diff --git a/TUnit.Assertions.Tests/Old/DecimalEqualsToAssertionTests.cs b/TUnit.Assertions.Tests/Old/DecimalEqualsToAssertionTests.cs index 24312a87b1..3da6dfc15c 100644 --- a/TUnit.Assertions.Tests/Old/DecimalEqualsToAssertionTests.cs +++ b/TUnit.Assertions.Tests/Old/DecimalEqualsToAssertionTests.cs @@ -24,19 +24,19 @@ public async Task Decimal_EqualsTo_Failure() [Test] public async Task Decimal_EqualsTo__With_Tolerance_Success() { - var double1 = 1.0001d; - var double2 = 1.0002d; - - await TUnitAssert.That(double1).IsEqualTo(double2).Within(0.0001); + var decimal1 = 1.0001m; + var decimal2 = 1.0002m; + + await TUnitAssert.That(decimal1).IsEqualTo(decimal2).Within(0.0001m); } - + [Test] public async Task Decimal_EqualsTo__With_Tolerance_Failure() { - var double1 = 1.0001d; - var double2 = 1.0003d; - - await TUnitAssert.ThrowsAsync(async () => await TUnitAssert.That(double1).IsEqualTo(double2).Within(0.0001)); + var decimal1 = 1.0001m; + var decimal2 = 1.0003m; + + await TUnitAssert.ThrowsAsync(async () => await TUnitAssert.That(decimal1).IsEqualTo(decimal2).Within(0.0001m)); } #endif } diff --git a/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs b/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs index c722fd80dc..4ed908fb22 100644 --- a/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs +++ b/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs @@ -309,6 +309,41 @@ protected override bool AreExactlyEqual(long actual, long expected) } } +/// +/// Asserts that a decimal value is equal to another, with optional tolerance. +/// +[AssertionExtension("IsEqualTo", OverloadResolutionPriority = 2)] +public class DecimalEqualsAssertion : ToleranceBasedEqualsAssertion +{ + public DecimalEqualsAssertion( + AssertionContext context, + decimal expected) + : base(context, expected) + { + } + + protected override bool HasToleranceValue() + { + return true; // decimal? always has meaningful value when not null + } + + protected override bool IsWithinTolerance(decimal actual, decimal expected, decimal tolerance) + { + var diff = Math.Abs(actual - expected); + return diff <= tolerance; + } + + protected override object CalculateDifference(decimal actual, decimal expected) + { + return Math.Abs(actual - expected); + } + + protected override bool AreExactlyEqual(decimal actual, decimal expected) + { + return actual == expected; + } +} + /// /// Asserts that a DateTimeOffset value is equal to another, with optional tolerance. /// diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index df8d331c86..8057b2c46b 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -677,6 +677,15 @@ namespace .Conditions [.(ExpectationMessage="to be a weekend day")] public static bool IsWeekend(this value) { } } + [.("IsEqualTo", OverloadResolutionPriority=2)] + public class DecimalEqualsAssertion : . + { + public DecimalEqualsAssertion(. context, decimal expected) { } + protected override bool AreExactlyEqual(decimal actual, decimal expected) { } + protected override object CalculateDifference(decimal actual, decimal expected) { } + protected override bool HasToleranceValue() { } + protected override bool IsWithinTolerance(decimal actual, decimal expected, decimal tolerance) { } + } public class DictionaryContainsKeyAssertion : . where TDictionary : . { @@ -2500,6 +2509,11 @@ namespace .Extensions protected override .<.> CheckAsync(.<> metadata) { } protected override string GetExpectation() { } } + public static class DecimalEqualsAssertionExtensions + { + [.(2)] + public static . IsEqualTo(this . source, decimal expected, [.("expected")] string? expectedExpression = null) { } + } public static class DirectoryHasFilesAssertionExtensions { public static . HasFiles(this .<.DirectoryInfo> source) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 8b00b719b5..7300961860 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -674,6 +674,15 @@ namespace .Conditions [.(ExpectationMessage="to be a weekend day")] public static bool IsWeekend(this value) { } } + [.("IsEqualTo", OverloadResolutionPriority=2)] + public class DecimalEqualsAssertion : . + { + public DecimalEqualsAssertion(. context, decimal expected) { } + protected override bool AreExactlyEqual(decimal actual, decimal expected) { } + protected override object CalculateDifference(decimal actual, decimal expected) { } + protected override bool HasToleranceValue() { } + protected override bool IsWithinTolerance(decimal actual, decimal expected, decimal tolerance) { } + } public class DictionaryContainsKeyAssertion : . where TDictionary : . { @@ -2494,6 +2503,10 @@ namespace .Extensions protected override .<.> CheckAsync(.<> metadata) { } protected override string GetExpectation() { } } + public static class DecimalEqualsAssertionExtensions + { + public static . IsEqualTo(this . source, decimal expected, [.("expected")] string? expectedExpression = null) { } + } public static class DirectoryHasFilesAssertionExtensions { public static . HasFiles(this .<.DirectoryInfo> source) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 4fe37c4155..cd77bad501 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -677,6 +677,15 @@ namespace .Conditions [.(ExpectationMessage="to be a weekend day")] public static bool IsWeekend(this value) { } } + [.("IsEqualTo", OverloadResolutionPriority=2)] + public class DecimalEqualsAssertion : . + { + public DecimalEqualsAssertion(. context, decimal expected) { } + protected override bool AreExactlyEqual(decimal actual, decimal expected) { } + protected override object CalculateDifference(decimal actual, decimal expected) { } + protected override bool HasToleranceValue() { } + protected override bool IsWithinTolerance(decimal actual, decimal expected, decimal tolerance) { } + } public class DictionaryContainsKeyAssertion : . where TDictionary : . { @@ -2500,6 +2509,11 @@ namespace .Extensions protected override .<.> CheckAsync(.<> metadata) { } protected override string GetExpectation() { } } + public static class DecimalEqualsAssertionExtensions + { + [.(2)] + public static . IsEqualTo(this . source, decimal expected, [.("expected")] string? expectedExpression = null) { } + } public static class DirectoryHasFilesAssertionExtensions { public static . HasFiles(this .<.DirectoryInfo> source) { } diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index 29795574b5..e412acfa30 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -637,6 +637,15 @@ namespace .Conditions [.(ExpectationMessage="to be a weekend day")] public static bool IsWeekend(this value) { } } + [.("IsEqualTo", OverloadResolutionPriority=2)] + public class DecimalEqualsAssertion : . + { + public DecimalEqualsAssertion(. context, decimal expected) { } + protected override bool AreExactlyEqual(decimal actual, decimal expected) { } + protected override object CalculateDifference(decimal actual, decimal expected) { } + protected override bool HasToleranceValue() { } + protected override bool IsWithinTolerance(decimal actual, decimal expected, decimal tolerance) { } + } public class DictionaryContainsKeyAssertion : . where TDictionary : . { @@ -2299,6 +2308,10 @@ namespace .Extensions protected override .<.> CheckAsync(.<> metadata) { } protected override string GetExpectation() { } } + public static class DecimalEqualsAssertionExtensions + { + public static . IsEqualTo(this . source, decimal expected, [.("expected")] string? expectedExpression = null) { } + } public static class DirectoryHasFilesAssertionExtensions { public static . HasFiles(this .<.DirectoryInfo> source) { }