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 ((object)parameterType == typeof(bool) || parameterType.GetTypeInfo().get_IsEnum())
return true;
MemberInfo[] members = TypeExtensions.GetMembers(method.TypeInfo.Type, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
foreach (MemberInfo memberInfo in members) {
if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointAttribute), true) && (object)GetTypeFromMemberInfo(memberInfo) == parameterType)
return true;
if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointSourceAttribute), true) && (object)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 = TypeExtensions.GetMembers(type2, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
foreach (MemberInfo memberInfo in members) {
if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointAttribute), true)) {
FieldInfo fieldInfo = memberInfo as FieldInfo;
if ((object)GetTypeFromMemberInfo(memberInfo) == type && (object)fieldInfo != null) {
if (fieldInfo.IsStatic)
list.Add(fieldInfo.GetValue(null));
else
list.Add(fieldInfo.GetValue(ProviderCache.GetInstanceOf(type2)));
}
} else if (CustomAttributeExtensions.IsDefined(memberInfo, typeof(DatapointSourceAttribute), true) && (object)GetElementTypeFromMemberInfo(memberInfo) == type) {
FieldInfo fieldInfo2 = memberInfo as FieldInfo;
PropertyInfo propertyInfo = memberInfo as PropertyInfo;
MethodInfo methodInfo = memberInfo as MethodInfo;
if ((object)fieldInfo2 != null) {
object obj = fieldInfo2.IsStatic ? null : ProviderCache.GetInstanceOf(type2);
foreach (object item in (IEnumerable)fieldInfo2.GetValue(obj)) {
list.Add(item);
}
} else if ((object)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 ((object)methodInfo != null) {
object obj = methodInfo.IsStatic ? null : ProviderCache.GetInstanceOf(type2);
foreach (object item3 in (IEnumerable)methodInfo.Invoke(obj, new Type[0])) {
list.Add(item3);
}
}
}
}
if (list.Count == 0) {
Type underlyingType = Nullable.GetUnderlyingType(type);
if ((object)underlyingType != null)
type = underlyingType;
if ((object)type == typeof(bool)) {
list.Add(true);
list.Add(false);
} else if (type.GetTypeInfo().get_IsEnum()) {
foreach (object enumValue in TypeHelper.GetEnumValues(type)) {
list.Add(enumValue);
}
}
if (list.Count > 0 && (object)underlyingType != null)
list.Add(null);
}
return list;
}
private Type GetTypeFromMemberInfo(MemberInfo member)
{
FieldInfo fieldInfo = member as FieldInfo;
if ((object)fieldInfo != null)
return fieldInfo.FieldType;
PropertyInfo propertyInfo = member as PropertyInfo;
if ((object)propertyInfo != null)
return propertyInfo.PropertyType;
return (member as MethodInfo)?.ReturnType;
}
private Type GetElementTypeFromMemberInfo(MemberInfo member)
{
Type typeFromMemberInfo = GetTypeFromMemberInfo(member);
if ((object)typeFromMemberInfo == null)
return null;
if (typeFromMemberInfo.IsArray)
return typeFromMemberInfo.GetElementType();
if (typeFromMemberInfo.GetTypeInfo().get_IsGenericType() && typeFromMemberInfo.get_Name() == "IEnumerable`1")
return TypeExtensions.GetGenericArguments(typeFromMemberInfo)[0];
return null;
}
}
}