AttributeFinderBase.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using NUnit.Framework.Interfaces;
  5. using UnityEngine;
  6. using UnityEngine.TestTools;
  7. namespace UnityEditor.TestTools.TestRunner
  8. {
  9. internal abstract class AttributeFinderBase : IAttributeFinder
  10. {
  11. public abstract IEnumerable<Type> Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform);
  12. }
  13. internal interface IAttributeFinder
  14. {
  15. IEnumerable<Type> Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform);
  16. }
  17. internal abstract class AttributeFinderBase<T1, T2> : AttributeFinderBase where T2 : Attribute
  18. {
  19. private readonly Func<T2, Type> m_TypeSelector;
  20. protected AttributeFinderBase(Func<T2, Type> typeSelector)
  21. {
  22. m_TypeSelector = typeSelector;
  23. }
  24. public override IEnumerable<Type> Search(ITest tests, ITestFilter filter, RuntimePlatform testTargetPlatform)
  25. {
  26. var selectedTests = new List<ITest>();
  27. GetMatchingTests(tests, filter, ref selectedTests, testTargetPlatform);
  28. var result = new List<Type>();
  29. result.AddRange(GetTypesFromPrebuildAttributes(selectedTests));
  30. result.AddRange(GetTypesFromInterface(selectedTests, testTargetPlatform));
  31. return result.Distinct();
  32. }
  33. private static void GetMatchingTests(ITest tests, ITestFilter filter, ref List<ITest> resultList, RuntimePlatform testTargetPlatform)
  34. {
  35. foreach (var test in tests.Tests)
  36. {
  37. if (IsTestEnabledOnPlatform(test, testTargetPlatform))
  38. {
  39. if (test.IsSuite)
  40. {
  41. GetMatchingTests(test, filter, ref resultList, testTargetPlatform);
  42. }
  43. else
  44. {
  45. if (filter.Pass(test))
  46. resultList.Add(test);
  47. }
  48. }
  49. }
  50. }
  51. private static bool IsTestEnabledOnPlatform(ITest test, RuntimePlatform testTargetPlatform)
  52. {
  53. if (test.Method == null)
  54. {
  55. return true;
  56. }
  57. var attributesFromMethods = test.Method.GetCustomAttributes<UnityPlatformAttribute>(true).Select(attribute => attribute);
  58. var attributesFromTypes = test.Method.TypeInfo.GetCustomAttributes<UnityPlatformAttribute>(true).Select(attribute => attribute);
  59. if (!attributesFromMethods.All(a => a.IsPlatformSupported(testTargetPlatform)))
  60. {
  61. return false;
  62. }
  63. if (!attributesFromTypes.All(a => a.IsPlatformSupported(testTargetPlatform)))
  64. {
  65. return false;
  66. }
  67. return true;
  68. }
  69. private IEnumerable<Type> GetTypesFromPrebuildAttributes(IEnumerable<ITest> tests)
  70. {
  71. var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
  72. allAssemblies = allAssemblies.Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEditor.TestRunner")).ToArray();
  73. var attributesFromAssemblies = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(T2), true).OfType<T2>());
  74. var attributesFromMethods = tests.SelectMany(t => t.Method.GetCustomAttributes<T2>(true).Select(attribute => attribute));
  75. var attributesFromTypes = tests.SelectMany(t => t.Method.TypeInfo.GetCustomAttributes<T2>(true).Select(attribute => attribute));
  76. var result = new List<T2>();
  77. result.AddRange(attributesFromAssemblies);
  78. result.AddRange(attributesFromMethods);
  79. result.AddRange(attributesFromTypes);
  80. return result.Select(m_TypeSelector).Where(type => type != null);
  81. }
  82. private static IEnumerable<Type> GetTypesFromInterface(IEnumerable<ITest> selectedTests, RuntimePlatform testTargetPlatform)
  83. {
  84. var typesWithInterfaces = selectedTests.Where(t => typeof(T1).IsAssignableFrom(t.Method.TypeInfo.Type) && IsTestEnabledOnPlatform(t, testTargetPlatform));
  85. return typesWithInterfaces.Select(t => t.Method.TypeInfo.Type);
  86. }
  87. }
  88. }