From 02eb5f2f135ed2568a03bdfa9f847b65e2f00e00 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 18 Aug 2017 18:37:16 +0200 Subject: [PATCH] PngDecoder is covered now, and proven to be buggy :P --- .../Formats/Png/PngDecoderTests.cs | 12 ++++++++---- tests/ImageSharp.Tests/TestImages.cs | 1 + .../ImageComparison/ImageComparer.cs | 2 +- .../ImageComparison/TolerantImageComparer.cs | 4 ++-- .../TestUtilities/TestEnvironment.cs | 2 +- .../TestUtilities/TestImageExtensions.cs | 14 ++++++++++++-- tests/Images/Input/Png/SnakeGame.png | Bin 0 -> 6958 bytes 7 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 tests/Images/Input/Png/SnakeGame.png diff --git a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs index 5f4055a936..1d40163d10 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngDecoderTests.cs @@ -12,6 +12,8 @@ using Xunit; namespace ImageSharp.Tests { + using ImageSharp.Tests.TestUtilities.ImageComparison; + public class PngDecoderTests { private const PixelTypes PixelTypes = Tests.PixelTypes.Rgba32 | Tests.PixelTypes.RgbaVector | Tests.PixelTypes.Argb32; @@ -19,17 +21,19 @@ namespace ImageSharp.Tests public static readonly string[] TestFiles = { TestImages.Png.Splash, TestImages.Png.Indexed, TestImages.Png.Interlaced, TestImages.Png.FilterVar, - TestImages.Png.Bad.ChunkLength1, TestImages.Png.Bad.ChunkLength2, TestImages.Png.Rgb48Bpp, TestImages.Png.Rgb48BppInterlaced + TestImages.Png.Bad.ChunkLength1, TestImages.Png.Bad.ChunkLength2, TestImages.Png.Rgb48Bpp, + TestImages.Png.Rgb48BppInterlaced, TestImages.Png.SnakeGame }; [Theory] [WithFileCollection(nameof(TestFiles), PixelTypes)] - public void Decode(TestImageProvider imageProvider) + public void Decode(TestImageProvider provider) where TPixel : struct, IPixel { - using (Image image = imageProvider.GetImage()) + using (Image image = provider.GetImage(new PngDecoder())) { - image.DebugSave(imageProvider); + image.DebugSave(provider); + image.CompareToOriginal(provider, ImageComparer.Exact); } } diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 527b78ae6b..66ca93bd23 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -31,6 +31,7 @@ namespace ImageSharp.Tests public const string Bike = "Png/Bike.png"; public const string BikeGrayscale = "Png/BikeGrayscale.png"; public const string Rgb48BppInterlaced = "Png/rgb-48bpp-interlaced.png"; + public const string SnakeGame = "Png/SnakeGame.png"; // Filtered test images from http://www.schaik.com/pngsuite/pngsuite_fil_png.html public const string Filter0 = "Png/filter0.png"; diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs index b13905ef57..80102e6010 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs @@ -10,7 +10,7 @@ namespace ImageSharp.Tests.TestUtilities.ImageComparison public abstract class ImageComparer { - public static ImageComparer Exact { get; } = ExactImageComparer.Instance; + public static ImageComparer Exact { get; } = Tolerant(0, 0); public static ImageComparer Tolerant( float imageThreshold = TolerantImageComparer.DefaultImageThreshold, diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs index 23e5761806..0351b00200 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs @@ -66,7 +66,7 @@ for (int x = 0; x < width; x++) { - int d = GetDifferenceInPixelByteSum(ref aBuffer[x], ref bBuffer[x]); + int d = GetHammingDistanceInRgbaSpace(ref aBuffer[x], ref bBuffer[x]); if (d > this.PixelThresholdInPixelByteSum) { @@ -92,7 +92,7 @@ } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static int GetDifferenceInPixelByteSum(ref Rgba32 a, ref Rgba32 b) + private static int GetHammingDistanceInRgbaSpace(ref Rgba32 a, ref Rgba32 b) { return Diff(a.R, b.R) + Diff(a.G, b.G) + Diff(a.B, b.B) + Diff(a.A, b.A); } diff --git a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs index 7cfc5c6e40..9b2f7c479e 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs @@ -119,7 +119,7 @@ namespace ImageSharp.Tests return Configuration.FindEncoder(format); } - private static IImageFormat GetImageFormat(string filePath) + internal static IImageFormat GetImageFormat(string filePath) { string extension = Path.GetExtension(filePath).ToLower(); if (extension[0] == '.') extension = extension.Substring(1); diff --git a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs index e4563df4fd..17d75ff3f2 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs @@ -7,7 +7,9 @@ namespace ImageSharp.Tests { using System; using System.IO; + using System.Linq; + using ImageSharp.Formats; using ImageSharp.PixelFormats; using ImageSharp.Tests.TestUtilities.ImageComparison; using ImageSharp.Tests.TestUtilities.ReferenceCodecs; @@ -137,9 +139,17 @@ namespace ImageSharp.Tests var testFile = TestFile.Create(path); - using (var original = Image.Load(testFile.Bytes, SystemDrawingReferenceDecoder.Instance)) + IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(path); + IImageFormat format = TestEnvironment.GetImageFormat(path); + IImageDecoder defaultDecoder = Configuration.Default.FindDecoder(format); + + if (referenceDecoder.GetType() == defaultDecoder.GetType()) + { + throw new InvalidOperationException($"Can't use CompareToOriginal(): no actual reference decoder registered for {format.Name}"); + } + + using (var original = Image.Load(testFile.Bytes, referenceDecoder)) { - //original.DebugSave(provider, "__SYSTEMDRAWING__"); comparer.VerifySimilarity(original, image); } diff --git a/tests/Images/Input/Png/SnakeGame.png b/tests/Images/Input/Png/SnakeGame.png new file mode 100644 index 0000000000000000000000000000000000000000..96d72b38aa9d97408ddc99d6a3f8a793a3fd8895 GIT binary patch literal 6958 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 uY}jqJ3