diff --git a/TUnit.Assertions/Assertions/Enums/EnumAssertions.cs b/TUnit.Assertions/Assertions/Enums/EnumAssertions.cs index 441a1073be..ca5d001106 100644 --- a/TUnit.Assertions/Assertions/Enums/EnumAssertions.cs +++ b/TUnit.Assertions/Assertions/Enums/EnumAssertions.cs @@ -22,7 +22,7 @@ protected override Task CheckAsync(EvaluationMetadata me if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}", exception)); } #if NET @@ -59,7 +59,7 @@ protected override Task CheckAsync(EvaluationMetadata me if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}", exception)); } #if NET diff --git a/TUnit.Assertions/Assertions/Regex/GroupAssertion.cs b/TUnit.Assertions/Assertions/Regex/GroupAssertion.cs index b2b998ea6e..35f47e4d98 100644 --- a/TUnit.Assertions/Assertions/Regex/GroupAssertion.cs +++ b/TUnit.Assertions/Assertions/Regex/GroupAssertion.cs @@ -41,7 +41,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata(groupValue, _groupName ?? $"group {_groupIndex}"); @@ -116,7 +117,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata(groupValue, _groupName ?? $"group {_groupIndex}"); diff --git a/TUnit.Assertions/Assertions/Regex/MatchAssertion.cs b/TUnit.Assertions/Assertions/Regex/MatchAssertion.cs index 41aef69833..4649ccd191 100644 --- a/TUnit.Assertions/Assertions/Regex/MatchAssertion.cs +++ b/TUnit.Assertions/Assertions/Regex/MatchAssertion.cs @@ -28,7 +28,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata(match, $"match at index {_index}"); diff --git a/TUnit.Assertions/Assertions/Regex/MatchIndexAssertion.cs b/TUnit.Assertions/Assertions/Regex/MatchIndexAssertion.cs index fa6867476f..38c92d0665 100644 --- a/TUnit.Assertions/Assertions/Regex/MatchIndexAssertion.cs +++ b/TUnit.Assertions/Assertions/Regex/MatchIndexAssertion.cs @@ -46,9 +46,9 @@ protected override Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}", exception)); } if (value == null) @@ -141,7 +141,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}", exception)); } if (value == null) diff --git a/TUnit.Assertions/Collections/MemoryAssertions.cs b/TUnit.Assertions/Collections/MemoryAssertions.cs index 0cbaf3b12a..2c24d2c83e 100644 --- a/TUnit.Assertions/Collections/MemoryAssertions.cs +++ b/TUnit.Assertions/Collections/MemoryAssertions.cs @@ -29,7 +29,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -65,7 +65,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -107,7 +107,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -149,7 +149,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -204,7 +204,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -250,7 +250,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -292,7 +292,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -331,7 +331,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -370,7 +370,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -409,7 +409,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -448,7 +448,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -609,7 +609,7 @@ protected override Task CheckAsync(EvaluationMetadata { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) diff --git a/TUnit.Assertions/Conditions/AsyncEnumerableAssertions.cs b/TUnit.Assertions/Conditions/AsyncEnumerableAssertions.cs index 5dc50b2980..4767edbd14 100644 --- a/TUnit.Assertions/Conditions/AsyncEnumerableAssertions.cs +++ b/TUnit.Assertions/Conditions/AsyncEnumerableAssertions.cs @@ -17,7 +17,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Deep comparison with ignored types diff --git a/TUnit.Assertions/Conditions/EquatableAssertion.cs b/TUnit.Assertions/Conditions/EquatableAssertion.cs index 88a82106b8..9bb5280811 100644 --- a/TUnit.Assertions/Conditions/EquatableAssertion.cs +++ b/TUnit.Assertions/Conditions/EquatableAssertion.cs @@ -29,7 +29,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -74,7 +74,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (!value.HasValue) diff --git a/TUnit.Assertions/Conditions/ExceptionPropertyAssertions.cs b/TUnit.Assertions/Conditions/ExceptionPropertyAssertions.cs index df9366496e..a92986149e 100644 --- a/TUnit.Assertions/Conditions/ExceptionPropertyAssertions.cs +++ b/TUnit.Assertions/Conditions/ExceptionPropertyAssertions.cs @@ -30,7 +30,7 @@ protected override Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -148,7 +148,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) diff --git a/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs b/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs index b7a8eb0e45..6d4acdaa49 100644 --- a/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs +++ b/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs @@ -31,7 +31,7 @@ protected override Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -315,7 +315,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -376,7 +376,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -436,7 +436,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -553,7 +553,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -609,7 +609,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Deep comparison with ignored types diff --git a/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs b/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs index 41a6d3d880..49594adea0 100644 --- a/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs +++ b/TUnit.Assertions/Conditions/NotEquivalentToAssertion.cs @@ -59,7 +59,7 @@ protected override Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}", exception)); } // Create a temporary StructuralEquivalencyAssertion to reuse the comparison logic diff --git a/TUnit.Assertions/Conditions/NullAssertion.cs b/TUnit.Assertions/Conditions/NullAssertion.cs index a098e53c59..2a6c15a742 100644 --- a/TUnit.Assertions/Conditions/NullAssertion.cs +++ b/TUnit.Assertions/Conditions/NullAssertion.cs @@ -67,7 +67,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (EqualityComparer.Default.Equals(value!, default!)) @@ -100,7 +100,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (!EqualityComparer.Default.Equals(value!, default!)) @@ -134,7 +134,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (!value.HasValue) @@ -168,7 +168,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value.HasValue) @@ -202,7 +202,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (EqualityComparer.Default.Equals(value!, default!)) @@ -236,7 +236,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (!EqualityComparer.Default.Equals(value!, default!)) diff --git a/TUnit.Assertions/Conditions/NumericIsCloseToAssertion.cs b/TUnit.Assertions/Conditions/NumericIsCloseToAssertion.cs index d6b0dafb8c..0062380ae7 100644 --- a/TUnit.Assertions/Conditions/NumericIsCloseToAssertion.cs +++ b/TUnit.Assertions/Conditions/NumericIsCloseToAssertion.cs @@ -41,7 +41,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Handle NaN comparisons @@ -114,7 +114,7 @@ protected override Task CheckAsync(EvaluationMetadata me if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Handle NaN comparisons @@ -185,7 +185,7 @@ protected override Task CheckAsync(EvaluationMetadata meta if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var diff = Math.Abs((long)value - _expected); @@ -231,7 +231,7 @@ protected override Task CheckAsync(EvaluationMetadata met if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var diff = Math.Abs((decimal) value - _expected); @@ -275,7 +275,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var diff = Math.Abs(value - _expected); diff --git a/TUnit.Assertions/Conditions/NumericIsWithinPercentOfAssertion.cs b/TUnit.Assertions/Conditions/NumericIsWithinPercentOfAssertion.cs index 2457669be7..09f75cbe67 100644 --- a/TUnit.Assertions/Conditions/NumericIsWithinPercentOfAssertion.cs +++ b/TUnit.Assertions/Conditions/NumericIsWithinPercentOfAssertion.cs @@ -40,7 +40,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Handle NaN comparisons @@ -121,7 +121,7 @@ protected override Task CheckAsync(EvaluationMetadata me if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Handle NaN comparisons @@ -198,7 +198,7 @@ protected override Task CheckAsync(EvaluationMetadata meta if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var diff = Math.Abs((double)value - _expected); @@ -251,7 +251,7 @@ protected override Task CheckAsync(EvaluationMetadata met if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var diff = Math.Abs((double)value - _expected); @@ -304,7 +304,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var diff = Math.Abs(value - _expected); diff --git a/TUnit.Assertions/Conditions/PredicateAssertions.cs b/TUnit.Assertions/Conditions/PredicateAssertions.cs index b8e8603600..904b20a98f 100644 --- a/TUnit.Assertions/Conditions/PredicateAssertions.cs +++ b/TUnit.Assertions/Conditions/PredicateAssertions.cs @@ -30,7 +30,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (_predicate(value)) @@ -80,7 +80,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var comparer = GetComparer(); diff --git a/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs b/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs index 9cade6088f..5d91d94373 100644 --- a/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs +++ b/TUnit.Assertions/Conditions/ReadOnlyListAssertions.cs @@ -31,7 +31,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -317,7 +317,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -378,7 +378,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -438,7 +438,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -555,7 +555,7 @@ protected override Task CheckAsync(EvaluationMetadata me { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -611,7 +611,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -70,7 +70,7 @@ protected override Task CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -110,7 +110,7 @@ protected override Task CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -150,7 +150,7 @@ protected override Task CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -190,7 +190,7 @@ protected override Task CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -230,7 +230,7 @@ protected override Task CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) @@ -270,7 +270,7 @@ protected override Task CheckAsync(EvaluationMetadata met { if (metadata.Exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {metadata.Exception.GetType().Name}", metadata.Exception)); } if (metadata.Value == null) diff --git a/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs b/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs index 87ca9a9574..abdab1668c 100644 --- a/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs +++ b/TUnit.Assertions/Conditions/SpecializedEqualityAssertions.cs @@ -423,7 +423,7 @@ protected override Task CheckAsync(EvaluationMetadata if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (_tolerance.HasValue) diff --git a/TUnit.Assertions/Conditions/StringAssertions.cs b/TUnit.Assertions/Conditions/StringAssertions.cs index 8879b37f08..ef0fdc653f 100644 --- a/TUnit.Assertions/Conditions/StringAssertions.cs +++ b/TUnit.Assertions/Conditions/StringAssertions.cs @@ -70,7 +70,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -189,7 +189,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -256,7 +256,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -323,7 +323,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -390,7 +390,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -457,7 +457,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -498,7 +498,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -610,7 +610,7 @@ protected override Task CheckAsync(EvaluationMetadata() @@ -682,7 +682,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } // Validate the regex pattern first (by creating a Regex object if we don't have one) diff --git a/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs b/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs index 29b80d4d89..92483280e1 100644 --- a/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs +++ b/TUnit.Assertions/Conditions/StructuralEquivalencyAssertion.cs @@ -75,7 +75,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}: {exception.Message}", exception)); } var result = CompareObjects( diff --git a/TUnit.Assertions/Conditions/ThrowsAssertion.cs b/TUnit.Assertions/Conditions/ThrowsAssertion.cs index 3b4de430b7..809d5e0ec3 100644 --- a/TUnit.Assertions/Conditions/ThrowsAssertion.cs +++ b/TUnit.Assertions/Conditions/ThrowsAssertion.cs @@ -38,7 +38,7 @@ protected sealed override Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } var actual = value!; diff --git a/TUnit.Assertions/Conditions/TypeOfAssertion.cs b/TUnit.Assertions/Conditions/TypeOfAssertion.cs index 7682f94b87..bc08a750e5 100644 --- a/TUnit.Assertions/Conditions/TypeOfAssertion.cs +++ b/TUnit.Assertions/Conditions/TypeOfAssertion.cs @@ -69,7 +69,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) @@ -309,7 +309,7 @@ protected override Task CheckAsync(EvaluationMetadata m if (exception != null) { - return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}")); + return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}", exception)); } if (value == null) diff --git a/TUnit.Assertions/Conditions/WaitsForAssertion.cs b/TUnit.Assertions/Conditions/WaitsForAssertion.cs index 254019468a..e57df59e0f 100644 --- a/TUnit.Assertions/Conditions/WaitsForAssertion.cs +++ b/TUnit.Assertions/Conditions/WaitsForAssertion.cs @@ -86,8 +86,10 @@ protected override async Task CheckAsync(EvaluationMetadata diff --git a/TUnit.Assertions/Conditions/WithInnerExceptionsAssertion.cs b/TUnit.Assertions/Conditions/WithInnerExceptionsAssertion.cs index 302451d121..877684f36a 100644 --- a/TUnit.Assertions/Conditions/WithInnerExceptionsAssertion.cs +++ b/TUnit.Assertions/Conditions/WithInnerExceptionsAssertion.cs @@ -25,7 +25,7 @@ protected override async Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata diff --git a/TUnit.Assertions/Core/AssertionResult.cs b/TUnit.Assertions/Core/AssertionResult.cs index e50b4d9424..0e528f1b0c 100644 --- a/TUnit.Assertions/Core/AssertionResult.cs +++ b/TUnit.Assertions/Core/AssertionResult.cs @@ -5,27 +5,35 @@ namespace TUnit.Assertions.Core; /// public readonly struct AssertionResult { + private static readonly AssertionResult _passed = new(true, string.Empty); internal static readonly Task _passedTask = Task.FromResult(Passed); public bool IsPassed { get; } public string Message { get; } + public Exception? Exception { get; } - private AssertionResult(bool isPassed, string message) + private AssertionResult(bool isPassed, string message, Exception? exception = null) { IsPassed = isPassed; Message = message ?? string.Empty; + Exception = exception; } /// /// Creates a passing assertion result. /// - public static AssertionResult Passed => new(true, string.Empty); + public static AssertionResult Passed => _passed; /// /// Creates a failing assertion result with a message describing what was found. /// public static AssertionResult Failed(string message) => new(false, message); + /// + /// Creates a failing assertion result with a message and an associated exception. + /// + public static AssertionResult Failed(string message, Exception? exception) => new(false, message, exception); + /// /// Helper method to conditionally create a failed result. /// Returns Passed if condition is false, Failed with message if condition is true. diff --git a/TUnit.Assertions/Core/AssertionResult{T}.cs b/TUnit.Assertions/Core/AssertionResult{T}.cs index 46be85158f..a0626470cf 100644 --- a/TUnit.Assertions/Core/AssertionResult{T}.cs +++ b/TUnit.Assertions/Core/AssertionResult{T}.cs @@ -11,12 +11,14 @@ public readonly struct AssertionResult public bool IsPassed { get; } public string Message { get; } public T? Value { get; } + public Exception? Exception { get; } - private AssertionResult(bool isPassed, string message, T? value) + private AssertionResult(bool isPassed, string message, T? value, Exception? exception = null) { IsPassed = isPassed; Message = message ?? string.Empty; Value = value; + Exception = exception; } /// @@ -27,6 +29,8 @@ private AssertionResult(bool isPassed, string message, T? value) internal static AssertionResult Failed(string message) => new(false, message, default); + internal static AssertionResult Failed(string message, Exception? exception) => new(false, message, default, exception); + /// /// Allows implicit conversion from a non-generic (failure only). /// Converting a passed without a value will throw. @@ -39,6 +43,6 @@ public static implicit operator AssertionResult(AssertionResult result) "Cannot convert a passed AssertionResult to AssertionResult without a value. Use AssertionResult.Passed(value) instead."); } - return Failed(result.Message); + return new AssertionResult(false, result.Message, default, result.Exception); } } diff --git a/TUnit.Mocks.Assertions/WasCalledAssertion.cs b/TUnit.Mocks.Assertions/WasCalledAssertion.cs index b49f499860..6c29ee631c 100644 --- a/TUnit.Mocks.Assertions/WasCalledAssertion.cs +++ b/TUnit.Mocks.Assertions/WasCalledAssertion.cs @@ -34,7 +34,7 @@ protected override Task CheckAsync(EvaluationMetadata CheckAsync(EvaluationMetadata { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public T Value { get; } 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 8e96e7b507..0278b550de 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 @@ -2384,14 +2384,17 @@ namespace .Core } public readonly struct AssertionResult { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public static . Passed { get; } public static . FailIf(bool condition, string message) { } public static . Failed(string message) { } + public static . Failed(string message, ? exception) { } } public readonly struct AssertionResult { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public T Value { get; } 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 130da6da01..307bdde769 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 @@ -2405,14 +2405,17 @@ namespace .Core } public readonly struct AssertionResult { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public static . Passed { get; } public static . FailIf(bool condition, string message) { } public static . Failed(string message) { } + public static . Failed(string message, ? exception) { } } public readonly struct AssertionResult { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public T Value { get; } 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 d6535daa29..9d341ae661 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 @@ -2156,14 +2156,17 @@ namespace .Core } public readonly struct AssertionResult { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public static . Passed { get; } public static . FailIf(bool condition, string message) { } public static . Failed(string message) { } + public static . Failed(string message, ? exception) { } } public readonly struct AssertionResult { + public ? Exception { get; } public bool IsPassed { get; } public string Message { get; } public T Value { get; } diff --git a/TUnit.TestProject/AssertionResultExceptionPropagationTests.cs b/TUnit.TestProject/AssertionResultExceptionPropagationTests.cs new file mode 100644 index 0000000000..da9eaef75f --- /dev/null +++ b/TUnit.TestProject/AssertionResultExceptionPropagationTests.cs @@ -0,0 +1,46 @@ +using TUnit.Assertions.Exceptions; + +namespace TUnit.TestProject; + +public class AssertionResultExceptionPropagationTests +{ + [Test] + public async Task Nested_Collection_Assertion_Failure_Preserves_InnerException() + { + var items = new[] { 1, 2, 3 }; + + AssertionException? caught = null; + try + { + await Assert.That(items).All().Satisfy(x => x.IsEqualTo(99)); + } + catch (AssertionException ex) + { + caught = ex; + } + + await Assert.That(caught).IsNotNull(); + await Assert.That(caught!.InnerException).IsNotNull(); + await Assert.That(caught.InnerException).IsTypeOf(); + } + + [Test] + public async Task Mapped_Assertion_Failure_Preserves_InnerException() + { + var value = "hello"; + + AssertionException? caught = null; + try + { + await Assert.That(value).Satisfies(v => v.Length, length => length.IsEqualTo(99)); + } + catch (AssertionException ex) + { + caught = ex; + } + + await Assert.That(caught).IsNotNull(); + await Assert.That(caught!.InnerException).IsNotNull(); + await Assert.That(caught.InnerException).IsTypeOf(); + } +}