using Rozpisky.Rendering; using Xunit; using AcColor = ACadSharp.Color; namespace Rozpisky.Tests; /// /// Paleta indexovaných barev AutoCADu. Rozhoduje o tom, jak vypadá náhled proti CADu – /// v exportu se index zapisuje číslem, takže tahle tabulka do souboru nikdy neproteče. /// public class AciPaletaTesty { [Theory] [InlineData(1, 0xFF0000)] [InlineData(2, 0xFFFF00)] [InlineData(3, 0x00FF00)] [InlineData(4, 0x00FFFF)] [InlineData(5, 0x0000FF)] [InlineData(6, 0xFF00FF)] [InlineData(7, 0xFFFFFF)] [InlineData(8, 0x414141)] [InlineData(9, 0x808080)] [InlineData(255, 0xFFFFFF)] [InlineData(250, 0x333333)] public void ZakladniBarvySedle(int index, int rgb) => Assert.Equal(rgb, AciPaleta.Rgb(index)); [Theory] // Odstínová část: první čtveřice ze skupiny červené a modrozelené, ověřená proti AutoCADu. [InlineData(10, 0xFF0000)] [InlineData(11, 0xFF7F7F)] [InlineData(12, 0xA50000)] [InlineData(13, 0xA55252)] [InlineData(20, 0xFF3F00)] [InlineData(21, 0xFF9F7F)] [InlineData(22, 0xA52900)] [InlineData(136, 0x004C4C)] [InlineData(18, 0x260000)] public void OdstinySeDopocitavajiSpravne(int index, int rgb) => Assert.Equal(rgb, AciPaleta.Rgb(index)); [Fact] public void MimoRozsahJeCerna() { Assert.Equal(0x000000, AciPaleta.Rgb(-1)); Assert.Equal(0x000000, AciPaleta.Rgb(256)); Assert.Equal(0x000000, AciPaleta.Rgb(0)); // 0 = ByBlock, samostatně se nekreslí } [Fact] public void KazdyOdstinMaVlastniBarvu() { // 24 skupin po 10 – žádné dvě sousední skupiny nesmí vyjít stejně. Přesně tímhle se // ACadSharp plete (29 a 39 tam mají tutéž barvu), a proto máme paletu vlastní. for (int skupina = 0; skupina + 1 < 24; skupina++) for (int pozice = 0; pozice < 10; pozice++) Assert.NotEqual(AciPaleta.Rgb(10 + skupina * 10 + pozice), AciPaleta.Rgb(20 + skupina * 10 + pozice)); } /// Indexy, kde se ACadSharp.Color.GetIndexRGB od AutoCADu liší o víc než /// zaokrouhlení: dva stupně šedi (8, 9), šedý klín na konci palety (250–254) a poslední /// index většiny desítek odstínů (29, 119, 139, …), kde ACadSharp bere barvu ze sousední /// skupiny – proto tam vycházejí i barvy mimo jas dané pozice. private static readonly int[] ZnameOdchylky = { 8, 9, 29, 91, 109, 119, 129, 139, 145, 147, 149, 157, 159, 167, 169, 177, 179, 187, 189, 192, 197, 199, 203, 209, 219, 229, 239, 249, 250, 251, 252, 253, 254, }; [Fact] public void ShodujeSeSAcadSharpKromeZnamychOdchylek() { // Pojistka proti tichému rozejití při upgradu balíčku. Jinde než v seznamu se smí lišit // nanejvýš o 1 na kanál (jiné zaokrouhlení při dopočtu odstínu) – to okem nepoznat. var zname = new HashSet(ZnameOdchylky); var novaOdchylka = new List(); var zmizelaOdchylka = new List(); for (int i = 0; i <= 255; i++) { var acad = AcColor.GetIndexRGB((byte)i); int nas = AciPaleta.Rgb(i); int rozdil = Math.Max(Math.Abs(acad[0] - ((nas >> 16) & 0xFF)), Math.Max(Math.Abs(acad[1] - ((nas >> 8) & 0xFF)), Math.Abs(acad[2] - (nas & 0xFF)))); if (rozdil > 1 && !zname.Contains(i)) novaOdchylka.Add(i); if (rozdil <= 1 && zname.Contains(i)) zmizelaOdchylka.Add(i); } Assert.Empty(novaOdchylka); // ACadSharp se rozešel s AutoCADem na dalším indexu Assert.Empty(zmizelaOdchylka); // ACadSharp se opravil – seznam zúžit } [Fact] public void NejblizsiIndexNajdePresnouShoduIPriblizek() { Assert.Equal(1, AciPaleta.NejblizsiIndex(0xFF0000)); Assert.Equal(5, AciPaleta.NejblizsiIndex(0x0000FF)); Assert.Equal(0xFF0000, AciPaleta.Rgb(AciPaleta.NejblizsiIndex(0xFE0101))); } }