From db78fb23da984e67cd75db782b178c2aa445ba9d Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sat, 19 Aug 2017 20:22:05 +0200 Subject: [PATCH] Added ReferenceImage -based assertions to JpegDecoderTests. The PdfJs decoder is quite inaccurate with them, which makes tests failing --- .../Formats/Jpeg/GolangPort/OldJpegDecoder.cs | 2 +- .../Formats/Jpg/BadEofJpegTests.cs | 43 ------ .../Formats/Jpg/JpegDecoderTests.cs | 126 +++++++++++------- tests/ImageSharp.Tests/TestImages.cs | 2 +- tests/Images/External | 2 +- 5 files changed, 78 insertions(+), 97 deletions(-) delete mode 100644 tests/ImageSharp.Tests/Formats/Jpg/BadEofJpegTests.cs diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/OldJpegDecoder.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/OldJpegDecoder.cs index 60a2e1246..62898d399 100644 --- a/src/ImageSharp/Formats/Jpeg/GolangPort/OldJpegDecoder.cs +++ b/src/ImageSharp/Formats/Jpeg/GolangPort/OldJpegDecoder.cs @@ -9,7 +9,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort /// /// Image decoder for generating an image out of a jpg stream. /// - public sealed class OldJpegDecoder : IImageDecoder, IJpegDecoderOptions + internal sealed class OldJpegDecoder : IImageDecoder, IJpegDecoderOptions { /// /// Gets or sets a value indicating whether the metadata should be ignored when the image is being decoded. diff --git a/tests/ImageSharp.Tests/Formats/Jpg/BadEofJpegTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/BadEofJpegTests.cs deleted file mode 100644 index bf6b4476c..000000000 --- a/tests/ImageSharp.Tests/Formats/Jpg/BadEofJpegTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; -using Xunit; -using Xunit.Abstractions; - -// ReSharper disable InconsistentNaming - -namespace SixLabors.ImageSharp.Tests -{ - public class BadEOFJpegTests : MeasureFixture - { - public BadEOFJpegTests(ITestOutputHelper output) - : base(output) - { - } - - [Theory] - [WithFile(TestImages.Jpeg.Baseline.Bad.MissingEOF, PixelTypes.Rgba32)] - public void LoadBaselineImage(TestImageProvider provider) - where TPixel : struct, IPixel - { - using (Image image = provider.GetImage()) - { - Assert.NotNull(image); - image.DebugSave(provider); - } - } - - [Theory] // TODO: #18 - [WithFile(TestImages.Jpeg.Progressive.Bad.BadEOF, PixelTypes.Rgba32)] - public void LoadProgressiveImage(TestImageProvider provider) - where TPixel : struct, IPixel - { - using (Image image = provider.GetImage()) - { - Assert.NotNull(image); - image.DebugSave(provider); - } - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs index 277554586..2d31a59f9 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs @@ -28,10 +28,16 @@ namespace SixLabors.ImageSharp.Tests { TestImages.Jpeg.Baseline.Calliphora, TestImages.Jpeg.Baseline.Cmyk, TestImages.Jpeg.Baseline.Jpeg400, TestImages.Jpeg.Baseline.Jpeg444, - TestImages.Jpeg.Baseline.Testimgorig + TestImages.Jpeg.Baseline.Testimgorig, + TestImages.Jpeg.Baseline.Bad.BadEOF, + TestImages.Jpeg.Baseline.Bad.ExifUndefType, }; - public static string[] ProgressiveTestJpegs = TestImages.Jpeg.Progressive.All; + public static string[] ProgressiveTestJpegs = + { + TestImages.Jpeg.Progressive.Fb, TestImages.Jpeg.Progressive.Progress, + TestImages.Jpeg.Progressive.Festzug, TestImages.Jpeg.Progressive.Bad.BadEOF + }; // TODO: We should make this comparer less tolerant ... private static readonly ImageComparer VeryTolerantJpegComparer = @@ -44,99 +50,117 @@ namespace SixLabors.ImageSharp.Tests private ITestOutputHelper Output { get; } - private static IImageDecoder OriginalDecoder => new OldJpegDecoder(); - - private static IImageDecoder PdfJsDecoder => new JpegDecoder(); - - private float GetDifferenceInPercents(Image image, TestImageProvider provider) - where TPixel : struct, IPixel - { - var reportingComparer = ImageComparer.Tolerant(0, 0); - - ImageSimilarityReport report = image.GetReferenceOutputSimilarityReports( - provider, - reportingComparer, - appendPixelTypeToFileName: false).SingleOrDefault(); - - if (report != null && report.TotalNormalizedDifference.HasValue) - { - return report.TotalNormalizedDifference.Value * 100; - } - - return 0; - } + private static IImageDecoder OldJpegDecoder => new OldJpegDecoder(); + private static IImageDecoder PdfJsJpegDecoder => new JpegDecoder(); + [Theory] - [WithFileCollection(nameof(BaselineTestJpegs), PixelTypes.Rgba32)] - public void CompareJpegDecoders(TestImageProvider provider) + [WithFileCollection(nameof(BaselineTestJpegs), PixelTypes.Rgba32 | PixelTypes.Rgba32 | PixelTypes.Argb32)] + public void DecodeBaselineJpeg(TestImageProvider provider) where TPixel : struct, IPixel { - this.Output.WriteLine(provider.SourceFileOrDescription); - provider.Utility.TestName = nameof(this.DecodeBaselineJpeg); - - using (Image image = provider.GetImage(OriginalDecoder)) + using (Image image = provider.GetImage(PdfJsJpegDecoder)) { - double d = this.GetDifferenceInPercents(image, provider); - this.Output.WriteLine($"Difference using ORIGINAL decoder: {d:0.0000}%"); - } + image.DebugSave(provider); - using (Image image = provider.GetImage(PdfJsDecoder)) - { - double d = this.GetDifferenceInPercents(image, provider); - this.Output.WriteLine($"Difference using PDFJS decoder: {d:0.0000}%"); + image.CompareToReferenceOutput(provider, VeryTolerantJpegComparer, appendPixelTypeToFileName: false); } } [Theory] [WithFileCollection(nameof(BaselineTestJpegs), PixelTypes.Rgba32 | PixelTypes.Rgba32 | PixelTypes.Argb32)] - public void DecodeBaselineJpeg(TestImageProvider provider) + public void DecodeBaselineJpeg_Old(TestImageProvider provider) where TPixel : struct, IPixel { - using (Image image = provider.GetImage(OriginalDecoder)) + using (Image image = provider.GetImage(OldJpegDecoder)) { image.DebugSave(provider); + + provider.Utility.TestName = nameof(this.DecodeBaselineJpeg); image.CompareToReferenceOutput(provider, VeryTolerantJpegComparer, appendPixelTypeToFileName: false); } } [Theory] - [WithFileCollection(nameof(BaselineTestJpegs), PixelTypes.Rgba32 | PixelTypes.Rgba32 | PixelTypes.Argb32)] - public void DecodeBaselineJpeg_PdfJs(TestImageProvider provider) + [WithFileCollection(nameof(ProgressiveTestJpegs), PixelTypes.Rgba32 | PixelTypes.Rgba32 | PixelTypes.Argb32)] + public void DecodeProgressiveJpeg(TestImageProvider provider) where TPixel : struct, IPixel { - using (Image image = provider.GetImage(PdfJsDecoder)) + using (Image image = provider.GetImage(PdfJsJpegDecoder)) { image.DebugSave(provider); - - provider.Utility.TestName = nameof(this.DecodeBaselineJpeg); + image.CompareToReferenceOutput(provider, VeryTolerantJpegComparer, appendPixelTypeToFileName: false); } } [Theory] [WithFileCollection(nameof(ProgressiveTestJpegs), PixelTypes.Rgba32 | PixelTypes.Rgba32 | PixelTypes.Argb32)] - public void DecodeProgressiveJpeg(TestImageProvider provider) + public void DecodeProgressiveJpeg_Old(TestImageProvider provider) where TPixel : struct, IPixel { - using (Image image = provider.GetImage(OriginalDecoder)) + using (Image image = provider.GetImage(OldJpegDecoder)) { - image.DebugSave(provider, VeryTolerantJpegComparer); + image.DebugSave(provider); + + provider.Utility.TestName = nameof(this.DecodeProgressiveJpeg); + image.CompareToReferenceOutput(provider, VeryTolerantJpegComparer, appendPixelTypeToFileName: false); } } + + private float GetDifferenceInPercents(Image image, TestImageProvider provider) + where TPixel : struct, IPixel + { + var reportingComparer = ImageComparer.Tolerant(0, 0); + ImageSimilarityReport report = image.GetReferenceOutputSimilarityReports( + provider, + reportingComparer, + appendPixelTypeToFileName: false).SingleOrDefault(); - [Theory] - [WithFileCollection(nameof(ProgressiveTestJpegs), PixelTypes.Rgba32 | PixelTypes.Rgba32 | PixelTypes.Argb32)] - public void DecodeProgressiveJpeg_PdfJs(TestImageProvider provider) + if (report != null && report.TotalNormalizedDifference.HasValue) + { + return report.TotalNormalizedDifference.Value * 100; + } + + return 0; + } + + private void CompareJpegDecodersImpl(TestImageProvider provider, string testName) where TPixel : struct, IPixel { - using (Image image = provider.GetImage(PdfJsDecoder)) + this.Output.WriteLine(provider.SourceFileOrDescription); + provider.Utility.TestName = testName; + + using (Image image = provider.GetImage(OldJpegDecoder)) { - image.DebugSave(provider, VeryTolerantJpegComparer); + double d = this.GetDifferenceInPercents(image, provider); + this.Output.WriteLine($"Difference using ORIGINAL decoder: {d:0.0000}%"); + } + + using (Image image = provider.GetImage(PdfJsJpegDecoder)) + { + double d = this.GetDifferenceInPercents(image, provider); + this.Output.WriteLine($"Difference using PDFJS decoder: {d:0.0000}%"); } } + [Theory] + [WithFileCollection(nameof(BaselineTestJpegs), PixelTypes.Rgba32)] + public void CompareJpegDecoders_Baseline(TestImageProvider provider) + where TPixel : struct, IPixel + { + this.CompareJpegDecodersImpl(provider, nameof(this.DecodeBaselineJpeg)); + } + [Theory] + [WithFileCollection(nameof(ProgressiveTestJpegs), PixelTypes.Rgba32)] + public void CompareJpegDecoders_Progressive(TestImageProvider provider) + where TPixel : struct, IPixel + { + this.CompareJpegDecodersImpl(provider, nameof(this.DecodeProgressiveJpeg)); + } + [Theory] [WithSolidFilledImages(16, 16, 255, 0, 0, PixelTypes.Rgba32, JpegSubsample.Ratio420, 75)] [WithSolidFilledImages(16, 16, 255, 0, 0, PixelTypes.Rgba32, JpegSubsample.Ratio420, 100)] diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 64c08b7e4..4adc9bd72 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -84,7 +84,7 @@ namespace SixLabors.ImageSharp.Tests { public static class Bad { - public const string MissingEOF = "Jpg/baseline/badeof.jpg"; + public const string BadEOF = "Jpg/baseline/badeof.jpg"; public const string ExifUndefType = "Jpg/baseline/ExifUndefType.jpg"; } diff --git a/tests/Images/External b/tests/Images/External index 9ac60731a..086c854f0 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit 9ac60731a5da104690453e104db84d6ed6971622 +Subproject commit 086c854f001e3bb1fa9085e76ba902171140dcc6