diff --git a/.gitignore b/.gitignore
index be55021..9f65321 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,5 @@ obj/
*.DotSettings.user
.idea/
*.received.*
-nugets/
\ No newline at end of file
+nugets/
+src/nul
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 3a4bc1b..3a9ac1f 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -2,7 +2,7 @@
CS1591
- 3.8.1
+ 3.8.2
1.0.0
enable
preview
@@ -13,4 +13,4 @@
true
true
-
\ No newline at end of file
+
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index 6085157..86738a4 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -4,11 +4,11 @@
true
-
+
-
+
@@ -16,4 +16,4 @@
-
+
\ No newline at end of file
diff --git a/src/Tests/Tests.cs b/src/Tests/Tests.cs
index 39a13b4..09d06ef 100644
--- a/src/Tests/Tests.cs
+++ b/src/Tests/Tests.cs
@@ -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");