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>
131 lines
4.4 KiB
C#
131 lines
4.4 KiB
C#
using Rozpisky.Dxf;
|
||
using Rozpisky.Models;
|
||
using Xunit;
|
||
|
||
namespace Rozpisky.Tests;
|
||
|
||
/// <summary>
|
||
/// Čistá byznys logika převodu vstupů na SŽ-kódy a názvy: 47-poziční kód
|
||
/// (<see cref="KodPrilohy"/>), rozpad čísla objektu (<see cref="ObjektOznaceni"/>) a automatické
|
||
/// jméno rozvržení (<see cref="Priloha.JmenoRozvrzeniAuto"/>). Hlídá pevnou šířku/pozice kódu –
|
||
/// tichý posun by jinak zkazil kód na každém výkresu. Očekávané hodnoty jsou worked examples
|
||
/// z doc-komentářů příslušných metod.
|
||
/// </summary>
|
||
public class KodovaniTesty
|
||
{
|
||
private static Projekt VzorProjekt() => new()
|
||
{
|
||
Skod = "SO12345",
|
||
StupenDokumentace = "DUSP",
|
||
};
|
||
|
||
private static Priloha VzorPriloha() => new()
|
||
{
|
||
CisloObjektu = "SO131.45.12.01",
|
||
OznaceniCasti = "D",
|
||
OznaceniDilciCasti = "D110",
|
||
TypPrilohy = "D1",
|
||
DilciPriloha = "1",
|
||
PoradiPrilohy = "001",
|
||
R1 = "V00",
|
||
};
|
||
|
||
[Fact]
|
||
public void Sestav_MaPevnychSedmActyricetZnaku_APozice()
|
||
{
|
||
var kod = KodPrilohy.Sestav(VzorProjekt(), VzorPriloha());
|
||
Assert.Equal(KodPrilohy.Delka, kod.Length);
|
||
Assert.Equal("SO12345XXXX_DUSP_D110_SO1314512_01_D1_1_001_V00", kod);
|
||
}
|
||
|
||
[Fact]
|
||
public void Sestav_PrazdnaPoleDoplniX_ProrezanaOrizne()
|
||
{
|
||
var p = new Projekt { Skod = "", StupenDokumentace = "" };
|
||
var r = new Priloha { CisloObjektu = "", R1 = "" };
|
||
var kod = KodPrilohy.Sestav(p, r);
|
||
Assert.Equal(KodPrilohy.Delka, kod.Length);
|
||
// Samé X kromě separátorů na pevných pozicích 12,17,22,32,35,38,40,44.
|
||
Assert.Equal("XXXXXXXXXXX_XXXX_XXXX_XXXXXXXXX_XX_XX_X_XXX_XXX", kod);
|
||
}
|
||
|
||
[Fact]
|
||
public void SestavDesky_MaPevnyStred_XX_X_000()
|
||
{
|
||
var kod = KodPrilohy.SestavDesky(VzorProjekt(), VzorPriloha());
|
||
Assert.Equal(KodPrilohy.Delka, kod.Length);
|
||
Assert.Equal("SO12345XXXX_DUSP_D110_SO1314512_01_XX_X_000_V00", kod);
|
||
}
|
||
|
||
[Fact]
|
||
public void SestavSeznam_PrepiseStredAVoltelnouRevizi()
|
||
{
|
||
var kod = KodPrilohy.SestavSeznam(VzorProjekt(), VzorPriloha(), revizeKod: "P01");
|
||
Assert.Equal(KodPrilohy.Delka, kod.Length);
|
||
Assert.Equal("SO12345XXXX_DUSP_D110_SO1314512_01_XX_X_001_P01", kod);
|
||
}
|
||
|
||
[Theory]
|
||
[InlineData("V00", 'V', "00")] // vedoucí znak = typ, zbytek číslo
|
||
[InlineData("002", '0', "02")] // číslicový typ 0, číslo z dalších číslic
|
||
[InlineData("", 'X', "XX")] // bez revize → X + XX
|
||
public void RozpadRevize_SePromitneDoPozic45Az47(string rev, char typ, string cislo)
|
||
{
|
||
var r = VzorPriloha();
|
||
r.R1 = rev;
|
||
var kod = KodPrilohy.Sestav(VzorProjekt(), r);
|
||
Assert.Equal(typ, kod[44]); // pozice 45 (0-based 44)
|
||
Assert.Equal(cislo, kod.Substring(45)); // pozice 46–47
|
||
}
|
||
|
||
[Fact]
|
||
public void ObjektOznaceni_Rozpad_RozdeliNaSlozky()
|
||
{
|
||
var o = ObjektOznaceni.Rozpad("SO131.45.12.01");
|
||
Assert.Equal("SO", o.Prefix);
|
||
Assert.Equal("131", o.Cislo);
|
||
Assert.Equal("45", o.Usek);
|
||
Assert.Equal("12", o.Razeni);
|
||
Assert.Equal("01", o.Podobjekt);
|
||
}
|
||
|
||
[Theory]
|
||
[InlineData("SK11", "SK", "11")] // jen řada, bez dalších segmentů
|
||
[InlineData("PS 22-3_4", "PS", "")] // libovolný oddělovač; "PS" samé písmeno → prázdné číslo
|
||
public void ObjektOznaceni_Rozpad_ZvladneOddelovaceAKratkeVstupy(string vstup, string prefix, string cislo)
|
||
{
|
||
var o = ObjektOznaceni.Rozpad(vstup);
|
||
Assert.Equal(prefix, o.Prefix);
|
||
Assert.Equal(cislo, o.Cislo);
|
||
}
|
||
|
||
[Fact]
|
||
public void ObjektOznaceni_Rozpad_PrazdnyVstupDaSamePrazdne()
|
||
{
|
||
var o = ObjektOznaceni.Rozpad("");
|
||
Assert.Equal(new ObjektOznaceni("", "", "", "", ""), o);
|
||
}
|
||
|
||
[Fact]
|
||
public void JmenoRozvrzeniAuto_SkladaZObjektuAPrilohy()
|
||
{
|
||
var r = VzorPriloha();
|
||
Assert.Equal("SO1314512_01_D1_1_001", r.JmenoRozvrzeniAuto);
|
||
}
|
||
|
||
[Fact]
|
||
public void JmenoRozvrzeniAuto_ProDeskyJeObjektovySpecial()
|
||
{
|
||
var r = VzorPriloha();
|
||
r.JeDesky = true;
|
||
Assert.Equal("SO1314512_01_XX_X_000", r.JmenoRozvrzeniAuto);
|
||
}
|
||
|
||
[Fact]
|
||
public void NazevObjektovehoSpecialu_TypXXZustavaLiteralne()
|
||
{
|
||
Assert.Equal("SO1314512_01_XX_X_001",
|
||
Priloha.NazevObjektovehoSpecialu("SO131.45.12.01", "001"));
|
||
}
|
||
}
|