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]