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<.