using HPPH.Reference; namespace HPPH.Test.PixelHelper; [TestClass] public class CreateColorPaletteTests { private static IEnumerable GetTestImages() => Directory.EnumerateFiles(@"..\..\..\..\sample_data", "*.png", SearchOption.AllDirectories); private static int[] Sizes => [0, 1, 2, 16, 64]; private static readonly Dictionary>> _reference = []; [ClassInitialize] public static void Initialize(TestContext context) { ReadOnlySpan sizes = Sizes; foreach (string image in GetTestImages()) { _reference[image] = []; Initialize(image, sizes); Initialize(image, sizes); Initialize(image, sizes); Initialize(image, sizes); Initialize(image, sizes); Initialize(image, sizes); } } private static void Initialize(string image, ReadOnlySpan sizes) where T : unmanaged, IColor { _reference[image][typeof(T)] = []; Image img = ImageHelper.GetImage(image); foreach (int size in sizes) _reference[image][typeof(T)][size] = [.. ReferencePixelHelper.CreateColorPalette(img, size).OrderBy(x => x.R).ThenBy(x => x.G).ThenBy(x => x.B).ThenBy(x => x.A)]; } [TestMethod] public void CreateColorPaletteReadOnlySpan() { ReadOnlySpan sizes = Sizes; foreach (string image in GetTestImages()) { foreach (int size in sizes) { CreateColorPaletteReadOnlySpan(image, size); CreateColorPaletteReadOnlySpan(image, size); CreateColorPaletteReadOnlySpan(image, size); CreateColorPaletteReadOnlySpan(image, size); CreateColorPaletteReadOnlySpan(image, size); CreateColorPaletteReadOnlySpan(image, size); } } } private void CreateColorPaletteReadOnlySpan(string image, int size) where T : unmanaged, IColor { T[] data = ImageHelper.GetColorsFromImage(image); ReadOnlySpan span = data; T[] test = [.. span.CreateColorPalette(size).OrderBy(x => x.R).ThenBy(x => x.G).ThenBy(x => x.B).ThenBy(x => x.A)]; IColor[] reference = _reference[image][typeof(T)][size]; Assert.AreEqual(reference.Length, test.Length, $"Palette Size differs for image {image}, size {size}"); for (int i = 0; i < reference.Length; i++) Assert.AreEqual(reference[i], test[i], $"Index {i} differs for image {image}, size {size}"); } [TestMethod] public void CreateColorPaletteSpan() { ReadOnlySpan sizes = Sizes; foreach (string image in GetTestImages()) { foreach (int size in sizes) { CreateColorPaletteSpan(image, size); CreateColorPaletteSpan(image, size); CreateColorPaletteSpan(image, size); CreateColorPaletteSpan(image, size); CreateColorPaletteSpan(image, size); CreateColorPaletteSpan(image, size); } } } private void CreateColorPaletteSpan(string image, int size) where T : unmanaged, IColor { T[] data = ImageHelper.GetColorsFromImage(image); Span span = data; T[] test = [.. span.CreateColorPalette(size).OrderBy(x => x.R).ThenBy(x => x.G).ThenBy(x => x.B).ThenBy(x => x.A)]; IColor[] reference = _reference[image][typeof(T)][size]; Assert.AreEqual(reference.Length, test.Length, $"Palette Size differs for image {image}, size {size}"); for (int i = 0; i < reference.Length; i++) Assert.AreEqual(reference[i], test[i], $"Index {i} differs for image {image}, size {size}"); } [TestMethod] public void CreateColorPaletteImage() { ReadOnlySpan sizes = Sizes; foreach (string image in GetTestImages()) { foreach (int size in sizes) { CreateColorPaletteImage(image, size); CreateColorPaletteImage(image, size); CreateColorPaletteImage(image, size); CreateColorPaletteImage(image, size); CreateColorPaletteImage(image, size); CreateColorPaletteImage(image, size); } } } private void CreateColorPaletteImage(string image, int size) where T : struct, IColor { IImage data = ImageHelper.GetImage(image); IColor[] test = [.. data.CreateColorPalette(size).OrderBy(x => x.R).ThenBy(x => x.G).ThenBy(x => x.B).ThenBy(x => x.A)]; IColor[] reference = _reference[image][typeof(T)][size]; Assert.AreEqual(reference.Length, test.Length, $"Palette Size differs for image {image}, size {size}"); for (int i = 0; i < reference.Length; i++) Assert.AreEqual(reference[i], test[i], $"Index {i} differs for image {image}, size {size}"); } [TestMethod] public void CreateColorPaletteGenericImage() { ReadOnlySpan sizes = Sizes; foreach (string image in GetTestImages()) { foreach (int size in sizes) { CreateColorPaletteGenericImage(image, size); CreateColorPaletteGenericImage(image, size); CreateColorPaletteGenericImage(image, size); CreateColorPaletteGenericImage(image, size); CreateColorPaletteGenericImage(image, size); CreateColorPaletteGenericImage(image, size); } } } private void CreateColorPaletteGenericImage(string image, int size) where T : unmanaged, IColor { Image data = ImageHelper.GetImage(image); T[] test = [.. data.CreateColorPalette(size).OrderBy(x => x.R).ThenBy(x => x.G).ThenBy(x => x.B).ThenBy(x => x.A)]; IColor[] reference = _reference[image][typeof(T)][size]; Assert.AreEqual(reference.Length, test.Length, $"Palette Size differs for image {image}, size {size}"); for (int i = 0; i < reference.Length; i++) Assert.AreEqual(reference[i], test[i], $"Index {i} differs for image {image}, size {size}"); } [TestMethod] public void CreateColorPaletteRefImage() { ReadOnlySpan sizes = Sizes; foreach (string image in GetTestImages()) { foreach (int size in sizes) { CreateColorPaletteRefImage(image, size); CreateColorPaletteRefImage(image, size); CreateColorPaletteRefImage(image, size); CreateColorPaletteRefImage(image, size); CreateColorPaletteRefImage(image, size); CreateColorPaletteRefImage(image, size); } } } private void CreateColorPaletteRefImage(string image, int size) where T : unmanaged, IColor { RefImage data = ImageHelper.GetImage(image).AsRefImage(); T[] test = [.. data.CreateColorPalette(size).OrderBy(x => x.R).ThenBy(x => x.G).ThenBy(x => x.B).ThenBy(x => x.A)]; IColor[] reference = _reference[image][typeof(T)][size]; Assert.AreEqual(reference.Length, test.Length, $"Palette Size differs for image {image}, size {size}"); for (int i = 0; i < reference.Length; i++) Assert.AreEqual(reference[i], test[i], $"Index {i} differs for image {image}, size {size}"); } }