📷 A modern, cross-platform, 2D Graphics library for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

175 lines
6.5 KiB

// ReSharper disable InconsistentNaming
namespace ImageSharp.Tests
{
using ImageSharp.PixelFormats;
using SixLabors.Primitives;
using Xunit;
using Xunit.Abstractions;
public class ImageComparerTests
{
public ImageComparerTests(ITestOutputHelper output)
{
this.Output = output;
}
private ITestOutputHelper Output { get; }
[Theory]
[WithTestPatternImages(
100,
100,
PixelTypes.Rgba32,
PercentageImageComparer.DefaultImageThreshold,
PercentageImageComparer.DefaultSegmentThreshold,
PercentageImageComparer.DefaultScaleIntoSize)]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32, 0, 0, 100)]
public void PercentageComparer_ApprovesPerfectSimilarity<TPixel>(
TestImageProvider<TPixel> provider,
float imageTheshold,
byte segmentThreshold,
int scaleIntoSize)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone())
{
PercentageImageComparer.VerifySimilarity(
image,
clone,
imageTheshold,
segmentThreshold,
scaleIntoSize);
}
}
}
private static void ModifyPixel<TPixel>(Image<TPixel> img, int x, int y, byte value)
where TPixel : struct, IPixel<TPixel>
{
TPixel pixel = img[x, y];
var rgbaPixel = default(Rgba32);
pixel.ToRgba32(ref rgbaPixel);
rgbaPixel.R += value;
pixel.PackFromRgba32(rgbaPixel);
img[x, y] = pixel;
}
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32)]
public void PercentageComparer_ApprovesImperfectSimilarity<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone())
{
ModifyPixel(clone, 0, 0, 2);
PercentageImageComparer.VerifySimilarity(image, clone, scaleIntoSize: 100);
}
}
}
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32, 99, 100)]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32, 100, 99)]
public void PercentageComparer_ThrowsOnSizeMismatch<TPixel>(TestImageProvider<TPixel> provider, int w, int h)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone(ctx => ctx.Resize(w, h)))
{
ImageDimensionsMismatchException ex = Assert.ThrowsAny<ImageDimensionsMismatchException>(
() =>
{
PercentageImageComparer.VerifySimilarity(image, clone);
});
this.Output.WriteLine(ex.Message);
}
}
}
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32)]
public void PercentageComparer_WhenDifferenceIsTooLarge_Throws<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone())
{
ModifyPixel(clone, 0, 0, 42);
ModifyPixel(clone, 1, 0, 42);
ModifyPixel(clone, 2, 0, 42);
Assert.ThrowsAny<ImagesSimilarityException>(
() => { PercentageImageComparer.VerifySimilarity(image, clone, scaleIntoSize: 100); });
}
}
}
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32)]
public void ExactComparer_ApprovesExactEquality<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone())
{
ExactComparer.Instance.Verify(image, clone);
}
}
}
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32, 99, 100)]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32, 100, 99)]
public void ExactComparer_ThrowsOnSizeMismatch<TPixel>(TestImageProvider<TPixel> provider, int w, int h)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone(ctx => ctx.Resize(w, h)))
{
ImageDimensionsMismatchException ex = Assert.ThrowsAny<ImageDimensionsMismatchException>(
() =>
{
ExactComparer.Instance.Verify(image, clone);
});
this.Output.WriteLine(ex.Message);
}
}
}
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32)]
public void ExactComparer_ThrowsOnSmallestPixelDifference<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>
{
using (Image<TPixel> image = provider.GetImage())
{
using (Image<TPixel> clone = image.Clone())
{
ModifyPixel(clone, 42, 42, 1);
ModifyPixel(clone, 7, 93, 1);
ImagesAreNotEqualException ex = Assert.ThrowsAny<ImagesAreNotEqualException>(
() =>
{
ExactComparer.Instance.Verify(image, clone);
});
this.Output.WriteLine(ex.Message);
Assert.Equal(2, ex.Differences.Length);
Assert.Contains(new Point(42, 24), ex.Differences);
Assert.Contains(new Point(7, 93), ex.Differences);
}
}
}
}
}