diff --git a/Source/aweXpect/That/Delegates/ThatDelegateThrows.WithParamName.cs b/Source/aweXpect/That/Delegates/ThatDelegateThrows.WithParamName.cs index 17632f72d..472c20b90 100644 --- a/Source/aweXpect/That/Delegates/ThatDelegateThrows.WithParamName.cs +++ b/Source/aweXpect/That/Delegates/ThatDelegateThrows.WithParamName.cs @@ -10,14 +10,25 @@ public static partial class ThatDelegateThrows /// /// Verifies that the actual has an param name. /// + /// + /// If is , does not verify anything. + /// public static AndOrResult> WithParamName( this ThatDelegateThrows source, - string expected) + string? expected) where TException : ArgumentException? - => new(source.ExpectationBuilder.AddConstraint((it, grammars) + { + if (expected == null) + { + return new AndOrResult>(source.ExpectationBuilder, source); + } + + return new AndOrResult>( + source.ExpectationBuilder.AddConstraint((it, grammars) => new ThatException.HasParamNameValueConstraint( it, grammars | ExpectationGrammars.Active | ExpectationGrammars.Nested, expected)), source); + } } diff --git a/Source/aweXpect/That/Exceptions/ThatException.HasParamName.cs b/Source/aweXpect/That/Exceptions/ThatException.HasParamName.cs index d983547b0..b84bea0ee 100644 --- a/Source/aweXpect/That/Exceptions/ThatException.HasParamName.cs +++ b/Source/aweXpect/That/Exceptions/ThatException.HasParamName.cs @@ -11,18 +11,21 @@ public static partial class ThatException /// /// Verifies that the actual has an param name. /// + /// + /// If is , does not verify anything. + /// public static AndOrResult> HasParamName( this IThat source, - string expected) + string? expected) where TException : ArgumentException? - => new(source.Get().ExpectationBuilder.AddConstraint((it, grammars) => - new HasParamNameValueConstraint(it, grammars, expected)), + => new(source.Get().ExpectationBuilder.AddConstraint((it, grammars) + => new HasParamNameValueConstraint(it, grammars, expected)), source); internal class HasParamNameValueConstraint( string it, ExpectationGrammars grammars, - string expected) + string? expected) : ConstraintResult.WithNotNullValue(it, grammars), IValueConstraint where TArgumentException : ArgumentException? @@ -30,7 +33,7 @@ internal class HasParamNameValueConstraint( public ConstraintResult IsMetBy(Exception? actual) { Actual = actual; - Outcome = actual is TArgumentException argumentException && argumentException.ParamName == expected + Outcome = actual is TArgumentException argumentException && (expected is null || argumentException.ParamName == expected) ? Outcome.Success : Outcome.Failure; return this; diff --git a/Tests/aweXpect.Api.Tests/Expected/aweXpect_net8.0.txt b/Tests/aweXpect.Api.Tests/Expected/aweXpect_net8.0.txt index 5a080c70f..3ff5ecb7f 100644 --- a/Tests/aweXpect.Api.Tests/Expected/aweXpect_net8.0.txt +++ b/Tests/aweXpect.Api.Tests/Expected/aweXpect_net8.0.txt @@ -280,7 +280,7 @@ namespace aweXpect where TException : System.Exception? { } public static aweXpect.Results.StringEqualityTypeResult> WithMessage(this aweXpect.Delegates.ThatDelegateThrows source, string expected) where TException : System.Exception? { } - public static aweXpect.Results.AndOrResult> WithParamName(this aweXpect.Delegates.ThatDelegateThrows source, string expected) + public static aweXpect.Results.AndOrResult> WithParamName(this aweXpect.Delegates.ThatDelegateThrows source, string? expected) where TException : System.ArgumentException? { } public static aweXpect.Results.AndOrResult> WithRecursiveInnerExceptions(this aweXpect.Delegates.ThatDelegateThrows source, System.Action>> expectations) where TException : System.Exception? { } @@ -669,7 +669,7 @@ namespace aweXpect public static aweXpect.Results.AndOrResult> HasInnerException(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> HasInnerException(this aweXpect.Core.IThat source, System.Action> expectations) { } public static aweXpect.Results.StringEqualityTypeResult> HasMessage(this aweXpect.Core.IThat source, string expected) { } - public static aweXpect.Results.AndOrResult> HasParamName(this aweXpect.Core.IThat source, string expected) + public static aweXpect.Results.AndOrResult> HasParamName(this aweXpect.Core.IThat source, string? expected) where TException : System.ArgumentException? { } public static aweXpect.Results.AndOrResult> HasRecursiveInnerExceptions(this aweXpect.Core.IThat source, System.Action>> expectations) { } } diff --git a/Tests/aweXpect.Api.Tests/Expected/aweXpect_netstandard2.0.txt b/Tests/aweXpect.Api.Tests/Expected/aweXpect_netstandard2.0.txt index 4285af7a1..e7e99a7e6 100644 --- a/Tests/aweXpect.Api.Tests/Expected/aweXpect_netstandard2.0.txt +++ b/Tests/aweXpect.Api.Tests/Expected/aweXpect_netstandard2.0.txt @@ -131,7 +131,7 @@ namespace aweXpect where TException : System.Exception? { } public static aweXpect.Results.StringEqualityTypeResult> WithMessage(this aweXpect.Delegates.ThatDelegateThrows source, string expected) where TException : System.Exception? { } - public static aweXpect.Results.AndOrResult> WithParamName(this aweXpect.Delegates.ThatDelegateThrows source, string expected) + public static aweXpect.Results.AndOrResult> WithParamName(this aweXpect.Delegates.ThatDelegateThrows source, string? expected) where TException : System.ArgumentException? { } public static aweXpect.Results.AndOrResult> WithRecursiveInnerExceptions(this aweXpect.Delegates.ThatDelegateThrows source, System.Action>> expectations) where TException : System.Exception? { } @@ -454,7 +454,7 @@ namespace aweXpect public static aweXpect.Results.AndOrResult> HasInnerException(this aweXpect.Core.IThat source) { } public static aweXpect.Results.AndOrResult> HasInnerException(this aweXpect.Core.IThat source, System.Action> expectations) { } public static aweXpect.Results.StringEqualityTypeResult> HasMessage(this aweXpect.Core.IThat source, string expected) { } - public static aweXpect.Results.AndOrResult> HasParamName(this aweXpect.Core.IThat source, string expected) + public static aweXpect.Results.AndOrResult> HasParamName(this aweXpect.Core.IThat source, string? expected) where TException : System.ArgumentException? { } public static aweXpect.Results.AndOrResult> HasRecursiveInnerExceptions(this aweXpect.Core.IThat source, System.Action>> expectations) { } } diff --git a/Tests/aweXpect.Tests/Delegates/ThatDelegate.Throws.WithParamNameTests.cs b/Tests/aweXpect.Tests/Delegates/ThatDelegate.Throws.WithParamNameTests.cs index f8baa70e4..ea1b7184e 100644 --- a/Tests/aweXpect.Tests/Delegates/ThatDelegate.Throws.WithParamNameTests.cs +++ b/Tests/aweXpect.Tests/Delegates/ThatDelegate.Throws.WithParamNameTests.cs @@ -6,6 +6,34 @@ public sealed partial class Throws { public class WithParamNameTests { + [Theory] + [AutoData] + public async Task WhenExpectedIsNull_AndParamNameIsEmpty_ShouldSucceed(string message) + { + ArgumentException exception = new(message); + void Delegate() => throw exception; + + async Task Act() + => await That(Delegate).Throws() + .WithParamName(null); + + await That(Act).DoesNotThrow(); + } + + [Theory] + [AutoData] + public async Task WhenExpectedIsNull_ShouldSucceed(string message) + { + ArgumentException exception = new(message, nameof(message)); + void Delegate() => throw exception; + + async Task Act() + => await That(Delegate).Throws() + .WithParamName(null); + + await That(Act).DoesNotThrow(); + } + [Theory] [AutoData] public async Task WhenParamNameIsDifferent_ShouldFail(string message) diff --git a/Tests/aweXpect.Tests/Exceptions/ThatException.HasParamName.Tests.cs b/Tests/aweXpect.Tests/Exceptions/ThatException.HasParamName.Tests.cs index f31f6f8e2..422cc4919 100644 --- a/Tests/aweXpect.Tests/Exceptions/ThatException.HasParamName.Tests.cs +++ b/Tests/aweXpect.Tests/Exceptions/ThatException.HasParamName.Tests.cs @@ -6,6 +6,30 @@ public class HasParamName { public sealed class Tests { + [Theory] + [AutoData] + public async Task WhenExpectedIsNull_AndParamNameIsEmpty_ShouldSucceed(string message) + { + ArgumentException subject = new(message); + + async Task Act() + => await That(subject).HasParamName(null); + + await That(Act).DoesNotThrow(); + } + + [Theory] + [AutoData] + public async Task WhenExpectedIsNull_ShouldSucceed(string message) + { + ArgumentException subject = new(message, nameof(message)); + + async Task Act() + => await That(subject).HasParamName(null); + + await That(Act).DoesNotThrow(); + } + [Theory] [AutoData] public async Task WhenParamNameIsDifferent_ShouldFail(string message)