diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndHunterLabConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndHunterLabConversionTests.cs
new file mode 100644
index 0000000000..a3b7d4b0f1
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndHunterLabConversionTests.cs
@@ -0,0 +1,70 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles;
+
+///
+/// Tests - conversions.
+///
+public class CieXyyAndHunterLabConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002f);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0.360555, 0.936901, 0.1001514, 31.6467056, -33.00599, 25.67032)]
+ public void Convert_CieXyy_to_HunterLab(float x, float y, float yl, float l, float a, float b)
+ {
+ // Arrange
+ CieXyy input = new(x, y, yl);
+ HunterLab expected = new(l, a, b);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new CieXyy[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new HunterLab[5];
+
+ // Act
+ HunterLab actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(31.6467056, -33.00599, 25.67032, 0.360555, 0.936901, 0.1001514)]
+ public void Convert_HunterLab_to_CieXyy(float l, float a, float b, float x, float y, float yl)
+ {
+ // Arrange
+ HunterLab input = new(l, a, b);
+ CieXyy expected = new(x, y, yl);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new HunterLab[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieXyy[5];
+
+ // Act
+ CieXyy actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndLmsConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndLmsConversionTests.cs
new file mode 100644
index 0000000000..6974a864fb
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndLmsConversionTests.cs
@@ -0,0 +1,70 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles.Conversion;
+
+///
+/// Tests - conversions.
+///
+public class CieXyyAndLmsConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002f);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0.360555, 0.936901, 0.1001514, 0.06631134, 0.1415282, -0.03809926)]
+ public void Convert_CieXyy_to_Lms(float x, float y, float yl, float l, float m, float s)
+ {
+ // Arrange
+ CieXyy input = new(x, y, yl);
+ Lms expected = new(l, m, s);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new CieXyy[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new Lms[5];
+
+ // Act
+ Lms actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0.06631134, 0.1415282, -0.03809926, 0.360555, 0.936901, 0.1001514)]
+ public void Convert_Lms_to_CieXyy(float l, float m, float s, float x, float y, float yl)
+ {
+ // Arrange
+ Lms input = new(l, m, s);
+ CieXyy expected = new(x, y, yl);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new Lms[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieXyy[5];
+
+ // Act
+ CieXyy actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndRgbConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndRgbConversionTests.cs
new file mode 100644
index 0000000000..18df2ce145
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndRgbConversionTests.cs
@@ -0,0 +1,70 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles;
+
+///
+/// Tests - conversions.
+///
+public class CieXyyAndRgbConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002f);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0.360555, 0.936901, 0.1001514, 0, 0.4277014, 0)]
+ public void Convert_CieXyy_to_Rgb(float x, float y, float yl, float r, float g, float b)
+ {
+ // Arrange
+ CieXyy input = new(x, y, yl);
+ Rgb expected = new(r, g, b);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new CieXyy[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new Rgb[5];
+
+ // Act
+ Rgb actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 0, 0)]
+ [InlineData(0, 0.4277014, 0, 0.32114, 0.59787, 0.10976)]
+ public void Convert_Rgb_to_CieXyy(float r, float g, float b, float x, float y, float yl)
+ {
+ // Arrange
+ Rgb input = new(r, g, b);
+ CieXyy expected = new(x, y, yl);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new Rgb[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieXyy[5];
+
+ // Act
+ CieXyy actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndYCbCrConversionTests.cs b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndYCbCrConversionTests.cs
new file mode 100644
index 0000000000..1fe3596036
--- /dev/null
+++ b/tests/ImageSharp.Tests/ColorProfiles/CieXyyAndYCbCrConversionTests.cs
@@ -0,0 +1,70 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.ColorProfiles;
+
+namespace SixLabors.ImageSharp.Tests.ColorProfiles;
+
+///
+/// Tests - conversions.
+///
+public class CieXyyAndYCbCrConversionTests
+{
+ private static readonly ApproximateColorProfileComparer Comparer = new(.0002f);
+
+ [Theory]
+ [InlineData(0, 0, 0, 0, 128, 128)]
+ [InlineData(0.360555, 0.936901, 0.1001514, 64.0204849, 91.87107, 82.33627)]
+ public void Convert_CieXyy_to_YCbCr(float x, float y, float yl, float y2, float cb, float cr)
+ {
+ // Arrange
+ CieXyy input = new(x, y, yl);
+ YCbCr expected = new(y2, cb, cr);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new CieXyy[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new YCbCr[5];
+
+ // Act
+ YCbCr actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+
+ [Theory]
+ [InlineData(0, 128, 128, 0, 0, 0)]
+ [InlineData(64.0204849, 91.87107, 82.33627, 0.32114, 0.59787, 0.10976)]
+ public void Convert_YCbCr_to_CieXyy(float y2, float cb, float cr, float x, float y, float yl)
+ {
+ // Arrange
+ YCbCr input = new(y2, cb, cr);
+ CieXyy expected = new(x, y, yl);
+ ColorProfileConverter converter = new();
+
+ Span inputSpan = new YCbCr[5];
+ inputSpan.Fill(input);
+
+ Span actualSpan = new CieXyy[5];
+
+ // Act
+ CieXyy actual = converter.Convert(input);
+ converter.Convert(inputSpan, actualSpan);
+
+ // Assert
+ Assert.Equal(expected, actual, Comparer);
+
+ for (int i = 0; i < actualSpan.Length; i++)
+ {
+ Assert.Equal(expected, actualSpan[i], Comparer);
+ }
+ }
+}