Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ obj/
*.DotSettings.user
.idea/
*.received.*
nugets/
nugets/
src/nul
4 changes: 2 additions & 2 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Project>
<PropertyGroup>
<NoWarn>CS1591</NoWarn>
<Version>3.8.1</Version>
<Version>3.8.2</Version>
<AssemblyVersion>1.0.0</AssemblyVersion>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>preview</LangVersion>
Expand All @@ -13,4 +13,4 @@
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
</PropertyGroup>
</Project>
</Project>
6 changes: 3 additions & 3 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="14.10.0" />
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="14.10.1" />
<PackageVersion Include="MarkdownSnippets.MsBuild" Version="28.0.0-beta.10" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="NUnit" Version="4.4.0" />
<PackageVersion Include="NUnit3TestAdapter" Version="5.2.0" Pinned="true"/>
<PackageVersion Include="NUnit3TestAdapter" Version="5.2.0" Pinned="true" />
<PackageVersion Include="Polyfill" Version="9.5.0" />
<PackageVersion Include="ProjectDefaults" Version="1.0.170" />
<PackageVersion Include="Verify" Version="31.9.3" />
<PackageVersion Include="Verify.DiffPlex" Version="3.1.2" />
<PackageVersion Include="Verify.Nunit" Version="31.9.3" />
<PackageVersion Include="Microsoft.Sbom.Targets" Version="4.1.5" />
</ItemGroup>
</Project>
</Project>
100 changes: 100 additions & 0 deletions src/Tests/Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,106 @@ public Task CompareDifferent()
return Verify(compare);
}

// https://github.com/VerifyTests/Verify.ImageMagick/issues/754
// Regression test: Ensure image comparisons correctly detect differences
// regardless of the threshold value (as long as diff > threshold)
[Test]
public async Task Issue754_DifferentImagesShouldNotBeEqual()
{
// Simulate UI screenshot comparison - white background with different text positions
using var image1 = new MagickImage(MagickColors.White, 200, 100);
using var text1 = new MagickImage(MagickColors.Black, 80, 20);
image1.Composite(text1, 10, 40, CompositeOperator.Over); // Text on left

using var image2 = new MagickImage(MagickColors.White, 200, 100);
using var text2 = new MagickImage(MagickColors.Black, 80, 20);
image2.Composite(text2, 110, 40, CompositeOperator.Over); // Text on right

var stream1 = new MemoryStream();
var stream2 = new MemoryStream();
image1.Write(stream1, MagickFormat.Png);
image2.Write(stream2, MagickFormat.Png);
stream1.Position = 0;
stream2.Position = 0;

// Get raw diff to understand the magnitude
using var img1 = new MagickImage(stream1);
using var img2 = new MagickImage(stream2);
var rawDiff = img1.Compare(img2, ErrorMetric.Fuzz);

stream1.Position = 0;
stream2.Position = 0;

// With an extremely small threshold, different images MUST be detected
var threshold = 0.00000000000001;
var compare = await VerifyImageMagick.Compare(threshold, ErrorMetric.Fuzz, stream1, stream2);

Assert.That(compare.IsEqual, Is.False,
$"Different images (diff={rawDiff}) should be detected with threshold={threshold}");
}

// https://github.com/VerifyTests/Verify.ImageMagick/issues/754
// Test that threshold=0 and tiny threshold behave consistently
[Test]
public async Task Issue754_ZeroVsNonZeroThreshold()
{
using var image1 = new MagickImage(MagickColors.White, 100, 100);
using var image2 = new MagickImage(MagickColors.White, 100, 100);

// Add a visible difference - 10x10 black square
using var diff = new MagickImage(MagickColors.Black, 10, 10);
image2.Composite(diff, 45, 45, CompositeOperator.Over);

var stream1 = new MemoryStream();
var stream2 = new MemoryStream();
image1.Write(stream1, MagickFormat.Png);
image2.Write(stream2, MagickFormat.Png);

// Compare with threshold = 0
stream1.Position = 0;
stream2.Position = 0;
var compareZero = await VerifyImageMagick.Compare(0, ErrorMetric.Fuzz, stream1, stream2);

// Compare with tiny non-zero threshold
stream1.Position = 0;
stream2.Position = 0;
var compareTiny = await VerifyImageMagick.Compare(0.00000000000001, ErrorMetric.Fuzz, stream1, stream2);

// Both should detect the difference
Assert.Multiple(() =>
{
Assert.That(compareZero.IsEqual, Is.False, "Threshold=0 should detect difference");
Assert.That(compareTiny.IsEqual, Is.False, "Tiny threshold should detect difference");
});
}

// https://github.com/VerifyTests/Verify.ImageMagick/issues/754
// Verify RootMeanSquared works as a reliable alternative
[Test]
public async Task Issue754_RootMeanSquaredAsAlternative()
{
using var image1 = new MagickImage(MagickColors.White, 100, 100);
using var block1 = new MagickImage(MagickColors.Gray, 20, 20);
image1.Composite(block1, 10, 10, CompositeOperator.Over);

using var image2 = new MagickImage(MagickColors.White, 100, 100);
using var block2 = new MagickImage(MagickColors.Gray, 20, 20);
image2.Composite(block2, 70, 70, CompositeOperator.Over);

var stream1 = new MemoryStream();
var stream2 = new MemoryStream();
image1.Write(stream1, MagickFormat.Png);
image2.Write(stream2, MagickFormat.Png);
stream1.Position = 0;
stream2.Position = 0;

var threshold = 0.00000000000001;
var compare = await VerifyImageMagick.Compare(threshold, ErrorMetric.RootMeanSquared, stream1, stream2);

Assert.That(compare.IsEqual, Is.False,
"RootMeanSquared should detect positional differences");
}

[Test]
public Task VerifyPdf() =>
VerifyFile("sample.pdf");
Expand Down