První commit — WPF aplikace pro generování výkresových rohových razítek (.NET 10, SkiaSharp, ACadSharp, ClosedXML) včetně xUnit testů, DXF šablony, log a dokumentace. Build výstupy (bin/, obj/, .vs/) jsou ignorovány. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
56 lines
2.3 KiB
C#
56 lines
2.3 KiB
C#
using Rozpisky.Dxf;
|
||
using Rozpisky.Rendering;
|
||
using Xunit;
|
||
|
||
namespace Rozpisky.Tests;
|
||
|
||
/// <summary>
|
||
/// 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.
|
||
/// </summary>
|
||
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}");
|
||
}
|
||
}
|