DatapointProvider
Provides data from fields marked with the DatapointAttribute or the
DatapointsAttribute.
using NUnit.Compatibility;
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(IParameterInfo parameter)
{
IMethodInfo method = parameter.Method;
if (!method.IsDefined<TheoryAttribute>(true))
return false;
Type parameterType = parameter.ParameterType;
if (parameterType == typeof(bool) || TypeExtensions.GetTypeInfo(parameterType).IsEnum)
return true;
MemberInfo[] members = method.TypeInfo.Type.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
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(IParameterInfo parameter)
{
List<object> list = new List<object>();
Type type = parameter.ParameterType;
Type type2 = parameter.Method.TypeInfo.Type;
MemberInfo[] members = type2.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
foreach (MemberInfo memberInfo in members) {
if (memberInfo.IsDefined(typeof(DatapointAttribute), true)) {
FieldInfo fieldInfo = memberInfo as FieldInfo;
if (GetTypeFromMemberInfo(memberInfo) == type && fieldInfo != (FieldInfo)null) {
if (fieldInfo.IsStatic)
list.Add(fieldInfo.GetValue(null));
else
list.Add(fieldInfo.GetValue(ProviderCache.GetInstanceOf(type2)));
}
} else if (memberInfo.IsDefined(typeof(DatapointSourceAttribute), true) && GetElementTypeFromMemberInfo(memberInfo) == type) {
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(type2);
foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) {
list.Add(item);
}
} else if (propertyInfo != (PropertyInfo)null) {
object obj = propertyInfo.GetGetMethod(true).IsStatic ? null : ProviderCache.GetInstanceOf(type2);
foreach (object item2 in (IEnumerable)propertyInfo.GetValue(obj, null)) {
list.Add(item2);
}
} else if (methodInfo != (MethodInfo)null) {
object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(type2);
MethodInfo methodInfo2 = methodInfo;
object obj2 = obj;
object[] parameters = new Type[0];
foreach (object item3 in (IEnumerable)methodInfo2.Invoke(obj2, parameters)) {
list.Add(item3);
}
}
}
}
if (list.Count == 0) {
Type underlyingType = Nullable.GetUnderlyingType(type);
if (underlyingType != (Type)null)
type = underlyingType;
if (type == typeof(bool)) {
list.Add(true);
list.Add(false);
} else if (TypeExtensions.GetTypeInfo(type).IsEnum) {
foreach (object value in Enum.GetValues(type)) {
list.Add(value);
}
}
if (list.Count > 0 && underlyingType != (Type)null)
list.Add(null);
}
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 (TypeExtensions.GetTypeInfo(typeFromMemberInfo).IsGenericType && typeFromMemberInfo.Name == "IEnumerable`1")
return typeFromMemberInfo.GetGenericArguments()[0];
return null;
}
}
}