TestFixtureSourceAttribute
Identifies the source used to provide test fixture instances for a test class.
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
using NUnit.Framework.Internal.Builders;
using NUnit.Framework.Internal.Extensions;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace NUnit.Framework
{
[NullableContext(1)]
[Nullable(0)]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class TestFixtureSourceAttribute : NUnitAttribute, IFixtureBuilder2, IFixtureBuilder
{
private readonly NUnitTestFixtureBuilder _builder = new NUnitTestFixtureBuilder();
public const string MUST_BE_STATIC = "The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.";
[Nullable(2)]
[field: Nullable(2)]
public string SourceName {
[NullableContext(2)]
get;
}
[Nullable(2)]
[field: Nullable(2)]
public Type SourceType {
[NullableContext(2)]
get;
}
[Nullable(2)]
[field: Nullable(2)]
public string Category {
[NullableContext(2)]
get;
[NullableContext(2)]
set;
}
public TestFixtureSourceAttribute(string sourceName)
{
SourceName = sourceName;
}
public TestFixtureSourceAttribute(Type sourceType, string sourceName)
{
SourceType = sourceType;
SourceName = sourceName;
}
public TestFixtureSourceAttribute(Type sourceType)
{
SourceType = sourceType;
}
public IEnumerable<TestSuite> BuildFrom(ITypeInfo typeInfo)
{
return BuildFrom(typeInfo, PreFilter.Empty);
}
public IEnumerable<TestSuite> BuildFrom(ITypeInfo typeInfo, IPreFilter filter)
{
Type sourceType = SourceType ?? typeInfo.Type;
ParameterizedFixtureSuite parameterizedFixtureSuite = new ParameterizedFixtureSuite(typeInfo);
parameterizedFixtureSuite.ApplyAttributesToTest(typeInfo.Type);
FixtureLifeCycleAttribute[] attributes = typeInfo.Type.Assembly.GetAttributes<FixtureLifeCycleAttribute>();
FixtureLifeCycleAttribute[] attributes2 = typeInfo.Type.GetAttributes<FixtureLifeCycleAttribute>(true);
ParallelizableAttribute[] attributes3 = typeInfo.Type.GetAttributes<ParallelizableAttribute>(true);
foreach (ITestFixtureData item in GetParametersFor(sourceType)) {
TestSuite testSuite = _builder.BuildFrom(typeInfo, filter, item);
testSuite.ApplyAttributesToTest(attributes);
testSuite.ApplyAttributesToTest(attributes2);
testSuite.ApplyAttributesToTest(attributes3);
parameterizedFixtureSuite.Add(testSuite);
}
yield return (TestSuite)parameterizedFixtureSuite;
}
public IEnumerable<ITestFixtureData> GetParametersFor(Type sourceType)
{
List<ITestFixtureData> list = new List<ITestFixtureData>();
try {
IEnumerable testFixtureSource = GetTestFixtureSource(sourceType);
if (testFixtureSource != null) {
foreach (object item in testFixtureSource) {
ITestFixtureData testFixtureData = item as ITestFixtureData;
if (testFixtureData == null) {
object[] array = item as object[];
if (array == null)
array = new object[1] {
item
};
testFixtureData = new TestFixtureParameters(array);
}
if (Category != null) {
foreach (string item2 in Category.Tokenize(',', false)) {
testFixtureData.Properties.Add("Category", item2);
}
}
list.Add(testFixtureData);
}
return list;
}
return list;
} catch (Exception exception) {
list.Clear();
list.Add(new TestFixtureParameters(exception));
return list;
}
}
[return: Nullable(2)]
private IEnumerable GetTestFixtureSource(Type sourceType)
{
if (SourceName == null)
return Reflect.Construct(sourceType) as IEnumerable;
MemberInfo[] memberIncludingFromBase = sourceType.GetMemberIncludingFromBase(SourceName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (memberIncludingFromBase.Length == 1) {
MemberInfo memberInfo = memberIncludingFromBase[0];
FieldInfo fieldInfo = memberInfo as FieldInfo;
if ((object)fieldInfo != null) {
if (!fieldInfo.IsStatic)
return SourceMustBeStaticError();
return (IEnumerable)fieldInfo.GetValue(null);
}
PropertyInfo propertyInfo = memberInfo as PropertyInfo;
if ((object)propertyInfo != null) {
if ((!(propertyInfo.GetGetMethod(true)?.IsStatic)) ?? true)
return SourceMustBeStaticError();
return (IEnumerable)propertyInfo.GetValue(null, null);
}
MethodInfo methodInfo = memberInfo as MethodInfo;
if ((object)methodInfo != null) {
if (!methodInfo.IsStatic)
return SourceMustBeStaticError();
return AsyncEnumerableAdapter.CoalesceToEnumerable(methodInfo.InvokeMaybeAwait<object>());
}
}
return null;
}
private static IEnumerable SourceMustBeStaticError()
{
TestFixtureParameters testFixtureParameters = new TestFixtureParameters();
testFixtureParameters.RunState = RunState.NotRunnable;
testFixtureParameters.Properties.Set("_SKIPREASON", "The sourceName specified on a TestCaseSourceAttribute must refer to a static field, property or method.");
return new TestFixtureParameters[1] {
testFixtureParameters
};
}
}
}