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

DatapointProvider

Provides data from fields marked with the DatapointAttribute or the DatapointsAttribute.
using NUnit.Framework.Interfaces; using System; using System.Collections; using System.Collections.Generic; using System.Reflection; namespace NUnit.Framework.Internal.Builders { public class DatapointProvider : IParameterDataProvider { public bool HasDataFor(ParameterInfo parameter) { Type parameterType = parameter.ParameterType; MemberInfo member = parameter.Member; Type reflectedType = member.ReflectedType; if (!member.IsDefined(typeof(TheoryAttribute), true)) return false; if (parameterType == typeof(bool) || parameterType.IsEnum) return true; MemberInfo[] members = reflectedType.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MemberInfo memberInfo in members) { if (memberInfo.IsDefined(typeof(DatapointAttribute), true) && GetTypeFromMemberInfo(memberInfo) == parameterType) return true; if (memberInfo.IsDefined(typeof(DatapointSourceAttribute), true) && GetElementTypeFromMemberInfo(memberInfo) == parameterType) return true; } return false; } public IEnumerable GetDataFor(ParameterInfo parameter) { List<object> list = new List<object>(); Type parameterType = parameter.ParameterType; Type reflectedType = parameter.Member.ReflectedType; MemberInfo[] members = reflectedType.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MemberInfo memberInfo in members) { if (memberInfo.IsDefined(typeof(DatapointAttribute), true)) { FieldInfo fieldInfo = memberInfo as FieldInfo; if (GetTypeFromMemberInfo(memberInfo) == parameterType && fieldInfo != (FieldInfo)null) { if (fieldInfo.IsStatic) list.Add(fieldInfo.GetValue(null)); else list.Add(fieldInfo.GetValue(ProviderCache.GetInstanceOf(reflectedType))); } } else if (memberInfo.IsDefined(typeof(DatapointSourceAttribute), true) && GetElementTypeFromMemberInfo(memberInfo) == parameterType) { FieldInfo fieldInfo2 = memberInfo as FieldInfo; PropertyInfo propertyInfo = memberInfo as PropertyInfo; MethodInfo methodInfo = memberInfo as MethodInfo; if (fieldInfo2 != (FieldInfo)null) { object obj = fieldInfo2.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType); foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) { list.Add(item); } } else if (propertyInfo != (PropertyInfo)null) { MethodInfo getMethod = propertyInfo.GetGetMethod(true); object obj = getMethod.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType); foreach (object item2 in (IEnumerable)propertyInfo.GetValue(obj, null)) { list.Add(item2); } } else if (methodInfo != (MethodInfo)null) { object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType); foreach (object item3 in (IEnumerable)methodInfo.Invoke(obj, new Type[0])) { list.Add(item3); } } } } if (list.Count == 0) { if (parameterType == typeof(bool)) { list.Add(true); list.Add(false); } else if (parameterType.IsEnum) { foreach (object enumValue in TypeHelper.GetEnumValues(parameterType)) { list.Add(enumValue); } return list; } } return list; } private Type GetTypeFromMemberInfo(MemberInfo member) { FieldInfo fieldInfo = member as FieldInfo; if (fieldInfo != (FieldInfo)null) return fieldInfo.FieldType; PropertyInfo propertyInfo = member as PropertyInfo; if (propertyInfo != (PropertyInfo)null) return propertyInfo.PropertyType; MethodInfo methodInfo = member as MethodInfo; if (methodInfo != (MethodInfo)null) return methodInfo.ReturnType; return null; } private Type GetElementTypeFromMemberInfo(MemberInfo member) { Type typeFromMemberInfo = GetTypeFromMemberInfo(member); if (typeFromMemberInfo == (Type)null) return null; if (typeFromMemberInfo.IsArray) return typeFromMemberInfo.GetElementType(); if (typeFromMemberInfo.IsGenericType && typeFromMemberInfo.Name == "IEnumerable`1") return typeFromMemberInfo.GetGenericArguments()[0]; return null; } } }