diff --git a/tests/ImageSharp.Tests/Colors/ColorConstructorTests.cs b/tests/ImageSharp.Tests/Colors/ColorConstructorTests.cs
new file mode 100644
index 0000000000..a7ece164f2
--- /dev/null
+++ b/tests/ImageSharp.Tests/Colors/ColorConstructorTests.cs
@@ -0,0 +1,140 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageSharp.Tests.Colors
+{
+ using System.Collections.Generic;
+ using System.Numerics;
+ using Xunit;
+
+ public class ColorConstructorTests
+ {
+ public static IEnumerable Vector4Data
+ {
+ get
+ {
+ var vector4Values = new Vector4[]
+ {
+ Vector4.Zero,
+ Vector4.One,
+ Vector4.UnitX,
+ Vector4.UnitY,
+ Vector4.UnitZ,
+ Vector4.UnitW,
+ };
+
+ foreach (var vector4 in vector4Values)
+ {
+ yield return new object[] { new Argb(vector4), vector4 };
+ yield return new object[] { new Bgra4444(vector4), vector4 };
+ yield return new object[] { new Bgra5551(vector4), vector4 };
+ yield return new object[] { new Byte4(vector4), vector4 };
+ yield return new object[] { new HalfVector4(vector4), vector4 };
+ yield return new object[] { new NormalizedByte4(vector4), vector4 };
+ yield return new object[] { new NormalizedShort4(vector4), vector4 };
+ yield return new object[] { new Rgba1010102(vector4), vector4 };
+ yield return new object[] { new Rgba64(vector4), vector4 };
+ yield return new object[] { new Short4(vector4), vector4 };
+ }
+ }
+ }
+
+ public static IEnumerable Vector3Data
+ {
+ get
+ {
+ var vector3Values = new Dictionary()
+ {
+ { Vector3.One, Vector4.One },
+ { Vector3.Zero, new Vector4(0, 0, 0, 1) },
+ { Vector3.UnitX, new Vector4(1, 0, 0, 1) },
+ { Vector3.UnitY, new Vector4(0, 1, 0, 1) },
+ { Vector3.UnitZ, new Vector4(0, 0, 1, 1) },
+ };
+
+ foreach (var vector3 in vector3Values.Keys)
+ {
+ var vector4 = vector3Values[vector3];
+
+ yield return new object[] { new Argb(vector3), vector4 };
+ yield return new object[] { new Bgr565(vector3), vector4 };
+ }
+ }
+ }
+
+ public static IEnumerable Float4Data
+ {
+ get
+ {
+ var vector4Values = new Vector4[]
+ {
+ Vector4.Zero,
+ Vector4.One,
+ Vector4.UnitX,
+ Vector4.UnitY,
+ Vector4.UnitZ,
+ Vector4.UnitW,
+ };
+
+ foreach (var vector4 in vector4Values)
+ {
+ yield return new object[] { new Argb(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new Bgra4444(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new Bgra5551(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new Byte4(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new HalfVector4(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new NormalizedByte4(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new NormalizedShort4(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new Rgba1010102(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new Rgba64(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ yield return new object[] { new Short4(vector4.X, vector4.Y, vector4.Z, vector4.W), vector4 };
+ }
+ }
+ }
+
+ public static IEnumerable Float3Data
+ {
+ get
+ {
+ var vector3Values = new Dictionary()
+ {
+ { Vector3.One, Vector4.One },
+ { Vector3.Zero, new Vector4(0, 0, 0, 1) },
+ { Vector3.UnitX, new Vector4(1, 0, 0, 1) },
+ { Vector3.UnitY, new Vector4(0, 1, 0, 1) },
+ { Vector3.UnitZ, new Vector4(0, 0, 1, 1) },
+ };
+
+ foreach (var vector3 in vector3Values.Keys)
+ {
+ var vector4 = vector3Values[vector3];
+
+ yield return new object[] { new Argb(vector3.X, vector3.Y, vector3.Z), vector4 };
+ yield return new object[] { new Bgr565(vector3.X, vector3.Y, vector3.Z), vector4 };
+ }
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(Vector4Data))]
+ [MemberData(nameof(Vector3Data))]
+ [MemberData(nameof(Float4Data))]
+ [MemberData(nameof(Float3Data))]
+ public void ConstructorToVector4(IPackedVector packedVector, Vector4 expectedVector4)
+ {
+ // Arrange
+ var precision = 2;
+
+ // Act
+ var vector4 = packedVector.ToVector4();
+
+ // Assert
+ Assert.Equal(expectedVector4.X, vector4.X, precision);
+ Assert.Equal(expectedVector4.Y, vector4.Y, precision);
+ Assert.Equal(expectedVector4.Z, vector4.Z, precision);
+ Assert.Equal(expectedVector4.W, vector4.W, precision);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs b/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs
index b6b4712ac4..af948fa21a 100644
--- a/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs
+++ b/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs
@@ -5,6 +5,7 @@
namespace ImageSharp.Tests.Colors
{
+ using System;
using System.Numerics;
using Xunit;
@@ -13,89 +14,89 @@ namespace ImageSharp.Tests.Colors
///
public class ColorEqualityTests
{
- public static readonly TheoryData EqualityData =
- new TheoryData()
+ public static readonly TheoryData EqualityData =
+ new TheoryData()
{
- { new Alpha8(.5F), new Alpha8(.5F) },
- { new Argb(Vector4.One), new Argb(Vector4.One) },
- { new Bgr565(Vector3.One), new Bgr565(Vector3.One) },
- { new Bgra4444(Vector4.One), new Bgra4444(Vector4.One) },
- { new Bgra5551(Vector4.One), new Bgra5551(Vector4.One) },
- { new Byte4(Vector4.One * 255), new Byte4(Vector4.One * 255) },
- { new HalfSingle(-1F), new HalfSingle(-1F) },
- { new HalfVector2(0.1f, -0.3f), new HalfVector2(0.1f, -0.3f) },
- { new HalfVector4(Vector4.One), new HalfVector4(Vector4.One) },
- { new NormalizedByte2(-Vector2.One), new NormalizedByte2(-Vector2.One) },
- { new NormalizedByte4(Vector4.One), new NormalizedByte4(Vector4.One) },
- { new NormalizedShort2(Vector2.One), new NormalizedShort2(Vector2.One) },
- { new NormalizedShort4(Vector4.One), new NormalizedShort4(Vector4.One) },
- { new Rg32(Vector2.One), new Rg32(Vector2.One) },
- { new Rgba1010102(Vector4.One), new Rgba1010102(Vector4.One) },
- { new Rgba64(Vector4.One), new Rgba64(Vector4.One) },
- { new Short2(Vector2.One * 0x7FFF), new Short2(Vector2.One * 0x7FFF) },
- { new Short4(Vector4.One * 0x7FFF), new Short4(Vector4.One * 0x7FFF) },
+ { new Alpha8(.5F), new Alpha8(.5F), typeof(Alpha8) },
+ { new Argb(Vector4.One), new Argb(Vector4.One), typeof(Argb) },
+ { new Bgr565(Vector3.One), new Bgr565(Vector3.One), typeof(Bgr565) },
+ { new Bgra4444(Vector4.One), new Bgra4444(Vector4.One), typeof(Bgra4444) },
+ { new Bgra5551(Vector4.One), new Bgra5551(Vector4.One), typeof(Bgra5551) },
+ { new Byte4(Vector4.One * 255), new Byte4(Vector4.One * 255), typeof(Byte4) },
+ { new HalfSingle(-1F), new HalfSingle(-1F), typeof(HalfSingle) },
+ { new HalfVector2(0.1f, -0.3f), new HalfVector2(0.1f, -0.3f), typeof(HalfVector2) },
+ { new HalfVector4(Vector4.One), new HalfVector4(Vector4.One), typeof(HalfVector4) },
+ { new NormalizedByte2(-Vector2.One), new NormalizedByte2(-Vector2.One), typeof(NormalizedByte2) },
+ { new NormalizedByte4(Vector4.One), new NormalizedByte4(Vector4.One), typeof(NormalizedByte4) },
+ { new NormalizedShort2(Vector2.One), new NormalizedShort2(Vector2.One), typeof(NormalizedShort2) },
+ { new NormalizedShort4(Vector4.One), new NormalizedShort4(Vector4.One), typeof(NormalizedShort4) },
+ { new Rg32(Vector2.One), new Rg32(Vector2.One), typeof(Rg32) },
+ { new Rgba1010102(Vector4.One), new Rgba1010102(Vector4.One), typeof(Rgba1010102) },
+ { new Rgba64(Vector4.One), new Rgba64(Vector4.One), typeof(Rgba64) },
+ { new Short2(Vector2.One * 0x7FFF), new Short2(Vector2.One * 0x7FFF), typeof(Short2) },
+ { new Short4(Vector4.One * 0x7FFF), new Short4(Vector4.One * 0x7FFF), typeof(Short4) },
};
- public static readonly TheoryData NotEqualityDataNulls =
- new TheoryData()
+ public static readonly TheoryData NotEqualityDataNulls =
+ new TheoryData()
{
// Valid object against null
- { new Alpha8(.5F), null },
- { new Argb(Vector4.One), null },
- { new Bgr565(Vector3.One), null },
- { new Bgra4444(Vector4.One), null },
- { new Bgra5551(Vector4.One), null },
- { new Byte4(Vector4.One * 255), null },
- { new HalfSingle(-1F), null },
- { new HalfVector2(0.1f, -0.3f), null },
- { new HalfVector4(Vector4.One), null },
- { new NormalizedByte2(-Vector2.One), null },
- { new NormalizedByte4(Vector4.One), null },
- { new NormalizedShort2(Vector2.One), null },
- { new NormalizedShort4(Vector4.One), null },
- { new Rg32(Vector2.One), null },
- { new Rgba1010102(Vector4.One), null },
- { new Rgba64(Vector4.One), null },
- { new Short2(Vector2.One * 0x7FFF), null },
- { new Short4(Vector4.One * 0x7FFF), null },
+ { new Alpha8(.5F), null, typeof(Alpha8) },
+ { new Argb(Vector4.One), null, typeof(Argb) },
+ { new Bgr565(Vector3.One), null, typeof(Bgr565) },
+ { new Bgra4444(Vector4.One), null, typeof(Bgra4444) },
+ { new Bgra5551(Vector4.One), null, typeof(Bgra5551) },
+ { new Byte4(Vector4.One * 255), null, typeof(Byte4) },
+ { new HalfSingle(-1F), null, typeof(HalfSingle) },
+ { new HalfVector2(0.1f, -0.3f), null, typeof(HalfVector2) },
+ { new HalfVector4(Vector4.One), null, typeof(HalfVector4) },
+ { new NormalizedByte2(-Vector2.One), null, typeof(NormalizedByte2) },
+ { new NormalizedByte4(Vector4.One), null, typeof(NormalizedByte4) },
+ { new NormalizedShort2(Vector2.One), null, typeof(NormalizedShort2) },
+ { new NormalizedShort4(Vector4.One), null, typeof(NormalizedShort4) },
+ { new Rg32(Vector2.One), null, typeof(Rg32) },
+ { new Rgba1010102(Vector4.One), null, typeof(Rgba1010102) },
+ { new Rgba64(Vector4.One), null, typeof(Rgba64) },
+ { new Short2(Vector2.One * 0x7FFF), null, typeof(Short2) },
+ { new Short4(Vector4.One * 0x7FFF), null, typeof(Short4) },
};
- public static readonly TheoryData NotEqualityDataDifferentObjects =
- new TheoryData()
+ public static readonly TheoryData NotEqualityDataDifferentObjects =
+ new TheoryData()
{
// Valid objects of different types but not equal
- { new Alpha8(.5F), new Argb(Vector4.Zero) },
- { new HalfSingle(-1F), new NormalizedShort2(Vector2.Zero) },
- { new Rgba1010102(Vector4.One), new Bgra5551(Vector4.Zero) },
+ { new Alpha8(.5F), new Argb(Vector4.Zero), null },
+ { new HalfSingle(-1F), new NormalizedShort2(Vector2.Zero), null },
+ { new Rgba1010102(Vector4.One), new Bgra5551(Vector4.Zero), null },
};
- public static readonly TheoryData NotEqualityData =
- new TheoryData()
+ public static readonly TheoryData NotEqualityData =
+ new TheoryData()
{
// Valid objects of the same type but not equal
- { new Alpha8(.5F), new Alpha8(.8F) },
- { new Argb(Vector4.One), new Argb(Vector4.Zero) },
- { new Bgr565(Vector3.One), new Bgr565(Vector3.Zero) },
- { new Bgra4444(Vector4.One), new Bgra4444(Vector4.Zero) },
- { new Bgra5551(Vector4.One), new Bgra5551(Vector4.Zero) },
- { new Byte4(Vector4.One * 255), new Byte4(Vector4.Zero) },
- { new HalfSingle(-1F), new HalfSingle(1F) },
- { new HalfVector2(0.1f, -0.3f), new HalfVector2(0.1f, 0.3f) },
- { new HalfVector4(Vector4.One), new HalfVector4(Vector4.Zero) },
- { new NormalizedByte2(-Vector2.One), new NormalizedByte2(-Vector2.Zero) },
- { new NormalizedByte4(Vector4.One), new NormalizedByte4(Vector4.Zero) },
- { new NormalizedShort2(Vector2.One), new NormalizedShort2(Vector2.Zero) },
- { new NormalizedShort4(Vector4.One), new NormalizedShort4(Vector4.Zero) },
- { new Rg32(Vector2.One), new Rg32(Vector2.Zero) },
- { new Rgba1010102(Vector4.One), new Rgba1010102(Vector4.Zero) },
- { new Rgba64(Vector4.One), new Rgba64(Vector4.Zero) },
- { new Short2(Vector2.One * 0x7FFF), new Short2(Vector2.Zero) },
- { new Short4(Vector4.One * 0x7FFF), new Short4(Vector4.Zero) },
+ { new Alpha8(.5F), new Alpha8(.8F), typeof(Alpha8) },
+ { new Argb(Vector4.One), new Argb(Vector4.Zero), typeof(Argb) },
+ { new Bgr565(Vector3.One), new Bgr565(Vector3.Zero), typeof(Bgr565) },
+ { new Bgra4444(Vector4.One), new Bgra4444(Vector4.Zero), typeof(Bgra4444) },
+ { new Bgra5551(Vector4.One), new Bgra5551(Vector4.Zero), typeof(Bgra5551) },
+ { new Byte4(Vector4.One * 255), new Byte4(Vector4.Zero), typeof(Byte4) },
+ { new HalfSingle(-1F), new HalfSingle(1F), typeof(HalfSingle) },
+ { new HalfVector2(0.1f, -0.3f), new HalfVector2(0.1f, 0.3f), typeof(HalfVector2) },
+ { new HalfVector4(Vector4.One), new HalfVector4(Vector4.Zero), typeof(HalfVector4) },
+ { new NormalizedByte2(-Vector2.One), new NormalizedByte2(-Vector2.Zero), typeof(NormalizedByte2) },
+ { new NormalizedByte4(Vector4.One), new NormalizedByte4(Vector4.Zero), typeof(NormalizedByte4) },
+ { new NormalizedShort2(Vector2.One), new NormalizedShort2(Vector2.Zero), typeof(NormalizedShort2) },
+ { new NormalizedShort4(Vector4.One), new NormalizedShort4(Vector4.Zero), typeof(NormalizedShort4) },
+ { new Rg32(Vector2.One), new Rg32(Vector2.Zero), typeof(Rg32) },
+ { new Rgba1010102(Vector4.One), new Rgba1010102(Vector4.Zero), typeof(Rgba1010102) },
+ { new Rgba64(Vector4.One), new Rgba64(Vector4.Zero), typeof(Rgba64) },
+ { new Short2(Vector2.One * 0x7FFF), new Short2(Vector2.Zero), typeof(Short2) },
+ { new Short4(Vector4.One * 0x7FFF), new Short4(Vector4.Zero), typeof(Short4) },
};
[Theory]
[MemberData(nameof(EqualityData))]
- public void Equality(object first, object second)
+ public void Equality(object first, object second, Type type)
{
// Act
var equal = first.Equals(second);
@@ -108,7 +109,7 @@ namespace ImageSharp.Tests.Colors
[MemberData(nameof(NotEqualityDataNulls))]
[MemberData(nameof(NotEqualityDataDifferentObjects))]
[MemberData(nameof(NotEqualityData))]
- public void NotEquality(object first, object second)
+ public void NotEquality(object first, object second, Type type)
{
// Act
var equal = first.Equals(second);
@@ -119,7 +120,7 @@ namespace ImageSharp.Tests.Colors
[Theory]
[MemberData(nameof(EqualityData))]
- public void HashCodeEqual(object first, object second)
+ public void HashCodeEqual(object first, object second, Type type)
{
// Act
var equal = first.GetHashCode() == second.GetHashCode();
@@ -130,7 +131,7 @@ namespace ImageSharp.Tests.Colors
[Theory]
[MemberData(nameof(NotEqualityDataDifferentObjects))]
- public void HashCodeNotEqual(object first, object second)
+ public void HashCodeNotEqual(object first, object second, Type type)
{
// Act
var equal = first.GetHashCode() == second.GetHashCode();
@@ -138,5 +139,77 @@ namespace ImageSharp.Tests.Colors
// Assert
Assert.False(equal);
}
+
+ [Theory]
+ [MemberData(nameof(EqualityData))]
+ public void EqualityObject(object first, object second, Type type)
+ {
+ // Arrange
+ // Cast to the known object types, this is so that we can hit the
+ // equality operator on the concrete type, otherwise it goes to the
+ // default "object" one :)
+ dynamic firstObject = Convert.ChangeType(first, type);
+ dynamic secondObject = Convert.ChangeType(second, type);
+
+ // Act
+ var equal = firstObject.Equals(secondObject);
+
+ // Assert
+ Assert.True(equal);
+ }
+
+ [Theory]
+ [MemberData(nameof(NotEqualityData))]
+ public void NotEqualityObject(object first, object second, Type type)
+ {
+ // Arrange
+ // Cast to the known object types, this is so that we can hit the
+ // equality operator on the concrete type, otherwise it goes to the
+ // default "object" one :)
+ dynamic firstObject = Convert.ChangeType(first, type);
+ dynamic secondObject = Convert.ChangeType(second, type);
+
+ // Act
+ var equal = firstObject.Equals(secondObject);
+
+ // Assert
+ Assert.False(equal);
+ }
+
+ [Theory]
+ [MemberData(nameof(EqualityData))]
+ public void EqualityOperator(object first, object second, Type type)
+ {
+ // Arrange
+ // Cast to the known object types, this is so that we can hit the
+ // equality operator on the concrete type, otherwise it goes to the
+ // default "object" one :)
+ dynamic firstObject = Convert.ChangeType(first, type);
+ dynamic secondObject = Convert.ChangeType(second, type);
+
+ // Act
+ var equal = firstObject == secondObject;
+
+ // Assert
+ Assert.True(equal);
+ }
+
+ [Theory]
+ [MemberData(nameof(NotEqualityData))]
+ public void NotEqualityOperator(object first, object second, Type type)
+ {
+ // Arrange
+ // Cast to the known object types, this is so that we can hit the
+ // equality operator on the concrete type, otherwise it goes to the
+ // default "object" one :)
+ dynamic firstObject = Convert.ChangeType(first, type);
+ dynamic secondObject = Convert.ChangeType(second, type);
+
+ // Act
+ var notEqual = firstObject != secondObject;
+
+ // Assert
+ Assert.True(notEqual);
+ }
}
}
diff --git a/tests/ImageSharp.Tests/Colors/ColorPackingTests.cs b/tests/ImageSharp.Tests/Colors/ColorPackingTests.cs
new file mode 100644
index 0000000000..d4fc337a65
--- /dev/null
+++ b/tests/ImageSharp.Tests/Colors/ColorPackingTests.cs
@@ -0,0 +1,84 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageSharp.Tests.Colors
+{
+ using System.Collections.Generic;
+ using System.Numerics;
+ using Xunit;
+
+ public class ColorPackingTests
+ {
+ public static IEnumerable Vector4PackData
+ {
+ get
+ {
+ var vector4Values = new Vector4[]
+ {
+ Vector4.Zero,
+ Vector4.One,
+ Vector4.UnitX,
+ Vector4.UnitY,
+ Vector4.UnitZ,
+ Vector4.UnitW,
+ };
+
+ foreach (var vector4 in vector4Values)
+ {
+ yield return new object[] { new Argb(), vector4 };
+ yield return new object[] { new Bgra4444(), vector4 };
+ yield return new object[] { new Bgra5551(), vector4 };
+ yield return new object[] { new Byte4(), vector4 };
+ yield return new object[] { new HalfVector4(), vector4 };
+ yield return new object[] { new NormalizedByte4(), vector4 };
+ yield return new object[] { new NormalizedShort4(), vector4 };
+ yield return new object[] { new Rgba1010102(), vector4 };
+ yield return new object[] { new Rgba64(), vector4 };
+ yield return new object[] { new Short4(), vector4 };
+ }
+ }
+ }
+
+ public static IEnumerable Vector3PackData
+ {
+ get
+ {
+ var vector4Values = new Vector4[]
+ {
+ Vector4.One,
+ new Vector4(0, 0, 0, 1),
+ new Vector4(1, 0, 0, 1),
+ new Vector4(0, 1, 0, 1),
+ new Vector4(0, 0, 1, 1),
+ };
+
+ foreach (var vector4 in vector4Values)
+ {
+ yield return new object[] { new Argb(), vector4 };
+ yield return new object[] { new Bgr565(), vector4 };
+ }
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(Vector4PackData))]
+ [MemberData(nameof(Vector3PackData))]
+ public void FromVector4ToVector4(IPackedVector packedVector, Vector4 vector4ToPack)
+ {
+ // Arrange
+ var precision = 2;
+ packedVector.PackFromVector4(vector4ToPack);
+
+ // Act
+ var vector4 = packedVector.ToVector4();
+
+ // Assert
+ Assert.Equal(vector4ToPack.X, vector4.X, precision);
+ Assert.Equal(vector4ToPack.Y, vector4.Y, precision);
+ Assert.Equal(vector4ToPack.Z, vector4.Z, precision);
+ Assert.Equal(vector4ToPack.W, vector4.W, precision);
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/Colors/PackedPixelTests.cs b/tests/ImageSharp.Tests/Colors/PackedPixelTests.cs
index 820dc2bae3..77fee1e79a 100644
--- a/tests/ImageSharp.Tests/Colors/PackedPixelTests.cs
+++ b/tests/ImageSharp.Tests/Colors/PackedPixelTests.cs
@@ -13,6 +13,10 @@ namespace ImageSharp.Tests.Colors
///
/// The packed pixel tests.
///
+ ///
+ /// The "ToVector4" tests should now be covered in
+ /// and at some point they can be safely removed from here.
+ ///
public class PackedPixelTests
{
[Fact]