diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index c86cbf234d..78b65a0e74 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -60,9 +60,38 @@
## Quick Reference
+### ⚠️ CRITICAL: TUnit.TestProject Testing Rules
+
+**DO NOT run `TUnit.TestProject` without filters!** Many tests are intentionally designed to fail to verify error handling, diagnostics, and edge cases.
+
+```bash
+# ❌ WRONG - Will show many "failures" (this is expected behavior)
+cd TUnit.TestProject && dotnet run
+cd TUnit.TestProject && dotnet test
+
+# ✅ CORRECT - Always use targeted filters when testing TUnit.TestProject
+cd TUnit.TestProject && dotnet run -- --treenode-filter "/*/*/SpecificClass/*"
+cd TUnit.TestProject && dotnet run -- --treenode-filter "/*/*/*/*[Category!=Performance]"
+
+# ✅ CORRECT - Test other test projects normally (they don't have intentional failures)
+dotnet test TUnit.Engine.Tests
+dotnet test TUnit.Assertions.Tests
+dotnet test TUnit.Core.SourceGenerator.Tests
+```
+
+**Why TUnit.TestProject is special:**
+- Contains negative test cases (tests that verify failures work correctly)
+- Tests error messages, diagnostics, and exception handling
+- Performance tests excluded by default
+- Integration tests covering all edge cases
+
+**Golden Rule**: When verifying changes, use `dotnet test` (which excludes TUnit.TestProject), OR run TUnit.TestProject with specific `--treenode-filter` patterns.
+
+---
+
### Most Common Commands
```bash
-# Run all tests
+# Run all tests (automatically excludes TUnit.TestProject integration tests)
dotnet test
# Test source generator + accept snapshots
diff --git a/CLAUDE.md b/CLAUDE.md
index fd4913434d..1ed9227dd1 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -120,10 +120,39 @@ dotnet publish -c Release -p:PublishAot=true --use-current-runtime
## 📋 Quick Reference Card
+### ⚠️ CRITICAL: TUnit.TestProject Testing Rules
+
+**DO NOT run `TUnit.TestProject` without filters!** Many tests are intentionally designed to fail to verify error handling.
+
+```bash
+# ❌ WRONG - Will show many "failures" (expected behavior)
+cd TUnit.TestProject && dotnet run
+cd TUnit.TestProject && dotnet test
+
+# ✅ CORRECT - Always use targeted filters
+cd TUnit.TestProject && dotnet run -- --treenode-filter "/*/*/SpecificClass/*"
+cd TUnit.TestProject && dotnet run -- --treenode-filter "/*/*/*/*[Category!=Performance]"
+
+# ✅ CORRECT - Test other projects normally
+dotnet test TUnit.Engine.Tests
+dotnet test TUnit.Assertions.Tests
+dotnet test TUnit.Core.SourceGenerator.Tests
+```
+
+**Why?** TUnit.TestProject contains:
+- Tests that verify failure scenarios (expected to fail)
+- Tests for error messages and diagnostics
+- Performance tests that should be excluded by default
+- Integration tests covering edge cases
+
+**Rule**: Only run TUnit.TestProject with explicit `--treenode-filter` to target specific tests or classes.
+
+---
+
### Most Common Commands
```bash
-# Run all tests
+# Run all tests (excludes TUnit.TestProject integration tests)
dotnet test
# Test source generator + accept snapshots
diff --git a/Directory.Packages.props b/Directory.Packages.props
index dd472ddf2d..d59237dee8 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -54,7 +54,7 @@
-
+
@@ -81,12 +81,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/TUnit.Analyzers.Tests/DisposableFieldPropertyAnalyzerTests.cs b/TUnit.Analyzers.Tests/DisposableFieldPropertyAnalyzerTests.cs
index 54e85764fa..4b545d6757 100644
--- a/TUnit.Analyzers.Tests/DisposableFieldPropertyAnalyzerTests.cs
+++ b/TUnit.Analyzers.Tests/DisposableFieldPropertyAnalyzerTests.cs
@@ -582,4 +582,619 @@ public async Task RecordPaymentUsingMappedCommand(CancellationToken cancellation
"""
);
}
+
+ [Test]
+ public async Task New_Disposable_In_AsyncInitializer_Flags_Issue()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+ using TUnit.Core.Interfaces;
+
+ public class DisposableFieldTests : IAsyncInitializer
+ {
+ private HttpClient? {|#0:_httpClient|};
+
+ public Task InitializeAsync()
+ {
+ _httpClient = new HttpClient();
+ return Task.CompletedTask;
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """,
+
+ Verifier.Diagnostic(Rules.Dispose_Member_In_Cleanup)
+ .WithLocation(0)
+ .WithArguments("_httpClient")
+ );
+ }
+
+ [Test]
+ public async Task New_Disposable_In_AsyncInitializer_No_Issue_When_Cleaned_Up()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+ using TUnit.Core.Interfaces;
+
+ public class DisposableFieldTests : IAsyncInitializer, IAsyncDisposable
+ {
+ private HttpClient? _httpClient;
+
+ public Task InitializeAsync()
+ {
+ _httpClient = new HttpClient();
+ return Task.CompletedTask;
+ }
+
+ public ValueTask DisposeAsync()
+ {
+ _httpClient?.Dispose();
+ return ValueTask.CompletedTask;
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ // ========================================
+ // FIELD INITIALIZATION TESTS
+ // ========================================
+
+ [Test]
+ public async Task FieldInitialization_Flags_Issue()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private HttpClient? {|#0:_httpClient|} = new HttpClient();
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """,
+
+ Verifier.Diagnostic(Rules.Dispose_Member_In_Cleanup)
+ .WithLocation(0)
+ .WithArguments("_httpClient")
+ );
+ }
+
+ [Test]
+ public async Task FieldInitialization_No_Issue_When_Disposed_In_Dispose()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests : IDisposable
+ {
+ private HttpClient? _httpClient = new HttpClient();
+
+ public void Dispose()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ [Test]
+ public async Task FieldInitialization_No_Issue_When_Disposed_In_DisposeAsync()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+
+ public class DisposableFieldTests : IAsyncDisposable
+ {
+ private HttpClient? _httpClient = new HttpClient();
+
+ public ValueTask DisposeAsync()
+ {
+ _httpClient?.Dispose();
+ return ValueTask.CompletedTask;
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ [Test]
+ public async Task FieldInitialization_No_Issue_When_Disposed_In_After()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private HttpClient? _httpClient = new HttpClient();
+
+ [After(HookType.Test)]
+ public void Cleanup()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ // ========================================
+ // CONSTRUCTOR INITIALIZATION TESTS
+ // ========================================
+
+ [Test]
+ public async Task Constructor_Flags_Issue()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private HttpClient? {|#0:_httpClient|};
+
+ public DisposableFieldTests()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """,
+
+ Verifier.Diagnostic(Rules.Dispose_Member_In_Cleanup)
+ .WithLocation(0)
+ .WithArguments("_httpClient")
+ );
+ }
+
+ [Test]
+ public async Task Constructor_No_Issue_When_Disposed_In_Dispose()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests : IDisposable
+ {
+ private HttpClient? _httpClient;
+
+ public DisposableFieldTests()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ public void Dispose()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ [Test]
+ public async Task Constructor_No_Issue_When_Disposed_In_DisposeAsync()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+
+ public class DisposableFieldTests : IAsyncDisposable
+ {
+ private HttpClient? _httpClient;
+
+ public DisposableFieldTests()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ public ValueTask DisposeAsync()
+ {
+ _httpClient?.Dispose();
+ return ValueTask.CompletedTask;
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ [Test]
+ public async Task Constructor_No_Issue_When_Disposed_In_After()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private HttpClient? _httpClient;
+
+ public DisposableFieldTests()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ [After(HookType.Test)]
+ public void Cleanup()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ // ========================================
+ // BEFORE(TEST) WITH DISPOSE/DISPOSEASYNC TESTS
+ // ========================================
+
+ [Test]
+ public async Task BeforeTest_No_Issue_When_Disposed_In_Dispose()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests : IDisposable
+ {
+ private HttpClient? _httpClient;
+
+ [Before(HookType.Test)]
+ public void Setup()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ public void Dispose()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ [Test]
+ public async Task BeforeTest_No_Issue_When_Disposed_In_DisposeAsync()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+
+ public class DisposableFieldTests : IAsyncDisposable
+ {
+ private HttpClient? _httpClient;
+
+ [Before(HookType.Test)]
+ public void Setup()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ public ValueTask DisposeAsync()
+ {
+ _httpClient?.Dispose();
+ return ValueTask.CompletedTask;
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ // ========================================
+ // IASYNCINITIALIZER ADDITIONAL COMBINATIONS
+ // ========================================
+
+ [Test]
+ public async Task IAsyncInitializer_No_Issue_When_Disposed_In_Dispose()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+ using TUnit.Core.Interfaces;
+
+ public class DisposableFieldTests : IAsyncInitializer, IDisposable
+ {
+ private HttpClient? _httpClient;
+
+ public Task InitializeAsync()
+ {
+ _httpClient = new HttpClient();
+ return Task.CompletedTask;
+ }
+
+ public void Dispose()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ [Test]
+ public async Task IAsyncInitializer_No_Issue_When_Disposed_In_After()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System;
+ using System.Net.Http;
+ using System.Threading.Tasks;
+ using TUnit.Core;
+ using TUnit.Core.Interfaces;
+
+ public class DisposableFieldTests : IAsyncInitializer
+ {
+ private HttpClient? _httpClient;
+
+ public Task InitializeAsync()
+ {
+ _httpClient = new HttpClient();
+ return Task.CompletedTask;
+ }
+
+ [After(HookType.Test)]
+ public void Cleanup()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ // ========================================
+ // STATIC FIELD WITH BEFORE(ASSEMBLY) TESTS
+ // ========================================
+
+ [Test]
+ public async Task BeforeAssembly_Static_Flags_Issue()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private static HttpClient? {|#0:_httpClient|};
+
+ [Before(HookType.Assembly)]
+ public static void Setup()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """,
+
+ Verifier.Diagnostic(Rules.Dispose_Member_In_Cleanup)
+ .WithLocation(0)
+ .WithArguments("_httpClient")
+ );
+ }
+
+ [Test]
+ public async Task BeforeAssembly_Static_No_Issue_When_Disposed_In_AfterAssembly()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private static HttpClient? _httpClient;
+
+ [Before(HookType.Assembly)]
+ public static void Setup()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ [After(HookType.Assembly)]
+ public static void Cleanup()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
+
+ // ========================================
+ // STATIC FIELD WITH BEFORE(TESTSESSION) TESTS
+ // ========================================
+
+ [Test]
+ public async Task BeforeTestSession_Static_Flags_Issue()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private static HttpClient? {|#0:_httpClient|};
+
+ [Before(HookType.TestSession)]
+ public static void Setup()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """,
+
+ Verifier.Diagnostic(Rules.Dispose_Member_In_Cleanup)
+ .WithLocation(0)
+ .WithArguments("_httpClient")
+ );
+ }
+
+ [Test]
+ public async Task BeforeTestSession_Static_No_Issue_When_Disposed_In_AfterTestSession()
+ {
+ await Verifier
+ .VerifyAnalyzerAsync(
+ """
+ using System.Net.Http;
+ using TUnit.Core;
+
+ public class DisposableFieldTests
+ {
+ private static HttpClient? _httpClient;
+
+ [Before(HookType.TestSession)]
+ public static void Setup()
+ {
+ _httpClient = new HttpClient();
+ }
+
+ [After(HookType.TestSession)]
+ public static void Cleanup()
+ {
+ _httpClient?.Dispose();
+ }
+
+ [Test]
+ public void Test1()
+ {
+ }
+ }
+ """
+ );
+ }
}
diff --git a/TUnit.Analyzers/DisposableFieldPropertyAnalyzer.cs b/TUnit.Analyzers/DisposableFieldPropertyAnalyzer.cs
index 77900e6c58..151d20de8c 100644
--- a/TUnit.Analyzers/DisposableFieldPropertyAnalyzer.cs
+++ b/TUnit.Analyzers/DisposableFieldPropertyAnalyzer.cs
@@ -46,6 +46,16 @@ private static void CheckMethods(SyntaxNodeAnalysisContext context, IMethodSymbo
var methodSymbols = methods.Where(x => x.IsStatic == isStaticMethod).ToArray();
+ // Check field initializers first
+ if (context.Node is ClassDeclarationSyntax classDeclarationSyntax)
+ {
+ var namedTypeSymbol = context.SemanticModel.GetDeclaredSymbol(classDeclarationSyntax);
+ if (namedTypeSymbol != null)
+ {
+ CheckFieldInitializers(context, namedTypeSymbol, isStaticMethod, createdObjects);
+ }
+ }
+
foreach (var methodSymbol in methodSymbols)
{
CheckSetUps(context, methodSymbol, createdObjects);
@@ -65,6 +75,87 @@ private static void CheckMethods(SyntaxNodeAnalysisContext context, IMethodSymbo
}
}
+ private static void CheckFieldInitializers(SyntaxNodeAnalysisContext context, INamedTypeSymbol namedTypeSymbol, bool isStatic, ConcurrentDictionary createdObjects)
+ {
+ // Directly traverse the class syntax to find field declarations
+ if (context.Node is not ClassDeclarationSyntax classDeclaration)
+ {
+ return;
+ }
+
+ var members = classDeclaration.Members;
+
+ foreach (var member in members)
+ {
+ // Handle field declarations: private HttpClient _client = new HttpClient();
+ if (member is FieldDeclarationSyntax fieldDeclaration)
+ {
+ if (fieldDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword)) != isStatic)
+ {
+ continue;
+ }
+
+ foreach (var variable in fieldDeclaration.Declaration.Variables)
+ {
+ if (variable.Initializer == null)
+ {
+ continue;
+ }
+
+ // Check if the initializer contains an object creation expression
+ var objectCreations = variable.Initializer.Value.DescendantNodesAndSelf()
+ .OfType();
+
+ foreach (var objectCreation in objectCreations)
+ {
+ var typeInfo = context.SemanticModel.GetTypeInfo(objectCreation);
+ if (typeInfo.Type?.IsDisposable() is true || typeInfo.Type?.IsAsyncDisposable() is true)
+ {
+ var fieldSymbol = context.SemanticModel.GetDeclaredSymbol(variable) as IFieldSymbol;
+ if (fieldSymbol != null)
+ {
+ createdObjects.TryAdd(fieldSymbol, HookLevel.Test);
+ break; // Only need to add once
+ }
+ }
+ }
+ }
+ }
+
+ // Handle property declarations: public HttpClient Client { get; set; } = new HttpClient();
+ if (member is PropertyDeclarationSyntax propertyDeclaration)
+ {
+ if (propertyDeclaration.Modifiers.Any(m => m.IsKind(SyntaxKind.StaticKeyword)) != isStatic)
+ {
+ continue;
+ }
+
+ if (propertyDeclaration.Initializer == null)
+ {
+ continue;
+ }
+
+ // Check if the initializer contains an object creation expression
+ var objectCreations = propertyDeclaration.Initializer.Value.DescendantNodesAndSelf()
+ .OfType();
+
+ foreach (var objectCreation in objectCreations)
+ {
+ var typeInfo = context.SemanticModel.GetTypeInfo(objectCreation);
+ if (typeInfo.Type?.IsDisposable() is true || typeInfo.Type?.IsAsyncDisposable() is true)
+ {
+ var propertySymbol = context.SemanticModel.GetDeclaredSymbol(propertyDeclaration) as IPropertySymbol;
+ if (propertySymbol != null)
+ {
+ createdObjects.TryAdd(propertySymbol, HookLevel.Test);
+ break; // Only need to add once
+ }
+ }
+ }
+ }
+ }
+ }
+
private static void CheckSetUps(SyntaxNodeAnalysisContext context, IMethodSymbol methodSymbol, ConcurrentDictionary createdObjects)
{
var syntaxNodes = methodSymbol.DeclaringSyntaxReferences
@@ -72,7 +163,20 @@ private static void CheckSetUps(SyntaxNodeAnalysisContext context, IMethodSymbol
var isHookMethod = methodSymbol.IsHookMethod(context.Compilation, out _, out var level, out _);
- if (!isHookMethod && methodSymbol.MethodKind != MethodKind.Constructor)
+ // Check for IAsyncInitializer.InitializeAsync()
+ var isInitializeAsyncMethod = false;
+ if (methodSymbol is { Name: "InitializeAsync", Parameters.IsDefaultOrEmpty: true })
+ {
+ var asyncInitializer = context.Compilation.GetTypeByMetadataName("TUnit.Core.Interfaces.IAsyncInitializer");
+ if (asyncInitializer != null && methodSymbol.ContainingType.Interfaces.Any(x =>
+ SymbolEqualityComparer.Default.Equals(x, asyncInitializer)))
+ {
+ isInitializeAsyncMethod = true;
+ level = HookLevel.Test;
+ }
+ }
+
+ if (!isHookMethod && methodSymbol.MethodKind != MethodKind.Constructor && !isInitializeAsyncMethod)
{
return;
}
diff --git a/TUnit.Assertions.SourceGenerator/Generators/MethodAssertionGenerator.cs b/TUnit.Assertions.SourceGenerator/Generators/MethodAssertionGenerator.cs
index 750caa385b..47796a2da8 100644
--- a/TUnit.Assertions.SourceGenerator/Generators/MethodAssertionGenerator.cs
+++ b/TUnit.Assertions.SourceGenerator/Generators/MethodAssertionGenerator.cs
@@ -459,9 +459,10 @@ private static string BuildMethodCallExpression(AssertionMethodData data)
if (data.IsExtensionMethod)
{
- // Extension method syntax: value.MethodName(params)
+ // Extension method syntax: value!.MethodName(params)
+ // Use null-forgiving operator since we've already checked for null above
var paramList = string.Join(", ", data.AdditionalParameters.Select(p => $"_{p.Name}"));
- return $"value.{methodName}{typeArguments}({paramList})";
+ return $"value!.{methodName}{typeArguments}({paramList})";
}
else
{
@@ -502,14 +503,18 @@ private static void GenerateExtensionMethod(StringBuilder sb, AssertionMethodDat
// Additional parameters
foreach (var param in data.AdditionalParameters)
{
- sb.Append($", {param.Type.ToDisplayString()} {param.Name}");
+ var paramsModifier = param.IsParams ? "params " : "";
+ sb.Append($", {paramsModifier}{param.Type.ToDisplayString()} {param.Name}");
}
- // CallerArgumentExpression parameters
+ // CallerArgumentExpression parameters (skip for params since params must be last)
for (int i = 0; i < data.AdditionalParameters.Length; i++)
{
var param = data.AdditionalParameters[i];
- sb.Append($", [CallerArgumentExpression(nameof({param.Name}))] string? {param.Name}Expression = null");
+ if (!param.IsParams)
+ {
+ sb.Append($", [CallerArgumentExpression(nameof({param.Name}))] string? {param.Name}Expression = null");
+ }
}
sb.AppendLine(")");
@@ -528,7 +533,9 @@ private static void GenerateExtensionMethod(StringBuilder sb, AssertionMethodDat
// Build expression string
if (data.AdditionalParameters.Length > 0)
{
- var exprList = string.Join(", ", data.AdditionalParameters.Select(p => $"{{{p.Name}Expression}}"));
+ // For params parameters, use parameter name directly (no Expression suffix since we didn't generate it)
+ var exprList = string.Join(", ", data.AdditionalParameters.Select(p =>
+ p.IsParams ? $"{{{p.Name}}}" : $"{{{p.Name}Expression}}"));
sb.AppendLine($" source.Context.ExpressionBuilder.Append($\".{methodName}({exprList})\");");
}
else
diff --git a/TUnit.Assertions/Assertions/GenericAssertions.cs b/TUnit.Assertions/Assertions/GenericAssertions.cs
new file mode 100644
index 0000000000..61dc2282da
--- /dev/null
+++ b/TUnit.Assertions/Assertions/GenericAssertions.cs
@@ -0,0 +1,42 @@
+using TUnit.Assertions.Attributes;
+
+namespace TUnit.Assertions.Assertions;
+
+internal static class GenericAssertions
+{
+ [GenerateAssertion]
+ public static bool IsIn(this T value, IEnumerable collection)
+ {
+ return collection.Contains(value);
+ }
+
+ [GenerateAssertion]
+ public static bool IsIn(this T value, IEnumerable collection, IEqualityComparer equalityComparer)
+ {
+ return collection.Contains(value, equalityComparer);
+ }
+
+ [GenerateAssertion]
+ public static bool IsIn(this T value, params T[] collection)
+ {
+ return collection.Contains(value);
+ }
+
+ [GenerateAssertion]
+ public static bool IsNotIn(this T value, IEnumerable collection)
+ {
+ return !collection.Contains(value);
+ }
+
+ [GenerateAssertion]
+ public static bool IsNotIn(this T value, IEnumerable collection, IEqualityComparer equalityComparer)
+ {
+ return !collection.Contains(value, equalityComparer);
+ }
+
+ [GenerateAssertion]
+ public static bool IsNotIn(this T value, params T[] collection)
+ {
+ return !collection.Contains(value);
+ }
+}
diff --git a/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs b/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs
index d78a86b509..a61b3a5efe 100644
--- a/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs
+++ b/TUnit.Assertions/Conditions/HasDistinctItemsAssertion.cs
@@ -31,21 +31,26 @@ protected override Task CheckAsync(EvaluationMetadata();
+ var duplicates = new List();
+ var totalCount = 0;
- if (list.Count == distinctList.Count)
+ foreach (var item in value)
{
- return Task.FromResult(AssertionResult.Passed);
+ totalCount++;
+ if (!seen.Add(item) && !duplicates.Contains(item))
+ {
+ duplicates.Add(item);
+ }
}
- var duplicates = list.GroupBy(x => x)
- .Where(g => g.Count() > 1)
- .Select(g => g.Key)
- .ToList();
+ if (duplicates.Count == 0)
+ {
+ return Task.FromResult(AssertionResult.Passed);
+ }
return Task.FromResult(AssertionResult.Failed(
- $"found {list.Count - distinctList.Count} duplicate(s): {string.Join(", ", duplicates)}"));
+ $"found {totalCount - seen.Count} duplicate(s): {string.Join(", ", duplicates)}"));
}
protected override string GetExpectation() => "to have distinct items";
diff --git a/TUnit.Assertions/Conditions/MembershipAssertions.cs b/TUnit.Assertions/Conditions/MembershipAssertions.cs
deleted file mode 100644
index 3dbdb19fce..0000000000
--- a/TUnit.Assertions/Conditions/MembershipAssertions.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using System.Text;
-using TUnit.Assertions.Attributes;
-using TUnit.Assertions.Core;
-
-namespace TUnit.Assertions.Conditions;
-
-///
-/// Asserts that a value is in a collection.
-///
-[AssertionExtension("IsIn")]
-public class IsInAssertion : ComparerBasedAssertion
-{
- private readonly IEnumerable _collection;
-
- public IsInAssertion(
- AssertionContext context,
- IEnumerable collection)
- : base(context)
- {
- _collection = collection;
- }
-
- public IsInAssertion Using(IEqualityComparer comparer)
- {
- SetComparer(comparer);
- return this;
- }
-
- protected override Task CheckAsync(EvaluationMetadata metadata)
- {
- var value = metadata.Value;
- var exception = metadata.Exception;
-
- if (exception != null)
- {
- return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}"));
- }
-
- var comparer = GetComparer();
-
- foreach (var item in _collection)
- {
- if (comparer.Equals(value!, item))
- {
- return Task.FromResult(AssertionResult.Passed);
- }
- }
-
- return Task.FromResult(AssertionResult.Failed($"value {value} was not found in collection"));
- }
-
- protected override string GetExpectation() => "to be in collection";
-}
-
-///
-/// Asserts that a value is NOT in a collection.
-///
-[AssertionExtension("IsNotIn")]
-public class IsNotInAssertion : ComparerBasedAssertion
-{
- private readonly IEnumerable _collection;
-
- public IsNotInAssertion(
- AssertionContext context,
- IEnumerable collection)
- : base(context)
- {
- _collection = collection;
- }
-
- public IsNotInAssertion Using(IEqualityComparer comparer)
- {
- SetComparer(comparer);
- return this;
- }
-
- protected override Task CheckAsync(EvaluationMetadata metadata)
- {
- var value = metadata.Value;
- var exception = metadata.Exception;
-
- if (exception != null)
- {
- return Task.FromResult(AssertionResult.Failed($"threw {exception.GetType().Name}"));
- }
-
- var comparer = GetComparer();
-
- foreach (var item in _collection)
- {
- if (comparer.Equals(value!, item))
- {
- return Task.FromResult(AssertionResult.Failed($"value {value} was found in collection"));
- }
- }
-
- return Task.FromResult(AssertionResult.Passed);
- }
-
- protected override string GetExpectation() => "to not be in collection";
-}
diff --git a/TUnit.Assertions/Conditions/StringAssertions.cs b/TUnit.Assertions/Conditions/StringAssertions.cs
index 1b6bdc4baf..95e20d0ed1 100644
--- a/TUnit.Assertions/Conditions/StringAssertions.cs
+++ b/TUnit.Assertions/Conditions/StringAssertions.cs
@@ -89,8 +89,8 @@ protected override Task CheckAsync(EvaluationMetadata m
if (_ignoringWhitespace)
{
- actualValue = string.Concat(actualValue.Where(c => !char.IsWhiteSpace(c)));
- expectedValue = string.Concat(expectedValue.Where(c => !char.IsWhiteSpace(c)));
+ actualValue = RemoveWhitespace(actualValue);
+ expectedValue = RemoveWhitespace(expectedValue);
}
if (actualValue.Contains(expectedValue, _comparison))
@@ -101,6 +101,24 @@ protected override Task CheckAsync(EvaluationMetadata m
return Task.FromResult(AssertionResult.Failed($"found \"{value}\""));
}
+ private static string RemoveWhitespace(string input)
+ {
+ if (string.IsNullOrEmpty(input))
+ {
+ return input;
+ }
+
+ var sb = new StringBuilder(input.Length);
+ foreach (var c in input)
+ {
+ if (!char.IsWhiteSpace(c))
+ {
+ sb.Append(c);
+ }
+ }
+ return sb.ToString();
+ }
+
protected override string GetExpectation() => $"to contain \"{_expected}\"";
}
diff --git a/TUnit.Assertions/Extensions/AssertionExtensions.cs b/TUnit.Assertions/Extensions/AssertionExtensions.cs
index 0349e62fc8..cf6e6e5a74 100644
--- a/TUnit.Assertions/Extensions/AssertionExtensions.cs
+++ b/TUnit.Assertions/Extensions/AssertionExtensions.cs
@@ -753,16 +753,22 @@ public static NotStructuralEquivalencyAssertion IsNotEquivalentTo
- /// Asserts that the value satisfies the specified predicate.
- /// Example: await Assert.That(x).Satisfies(v => v > 0 && v < 100);
+ /// Asserts that a mapped Task value satisfies custom assertions on the unwrapped result.
+ /// Maps the source value using a selector that returns a Task, then runs assertions on the awaited result.
+ /// Example: await Assert.That(model).Satisfies(m => m.AsyncValue, assert => assert.IsEqualTo("Hello"));
///
- public static SatisfiesAssertion Satisfies(
+ public static AsyncMappedSatisfiesAssertion Satisfies(
this IAssertionSource source,
- Func predicate,
- [CallerArgumentExpression(nameof(predicate))] string? expression = null)
+ Func> selector,
+ Func, Assertion> assertions,
+ [CallerArgumentExpression(nameof(selector))] string? selectorExpression = null)
{
- source.Context.ExpressionBuilder.Append($".Satisfies({expression})");
- return new SatisfiesAssertion(source.Context, predicate, expression ?? "predicate");
+ source.Context.ExpressionBuilder.Append($".Satisfies({selectorExpression}, ...)");
+ return new AsyncMappedSatisfiesAssertion(
+ source.Context,
+ selector!,
+ assertions,
+ selectorExpression ?? "selector");
}
///
@@ -785,46 +791,16 @@ public static MappedSatisfiesAssertion Satisfies
- /// Asserts that an async-mapped value satisfies custom assertions.
- /// Maps the source value using an async selector, then runs assertions on the mapped value.
- /// Example: await Assert.That(model).Satisfies(m => m.GetNameAsync(), assert => assert.IsEqualTo("John"));
- ///
- public static AsyncMappedSatisfiesAssertion Satisfies(
- this IAssertionSource source,
- Func> selector,
- Func, Assertion?> assertions,
- [CallerArgumentExpression(nameof(selector))] string? selectorExpression = null)
- {
- source.Context.ExpressionBuilder.Append($".Satisfies({selectorExpression}, ...)");
- return new AsyncMappedSatisfiesAssertion(
- source.Context,
- selector,
- assertions,
- selectorExpression ?? "selector");
- }
-
- ///
- /// Asserts that the value is in the specified collection (params array convenience method).
- /// Example: await Assert.That(5).IsIn(1, 3, 5, 7, 9);
- ///
- public static IsInAssertion IsIn(
- this IAssertionSource source,
- params TValue[] collection)
- {
- source.Context.ExpressionBuilder.Append($".IsIn({string.Join(", ", collection)})");
- return new IsInAssertion(source.Context, collection);
- }
-
- ///
- /// Asserts that the value is NOT in the specified collection (params array convenience method).
- /// Example: await Assert.That(4).IsNotIn(1, 3, 5, 7, 9);
+ /// Asserts that the value satisfies the specified predicate.
+ /// Example: await Assert.That(x).Satisfies(v => v > 0 && v < 100);
///
- public static IsNotInAssertion IsNotIn(
+ public static SatisfiesAssertion Satisfies(
this IAssertionSource source,
- params TValue[] collection)
+ Func predicate,
+ [CallerArgumentExpression(nameof(predicate))] string? expression = null)
{
- source.Context.ExpressionBuilder.Append($".IsNotIn({string.Join(", ", collection)})");
- return new IsNotInAssertion(source.Context, collection);
+ source.Context.ExpressionBuilder.Append($".Satisfies({expression})");
+ return new SatisfiesAssertion(source.Context, predicate, expression ?? "predicate");
}
///
diff --git a/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete1.verified.txt b/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete1.verified.txt
index d08b347bec..c42ddeb5f0 100644
--- a/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete1.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete1.verified.txt
@@ -13,7 +13,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
TestClassType = typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass1),
TestMethodName = "AssertClassName",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.Core.InheritsTestsAttribute()
@@ -34,7 +34,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass1", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass1", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -42,7 +42,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass1)),
Name = "ConcreteClass1",
Namespace = "TUnit.TestProject.AbstractTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -56,9 +56,16 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AbstractTests.ConcreteClass1(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.AssertClassName();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.AssertClassName());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
diff --git a/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete2.verified.txt b/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete2.verified.txt
index e65f62d62c..fdd9b1edda 100644
--- a/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete2.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/AbstractTests.Concrete2.verified.txt
@@ -13,7 +13,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_SecondTest_
TestClassType = typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass2),
TestMethodName = "SecondTest",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.Core.InheritsTestsAttribute(),
@@ -35,7 +35,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_SecondTest_
ReturnType = typeof(void),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(void)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass2", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass2", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -43,7 +43,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_SecondTest_
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass2)),
Name = "ConcreteClass2",
Namespace = "TUnit.TestProject.AbstractTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -57,10 +57,17 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_SecondTest_
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AbstractTests.ConcreteClass2(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- instance.SecondTest();
- await global::System.Threading.Tasks.Task.CompletedTask;
+ try
+ {
+ instance.SecondTest();
+ return default(global::System.Threading.Tasks.ValueTask);
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -95,7 +102,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_AssertClass
TestClassType = typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass2),
TestMethodName = "AssertClassName",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.Core.InheritsTestsAttribute(),
@@ -117,7 +124,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_AssertClass
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass2", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass2", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -125,7 +132,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_AssertClass
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass2)),
Name = "ConcreteClass2",
Namespace = "TUnit.TestProject.AbstractTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -139,9 +146,16 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass2_AssertClass
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AbstractTests.ConcreteClass2(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.AssertClassName();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.AssertClassName());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -176,7 +190,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
TestClassType = typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass1),
TestMethodName = "AssertClassName",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.Core.InheritsTestsAttribute()
@@ -197,7 +211,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass1", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AbstractTests.ConcreteClass1", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -205,7 +219,7 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AbstractTests.ConcreteClass1)),
Name = "ConcreteClass1",
Namespace = "TUnit.TestProject.AbstractTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -219,9 +233,16 @@ internal sealed class TUnit_TestProject_AbstractTests_ConcreteClass1_AssertClass
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AbstractTests.ConcreteClass1(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.AssertClassName();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.AssertClassName());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
diff --git a/TUnit.Core.SourceGenerator.Tests/AfterAllTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/AfterAllTests.Test.verified.txt
index ed931b1fba..35dae8961b 100644
--- a/TUnit.Core.SourceGenerator.Tests/AfterAllTests.Test.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/AfterAllTests.Test.verified.txt
@@ -13,7 +13,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
TestClassType = typeof(global::TUnit.TestProject.AfterTests.CleanupTests),
TestMethodName = "Test1",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -33,7 +33,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -41,7 +41,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.CleanupTests)),
Name = "CleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -55,9 +55,16 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AfterTests.CleanupTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.Test1();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.Test1());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -92,7 +99,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
TestClassType = typeof(global::TUnit.TestProject.AfterTests.CleanupTests),
TestMethodName = "Test2",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -112,7 +119,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -120,7 +127,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.CleanupTests)),
Name = "CleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -134,9 +141,16 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AfterTests.CleanupTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.Test2();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.Test2());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
diff --git a/TUnit.Core.SourceGenerator.Tests/AfterTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/AfterTests.Test.verified.txt
index ed931b1fba..35dae8961b 100644
--- a/TUnit.Core.SourceGenerator.Tests/AfterTests.Test.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/AfterTests.Test.verified.txt
@@ -13,7 +13,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
TestClassType = typeof(global::TUnit.TestProject.AfterTests.CleanupTests),
TestMethodName = "Test1",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -33,7 +33,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -41,7 +41,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.CleanupTests)),
Name = "CleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -55,9 +55,16 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test1_TestSource
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AfterTests.CleanupTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.Test1();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.Test1());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -92,7 +99,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
TestClassType = typeof(global::TUnit.TestProject.AfterTests.CleanupTests),
TestMethodName = "Test2",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -112,7 +119,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.CleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -120,7 +127,7 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.CleanupTests)),
Name = "CleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -134,9 +141,16 @@ internal sealed class TUnit_TestProject_AfterTests_CleanupTests_Test2_TestSource
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.AfterTests.CleanupTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- await instance.Test2();
+ try
+ {
+ return new global::System.Threading.Tasks.ValueTask(instance.Test2());
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
+ }
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
diff --git a/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt
index ab7a73d1a9..adcb5e7769 100644
--- a/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/ArgsAsArrayTests.Test.verified.txt
@@ -13,7 +13,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Params__string___TestSo
TestClassType = typeof(global::TUnit.TestProject.ArgsAsArrayTests),
TestMethodName = "Params",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -45,7 +45,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Params__string___TestSo
ReflectionInfo = typeof(global::TUnit.TestProject.ArgsAsArrayTests).GetMethod("Params", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(string[]) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgsAsArrayTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgsAsArrayTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -53,7 +53,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Params__string___TestSo
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.ArgsAsArrayTests)),
Name = "ArgsAsArrayTests",
Namespace = "TUnit.TestProject",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -67,35 +67,41 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Params__string___TestSo
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.ArgsAsArrayTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- switch (args.Length)
+ try
{
- case 0:
- instance.Params(new string[0]);
- break;
- case 1:
- instance.Params((args[0] is null ? null : args[0] is string[] arr ? arr : new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]) }));
- break;
- case 2:
- instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]) });
- break;
- case 3:
- instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) });
- break;
- case 4:
- instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) });
- break;
- case 5:
- instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) });
- break;
- case 6:
- instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) });
- break;
- default:
- throw new global::System.ArgumentException($"Expected between 0 and 1 arguments, but got {args.Length}");
+ switch (args.Length)
+ {
+ case 0:
+ instance.Params(new string[0]);
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 1:
+ instance.Params((args[0] is null ? null : args[0] is string[] arr ? arr : new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]) }));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 2:
+ instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]) });
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 3:
+ instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]) });
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 4:
+ instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]) });
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 5:
+ instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]) });
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 6:
+ instance.Params(new string[] { TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast(args[1]), TUnit.Core.Helpers.CastHelper.Cast(args[2]), TUnit.Core.Helpers.CastHelper.Cast(args[3]), TUnit.Core.Helpers.CastHelper.Cast(args[4]), TUnit.Core.Helpers.CastHelper.Cast(args[5]) });
+ return default(global::System.Threading.Tasks.ValueTask);
+ default:
+ throw new global::System.ArgumentException($"Expected between 0 and 1 arguments, but got {args.Length}");
+ }
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
}
- await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -130,7 +136,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_ParamsEnumerable__IEnum
TestClassType = typeof(global::TUnit.TestProject.ArgsAsArrayTests),
TestMethodName = "ParamsEnumerable",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -162,7 +168,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_ParamsEnumerable__IEnum
ReflectionInfo = typeof(global::TUnit.TestProject.ArgsAsArrayTests).GetMethod("ParamsEnumerable", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::System.Collections.Generic.IEnumerable) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgsAsArrayTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgsAsArrayTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -170,7 +176,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_ParamsEnumerable__IEnum
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.ArgsAsArrayTests)),
Name = "ArgsAsArrayTests",
Namespace = "TUnit.TestProject",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -184,35 +190,41 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_ParamsEnumerable__IEnum
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.ArgsAsArrayTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- switch (args.Length)
+ try
+ {
+ switch (args.Length)
+ {
+ case 0:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 1:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 2:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 3:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 4:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 5:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 6:
+ instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ default:
+ throw new global::System.ArgumentException($"Expected between 0 and 1 arguments, but got {args.Length}");
+ }
+ }
+ catch (global::System.Exception ex)
{
- case 0:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- case 1:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- case 2:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- case 3:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- case 4:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- case 5:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- case 6:
- instance.ParamsEnumerable(TUnit.Core.Helpers.CastHelper.Cast>(args[0]));
- break;
- default:
- throw new global::System.ArgumentException($"Expected between 0 and 1 arguments, but got {args.Length}");
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
}
- await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -247,7 +259,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Following_Non_Params__i
TestClassType = typeof(global::TUnit.TestProject.ArgsAsArrayTests),
TestMethodName = "Following_Non_Params",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute()
],
@@ -286,7 +298,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Following_Non_Params__i
ReflectionInfo = typeof(global::TUnit.TestProject.ArgsAsArrayTests).GetMethod("Following_Non_Params", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(int), typeof(global::System.Collections.Generic.IEnumerable) }, null)!.GetParameters()[1]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgsAsArrayTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgsAsArrayTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -294,7 +306,7 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Following_Non_Params__i
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.ArgsAsArrayTests)),
Name = "ArgsAsArrayTests",
Namespace = "TUnit.TestProject",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -308,35 +320,41 @@ internal sealed class TUnit_TestProject_ArgsAsArrayTests_Following_Non_Params__i
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.ArgsAsArrayTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- switch (args.Length)
+ try
+ {
+ switch (args.Length)
+ {
+ case 1:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 2:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 3:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 4:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 5:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 6:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ case 7:
+ instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ default:
+ throw new global::System.ArgumentException($"Expected between 1 and 2 arguments, but got {args.Length}");
+ }
+ }
+ catch (global::System.Exception ex)
{
- case 1:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- case 2:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- case 3:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- case 4:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- case 5:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- case 6:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- case 7:
- instance.Following_Non_Params(TUnit.Core.Helpers.CastHelper.Cast(args[0]), TUnit.Core.Helpers.CastHelper.Cast>(args[1]));
- break;
- default:
- throw new global::System.ArgumentException($"Expected between 1 and 2 arguments, but got {args.Length}");
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
}
- await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
diff --git a/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt
index 1064d7160c..e574acda8e 100644
--- a/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/ArgumentWithImplicitConverterTests.Test.verified.txt
@@ -13,7 +13,7 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Expli
TestClassType = typeof(global::TUnit.TestProject.ArgumentWithImplicitConverterTests),
TestMethodName = "Explicit",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass)
@@ -48,7 +48,7 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Expli
ReflectionInfo = typeof(global::TUnit.TestProject.ArgumentWithImplicitConverterTests).GetMethod("Explicit", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::TUnit.TestProject.ExplicitInteger) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgumentWithImplicitConverterTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgumentWithImplicitConverterTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -56,7 +56,7 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Expli
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.ArgumentWithImplicitConverterTests)),
Name = "ArgumentWithImplicitConverterTests",
Namespace = "TUnit.TestProject",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -70,17 +70,23 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Expli
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.ArgumentWithImplicitConverterTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- switch (args.Length)
+ try
{
- case 1:
- instance.Explicit(TUnit.Core.Helpers.CastHelper.Cast(args[0]));
- break;
- default:
- throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
+ switch (args.Length)
+ {
+ case 1:
+ instance.Explicit(TUnit.Core.Helpers.CastHelper.Cast(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ default:
+ throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
+ }
+ }
+ catch (global::System.Exception ex)
+ {
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
}
- await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
@@ -115,7 +121,7 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Impli
TestClassType = typeof(global::TUnit.TestProject.ArgumentWithImplicitConverterTests),
TestMethodName = "Implicit",
Dependencies = global::System.Array.Empty(),
- AttributeFactory = () =>
+ AttributeFactory = static () =>
[
new global::TUnit.Core.TestAttribute(),
new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass)
@@ -150,7 +156,7 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Impli
ReflectionInfo = typeof(global::TUnit.TestProject.ArgumentWithImplicitConverterTests).GetMethod("Implicit", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::TUnit.TestProject.ImplicitInteger) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgumentWithImplicitConverterTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.ArgumentWithImplicitConverterTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -158,7 +164,7 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Impli
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.ArgumentWithImplicitConverterTests)),
Name = "ArgumentWithImplicitConverterTests",
Namespace = "TUnit.TestProject",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -172,17 +178,23 @@ internal sealed class TUnit_TestProject_ArgumentWithImplicitConverterTests_Impli
})
},
InstanceFactory = (typeArgs, args) => new global::TUnit.TestProject.ArgumentWithImplicitConverterTests(),
- InvokeTypedTest = async (instance, args, cancellationToken) =>
+ InvokeTypedTest = static (instance, args, cancellationToken) =>
{
- switch (args.Length)
+ try
+ {
+ switch (args.Length)
+ {
+ case 1:
+ instance.Implicit(TUnit.Core.Helpers.CastHelper.Cast(args[0]));
+ return default(global::System.Threading.Tasks.ValueTask);
+ default:
+ throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
+ }
+ }
+ catch (global::System.Exception ex)
{
- case 1:
- instance.Implicit(TUnit.Core.Helpers.CastHelper.Cast(args[0]));
- break;
- default:
- throw new global::System.ArgumentException($"Expected exactly 1 argument, but got {args.Length}");
+ return new global::System.Threading.Tasks.ValueTask(global::System.Threading.Tasks.Task.FromException(ex));
}
- await global::System.Threading.Tasks.Task.CompletedTask;
},
};
metadata.UseRuntimeDataGeneration(testSessionId);
diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyAfterTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/AssemblyAfterTests.Test.verified.txt
index ebe1796e42..a7cdbc32db 100644
--- a/TUnit.Core.SourceGenerator.Tests/AssemblyAfterTests.Test.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/AssemblyAfterTests.Test.verified.txt
@@ -35,7 +35,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase1_AfterAll1_After
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase1", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase1", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -43,7 +43,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase1_AfterAll1_After
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyBase1)),
Name = "AssemblyBase1",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -111,7 +111,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase1_AfterEach1_Afte
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase1", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase1", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -119,7 +119,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase1_AfterEach1_Afte
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyBase1)),
Name = "AssemblyBase1",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -186,7 +186,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase2_AfterAll2_After
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase2", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase2", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -194,7 +194,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase2_AfterAll2_After
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyBase2)),
Name = "AssemblyBase2",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -262,7 +262,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase2_AfterEach2_Afte
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase2", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase2", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -270,7 +270,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase2_AfterEach2_Afte
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyBase2)),
Name = "AssemblyBase2",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -337,7 +337,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase3_AfterAll3_After
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase3", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase3", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -345,7 +345,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase3_AfterAll3_After
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyBase3)),
Name = "AssemblyBase3",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -413,7 +413,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase3_AfterEach3_Afte
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase3", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyBase3", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -421,7 +421,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyBase3_AfterEach3_Afte
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyBase3)),
Name = "AssemblyBase3",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -488,7 +488,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -496,7 +496,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -573,7 +573,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
ReflectionInfo = typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests).GetMethod("AfterAllCleanUpWithContext", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Static, null, new global::System.Type[] { typeof(global::TUnit.Core.AssemblyHookContext) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -581,7 +581,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -649,7 +649,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -657,7 +657,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -741,7 +741,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
ReflectionInfo = typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests).GetMethod("AfterAllCleanUpWithContextAndToken", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Static, null, new global::System.Type[] { typeof(global::TUnit.Core.AssemblyHookContext), typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[1]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -749,7 +749,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_AfterAll
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -817,7 +817,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_Cleanup_
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -825,7 +825,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_Cleanup_
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -901,7 +901,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_Cleanup_
ReflectionInfo = typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests).GetMethod("Cleanup", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -909,7 +909,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_Cleanup_
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -985,7 +985,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_CleanupW
ReflectionInfo = typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests).GetMethod("CleanupWithContext", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::TUnit.Core.TestContext) }, null)!.GetParameters()[0]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -993,7 +993,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_CleanupW
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -1076,7 +1076,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_CleanupW
ReflectionInfo = typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests).GetMethod("CleanupWithContext", global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, new global::System.Type[] { typeof(global::TUnit.Core.TestContext), typeof(global::System.Threading.CancellationToken) }, null)!.GetParameters()[1]
}
},
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.AfterTests.AssemblyCleanupTests", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -1084,7 +1084,7 @@ internal static class TUnit_TestProject_AfterTests_AssemblyCleanupTests_CleanupW
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.AfterTests.AssemblyCleanupTests)),
Name = "AssemblyCleanupTests",
Namespace = "TUnit.TestProject.AfterTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
diff --git a/TUnit.Core.SourceGenerator.Tests/AssemblyBeforeTests.Test.verified.txt b/TUnit.Core.SourceGenerator.Tests/AssemblyBeforeTests.Test.verified.txt
index 5338510711..4eada6fd58 100644
--- a/TUnit.Core.SourceGenerator.Tests/AssemblyBeforeTests.Test.verified.txt
+++ b/TUnit.Core.SourceGenerator.Tests/AssemblyBeforeTests.Test.verified.txt
@@ -35,7 +35,7 @@ internal static class TUnit_TestProject_BeforeTests_AssemblyBase1_BeforeAll1_Bef
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.BeforeTests.AssemblyBase1", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.BeforeTests.AssemblyBase1", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -43,7 +43,7 @@ internal static class TUnit_TestProject_BeforeTests_AssemblyBase1_BeforeAll1_Bef
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.BeforeTests.AssemblyBase1)),
Name = "AssemblyBase1",
Namespace = "TUnit.TestProject.BeforeTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty(),
Properties = global::System.Array.Empty(),
Parent = null
@@ -111,7 +111,7 @@ internal static class TUnit_TestProject_BeforeTests_AssemblyBase1_BeforeEach1_Be
ReturnType = typeof(global::System.Threading.Tasks.Task),
ReturnTypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::System.Threading.Tasks.Task)),
Parameters = global::System.Array.Empty(),
- Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.BeforeTests.AssemblyBase1", () =>
+ Class = global::TUnit.Core.ClassMetadata.GetOrAdd("TestsBase`1:global::TUnit.TestProject.BeforeTests.AssemblyBase1", static () =>
{
var classMetadata = new global::TUnit.Core.ClassMetadata
{
@@ -119,7 +119,7 @@ internal static class TUnit_TestProject_BeforeTests_AssemblyBase1_BeforeEach1_Be
TypeInfo = new global::TUnit.Core.ConcreteType(typeof(global::TUnit.TestProject.BeforeTests.AssemblyBase1)),
Name = "AssemblyBase1",
Namespace = "TUnit.TestProject.BeforeTests",
- Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
+ Assembly = global::TUnit.Core.AssemblyMetadata.GetOrAdd("TestsBase`1", static () => new global::TUnit.Core.AssemblyMetadata { Name = "TestsBase`1" }),
Parameters = global::System.Array.Empty