diff --git a/.gitignore b/.gitignore
index dd1360bb1a..740dafc6d7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -438,4 +438,4 @@ doc/plans/
*.nettrace
# Git worktrees
-.worktrees/
\ No newline at end of file
+.worktrees/.worktrees/
diff --git a/TUnit.Engine.Tests/GenericMethodWithDataSourceTests.cs b/TUnit.Engine.Tests/GenericMethodWithDataSourceTests.cs
new file mode 100644
index 0000000000..fae226043f
--- /dev/null
+++ b/TUnit.Engine.Tests/GenericMethodWithDataSourceTests.cs
@@ -0,0 +1,88 @@
+using Shouldly;
+using TUnit.Engine.Tests.Enums;
+
+namespace TUnit.Engine.Tests;
+
+///
+/// Tests that verify generic methods with [GenerateGenericTest] and [MethodDataSource] attributes
+/// are properly discovered and executed.
+///
+public class GenericMethodWithDataSourceTests(TestMode testMode) : InvokableTestBase(testMode)
+{
+ [Test]
+ public async Task NonGenericClassWithGenericMethodAndDataSource_Should_Generate_Tests()
+ {
+ // This test verifies that a non-generic class with a generic method that has both
+ // [GenerateGenericTest(typeof(int))] and [GenerateGenericTest(typeof(double))]
+ // combined with [MethodDataSource(nameof(GetStrings))] generates 4 tests:
+ // - GenericMethodWithDataSource("hello")
+ // - GenericMethodWithDataSource("world")
+ // - GenericMethodWithDataSource("hello")
+ // - GenericMethodWithDataSource("world")
+ await RunTestsWithFilter(
+ "/*/*/Bug4440_NonGenericClassWithGenericMethodAndDataSource/*",
+ [
+ result => result.ResultSummary.Outcome.ShouldBe("Completed"),
+ result => result.ResultSummary.Counters.Total.ShouldBe(4),
+ result => result.ResultSummary.Counters.Passed.ShouldBe(4),
+ result => result.ResultSummary.Counters.Failed.ShouldBe(0),
+ result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0)
+ ]);
+ }
+
+ [Test]
+ public async Task GenericClassWithMethodDataSource_Should_Generate_Tests()
+ {
+ // Generic class with 2 types (string, object) and data source with 3 items (1, 2, 3)
+ // Expected: 2 class types × 3 data items = 6 tests
+ // The data source values differentiate the test names, so all 6 are unique.
+ await RunTestsWithFilter(
+ "/*/*/Bug4440_GenericClassWithMethodDataSource*/*",
+ [
+ result => result.ResultSummary.Outcome.ShouldBe("Completed"),
+ result => result.ResultSummary.Counters.Total.ShouldBe(6),
+ result => result.ResultSummary.Counters.Passed.ShouldBe(6),
+ result => result.ResultSummary.Counters.Failed.ShouldBe(0),
+ result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0)
+ ]);
+ }
+
+ [Test]
+ public async Task FullyGenericWithDataSources_Should_Generate_Tests()
+ {
+ // Cartesian product: 2 class types × 2 method types × 2 data items = 8 tests
+ // - Bug4440_GenericClassGenericMethodWithDataSources.CartesianProduct(true)
+ // - Bug4440_GenericClassGenericMethodWithDataSources.CartesianProduct(false)
+ // - Bug4440_GenericClassGenericMethodWithDataSources.CartesianProduct(true)
+ // - Bug4440_GenericClassGenericMethodWithDataSources.CartesianProduct(false)
+ // - Bug4440_GenericClassGenericMethodWithDataSources