Baseline: současný stav projektu Rozpisky

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>
This commit is contained in:
2026-09-07 09:45:49 +02:00
co-authored by Claude Opus 5
commit a6377ab583
107 changed files with 349485 additions and 0 deletions
+130
View File
@@ -0,0 +1,130 @@
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 4647
}
[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"));
}
}