TestRunCallbackListener.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using NUnit.Framework.Interfaces;
  6. using NUnit.Framework.Internal;
  7. using UnityEngine.TestTools.TestRunner;
  8. namespace UnityEngine.TestRunner.Utils
  9. {
  10. internal class TestRunCallbackListener : ScriptableObject, ITestRunnerListener
  11. {
  12. private ITestRunCallback[] m_Callbacks;
  13. public void RunStarted(ITest testsToRun)
  14. {
  15. InvokeAllCallbacks(callback => callback.RunStarted(testsToRun));
  16. }
  17. private static ITestRunCallback[] GetAllCallbacks()
  18. {
  19. var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
  20. allAssemblies = allAssemblies.Where(x => x.GetReferencedAssemblies().Any(z => z.Name == "UnityEngine.TestRunner")).ToArray();
  21. var attributes = allAssemblies.SelectMany(assembly => assembly.GetCustomAttributes(typeof(TestRunCallbackAttribute), true).OfType<TestRunCallbackAttribute>()).ToArray();
  22. return attributes.Select(attribute => attribute.ConstructCallback()).ToArray();
  23. }
  24. private void InvokeAllCallbacks(Action<ITestRunCallback> invoker)
  25. {
  26. if (m_Callbacks == null)
  27. {
  28. m_Callbacks = GetAllCallbacks();
  29. }
  30. foreach (var testRunCallback in m_Callbacks)
  31. {
  32. try
  33. {
  34. invoker(testRunCallback);
  35. }
  36. catch (Exception e)
  37. {
  38. Debug.LogException(e);
  39. throw;
  40. }
  41. }
  42. }
  43. public void RunFinished(ITestResult testResults)
  44. {
  45. InvokeAllCallbacks(callback => callback.RunFinished(testResults));
  46. }
  47. public void TestStarted(ITest test)
  48. {
  49. InvokeAllCallbacks(callback => callback.TestStarted(test));
  50. }
  51. public void TestFinished(ITestResult result)
  52. {
  53. InvokeAllCallbacks(callback => callback.TestFinished(result));
  54. }
  55. }
  56. }