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;
}
}
}