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)) {
if (GetTypeFromMemberInfo(memberInfo) == parameterType && memberInfo.MemberType == MemberTypes.Field) {
FieldInfo fieldInfo = memberInfo as FieldInfo;
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) {
switch (memberInfo.MemberType) {
case MemberTypes.Field: {
FieldInfo fieldInfo2 = memberInfo as FieldInfo;
object obj = fieldInfo2.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType);
foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) {
list.Add(item);
}
break;
}
case MemberTypes.Property: {
PropertyInfo propertyInfo = memberInfo as PropertyInfo;
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);
}
break;
}
case MemberTypes.Method: {
MethodInfo methodInfo = memberInfo as MethodInfo;
object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(reflectedType);
foreach (object item3 in (IEnumerable)methodInfo.Invoke(obj, new Type[0])) {
list.Add(item3);
}
break;
}
}
}
}
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)
{
switch (member.MemberType) {
case MemberTypes.Field:
return ((FieldInfo)member).FieldType;
case MemberTypes.Property:
return ((PropertyInfo)member).PropertyType;
case MemberTypes.Method:
return ((MethodInfo)member).ReturnType;
default:
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;
}
}
}