using System.IO;
using ACadSharp.Entities;
using ACadSharp.IO;
using Rozpisky.Dxf;
using Rozpisky.Rendering;
using Xunit;
namespace Rozpisky.Tests;
///
/// Cesta barev tam a zpět: Rozpiska.dxf → → soubor →
/// zpátky. Šablona i všech 9 log jsou zapsané výhradně indexovanými barvami AutoCADu
/// (group 62); dřív z nich export dělal natvrdo RGB (group 420), takže výkres v CADu přestal
/// reagovat na tabulku barev a ByLayer se rozpadlo na kopie barvy hladiny.
///
public class DxfBarvyRoundTripTesty : IDisposable
{
private readonly string _soubor = Path.Combine(Path.GetTempPath(), "rozpisky-barvy-" + Guid.NewGuid().ToString("N") + ".dxf");
public void Dispose()
{
try { File.Delete(_soubor); } catch (IOException) { }
GC.SuppressFinalize(this);
}
/// Přehraje šablonu do DXF rendereru, zapíše a načte zpět.
private ACadSharp.CadDocument Kolecko(bool sRameckem = true)
{
var tpl = new DxfTemplate(TestData.Sablona);
var dxf = new DxfProfileRenderer();
tpl.Replay(dxf, values: null, includeNoPrint: sRameckem);
DxfWriter.Write(_soubor, dxf.Document, binary: true);
return DxfReader.Read(_soubor);
}
[Fact]
public void ZadnaEntitaNevyjdeJakoTrueColor()
{
var doc = Kolecko();
var prohresky = doc.Entities.OfType().Where(e => e.Color.IsTrueColor).ToList();
Assert.Empty(prohresky);
}
[Fact]
public void PouziteIndexyOdpovidajiZdroji()
{
// Indexy, které kreslítko dostalo ze šablony, musí být tytéž, jaké skončí v souboru.
var zaznam = new RecordingRenderer();
new DxfTemplate(TestData.Sablona).Replay(zaznam, values: null, includeNoPrint: true);
var zdrojove = zaznam.Stavy.Where(s => s.Barva.Druh == BarvaDruh.Index)
.Select(s => (int)s.Barva.Index).ToHashSet();
var doc = Kolecko();
var vysledne = doc.Entities.OfType()
.Where(e => !e.Color.IsByLayer && !e.Color.IsByBlock)
.Select(e => (int)e.Color.Index).ToHashSet();
Assert.NotEmpty(zdrojove);
Assert.Equal(zdrojove, vysledne);
}
[Fact]
public void ByLayerZustaneByLayer()
{
// Šablona má 41 entit s barvou 256 (ByLayer). Když se rozbalí na konkrétní RGB,
// přestane jít barva výkresu měnit přes hladinu – přesně to uživatel hlásí.
var zaznam = new RecordingRenderer();
new DxfTemplate(TestData.Sablona).Replay(zaznam, values: null, includeNoPrint: true);
int zdrojovych = zaznam.Stavy.Count(s => s.Barva.Druh == BarvaDruh.ByLayer);
Assert.True(zdrojovych > 0, "šablona žádnou ByLayer entitu nemá – test ztratil smysl");
var doc = Kolecko();
Assert.Contains(doc.Entities.OfType(), e => e.Color.IsByLayer);
}
[Fact]
public void HladinyMajiVlastnostiZTabulkyNeZPrvniEntity()
{
var zdroj = ACadSharp.IO.DxfReader.Read(TestData.Sablona);
var doc = Kolecko();
foreach (var vrstva in doc.Layers)
{
if (!zdroj.Layers.TryGetValue(vrstva.Name, out var puvodni)) continue;
Assert.Equal(puvodni.Color.Index, vrstva.Color.Index);
Assert.Equal(puvodni.PlotFlag, vrstva.PlotFlag);
}
}
[Fact]
public void VerzeVystupuJeZafixovana()
{
// Bez explicitního nastavení určí verzi výchozí hodnota ACadSharp – a tu může upgrade
// balíčku tiše změnit. Verze rozhoduje, čím půjde výkres u kolegy otevřít.
var doc = Kolecko();
Assert.Equal(DxfProfileRenderer.VerzeVystupu, doc.Header.Version);
}
[Fact]
public void RamecekNoPrintZustaneNetisknutelny()
{
// Rámeček A4 se do exportu kreslí jako reference, ale tisknout se nesmí.
var doc = Kolecko();
Assert.True(doc.Layers.TryGetValue(DxfTemplate.HladinaNoPrint, out var vrstva),
"hladina !!NOPRINT v exportu chybí");
Assert.False(vrstva!.PlotFlag);
}
}