Skip to content

Commit bfd42e0

Browse files
committed
#3053: Class data derived from TheoryData<SomeType[]> is broken
1 parent 5f7494f commit bfd42e0

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed

src/xunit.core/ClassDataAttribute.cs

+14-12
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,21 @@ public ClassDataAttribute(Type @class)
3131
/// <inheritdoc/>
3232
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
3333
{
34-
IEnumerable<object[]> data = Activator.CreateInstance(Class) as IEnumerable<object[]>;
35-
if (data == null)
36-
throw new ArgumentException(
37-
string.Format(
38-
CultureInfo.CurrentCulture,
39-
"{0} must implement IEnumerable<object[]> to be used as ClassData for the test method named '{1}' on {2}",
40-
Class.FullName,
41-
testMethod.Name,
42-
testMethod.DeclaringType.FullName
43-
)
44-
);
34+
var dataObj = Activator.CreateInstance(Class);
35+
if (dataObj is ITheoryData theoryData)
36+
return theoryData.GetData();
37+
if (dataObj is IEnumerable<object[]> enumerable)
38+
return enumerable;
4539

46-
return data;
40+
throw new ArgumentException(
41+
string.Format(
42+
CultureInfo.CurrentCulture,
43+
"{0} must implement IEnumerable<object[]> to be used as ClassData for the test method named '{1}' on {2}",
44+
Class.FullName,
45+
testMethod.Name,
46+
testMethod.DeclaringType.FullName
47+
)
48+
);
4749
}
4850
}
4951
}

test/test.xunit.execution/Acceptance/Xunit2TheoryAcceptanceTests.cs

+35
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,41 @@ public IEnumerator<object[]> GetEnumerator()
677677
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
678678
}
679679

680+
[Fact]
681+
public void ClassDataFromArray()
682+
{
683+
var testMessages = Run<ITestResultMessage>(typeof(ClassWithArrayData));
684+
685+
Assert.Collection(
686+
testMessages.OfType<ITestPassed>().Select(p => p.Test.DisplayName).OrderBy(x => x),
687+
name => Assert.Equal("Xunit2TheoryAcceptanceTests+ClassDataTests+ClassWithArrayData.ExampleParameterizedTestMethod(values: [\"0\", \"2\", \"4\"])", name),
688+
name => Assert.Equal("Xunit2TheoryAcceptanceTests+ClassDataTests+ClassWithArrayData.ExampleParameterizedTestMethod(values: [\"0\", \"2\"])", name),
689+
name => Assert.Equal("Xunit2TheoryAcceptanceTests+ClassDataTests+ClassWithArrayData.ExampleParameterizedTestMethod(values: [\"0\"])", name)
690+
);
691+
Assert.Empty(testMessages.OfType<ITestFailed>());
692+
Assert.Empty(testMessages.OfType<ITestSkipped>());
693+
}
694+
695+
class ClassWithArrayData
696+
{
697+
[Theory]
698+
[ClassData(typeof(ClassDataFromArrayDataSource))]
699+
public void ExampleParameterizedTestMethod(string[] values)
700+
{
701+
Assert.All(values, s => Assert.True(s.Length < 10));
702+
}
703+
}
704+
705+
class ClassDataFromArrayDataSource : TheoryData<string[]>
706+
{
707+
public ClassDataFromArrayDataSource()
708+
{
709+
Add(["0"]);
710+
Add(["0", "2"]);
711+
Add(["0", "2", "4"]);
712+
}
713+
}
714+
680715
[Fact]
681716
public void NoDefaultConstructor_Fails()
682717
{

0 commit comments

Comments
 (0)