PageRenderTime 60ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/src/NUnit/core/Builders/DatapointProvider.cs

#
C# | 151 lines | 121 code | 21 blank | 9 comment | 31 complexity | b517969627d03f8d866461a57b51e022 MD5 | raw file
Possible License(s): GPL-2.0
  1. // ****************************************************************
  2. // Copyright 2008, Charlie Poole
  3. // This is free software licensed under the NUnit license. You may
  4. // obtain a copy of the license at http://nunit.org
  5. // ****************************************************************
  6. using System;
  7. using System.Reflection;
  8. using System.Collections;
  9. using NUnit.Core.Extensibility;
  10. namespace NUnit.Core.Builders
  11. {
  12. /// <summary>
  13. /// Provides data from fields marked with the DatapointAttribute or the
  14. /// DatapointsAttribute.
  15. /// </summary>
  16. public class DatapointProvider : IDataPointProvider
  17. {
  18. private static readonly string DatapointAttribute = "NUnit.Framework.DatapointAttribute";
  19. private static readonly string DatapointsAttribute = "NUnit.Framework.DatapointsAttribute";
  20. #region IDataPointProvider Members
  21. public bool HasDataFor(System.Reflection.ParameterInfo parameter)
  22. {
  23. Type parameterType = parameter.ParameterType;
  24. MemberInfo method = parameter.Member;
  25. Type fixtureType = method.ReflectedType;
  26. if (!Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true))
  27. return false;
  28. if (parameterType == typeof(bool) || parameterType.IsEnum)
  29. return true;
  30. foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
  31. {
  32. if (Reflect.HasAttribute(member, DatapointAttribute, true) &&
  33. GetTypeFromMemberInfo(member) == parameterType)
  34. return true;
  35. else if (Reflect.HasAttribute(member, DatapointsAttribute, true) &&
  36. GetElementTypeFromMemberInfo(member) == parameterType)
  37. return true;
  38. }
  39. return false;
  40. }
  41. public System.Collections.IEnumerable GetDataFor(System.Reflection.ParameterInfo parameter)
  42. {
  43. ArrayList datapoints = new ArrayList();
  44. Type parameterType = parameter.ParameterType;
  45. Type fixtureType = parameter.Member.ReflectedType;
  46. foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
  47. {
  48. if (Reflect.HasAttribute(member, DatapointAttribute, true))
  49. {
  50. if (GetTypeFromMemberInfo(member) == parameterType &&
  51. member.MemberType == MemberTypes.Field)
  52. {
  53. FieldInfo field = member as FieldInfo;
  54. if (field.IsStatic)
  55. datapoints.Add(field.GetValue(null));
  56. else
  57. datapoints.Add(field.GetValue(ProviderCache.GetInstanceOf(fixtureType)));
  58. }
  59. }
  60. else if (Reflect.HasAttribute(member, DatapointsAttribute, true))
  61. {
  62. if (GetElementTypeFromMemberInfo(member) == parameterType)
  63. {
  64. object instance;
  65. switch(member.MemberType)
  66. {
  67. case MemberTypes.Field:
  68. FieldInfo field = member as FieldInfo;
  69. instance = field.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
  70. datapoints.AddRange((ICollection)field.GetValue(instance));
  71. break;
  72. case MemberTypes.Property:
  73. PropertyInfo property = member as PropertyInfo;
  74. MethodInfo getMethod = property.GetGetMethod(true);
  75. instance = getMethod.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
  76. datapoints.AddRange((ICollection)property.GetValue(instance,null));
  77. break;
  78. case MemberTypes.Method:
  79. MethodInfo method = member as MethodInfo;
  80. instance = method.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
  81. datapoints.AddRange((ICollection)method.Invoke(instance, Type.EmptyTypes));
  82. break;
  83. }
  84. }
  85. }
  86. }
  87. if (datapoints.Count == 0)
  88. {
  89. if (parameterType == typeof(bool))
  90. {
  91. datapoints.Add(true);
  92. datapoints.Add(false);
  93. }
  94. else if (parameterType.IsEnum)
  95. {
  96. datapoints.AddRange(System.Enum.GetValues(parameterType));
  97. }
  98. }
  99. return datapoints;
  100. }
  101. private Type GetTypeFromMemberInfo(MemberInfo member)
  102. {
  103. switch (member.MemberType)
  104. {
  105. case MemberTypes.Field:
  106. return ((FieldInfo)member).FieldType;
  107. case MemberTypes.Property:
  108. return ((PropertyInfo)member).PropertyType;
  109. case MemberTypes.Method:
  110. return ((MethodInfo)member).ReturnType;
  111. default:
  112. return null;
  113. }
  114. }
  115. private Type GetElementTypeFromMemberInfo(MemberInfo member)
  116. {
  117. Type type = GetTypeFromMemberInfo(member);
  118. if (type == null)
  119. return null;
  120. if (type.IsArray)
  121. return type.GetElementType();
  122. #if NET_2_0
  123. if (type.IsGenericType && type.Name == "IEnumerable`1")
  124. return type.GetGenericArguments()[0];
  125. #endif
  126. return null;
  127. }
  128. #endregion
  129. }
  130. }