diff --git a/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet10_0.verified.txt b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet10_0.verified.txt new file mode 100644 index 0000000000..52ab2f6509 --- /dev/null +++ b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet10_0.verified.txt @@ -0,0 +1,47 @@ +// +#pragma warning disable +#nullable enable + +using System; +using System.Runtime.CompilerServices; +using TUnit.Assertions.Core; +using TUnit.Assertions.Should.Core; + +namespace TUnit.Assertions.Should.Extensions; + +public static partial class ShouldExceptionExtensions +{ + + public static global::TUnit.Assertions.Should.Core.ShouldAssertion WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, [global::System.Runtime.CompilerServices.CallerArgumentExpression("expectedMessage")] string? expression = null) + where TException : System.Exception + { + var innerContext = source.Context; + innerContext.ExpressionBuilder.Append(".WithMessage("); + innerContext.ExpressionBuilder.Append(expression); + innerContext.ExpressionBuilder.Append(")"); + var inner = new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage); + var __tunit_should_because = source.ConsumeBecauseMessage(); + if (__tunit_should_because is not null) + { + inner.Because(__tunit_should_because); + } + return new global::TUnit.Assertions.Should.Core.ShouldAssertion(innerContext, inner); + } + + public static global::TUnit.Assertions.Should.Core.ShouldAssertion WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, System.StringComparison comparison, [global::System.Runtime.CompilerServices.CallerArgumentExpression("expectedMessage")] string? expression = null) + where TException : System.Exception + { + var innerContext = source.Context; + innerContext.ExpressionBuilder.Append(".WithMessage("); + innerContext.ExpressionBuilder.Append(expression); + innerContext.ExpressionBuilder.Append(")"); + var inner = new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage, comparison); + var __tunit_should_because = source.ConsumeBecauseMessage(); + if (__tunit_should_because is not null) + { + inner.Because(__tunit_should_because); + } + return new global::TUnit.Assertions.Should.Core.ShouldAssertion(innerContext, inner); + } +} + diff --git a/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet8_0.verified.txt b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet8_0.verified.txt new file mode 100644 index 0000000000..52ab2f6509 --- /dev/null +++ b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet8_0.verified.txt @@ -0,0 +1,47 @@ +// +#pragma warning disable +#nullable enable + +using System; +using System.Runtime.CompilerServices; +using TUnit.Assertions.Core; +using TUnit.Assertions.Should.Core; + +namespace TUnit.Assertions.Should.Extensions; + +public static partial class ShouldExceptionExtensions +{ + + public static global::TUnit.Assertions.Should.Core.ShouldAssertion WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, [global::System.Runtime.CompilerServices.CallerArgumentExpression("expectedMessage")] string? expression = null) + where TException : System.Exception + { + var innerContext = source.Context; + innerContext.ExpressionBuilder.Append(".WithMessage("); + innerContext.ExpressionBuilder.Append(expression); + innerContext.ExpressionBuilder.Append(")"); + var inner = new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage); + var __tunit_should_because = source.ConsumeBecauseMessage(); + if (__tunit_should_because is not null) + { + inner.Because(__tunit_should_because); + } + return new global::TUnit.Assertions.Should.Core.ShouldAssertion(innerContext, inner); + } + + public static global::TUnit.Assertions.Should.Core.ShouldAssertion WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, System.StringComparison comparison, [global::System.Runtime.CompilerServices.CallerArgumentExpression("expectedMessage")] string? expression = null) + where TException : System.Exception + { + var innerContext = source.Context; + innerContext.ExpressionBuilder.Append(".WithMessage("); + innerContext.ExpressionBuilder.Append(expression); + innerContext.ExpressionBuilder.Append(")"); + var inner = new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage, comparison); + var __tunit_should_because = source.ConsumeBecauseMessage(); + if (__tunit_should_because is not null) + { + inner.Because(__tunit_should_because); + } + return new global::TUnit.Assertions.Should.Core.ShouldAssertion(innerContext, inner); + } +} + diff --git a/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet9_0.verified.txt b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet9_0.verified.txt new file mode 100644 index 0000000000..52ab2f6509 --- /dev/null +++ b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.Overload_with_trailing_optional_constructor_parameter_is_emitted.DotNet9_0.verified.txt @@ -0,0 +1,47 @@ +// +#pragma warning disable +#nullable enable + +using System; +using System.Runtime.CompilerServices; +using TUnit.Assertions.Core; +using TUnit.Assertions.Should.Core; + +namespace TUnit.Assertions.Should.Extensions; + +public static partial class ShouldExceptionExtensions +{ + + public static global::TUnit.Assertions.Should.Core.ShouldAssertion WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, [global::System.Runtime.CompilerServices.CallerArgumentExpression("expectedMessage")] string? expression = null) + where TException : System.Exception + { + var innerContext = source.Context; + innerContext.ExpressionBuilder.Append(".WithMessage("); + innerContext.ExpressionBuilder.Append(expression); + innerContext.ExpressionBuilder.Append(")"); + var inner = new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage); + var __tunit_should_because = source.ConsumeBecauseMessage(); + if (__tunit_should_because is not null) + { + inner.Because(__tunit_should_because); + } + return new global::TUnit.Assertions.Should.Core.ShouldAssertion(innerContext, inner); + } + + public static global::TUnit.Assertions.Should.Core.ShouldAssertion WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, System.StringComparison comparison, [global::System.Runtime.CompilerServices.CallerArgumentExpression("expectedMessage")] string? expression = null) + where TException : System.Exception + { + var innerContext = source.Context; + innerContext.ExpressionBuilder.Append(".WithMessage("); + innerContext.ExpressionBuilder.Append(expression); + innerContext.ExpressionBuilder.Append(")"); + var inner = new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage, comparison); + var __tunit_should_because = source.ConsumeBecauseMessage(); + if (__tunit_should_because is not null) + { + inner.Because(__tunit_should_because); + } + return new global::TUnit.Assertions.Should.Core.ShouldAssertion(innerContext, inner); + } +} + diff --git a/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.cs b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.cs index 959664a4ca..9ee6ddee35 100644 --- a/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.cs +++ b/TUnit.Assertions.Should.SourceGenerator.Tests/ShouldExtensionGeneratorTests.cs @@ -84,6 +84,53 @@ public static MyEqualsAssertion IsEqualTo( await Assert.That(output).Contains("TValue expected"); } + [Test] + public async Task Overload_with_trailing_optional_constructor_parameter_is_emitted() + { + var output = await RunGenerator(""" + using System; + using System.Runtime.CompilerServices; + using TUnit.Assertions.Core; + + namespace MyNamespace; + + public class ExceptionMessageEqualsAssertion : Assertion + where TException : Exception + { + public ExceptionMessageEqualsAssertion( + AssertionContext context, + string expectedMessage, + StringComparison comparison = StringComparison.Ordinal) + : base(context) { } + protected override Task CheckAsync(EvaluationMetadata metadata) + => Task.FromResult(AssertionResult.Passed); + protected override string GetExpectation() => "to have message"; + } + + public static class ExceptionExtensions + { + public static ExceptionMessageEqualsAssertion WithMessage( + this IAssertionSource source, + string expectedMessage, + [CallerArgumentExpression(nameof(expectedMessage))] string? expression = null) + where TException : Exception + => new(source.Context, expectedMessage); + + public static ExceptionMessageEqualsAssertion WithMessage( + this IAssertionSource source, + string expectedMessage, + StringComparison comparison, + [CallerArgumentExpression(nameof(expectedMessage))] string? expression = null) + where TException : Exception + => new(source.Context, expectedMessage, comparison); + } + """); + + await Assert.That(output).Contains("WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, [global::System.Runtime.CompilerServices.CallerArgumentExpression(\"expectedMessage\")] string? expression = null)"); + await Assert.That(output).Contains("WithMessage(this global::TUnit.Assertions.Should.Core.IShouldSource source, string expectedMessage, System.StringComparison comparison, [global::System.Runtime.CompilerServices.CallerArgumentExpression(\"expectedMessage\")] string? expression = null)"); + await Assert.That(output).Contains("new global::MyNamespace.ExceptionMessageEqualsAssertion(innerContext, expectedMessage)"); + } + [Test] public async Task ShouldNameAttribute_overrides_conjugation() { diff --git a/TUnit.Assertions.Should.SourceGenerator/ShouldExtensionGenerator.cs b/TUnit.Assertions.Should.SourceGenerator/ShouldExtensionGenerator.cs index 413d062015..50e0e5100c 100644 --- a/TUnit.Assertions.Should.SourceGenerator/ShouldExtensionGenerator.cs +++ b/TUnit.Assertions.Should.SourceGenerator/ShouldExtensionGenerator.cs @@ -830,11 +830,12 @@ private static bool HasMatchingConstructor( INamedTypeSymbol assertionContextSymbol, List ctorCandidates) { + var minimumParameterCount = ctorCandidates.Count + 1; foreach (var ctor in returnType.Constructors) { if (ctor.DeclaredAccessibility != Accessibility.Public || ctor.IsStatic - || ctor.Parameters.Length != ctorCandidates.Count + 1) + || ctor.Parameters.Length < minimumParameterCount) { continue; } @@ -857,11 +858,29 @@ private static bool HasMatchingConstructor( break; } } + + // Source overloads may intentionally omit simple constructor defaults, such as + // StringComparison or comparer parameters. Do not infer hidden boolean/string state: + // generated negation and expression parameters require body knowledge to forward. + for (var i = minimumParameterCount; allMatch && i < ctor.Parameters.Length; i++) + { + if (!CanOmitConstructorParameter(ctor.Parameters[i])) + { + allMatch = false; + } + } if (allMatch) return true; } return false; } + private static bool CanOmitConstructorParameter(IParameterSymbol parameter) + { + return parameter.HasExplicitDefaultValue + && parameter.Type.SpecialType != SpecialType.System_Boolean + && parameter.Type.SpecialType != SpecialType.System_String; + } + private static string? TryGetShouldNameOverride(INamedTypeSymbol returnType, INamedTypeSymbol? shouldNameAttr) { if (shouldNameAttr is null) return null; diff --git a/TUnit.Assertions.Should.Tests/DelegateTests.cs b/TUnit.Assertions.Should.Tests/DelegateTests.cs index 54632b2188..494f6ce176 100644 --- a/TUnit.Assertions.Should.Tests/DelegateTests.cs +++ b/TUnit.Assertions.Should.Tests/DelegateTests.cs @@ -43,6 +43,15 @@ public async Task FuncTask_Throw() await act.Should().Throw(); } + [Test] + public async Task Throw_WithMessage_without_StringComparison() + { + Action act = () => throw new InvalidOperationException("data is empty."); + await act.Should() + .Throw() + .WithMessage("data is empty."); + } + [Test] public async Task FuncTaskT_NotThrow_returns_value() { diff --git a/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet10_0.verified.txt index 79ad6a363c..ab94717065 100644 --- a/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -39,6 +39,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } public ..ShouldAssertion<.> HaveAtMost(int maxCount, [.("maxCount")] string? expression = null) { } @@ -48,6 +49,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public readonly struct ShouldContinuation : ..IShouldSource, ..IShouldSource @@ -91,6 +93,7 @@ namespace . public ..ShouldAssertion<.> BeEmpty() { } public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } + public ..ShouldAssertion<.> Contain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(<., bool> predicate, [.("predicate")] string? expression = null) { } public ..ShouldAssertion<.> Contain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> ContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } @@ -105,6 +108,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(.<.> comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> NotContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } public ..ShouldAssertion<.> NotContainValue(TValue expectedValue, [.("expectedValue")] string? expression = null) { } @@ -128,6 +132,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -138,6 +143,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } [..ShouldGeneratePartial(typeof(.))] @@ -152,6 +158,7 @@ namespace . public ..ShouldAssertion<.> BeEmpty() { } public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } + public ..ShouldAssertion<.> Contain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(<., bool> predicate, [.("predicate")] string? expression = null) { } public ..ShouldAssertion<.> Contain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> ContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } @@ -166,6 +173,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(.<.> comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> NotContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } public ..ShouldAssertion<.> NotContainValue(TValue expectedValue, [.("expectedValue")] string? expression = null) { } @@ -178,6 +186,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -188,6 +197,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public abstract class ShouldSetSourceBase : ..ShouldEnumerableSourceBase @@ -212,6 +222,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -222,6 +233,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public abstract class ShouldSourceBase : ..IShouldSource, ..IShouldSource @@ -283,11 +295,17 @@ namespace . public static ..ShouldAssertion Eventually(this ..IShouldSource source, <., .> assertionBuilder, timeout, ? pollingInterval = default, [.("timeout")] string? timeoutExpression = null, [.("pollingInterval")] string? pollingIntervalExpression = null) { } [("Use Length().IsEqualTo(expectedLength) instead.")] public static ..ShouldAssertion HaveLength(this ..IShouldSource source, int expectedLength, [.("expectedLength")] string? expression = null) { } + public static ..ShouldAssertion HaveMessage(this ..IShouldSource source, string expectedMessage, [.("expectedMessage")] string? expression = null) + where TException : { } public static ..ShouldAssertion HaveMessage(this ..IShouldSource source, string expectedMessage, comparison, [.("expectedMessage")] string? expression = null) where TException : { } + public static ..ShouldAssertion HaveMessageContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion HaveMessageContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } + public static ..ShouldAssertion HaveMessageEqualTo(this ..IShouldSource source, string expectedMessage) { } public static ..ShouldAssertion HaveMessageEqualTo(this ..IShouldSource source, string expectedMessage, comparison) { } + public static ..ShouldAssertion HaveMessageStartingWith(this ..IShouldSource source, string expectedPrefix) { } public static ..ShouldAssertion HaveMessageStartingWith(this ..IShouldSource source, string expectedPrefix, comparison) { } public static ..ShouldAssertion NotBeDefined(this ..IShouldSource source) where TEnum : struct, { } @@ -298,16 +316,24 @@ namespace . public static ..ShouldAssertion WithInnerException(this ..IShouldSource source) where TException : where TInnerException : { } + public static ..ShouldAssertion WithMessage(this ..IShouldSource source, string expectedMessage, [.("expectedMessage")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessage(this ..IShouldSource source, string expectedMessage, comparison, [.("expectedMessage")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithMessageContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessageContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } public static ..ShouldAssertion WithMessageMatching(this ..IShouldSource source, .StringMatcher matcher, [.("matcher")] string? expression = null) where TException : { } public static ..ShouldAssertion WithMessageMatching(this ..IShouldSource source, string pattern, [.("pattern")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithMessageNotContaining(this ..IShouldSource source, string notExpectedSubstring, [.("notExpectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessageNotContaining(this ..IShouldSource source, string notExpectedSubstring, comparison, [.("notExpectedSubstring")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithStackTraceContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithStackTraceContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } } diff --git a/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 9157d74e63..2c93d0a41e 100644 --- a/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -39,6 +39,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } public ..ShouldAssertion<.> HaveAtMost(int maxCount, [.("maxCount")] string? expression = null) { } @@ -48,6 +49,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public readonly struct ShouldContinuation : ..IShouldSource, ..IShouldSource @@ -91,6 +93,7 @@ namespace . public ..ShouldAssertion<.> BeEmpty() { } public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } + public ..ShouldAssertion<.> Contain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(<., bool> predicate, [.("predicate")] string? expression = null) { } public ..ShouldAssertion<.> Contain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> ContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } @@ -105,6 +108,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(.<.> comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> NotContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } public ..ShouldAssertion<.> NotContainValue(TValue expectedValue, [.("expectedValue")] string? expression = null) { } @@ -128,6 +132,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -138,6 +143,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } [..ShouldGeneratePartial(typeof(.))] @@ -152,6 +158,7 @@ namespace . public ..ShouldAssertion<.> BeEmpty() { } public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } + public ..ShouldAssertion<.> Contain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(<., bool> predicate, [.("predicate")] string? expression = null) { } public ..ShouldAssertion<.> Contain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> ContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } @@ -166,6 +173,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(.<.> comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> NotContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } public ..ShouldAssertion<.> NotContainValue(TValue expectedValue, [.("expectedValue")] string? expression = null) { } @@ -178,6 +186,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -188,6 +197,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public abstract class ShouldSetSourceBase : ..ShouldEnumerableSourceBase @@ -212,6 +222,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -222,6 +233,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public abstract class ShouldSourceBase : ..IShouldSource, ..IShouldSource @@ -283,11 +295,17 @@ namespace . public static ..ShouldAssertion Eventually(this ..IShouldSource source, <., .> assertionBuilder, timeout, ? pollingInterval = default, [.("timeout")] string? timeoutExpression = null, [.("pollingInterval")] string? pollingIntervalExpression = null) { } [("Use Length().IsEqualTo(expectedLength) instead.")] public static ..ShouldAssertion HaveLength(this ..IShouldSource source, int expectedLength, [.("expectedLength")] string? expression = null) { } + public static ..ShouldAssertion HaveMessage(this ..IShouldSource source, string expectedMessage, [.("expectedMessage")] string? expression = null) + where TException : { } public static ..ShouldAssertion HaveMessage(this ..IShouldSource source, string expectedMessage, comparison, [.("expectedMessage")] string? expression = null) where TException : { } + public static ..ShouldAssertion HaveMessageContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion HaveMessageContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } + public static ..ShouldAssertion HaveMessageEqualTo(this ..IShouldSource source, string expectedMessage) { } public static ..ShouldAssertion HaveMessageEqualTo(this ..IShouldSource source, string expectedMessage, comparison) { } + public static ..ShouldAssertion HaveMessageStartingWith(this ..IShouldSource source, string expectedPrefix) { } public static ..ShouldAssertion HaveMessageStartingWith(this ..IShouldSource source, string expectedPrefix, comparison) { } public static ..ShouldAssertion NotBeDefined(this ..IShouldSource source) where TEnum : struct, { } @@ -298,16 +316,24 @@ namespace . public static ..ShouldAssertion WithInnerException(this ..IShouldSource source) where TException : where TInnerException : { } + public static ..ShouldAssertion WithMessage(this ..IShouldSource source, string expectedMessage, [.("expectedMessage")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessage(this ..IShouldSource source, string expectedMessage, comparison, [.("expectedMessage")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithMessageContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessageContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } public static ..ShouldAssertion WithMessageMatching(this ..IShouldSource source, .StringMatcher matcher, [.("matcher")] string? expression = null) where TException : { } public static ..ShouldAssertion WithMessageMatching(this ..IShouldSource source, string pattern, [.("pattern")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithMessageNotContaining(this ..IShouldSource source, string notExpectedSubstring, [.("notExpectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessageNotContaining(this ..IShouldSource source, string notExpectedSubstring, comparison, [.("notExpectedSubstring")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithStackTraceContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithStackTraceContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } } diff --git a/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 65a03ea371..1b086e5e0f 100644 --- a/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Should_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -39,6 +39,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } public ..ShouldAssertion<.> HaveAtMost(int maxCount, [.("maxCount")] string? expression = null) { } @@ -48,6 +49,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public readonly struct ShouldContinuation : ..IShouldSource, ..IShouldSource @@ -91,6 +93,7 @@ namespace . public ..ShouldAssertion<.> BeEmpty() { } public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } + public ..ShouldAssertion<.> Contain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(<., bool> predicate, [.("predicate")] string? expression = null) { } public ..ShouldAssertion<.> Contain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> ContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } @@ -105,6 +108,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(.<.> comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> NotContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } public ..ShouldAssertion<.> NotContainValue(TValue expectedValue, [.("expectedValue")] string? expression = null) { } @@ -128,6 +132,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -138,6 +143,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } [..ShouldGeneratePartial(typeof(.))] @@ -152,6 +158,7 @@ namespace . public ..ShouldAssertion<.> BeEmpty() { } public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } + public ..ShouldAssertion<.> Contain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(<., bool> predicate, [.("predicate")] string? expression = null) { } public ..ShouldAssertion<.> Contain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> ContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } @@ -166,6 +173,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(.<.> comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(. expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(. expected, .<.> comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> NotContainKey(TKey expectedKey, [.("expectedKey")] string? expression = null) { } public ..ShouldAssertion<.> NotContainValue(TValue expectedValue, [.("expectedValue")] string? expression = null) { } @@ -178,6 +186,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -188,6 +197,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public abstract class ShouldSetSourceBase : ..ShouldEnumerableSourceBase @@ -212,6 +222,7 @@ namespace . public ..ShouldAssertion<.> BeInDescendingOrder() { } public ..ShouldAssertion<.> BeInOrder() { } public ..ShouldAssertion<.> Contain( predicate, [.("predicate")] string? expression = null) { } + public ..ShouldAssertion<.> Contain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> Contain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } protected override . CreateSetAdapter(. value) { } public ..ShouldAssertion<.> HaveAtLeast(int minCount, [.("minCount")] string? expression = null) { } @@ -222,6 +233,7 @@ namespace . public ..ShouldAssertion<.> HaveDistinctItems(. comparer, [.("comparer")] string? comparerExpression = null) { } public ..ShouldAssertion<.> HaveSingleItem() { } public ..ShouldAssertion<.> NotBeEmpty() { } + public ..ShouldAssertion<.> NotContain(TItem expected, [.("expected")] string? expression = null) { } public ..ShouldAssertion<.> NotContain(TItem expected, . comparer, [.("expected")] string? expectedExpression = null, [.("comparer")] string? comparerExpression = null) { } } public abstract class ShouldSourceBase : ..IShouldSource, ..IShouldSource @@ -283,11 +295,17 @@ namespace . public static ..ShouldAssertion Eventually(this ..IShouldSource source, <., .> assertionBuilder, timeout, ? pollingInterval = default, [.("timeout")] string? timeoutExpression = null, [.("pollingInterval")] string? pollingIntervalExpression = null) { } [("Use Length().IsEqualTo(expectedLength) instead.")] public static ..ShouldAssertion HaveLength(this ..IShouldSource source, int expectedLength, [.("expectedLength")] string? expression = null) { } + public static ..ShouldAssertion HaveMessage(this ..IShouldSource source, string expectedMessage, [.("expectedMessage")] string? expression = null) + where TException : { } public static ..ShouldAssertion HaveMessage(this ..IShouldSource source, string expectedMessage, comparison, [.("expectedMessage")] string? expression = null) where TException : { } + public static ..ShouldAssertion HaveMessageContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion HaveMessageContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } + public static ..ShouldAssertion HaveMessageEqualTo(this ..IShouldSource source, string expectedMessage) { } public static ..ShouldAssertion HaveMessageEqualTo(this ..IShouldSource source, string expectedMessage, comparison) { } + public static ..ShouldAssertion HaveMessageStartingWith(this ..IShouldSource source, string expectedPrefix) { } public static ..ShouldAssertion HaveMessageStartingWith(this ..IShouldSource source, string expectedPrefix, comparison) { } public static ..ShouldAssertion NotBeDefined(this ..IShouldSource source) where TEnum : struct, { } @@ -298,16 +316,24 @@ namespace . public static ..ShouldAssertion WithInnerException(this ..IShouldSource source) where TException : where TInnerException : { } + public static ..ShouldAssertion WithMessage(this ..IShouldSource source, string expectedMessage, [.("expectedMessage")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessage(this ..IShouldSource source, string expectedMessage, comparison, [.("expectedMessage")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithMessageContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessageContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } public static ..ShouldAssertion WithMessageMatching(this ..IShouldSource source, .StringMatcher matcher, [.("matcher")] string? expression = null) where TException : { } public static ..ShouldAssertion WithMessageMatching(this ..IShouldSource source, string pattern, [.("pattern")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithMessageNotContaining(this ..IShouldSource source, string notExpectedSubstring, [.("notExpectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithMessageNotContaining(this ..IShouldSource source, string notExpectedSubstring, comparison, [.("notExpectedSubstring")] string? expression = null) where TException : { } + public static ..ShouldAssertion WithStackTraceContaining(this ..IShouldSource source, string expectedSubstring, [.("expectedSubstring")] string? expression = null) + where TException : { } public static ..ShouldAssertion WithStackTraceContaining(this ..IShouldSource source, string expectedSubstring, comparison, [.("expectedSubstring")] string? expression = null) where TException : { } }