using Rozpisky.Dxf; using Rozpisky.Models; using Xunit; namespace Rozpisky.Tests; /// /// Čistá byznys logika převodu vstupů na SŽ-kódy a názvy: 47-poziční kód /// (), rozpad čísla objektu () a automatické /// jméno rozvržení (). 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. /// 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")); } }