From 9208de1659b1dedafb8c9b364354225aa4b7c1df Mon Sep 17 00:00:00 2001 From: Olivia Date: Wed, 28 Dec 2016 21:09:58 +0200 Subject: [PATCH] Fixing bug with non-inclusive AlmostEquals. --- src/ImageSharp/Colors/Spaces/CieLab.cs | 6 ++-- src/ImageSharp/Colors/Spaces/CieXyz.cs | 6 ++-- src/ImageSharp/Colors/Spaces/Cmyk.cs | 8 ++--- src/ImageSharp/Colors/Spaces/Hsl.cs | 6 ++-- src/ImageSharp/Colors/Spaces/Hsv.cs | 6 ++-- .../Colors/ColorEqualityTests.cs | 35 +++++++++++++++++++ 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/ImageSharp/Colors/Spaces/CieLab.cs b/src/ImageSharp/Colors/Spaces/CieLab.cs index a97b09a14c..a4b9cb5f40 100644 --- a/src/ImageSharp/Colors/Spaces/CieLab.cs +++ b/src/ImageSharp/Colors/Spaces/CieLab.cs @@ -169,9 +169,9 @@ namespace ImageSharp.Colors.Spaces { Vector3 result = Vector3.Abs(this.backingVector - other.backingVector); - return result.X < precision - && result.Y < precision - && result.Z < precision; + return result.X <= precision + && result.Y <= precision + && result.Z <= precision; } } } diff --git a/src/ImageSharp/Colors/Spaces/CieXyz.cs b/src/ImageSharp/Colors/Spaces/CieXyz.cs index 0d90ddd7d3..5bd1eac634 100644 --- a/src/ImageSharp/Colors/Spaces/CieXyz.cs +++ b/src/ImageSharp/Colors/Spaces/CieXyz.cs @@ -160,9 +160,9 @@ namespace ImageSharp.Colors.Spaces { Vector3 result = Vector3.Abs(this.backingVector - other.backingVector); - return result.X < precision - && result.Y < precision - && result.Z < precision; + return result.X <= precision + && result.Y <= precision + && result.Z <= precision; } } } diff --git a/src/ImageSharp/Colors/Spaces/Cmyk.cs b/src/ImageSharp/Colors/Spaces/Cmyk.cs index 9322e4f90d..82e749f392 100644 --- a/src/ImageSharp/Colors/Spaces/Cmyk.cs +++ b/src/ImageSharp/Colors/Spaces/Cmyk.cs @@ -170,10 +170,10 @@ namespace ImageSharp.Colors.Spaces { Vector4 result = Vector4.Abs(this.backingVector - other.backingVector); - return result.X < precision - && result.Y < precision - && result.Z < precision - && result.W < precision; + return result.X <= precision + && result.Y <= precision + && result.Z <= precision + && result.W <= precision; } } } diff --git a/src/ImageSharp/Colors/Spaces/Hsl.cs b/src/ImageSharp/Colors/Spaces/Hsl.cs index 7847aafe58..13973349c3 100644 --- a/src/ImageSharp/Colors/Spaces/Hsl.cs +++ b/src/ImageSharp/Colors/Spaces/Hsl.cs @@ -189,9 +189,9 @@ namespace ImageSharp.Colors.Spaces { Vector3 result = Vector3.Abs(this.backingVector - other.backingVector); - return result.X < precision - && result.Y < precision - && result.Z < precision; + return result.X <= precision + && result.Y <= precision + && result.Z <= precision; } } } diff --git a/src/ImageSharp/Colors/Spaces/Hsv.cs b/src/ImageSharp/Colors/Spaces/Hsv.cs index 69984d6f95..f7ed05b86e 100644 --- a/src/ImageSharp/Colors/Spaces/Hsv.cs +++ b/src/ImageSharp/Colors/Spaces/Hsv.cs @@ -182,9 +182,9 @@ namespace ImageSharp.Colors.Spaces { Vector3 result = Vector3.Abs(this.backingVector - other.backingVector); - return result.X < precision - && result.Y < precision - && result.Z < precision; + return result.X <= precision + && result.Y <= precision + && result.Z <= precision; } } } diff --git a/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs b/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs index bf3c8d49f5..3209912ba6 100644 --- a/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs +++ b/tests/ImageSharp.Tests/Colors/ColorEqualityTests.cs @@ -181,6 +181,23 @@ namespace ImageSharp.Tests.Colors { new YCbCr(100, 100, 0), new YCbCr(100, 20, 0), typeof(YCbCr) }, }; + public static readonly TheoryData AlmostEqualsData = + new TheoryData() + { + { new CieLab(0f, 0f, 0f), new CieLab(0f, 0f, 0f), typeof(CieLab), 0f }, + { new CieLab(0f, 0f, 0f), new CieLab(0f, 0f, 0f), typeof(CieLab), .001f }, + { new CieLab(0f, 0f, 0f), new CieLab(0f, 0f, 0f), typeof(CieLab), .0001f }, + { new CieLab(0f, 0f, 0f), new CieLab(0f, 0f, 0f), typeof(CieLab), .0005f }, + { new CieLab(0f, 0f, 0f), new CieLab(0f, .001f, 0f), typeof(CieLab), .001f }, + { new CieLab(0f, 0f, 0f), new CieLab(0f, 0f, .0001f), typeof(CieLab), .0001f }, + { new CieLab(0f, 0f, 0f), new CieLab(.0005f, 0f, 0f), typeof(CieLab), .0005f }, + //{ new CieXyz(380f, 380f, 380f), null, typeof(CieXyz) }, + //{ new Cmyk(0f, 0f, 0f, 0f), null, typeof(Cmyk) }, + //{ new Hsl(0f, 0f, 0f), null, typeof(Hsl) }, + //{ new Hsv(360f, 1f, 1f), null, typeof(Hsv) }, + //{ new YCbCr(0, 0, 0), null, typeof(YCbCr) }, + }; + [Theory] [MemberData(nameof(EqualityData))] [MemberData(nameof(EqualityDataColorSpaces))] @@ -308,5 +325,23 @@ namespace ImageSharp.Tests.Colors // Assert Assert.True(notEqual); } + + [Theory] + [MemberData(nameof(AlmostEqualsData))] + public void AlmostEquals(object first, object second, Type type, float precision) + { + // 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 almostEqual = firstObject.AlmostEquals(secondObject, precision); + + // Assert + Assert.True(almostEqual); + } } }