using Rozpisky.Dxf; using Rozpisky.Rendering; using Xunit; namespace Rozpisky.Tests; /// /// Bbox pro fit fragmentu (loga do placeholderu): dřív se text počítal jen jako vkládací bod, /// takže textová loga mohla přetéct rámeček. Teď se bbox počítá replayem do BoundsRenderer. /// public class BoundsTesty { [Fact] public void VsechnaLoga_MajiNeprazdneBounds() { foreach (var name in TestData.VsechnaLoga) { var tpl = new DxfTemplate(TestData.Logo(name)); Assert.True(tpl.Bounds is { W: > 0, H: > 0 }, $"{name}: Bounds = {tpl.Bounds}"); } } [Fact] public void Bounds_ZahrnujiTextIVyplne() { // sprava_zeleznic: 2 texty + 2 SOLID šrafy. Bbox musí obsáhnout všechny smyčky výplní // a být širší než samotné výplně (texty SPRÁVA/ŽELEZNIC vedle značky). var tpl = new DxfTemplate(TestData.Logo("sprava_zeleznic.dxf")); var rec = new RecordingRenderer(); tpl.Replay(rec); var body = rec.Fills.SelectMany(f => f).SelectMany(l => l).ToList(); Assert.NotEmpty(body); var b = tpl.Bounds!.Value; Assert.True(body.All(p => p.X >= b.X - 1e-6 && p.X <= b.X + b.W + 1e-6 && p.Y >= b.Y - 1e-6 && p.Y <= b.Y + b.H + 1e-6)); double vyplneW = body.Max(p => p.X) - body.Min(p => p.X); Assert.True(b.W > vyplneW, $"bbox W={b.W:F2} nezahrnuje texty (výplně W={vyplneW:F2})"); } [Fact] public void BoundsRenderer_RespektujeZarovnaniTextu() { // Center/Right roste od kotvy doleva; Top dolů – dřív box rostl vždy jen doprava nahoru. var stred = new BoundsRenderer(); stred.Text(0, 0, "ABCD", 10, HAlign.Center, VAlign.Middle); Assert.True(stred.MinX < 0 && stred.MaxX > 0, $"Center: {stred.MinX}..{stred.MaxX}"); Assert.True(stred.MinY < 0 && stred.MaxY > 0, $"Middle: {stred.MinY}..{stred.MaxY}"); var vpravo = new BoundsRenderer(); vpravo.Text(0, 0, "ABCD", 10, HAlign.Right, VAlign.Top); Assert.True(vpravo.MinX < 0 && vpravo.MaxX <= 1e-9, $"Right: {vpravo.MinX}..{vpravo.MaxX}"); Assert.True(vpravo.MinY < 0 && vpravo.MaxY <= 1e-9, $"Top: {vpravo.MinY}..{vpravo.MaxY}"); } }