diff --git a/TUnit.Engine.Tests/Bugs/Bug2449.cs b/TUnit.Engine.Tests/Bugs/Bug2449.cs new file mode 100644 index 0000000000..2333cd6db0 --- /dev/null +++ b/TUnit.Engine.Tests/Bugs/Bug2449.cs @@ -0,0 +1,21 @@ +using Shouldly; +using TUnit.Engine.Tests.Enums; + +namespace TUnit.Engine.Tests.Bugs; + +public class Bug2449(TestMode testMode) : InvokableTestBase(testMode) +{ + [Test] + public async Task Test() + { + await RunTestsWithFilter( + "/*/TUnit.TestProject.Bugs._2449/*/*", + [ + 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) + ]); + } +} \ No newline at end of file diff --git a/TUnit.Engine/Services/DependencyCollector.cs b/TUnit.Engine/Services/DependencyCollector.cs index 36a476c840..c6942f5b46 100644 --- a/TUnit.Engine/Services/DependencyCollector.cs +++ b/TUnit.Engine/Services/DependencyCollector.cs @@ -73,7 +73,7 @@ private DiscoveredTest[] GetDependencies(DiscoveredTest test, DependsOnAttribute if (dependsOnAttribute.TestClass == null) { testsForClass = testsForClass - .Where(x => x.TestDetails.TestClassArguments.SequenceEqual(test.TestDetails.TestClassArguments)); + .Where(x => EqualArgs(x.TestDetails.TestClassArguments, test.TestDetails.TestClassArguments)); } if (dependsOnAttribute.TestName != null) @@ -97,6 +97,50 @@ private DiscoveredTest[] GetDependencies(DiscoveredTest test, DependsOnAttribute return foundTests; } + private bool EqualArgs(object?[] args1, object?[] args2) + { + if(args1.Length != args2.Length) + { + return false; + } + + for (var i = 0; i < args1.Length; i++) + { + var objA = args1[i]; + var objB = args2[i]; + + var type1 = objA?.GetType(); + var type2 = objB?.GetType(); + + if (type1 != type2) + { + return false; + } + + if(objA is null || objB is null) + { + if (objA != objB) + { + return false; + } + + continue; + } + + if (!type1!.IsValueType) + { + continue; + } + + if (!Equals(objA, objB)) + { + return false; + } + } + + return true; + } + [DebuggerDisplay("{TestDetails.TestClass.Name}.{TestDetails.TestName}")] internal class TestDetailsEqualityComparer : IEqualityComparer { diff --git a/TUnit.TestProject/Bugs/2449/Tests.cs b/TUnit.TestProject/Bugs/2449/Tests.cs new file mode 100644 index 0000000000..87e5dfe175 --- /dev/null +++ b/TUnit.TestProject/Bugs/2449/Tests.cs @@ -0,0 +1,32 @@ +using TUnit.Core.Interfaces; + +namespace TUnit.TestProject.Bugs._2449; + +[ClassDataSource] +public sealed class Tests(SampleDataClass arg) +{ + [Test] + public async Task Test1() + { + var value = arg.Value; + + await Assert.That(value).IsTrue(); + } + + [Test] + [DependsOn(nameof(Test1))] + public async Task Test2() + { + var value = arg.Value; + + await Assert.That(value).IsTrue(); + } +} + +public sealed class SampleDataClass : IAsyncInitializer, IAsyncDisposable +{ + public bool Value { get; } = true; + + public Task InitializeAsync() => Task.CompletedTask; + public ValueTask DisposeAsync() => default; +} \ No newline at end of file