Skip to content

Commit 613ba8e

Browse files
authored
Fix DependsOn not working when a test takes a reference type argument (#2450)
1 parent 4e22b3d commit 613ba8e

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

TUnit.Engine.Tests/Bugs/Bug2449.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Shouldly;
2+
using TUnit.Engine.Tests.Enums;
3+
4+
namespace TUnit.Engine.Tests.Bugs;
5+
6+
public class Bug2449(TestMode testMode) : InvokableTestBase(testMode)
7+
{
8+
[Test]
9+
public async Task Test()
10+
{
11+
await RunTestsWithFilter(
12+
"/*/TUnit.TestProject.Bugs._2449/*/*",
13+
[
14+
result => result.ResultSummary.Outcome.ShouldBe("Completed"),
15+
result => result.ResultSummary.Counters.Total.ShouldBe(2),
16+
result => result.ResultSummary.Counters.Passed.ShouldBe(2),
17+
result => result.ResultSummary.Counters.Failed.ShouldBe(0),
18+
result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0)
19+
]);
20+
}
21+
}

TUnit.Engine/Services/DependencyCollector.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ private DiscoveredTest[] GetDependencies(DiscoveredTest test, DependsOnAttribute
7373
if (dependsOnAttribute.TestClass == null)
7474
{
7575
testsForClass = testsForClass
76-
.Where(x => x.TestDetails.TestClassArguments.SequenceEqual(test.TestDetails.TestClassArguments));
76+
.Where(x => EqualArgs(x.TestDetails.TestClassArguments, test.TestDetails.TestClassArguments));
7777
}
7878

7979
if (dependsOnAttribute.TestName != null)
@@ -97,6 +97,50 @@ private DiscoveredTest[] GetDependencies(DiscoveredTest test, DependsOnAttribute
9797
return foundTests;
9898
}
9999

100+
private bool EqualArgs(object?[] args1, object?[] args2)
101+
{
102+
if(args1.Length != args2.Length)
103+
{
104+
return false;
105+
}
106+
107+
for (var i = 0; i < args1.Length; i++)
108+
{
109+
var objA = args1[i];
110+
var objB = args2[i];
111+
112+
var type1 = objA?.GetType();
113+
var type2 = objB?.GetType();
114+
115+
if (type1 != type2)
116+
{
117+
return false;
118+
}
119+
120+
if(objA is null || objB is null)
121+
{
122+
if (objA != objB)
123+
{
124+
return false;
125+
}
126+
127+
continue;
128+
}
129+
130+
if (!type1!.IsValueType)
131+
{
132+
continue;
133+
}
134+
135+
if (!Equals(objA, objB))
136+
{
137+
return false;
138+
}
139+
}
140+
141+
return true;
142+
}
143+
100144
[DebuggerDisplay("{TestDetails.TestClass.Name}.{TestDetails.TestName}")]
101145
internal class TestDetailsEqualityComparer : IEqualityComparer<TestDetails>
102146
{

TUnit.TestProject/Bugs/2449/Tests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using TUnit.Core.Interfaces;
2+
3+
namespace TUnit.TestProject.Bugs._2449;
4+
5+
[ClassDataSource<SampleDataClass>]
6+
public sealed class Tests(SampleDataClass arg)
7+
{
8+
[Test]
9+
public async Task Test1()
10+
{
11+
var value = arg.Value;
12+
13+
await Assert.That(value).IsTrue();
14+
}
15+
16+
[Test]
17+
[DependsOn(nameof(Test1))]
18+
public async Task Test2()
19+
{
20+
var value = arg.Value;
21+
22+
await Assert.That(value).IsTrue();
23+
}
24+
}
25+
26+
public sealed class SampleDataClass : IAsyncInitializer, IAsyncDisposable
27+
{
28+
public bool Value { get; } = true;
29+
30+
public Task InitializeAsync() => Task.CompletedTask;
31+
public ValueTask DisposeAsync() => default;
32+
}

0 commit comments

Comments
 (0)