<PackageReference Include="NUnit" Version="3.0.0-alpha-4" />

TestCaseSourceAttribute

TestCaseSourceAttribute indicates the source to be used to provide test cases for a test method.
using NUnit.Framework.Interfaces; using NUnit.Framework.Internal; using NUnit.Framework.Internal.Builders; using System; using System.Collections; using System.Collections.Generic; using System.Reflection; namespace NUnit.Framework { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public class TestCaseSourceAttribute : TestCaseBuilderAttribute, ITestBuilder, IImplyFixture { private readonly object[] _sourceConstructorParameters; private NUnitTestCaseBuilder _builder = new NUnitTestCaseBuilder(); public string SourceName { get; set; } public Type SourceType { get; set; } public string Category { get; set; } public TestCaseSourceAttribute(string sourceName) { SourceName = sourceName; } public TestCaseSourceAttribute(Type sourceType, string sourceName, params object[] constructorParameters) { SourceType = sourceType; SourceName = sourceName; _sourceConstructorParameters = constructorParameters; } public TestCaseSourceAttribute(Type sourceType) { SourceType = sourceType; } public IEnumerable<ITestCaseData> GetTestCasesFor(MethodInfo method) { List<ITestCaseData> list = new List<ITestCaseData>(); IEnumerable testCaseSource = GetTestCaseSource(method); if (testCaseSource != null) try { ParameterInfo[] parameters = method.GetParameters(); foreach (object item in testCaseSource) { ITestCaseData testCaseData = item as ITestCaseData; ParameterSet parameterSet; if (testCaseData != null) parameterSet = new ParameterSet(testCaseData); else { object[] array = item as object[]; if (array != null) { if (array.Length != parameters.Length) array = new object[1] { item }; } else if (item is Array) { Array array2 = item as Array; if (array2.Rank == 1 && array2.Length == parameters.Length) { array = new object[array2.Length]; for (int i = 0; i < array2.Length; i++) { array[i] = array2.GetValue(i); } } else array = new object[1] { item }; } else { array = new object[1] { item }; } parameterSet = new ParameterSet(array); } if (Category != null) { string[] array3 = Category.Split(new char[1] { ',' }); foreach (string value in array3) { parameterSet.Properties.Add("Category", value); } } list.Add(parameterSet); } return list; } catch (Exception exception) { list.Clear(); list.Add(new ParameterSet(exception)); return list; } return list; } private IEnumerable GetTestCaseSource(MethodInfo method) { Type type = SourceType; if (type == (Type)null) type = method.ReflectedType; if (SourceName == null) return Reflect.Construct(type, _sourceConstructorParameters) as IEnumerable; MemberInfo[] member = type.GetMember(SourceName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (member.Length == 1) { MemberInfo memberInfo = member[0]; object obj = Reflect.Construct(type, _sourceConstructorParameters); FieldInfo fieldInfo = memberInfo as FieldInfo; if (fieldInfo != (FieldInfo)null) return (IEnumerable)fieldInfo.GetValue(obj); PropertyInfo propertyInfo = memberInfo as PropertyInfo; if (propertyInfo != (PropertyInfo)null) return (IEnumerable)propertyInfo.GetValue(obj, null); MethodInfo methodInfo = memberInfo as MethodInfo; if (methodInfo != (MethodInfo)null) return (IEnumerable)methodInfo.Invoke(obj, null); } return null; } public IEnumerable<TestMethod> BuildFrom(MethodInfo method, Test suite) { List<TestMethod> list = new List<TestMethod>(); foreach (ParameterSet item in GetTestCasesFor(method)) { list.Add(_builder.BuildTestMethod(method, suite, item)); } return list; } } }