From 8a937e19f9e870f5b7f7459a01b4ac76c4fba0f0 Mon Sep 17 00:00:00 2001 From: kenny-ish <114967656+kenny-ish@users.noreply.github.com> Date: Fri, 16 Oct 2026 23:21:22 +0000 Subject: [PATCH 1/3] fix(reflection): apply per-row [Arguments] settings only to their own row In reflection mode, ReflectionAttributeExtractor.GetAllAttributes put every method-level data source attribute into the attribute list of every test case built from that method. The TestBuilder then appends the data source that produced the case on top of that. Since ArgumentsAttribute applies Skip, DisplayName and Categories from OnTestRegistered, the settings of one [Arguments] row leaked into all other rows, so [Arguments("c", Skip = "...")] skipped "a" and "b" too. The source generator already leaves method-level data source attributes out of the generated attribute list (GetTestAttributes) and relies on the per-case data source added by the TestBuilder. Do the same in reflection mode so both engines behave identically. Fixes #7076 --- .../Discovery/ReflectionAttributeExtractor.cs | 12 ++++++- tests/TUnit.Engine.Tests/Issue7076Tests.cs | 35 +++++++++++++++++++ .../Bugs/_7076/ArgumentsRowSkipTests.cs | 33 +++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 tests/TUnit.Engine.Tests/Issue7076Tests.cs create mode 100644 tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs diff --git a/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs b/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs index ab2bbff871b..83887bd7048 100644 --- a/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs +++ b/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs @@ -254,7 +254,17 @@ public static Attribute[] GetAllAttributes(Type testClass, MethodInfo testMethod // Add in reverse order of precedence so method attributes come first // This ensures ScopedAttributeFilter will keep method-level attributes over class/assembly - attributes.AddRange(key.Item2.GetCustomAttributes()); + // Method-level data source attributes are left out, matching the source generator. The + // data source that produced each test case is appended per test by the TestBuilder, so + // per-row settings such as [Arguments(Skip = "...")] only apply to their own row. + foreach (var attribute in key.Item2.GetCustomAttributes()) + { + if (attribute is not IDataSourceAttribute) + { + attributes.Add(attribute); + } + } + attributes.AddRange(key.Item1.GetCustomAttributes()); attributes.AddRange(key.Item1.Assembly.GetCustomAttributes()); diff --git a/tests/TUnit.Engine.Tests/Issue7076Tests.cs b/tests/TUnit.Engine.Tests/Issue7076Tests.cs new file mode 100644 index 00000000000..17f36fa8075 --- /dev/null +++ b/tests/TUnit.Engine.Tests/Issue7076Tests.cs @@ -0,0 +1,35 @@ +using Shouldly; +using TUnit.Engine.Tests.Enums; + +namespace TUnit.Engine.Tests; + +public class Issue7076Tests(TestMode testMode) : InvokableTestBase(testMode) +{ + [Test] + public async Task Arguments_Skip_Only_Skips_Its_Own_Row() + { + await RunTestsWithFilter( + "/*/*/ArgumentsRowSkipTests/OnlyMarkedRowIsSkipped", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(3), + result => result.ResultSummary.Counters.Passed.ShouldBe(2), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(1) + ]); + } + + [Test] + public async Task Arguments_DisplayName_Only_Applies_To_Its_Own_Row() + { + await RunTestsWithFilter( + "/*/*/ArgumentsRowSkipTests/DisplayNameOnlyAppliesToItsOwnRow", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(2), + result => result.ResultSummary.Counters.Passed.ShouldBe(2), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) + ]); + } +} diff --git a/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs b/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs new file mode 100644 index 00000000000..3c2c5239839 --- /dev/null +++ b/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs @@ -0,0 +1,33 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject.Bugs._7076; + +[EngineTest(ExpectedResult.Pass)] +public class ArgumentsRowSkipTests +{ + [Test] + [Arguments("a")] + [Arguments("b")] + [Arguments("c", Skip = "skip only c")] + public async Task OnlyMarkedRowIsSkipped(string value) + { + await Assert.That(value).IsNotEqualTo("c"); + } + + [Test] + [Arguments(1, DisplayName = "custom name for 1")] + [Arguments(2)] + public async Task DisplayNameOnlyAppliesToItsOwnRow(int value) + { + var displayName = TestContext.Current!.Metadata.DisplayName; + + if (value == 1) + { + await Assert.That(displayName).IsEqualTo("custom name for 1"); + } + else + { + await Assert.That(displayName).IsNotEqualTo("custom name for 1"); + } + } +} From 05497eb2edba61116eb8f4ff2d0af9e35d461872 Mon Sep 17 00:00:00 2001 From: kenny-ish <114967656+kenny-ish@users.noreply.github.com> Date: Mon, 19 Oct 2026 07:35:05 +0000 Subject: [PATCH 2/3] fix(reflection): isolate data source attributes per test row --- .../Generators/TestMetadataGenerator.cs | 26 +----- src/TUnit.Engine/Building/TestBuilder.cs | 5 ++ .../Discovery/ReflectionAttributeExtractor.cs | 17 +++- .../Discovery/ReflectionTestDataCollector.cs | 7 +- src/TUnit.Engine/Services/TestRegistry.cs | 4 +- ...sAndMethodArgumentsTests.Test.verified.txt | 4 +- ...ssDataSourceDrivenTests2.Test.verified.txt | 4 +- ...pleDataSourceDrivenTests.Test.verified.txt | 4 +- ...ithDataSourceMethodTests.Test.verified.txt | 5 +- ...ataSourceGeneratorTests.Typed.verified.txt | 4 +- .../GenericMethodTests.Test.verified.txt | 4 - ...aSource_Should_Generate_Tests.verified.txt | 12 +-- .../Hooks1589.Test.verified.txt | 4 +- .../Hooks1594.Test.verified.txt | 4 +- .../InheritsTestsTests.Test.verified.txt | 9 --- ...assDataSourceDrivenTests.Test.verified.txt | 4 +- ...icTestMethodRootingTests.Test.verified.txt | 1 - .../Tests1589.Test.verified.txt | 4 +- .../Tests1594.Test.verified.txt | 4 +- .../Tests1821.Test.verified.txt | 3 +- .../Tests1889.Test.DotNet10_0.verified.txt | 3 - .../Tests2136.Test.verified.txt | 5 -- .../Tests5118.Test.verified.txt | 3 +- ...utCancellationTokenTests.Test.verified.txt | 8 -- tests/TUnit.Engine.Tests/Issue7076Tests.cs | 80 ++++++++++++++++++- .../Bugs/_7076/ArgumentsRowSkipTests.cs | 68 +++++++++++++--- tests/TUnit.TestProject/TestVariantTests.cs | 19 +++++ 27 files changed, 200 insertions(+), 115 deletions(-) diff --git a/src/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs b/src/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs index 57fad6205c7..f96ef2108e5 100644 --- a/src/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs +++ b/src/TUnit.Core.SourceGenerator/Generators/TestMetadataGenerator.cs @@ -1135,26 +1135,8 @@ private static void EmitConcreteInvokeBody(CodeWriter writer, TestMethodMetadata /// private static void EmitConcreteAttributeFactory(CodeWriter writer, TestMethodMetadata testMethod, ConcreteInstantiation entry) { - // Build filtered attributes - var filteredAttributes = new List(); - - foreach (var attr in testMethod.MethodSymbol.GetAttributes()) - { - if (attr.AttributeClass?.Name == "ArgumentsAttribute" && entry.SpecificArgumentsAttribute != null) - { - if (AreSameAttribute(attr, entry.SpecificArgumentsAttribute)) - { - filteredAttributes.Add(attr); - } - } - else - { - filteredAttributes.Add(attr); - } - } - - filteredAttributes.AddRange(testMethod.TypeSymbol.GetAttributesIncludingBaseTypes()); - filteredAttributes.AddRange(testMethod.TypeSymbol.ContainingAssembly.GetAttributes()); + // Data source attributes are emitted separately for the selected row by TestBuilder. + var filteredAttributes = GetTestAttributes(testMethod).ToList(); writer.AppendLine("return new global::System.Attribute[]"); writer.AppendLine("{"); @@ -2846,9 +2828,9 @@ private static void WriteSynchronousExceptionHandler(CodeWriter writer) private static IEnumerable GetTestAttributes(TestMethodMetadata testMethod) { return testMethod.MethodSymbol.GetAttributes() - .Where(a => !DataSourceAttributeHelper.IsDataSourceAttribute(a.AttributeClass)) .Concat(testMethod.TypeSymbol.GetAttributesIncludingBaseTypes()) - .Concat(testMethod.TypeSymbol.ContainingAssembly.GetAttributes()); + .Concat(testMethod.TypeSymbol.ContainingAssembly.GetAttributes()) + .Where(a => !DataSourceAttributeHelper.IsDataSourceAttribute(a.AttributeClass)); } private static (bool HasCancellationToken, IParameterSymbol[] ParametersFromArgs) ParseInvokerParameters(IMethodSymbol methodSymbol) diff --git a/src/TUnit.Engine/Building/TestBuilder.cs b/src/TUnit.Engine/Building/TestBuilder.cs index 574675f96fd..b0f69a48f0e 100644 --- a/src/TUnit.Engine/Building/TestBuilder.cs +++ b/src/TUnit.Engine/Building/TestBuilder.cs @@ -1220,6 +1220,11 @@ private async ValueTask CreateTestContextAsync(string testId, TestM attributes = [..attributes, (Attribute)testBuilderContext.DataSourceAttribute]; } + if (testBuilderContext.ClassDataSourceAttribute != null && testBuilderContext.ClassDataSourceAttribute is not NoDataSource) + { + attributes = [..attributes, (Attribute)testBuilderContext.ClassDataSourceAttribute]; + } + var testDetails = new TestDetails(attributes) { TestId = testId, diff --git a/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs b/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs index 83887bd7048..aac3de74b58 100644 --- a/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs +++ b/src/TUnit.Engine/Discovery/ReflectionAttributeExtractor.cs @@ -265,8 +265,21 @@ public static Attribute[] GetAllAttributes(Type testClass, MethodInfo testMethod } } - attributes.AddRange(key.Item1.GetCustomAttributes()); - attributes.AddRange(key.Item1.Assembly.GetCustomAttributes()); + foreach (var attribute in key.Item1.GetCustomAttributes()) + { + if (attribute is not IDataSourceAttribute) + { + attributes.Add(attribute); + } + } + + foreach (var attribute in key.Item1.Assembly.GetCustomAttributes()) + { + if (attribute is not IDataSourceAttribute) + { + attributes.Add(attribute); + } + } return attributes.ToArray(); }); diff --git a/src/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs b/src/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs index 53c9deea31c..f41b8e648db 100644 --- a/src/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs +++ b/src/TUnit.Engine/Discovery/ReflectionTestDataCollector.cs @@ -1366,7 +1366,7 @@ private static TestMetadata CreateFailedMethodGenericMetadata( FilePath = ExtractFilePath(method) ?? "Unknown", LineNumber = ExtractLineNumber(method) ?? 0, MethodMetadata = ReflectionMetadataBuilder.CreateMethodMetadata(type, method), - AttributeFactory = () => method.GetCustomAttributes().ToArray(), + AttributeFactory = () => ReflectionAttributeExtractor.GetAllAttributes(type, method), DataSources = [], ClassDataSources = [], PropertyDataSources = [] @@ -1432,8 +1432,7 @@ private static TestMetadata CreateFailedTestMetadata( FilePath = ExtractFilePath(method) ?? "Unknown", LineNumber = ExtractLineNumber(method) ?? 0, MethodMetadata = ReflectionMetadataBuilder.CreateMethodMetadata(type, method), - AttributeFactory = () => method.GetCustomAttributes() - .ToArray(), + AttributeFactory = () => ReflectionAttributeExtractor.GetAllAttributes(type, method), DataSources = [ ], @@ -2462,7 +2461,7 @@ private static TestMetadata CreateFailedTestMetadataForDynamicBuilder( FilePath = ExtractFilePath(method) ?? "Unknown", LineNumber = ExtractLineNumber(method) ?? 0, MethodMetadata = ReflectionMetadataBuilder.CreateMethodMetadata(type, method), - AttributeFactory = () => method.GetCustomAttributes().ToArray(), + AttributeFactory = () => ReflectionAttributeExtractor.GetAllAttributes(type, method), DataSources = [], ClassDataSources = [], PropertyDataSources = [] diff --git a/src/TUnit.Engine/Services/TestRegistry.cs b/src/TUnit.Engine/Services/TestRegistry.cs index 0b5c26d742a..d95d95e5f55 100644 --- a/src/TUnit.Engine/Services/TestRegistry.cs +++ b/src/TUnit.Engine/Services/TestRegistry.cs @@ -236,7 +236,9 @@ public async Task CreateTestVariant( } var lambda = Expression.Lambda>(body, parameter); - var attributes = new List(currentContext.Metadata.TestDetails.GetAllAttributes()); + var attributes = currentContext.Metadata.TestDetails.GetAllAttributes() + .Where(static attribute => attribute is not IDataSourceAttribute) + .ToList(); var discoveryResult = new DynamicDiscoveryResult { diff --git a/tests/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt index e0a1bdee3d3..b9b1682fd17 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/ClassAndMethodArgumentsTests.Test.verified.txt @@ -77,9 +77,7 @@ internal static class TUnit_TestProject_ClassAndMethodArgumentsTests__TestSource { return [ - new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute("1"), - new global::TUnit.Core.ArgumentsAttribute("2") + new global::TUnit.Core.TestAttribute() ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests2.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests2.Test.verified.txt index a173c48819e..526b33939b3 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests2.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/ClassDataSourceDrivenTests2.Test.verified.txt @@ -60,9 +60,7 @@ internal static class TUnit_TestProject_ClassDataSourceDrivenTests2__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute(), - new global::TUnit.Core.ClassDataSourceAttribute() + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt index f024d15d562..c744cf02f8a 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/ClassTupleDataSourceDrivenTests.Test.verified.txt @@ -127,9 +127,7 @@ internal static class TUnit_TestProject_ClassTupleDataSourceDrivenTests__TestSou return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.MethodDataSourceAttribute("TupleMethod"), - new global::TUnit.Core.MethodDataSourceAttribute("NamedTupleMethod") + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt index f9463576e58..21476e90dbe 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/DataSourceClassCombinedWithDataSourceMethodTests.Test.verified.txt @@ -63,10 +63,7 @@ internal static class TUnit_TestProject_DataSourceClassCombinedWithDataSourceMet return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.MethodDataSourceAttribute(typeof(global::TUnit.TestProject.CommonTestData), "One"), - new global::TUnit.Core.MethodDataSourceAttribute(typeof(global::TUnit.TestProject.CommonTestData), "Two"), - new global::TUnit.Core.MethodDataSourceAttribute(typeof(global::TUnit.TestProject.CommonTestData), "Three") + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt index caad80e1457..a08af748469 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/DataSourceGeneratorTests.Typed.verified.txt @@ -91,9 +91,7 @@ internal static class TUnit_TestProject_DataSourceGeneratorTests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.TestProject.Attributes.AutoFixtureGeneratorAttribute(), - new global::TUnit.TestProject.Attributes.AutoFixtureGeneratorAttribute() + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodTests.Test.verified.txt index faf49ed8b34..9b851ec6388 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodTests.Test.verified.txt @@ -73,8 +73,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(object), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.MethodDataSourceAttribute("AggregateBy_Numeric_TestData"), - new global::TUnit.Core.MethodDataSourceAttribute("AggregateBy_String_TestData"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } @@ -83,8 +81,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(object), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.MethodDataSourceAttribute("AggregateBy_Numeric_TestData"), - new global::TUnit.Core.MethodDataSourceAttribute("AggregateBy_String_TestData"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } diff --git a/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodWithDataSourceTests.Generic_Method_With_MethodDataSource_Should_Generate_Tests.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodWithDataSourceTests.Generic_Method_With_MethodDataSource_Should_Generate_Tests.verified.txt index 32489318e32..bac73c04fc1 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodWithDataSourceTests.Generic_Method_With_MethodDataSource_Should_Generate_Tests.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/GenericMethodWithDataSourceTests.Generic_Method_With_MethodDataSource_Should_Generate_Tests.verified.txt @@ -157,7 +157,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "number", new gl { new global::TUnit.Core.TestAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.MethodDataSourceAttribute("GetNumbers"), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeA)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeB)) }; @@ -205,7 +204,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "number", new gl { new global::TUnit.Core.TestAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.MethodDataSourceAttribute("GetNumbers"), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeA)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeB)) }; @@ -468,8 +466,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "input", new new global::TUnit.Core.TestAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(int)), - new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)), - new global::TUnit.Core.MethodDataSourceAttribute("GetStrings") + new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)) }; } case 1: @@ -479,8 +476,7 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "input", new new global::TUnit.Core.TestAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(int)), - new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)), - new global::TUnit.Core.MethodDataSourceAttribute("GetStrings") + new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)) }; } default: @@ -1303,7 +1299,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(bool), "flag", new glo new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(int)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)), - new global::TUnit.Core.MethodDataSourceAttribute("GetBooleans"), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeA)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeB)) }; @@ -1316,7 +1311,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(bool), "flag", new glo new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(int)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)), - new global::TUnit.Core.MethodDataSourceAttribute("GetBooleans"), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeA)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeB)) }; @@ -1412,7 +1406,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(bool), "flag", new glo new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(int)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)), - new global::TUnit.Core.MethodDataSourceAttribute("GetBooleans"), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeA)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeB)) }; @@ -1425,7 +1418,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(bool), "flag", new glo new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(int)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(double)), - new global::TUnit.Core.MethodDataSourceAttribute("GetBooleans"), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeA)), new global::TUnit.Core.GenerateGenericTestAttribute(typeof(global::TUnit.TestProject.Bugs._4431.TypeB)) }; diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Hooks1589.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Hooks1589.Test.verified.txt index 63943c71197..c11d70c05fa 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Hooks1589.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Hooks1589.Test.verified.txt @@ -54,9 +54,7 @@ internal static class TUnit_TestProject_Bugs__1589_MyTests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute() - {Shared = global::TUnit.Core.SharedType.None,} + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Hooks1594.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Hooks1594.Test.verified.txt index a8537f1fab7..ae9f62afafb 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Hooks1594.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Hooks1594.Test.verified.txt @@ -55,9 +55,7 @@ internal static class TUnit_TestProject_Bugs__1594_MyTests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute() - {Shared = global::TUnit.Core.SharedType.None,} + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt index 12d7efff602..ca12bc64e9f 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/InheritsTestsTests.Test.verified.txt @@ -182,9 +182,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(1), - new global::TUnit.Core.ArgumentsAttribute(2), - new global::TUnit.Core.ArgumentsAttribute(3), new global::TUnit.Core.RepeatAttribute(10), new global::TUnit.Core.InheritsTestsAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) @@ -277,9 +274,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(1), - new global::TUnit.Core.ArgumentsAttribute(2), - new global::TUnit.Core.ArgumentsAttribute(3), new global::TUnit.Core.RepeatAttribute(10), new global::TUnit.Core.InheritsTestsAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) @@ -372,9 +366,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(int), "value", new glo return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(1), - new global::TUnit.Core.ArgumentsAttribute(2), - new global::TUnit.Core.ArgumentsAttribute(3), new global::TUnit.Core.RepeatAttribute(10), new global::TUnit.Core.InheritsTestsAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) diff --git a/tests/TUnit.Core.SourceGenerator.Tests/MultipleClassDataSourceDrivenTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/MultipleClassDataSourceDrivenTests.Test.verified.txt index 26a798d3677..752db74d0ee 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/MultipleClassDataSourceDrivenTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/MultipleClassDataSourceDrivenTests.Test.verified.txt @@ -64,9 +64,7 @@ internal static class TUnit_TestProject_MultipleClassDataSourceDrivenTests__Test return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute() - {Shared = new global::TUnit.Core.SharedType[]{global::TUnit.Core.SharedType.None,global::TUnit.Core.SharedType.None,global::TUnit.Core.SharedType.None,global::TUnit.Core.SharedType.None,global::TUnit.Core.SharedType.None},} + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/NonPublicTestMethodRootingTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/NonPublicTestMethodRootingTests.Test.verified.txt index 13dc51decee..c5be1e70b5d 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/NonPublicTestMethodRootingTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/NonPublicTestMethodRootingTests.Test.verified.txt @@ -43,7 +43,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(object), "value", new return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(2), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Tests1589.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Tests1589.Test.verified.txt index 63943c71197..c11d70c05fa 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Tests1589.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Tests1589.Test.verified.txt @@ -54,9 +54,7 @@ internal static class TUnit_TestProject_Bugs__1589_MyTests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute() - {Shared = global::TUnit.Core.SharedType.None,} + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Tests1594.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Tests1594.Test.verified.txt index a8537f1fab7..ae9f62afafb 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Tests1594.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Tests1594.Test.verified.txt @@ -55,9 +55,7 @@ internal static class TUnit_TestProject_Bugs__1594_MyTests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute() - {Shared = global::TUnit.Core.SharedType.None,} + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt index 3e2b7b1f61e..ce05562e39e 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Tests1821.Test.verified.txt @@ -74,8 +74,7 @@ internal static class TUnit_TestProject_Bugs__1821_Tests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.ClassDataSourceAttribute() + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt index 203662c3715..feb71ffb8af 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Tests1889.Test.DotNet10_0.verified.txt @@ -122,7 +122,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(bool), "condition", ne return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.MatrixDataSourceAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.InheritsTestsAttribute() }; @@ -209,8 +208,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(bool), "condition", ne return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(false), - new global::TUnit.Core.ArgumentsAttribute(true), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.InheritsTestsAttribute() }; diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Tests2136.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Tests2136.Test.verified.txt index 5abfef368dc..f2c32e77341 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Tests2136.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Tests2136.Test.verified.txt @@ -100,7 +100,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(true, "True"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } @@ -109,7 +108,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(1, "1"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } @@ -118,7 +116,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(1.1, "1.1"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } @@ -127,7 +124,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute("hello", "hello"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } @@ -136,7 +132,6 @@ global::TUnit.Core.ParameterMetadataFactory.Create(typeof(string), "expected", n return new global::System.Attribute[] { new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.ArgumentsAttribute(global::TUnit.TestProject.Bugs._2136.MyEnum.Item, "Item"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) }; } diff --git a/tests/TUnit.Core.SourceGenerator.Tests/Tests5118.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/Tests5118.Test.verified.txt index 052502fb6eb..f629152eb4f 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/Tests5118.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/Tests5118.Test.verified.txt @@ -57,8 +57,7 @@ internal static class TUnit_TestProject_Bugs__5118_AsyncClassMethodDataSourceTes [ new global::TUnit.Core.TestAttribute(), new global::TUnit.Core.TimeoutAttribute(5000), - new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.MethodDataSourceAttribute("GetAsyncTestData") + new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass) ]; } default: diff --git a/tests/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt b/tests/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt index 91fbdb405de..a48800a9d69 100644 --- a/tests/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt +++ b/tests/TUnit.Core.SourceGenerator.Tests/TimeoutCancellationTokenTests.Test.verified.txt @@ -102,7 +102,6 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests__TestSourc [ new global::TUnit.Core.TestAttribute(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") ]; } @@ -114,7 +113,6 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests__TestSourc new global::TUnit.Core.TimeoutAttribute(5_000), new global::TUnit.Core.CategoryAttribute("Blah"), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") ]; } @@ -125,7 +123,6 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests__TestSourc new global::TUnit.Core.TestAttribute(), new global::TUnit.TestProject.TimeoutCancellationTokenTests.FiveSecondTimeout(), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") ]; } @@ -136,7 +133,6 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests__TestSourc new global::TUnit.Core.TestAttribute(), new global::TUnit.Core.TimeoutAttribute(5_000), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") ]; } @@ -147,7 +143,6 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests__TestSourc new global::TUnit.Core.TimeoutAttribute(5_000), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") ]; } @@ -159,7 +154,6 @@ internal static class TUnit_TestProject_TimeoutCancellationTokenTests__TestSourc new global::TUnit.Core.TimeoutAttribute(5_000), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), new global::TUnit.Core.CategoryAttribute("Blah"), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") ]; } @@ -406,7 +400,6 @@ internal static class TUnit_TestProject_TimeoutDoesNotFireTests__TestSource return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.TimeoutAttribute(30_000), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Pass), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") @@ -512,7 +505,6 @@ internal static class TUnit_TestProject_CancellationTokenTriggeredTests__TestSou return [ new global::TUnit.Core.TestAttribute(), - new global::TUnit.Core.MethodDataSourceAttribute("DataSource"), new global::TUnit.Core.TimeoutAttribute(5_000), new global::TUnit.TestProject.Attributes.EngineTest(global::TUnit.TestProject.Attributes.ExpectedResult.Failure), new global::TUnit.Core.CategoryAttribute("Timeout Cancellation Token Tests") diff --git a/tests/TUnit.Engine.Tests/Issue7076Tests.cs b/tests/TUnit.Engine.Tests/Issue7076Tests.cs index 17f36fa8075..3c5ef4eb673 100644 --- a/tests/TUnit.Engine.Tests/Issue7076Tests.cs +++ b/tests/TUnit.Engine.Tests/Issue7076Tests.cs @@ -1,4 +1,8 @@ +using System.Reflection; using Shouldly; +using TUnit.Core; +using TUnit.Core.Interfaces; +using TUnit.Engine.Discovery; using TUnit.Engine.Tests.Enums; namespace TUnit.Engine.Tests; @@ -9,7 +13,7 @@ public class Issue7076Tests(TestMode testMode) : InvokableTestBase(testMode) public async Task Arguments_Skip_Only_Skips_Its_Own_Row() { await RunTestsWithFilter( - "/*/*/ArgumentsRowSkipTests/OnlyMarkedRowIsSkipped", + "/*/*/SkippableArgumentTests/Test1", [ result => result.ResultSummary.Outcome.ShouldBe("Completed"), result => result.ResultSummary.Counters.Total.ShouldBe(3), @@ -32,4 +36,78 @@ await RunTestsWithFilter( result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) ]); } + + [Test] + public async Task ClassArguments_Skip_Only_Skips_Its_Own_Row() + { + await RunTestsWithFilter( + "/*/*/ClassArgumentsRowSkipTests/OnlyMarkedClassRowIsSkipped", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(2), + result => result.ResultSummary.Counters.Passed.ShouldBe(1), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(1) + ]); + } + + [Test] + public async Task InheritedArguments_Skip_Only_Skips_Its_Own_Row() + { + await RunTestsWithFilter( + "/*/*/InheritedArgumentsRowSkipTests/OnlyMarkedInheritedRowIsSkipped", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(2), + result => result.ResultSummary.Counters.Passed.ShouldBe(1), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(1) + ]); + } + + [Test] + public async Task ClassConstructor_Uses_Method_DataSource() + { + await RunTestsWithFilter( + "/*/*/ClassConstructorDataSourceTest/MethodDataSourceIsPassedToClassConstructor", + [ + result => result.ResultSummary.Outcome.ShouldBe("Completed"), + result => result.ResultSummary.Counters.Total.ShouldBe(1), + result => result.ResultSummary.Counters.Passed.ShouldBe(1), + result => result.ResultSummary.Counters.Failed.ShouldBe(0), + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0) + ]); + } + + [Test] + public async Task Failed_Metadata_Filters_Method_DataSources() + { + var method = typeof(FailedMetadataDataSourceTest).GetMethod(nameof(FailedMetadataDataSourceTest.Test))!; + var collectorType = typeof(ReflectionTestDataCollector); + var exception = new InvalidOperationException("discovery failed"); + var factories = new (string Name, object?[] Arguments)[] + { + ("CreateFailedTestMetadata", [typeof(FailedMetadataDataSourceTest), method, exception]), + ("CreateFailedMethodGenericMetadata", [typeof(FailedMetadataDataSourceTest), method, "generic resolution failed"]), + ("CreateFailedTestMetadataForDynamicBuilder", [typeof(FailedMetadataDataSourceTest), method, exception]) + }; + + foreach (var (name, arguments) in factories) + { + var factory = collectorType.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static)!; + var metadata = (TestMetadata)factory.Invoke(null, arguments)!; + metadata.AttributeFactory().OfType().ShouldBeEmpty(name); + } + + await Task.CompletedTask; + } + + private sealed class FailedMetadataDataSourceTest + { + [Arguments(1)] + [Arguments(2, Skip = "wip")] + public static void Test(int value) + { + } + } } diff --git a/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs b/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs index 3c2c5239839..81feb04af4b 100644 --- a/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs +++ b/tests/TUnit.TestProject/Bugs/_7076/ArgumentsRowSkipTests.cs @@ -1,3 +1,4 @@ +using TUnit.Core.Interfaces; using TUnit.TestProject.Attributes; namespace TUnit.TestProject.Bugs._7076; @@ -5,15 +6,6 @@ namespace TUnit.TestProject.Bugs._7076; [EngineTest(ExpectedResult.Pass)] public class ArgumentsRowSkipTests { - [Test] - [Arguments("a")] - [Arguments("b")] - [Arguments("c", Skip = "skip only c")] - public async Task OnlyMarkedRowIsSkipped(string value) - { - await Assert.That(value).IsNotEqualTo("c"); - } - [Test] [Arguments(1, DisplayName = "custom name for 1")] [Arguments(2)] @@ -27,7 +19,63 @@ public async Task DisplayNameOnlyAppliesToItsOwnRow(int value) } else { - await Assert.That(displayName).IsNotEqualTo("custom name for 1"); + await Assert.That(displayName).IsEqualTo("DisplayNameOnlyAppliesToItsOwnRow(2)"); } } } + +[EngineTest(ExpectedResult.Pass)] +[Arguments("a")] +[Arguments("b", Skip = "skip only b")] +public class ClassArgumentsRowSkipTests(string value) +{ + [Test] + public async Task OnlyMarkedClassRowIsSkipped() + { + await Assert.That(value).IsEqualTo("a"); + } +} + +[EngineTest(ExpectedResult.Pass)] +[InheritsTests] +public class InheritedArgumentsRowSkipTests : InheritedArgumentsRowSkipBase; + +public abstract class InheritedArgumentsRowSkipBase +{ + [Test] + [Arguments(1)] + [Arguments(2, Skip = "skip only 2")] + public async Task OnlyMarkedInheritedRowIsSkipped(int value) + { + await Assert.That(value).IsEqualTo(1); + } +} + +[EngineTest(ExpectedResult.Pass)] +[ClassConstructor] +[ClassDataSource] +public class ClassConstructorDataSourceTest(ClassConstructorFixture fixture) +{ + [Test] + [Arguments(42)] + public async Task MethodDataSourceIsPassedToClassConstructor(int value) + { + await Assert.That(value).IsEqualTo(42); + } +} + +public sealed class ClassConstructorDataSourceProbe : IClassConstructor +{ + public Task Create(Type type, ClassConstructorMetadata classConstructorMetadata) + { + if (type == typeof(ClassConstructorDataSourceTest) && + classConstructorMetadata.TestBuilderContext.DataSourceAttribute is not ArgumentsAttribute) + { + throw new InvalidOperationException("The class constructor did not receive the method data source."); + } + + return Task.FromResult(Activator.CreateInstance(type, [new ClassConstructorFixture()])!); + } +} + +public sealed class ClassConstructorFixture; diff --git a/tests/TUnit.TestProject/TestVariantTests.cs b/tests/TUnit.TestProject/TestVariantTests.cs index 2bbe51ba087..587558056d5 100644 --- a/tests/TUnit.TestProject/TestVariantTests.cs +++ b/tests/TUnit.TestProject/TestVariantTests.cs @@ -68,6 +68,25 @@ public async Task CreateTestVariant_ShouldCreateVariantWithDifferentArguments(in // ValueTask→ source generator doesn't support this return type yet // void and ValueTask are covered by unit tests in ExpressionHelperTests. + [Test] + [Arguments(1, DisplayName = "one")] + public async Task CreateTestVariant_DoesNotInheritParentRowSettings(int value) + { + if (!TestContext.Current!.Dependencies.IsVariant()) + { + var variantInfo = await TestContext.Current.CreateTestVariant( + methodArguments: [2], + displayName: "variant"); + + if (variantInfo.DisplayName != "variant") + { + throw new InvalidOperationException($"Expected DisplayName 'variant' but got '{variantInfo.DisplayName}'"); + } + } + + await Assert.That(value).IsEqualTo(1).Or.IsEqualTo(2); + } + [Test] public async Task CreateTestVariant_FromTaskMethod() { From 2b49da92813299dc47ca6838996baf60bb397457 Mon Sep 17 00:00:00 2001 From: kenny-ish <114967656+kenny-ish@users.noreply.github.com> Date: Wed, 21 Oct 2026 08:23:32 +0000 Subject: [PATCH 3/3] test: assert the failed-metadata factories exist before invoking them A renamed factory now fails with its name instead of a NullReferenceException, and the test returns Task.CompletedTask instead of awaiting it. --- tests/TUnit.Engine.Tests/Issue7076Tests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/TUnit.Engine.Tests/Issue7076Tests.cs b/tests/TUnit.Engine.Tests/Issue7076Tests.cs index 3c5ef4eb673..b9af5b386fe 100644 --- a/tests/TUnit.Engine.Tests/Issue7076Tests.cs +++ b/tests/TUnit.Engine.Tests/Issue7076Tests.cs @@ -80,7 +80,7 @@ await RunTestsWithFilter( } [Test] - public async Task Failed_Metadata_Filters_Method_DataSources() + public Task Failed_Metadata_Filters_Method_DataSources() { var method = typeof(FailedMetadataDataSourceTest).GetMethod(nameof(FailedMetadataDataSourceTest.Test))!; var collectorType = typeof(ReflectionTestDataCollector); @@ -94,12 +94,13 @@ public async Task Failed_Metadata_Filters_Method_DataSources() foreach (var (name, arguments) in factories) { - var factory = collectorType.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static)!; + var factory = collectorType.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static); + factory.ShouldNotBeNull(name); var metadata = (TestMetadata)factory.Invoke(null, arguments)!; metadata.AttributeFactory().OfType().ShouldBeEmpty(name); } - await Task.CompletedTask; + return Task.CompletedTask; } private sealed class FailedMetadataDataSourceTest