EditModeLauncher.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using System;
  2. using System.Collections.Generic;
  3. using NUnit.Framework.Interfaces;
  4. using UnityEditor.SceneManagement;
  5. using UnityEditor.TestTools.TestRunner.Api;
  6. using UnityEngine;
  7. using UnityEngine.SceneManagement;
  8. using UnityEngine.TestRunner.Utils;
  9. using UnityEngine.TestTools;
  10. using UnityEngine.TestTools.TestRunner;
  11. using UnityEngine.TestTools.TestRunner.GUI;
  12. namespace UnityEditor.TestTools.TestRunner
  13. {
  14. internal class EditModeLauncher : TestLauncherBase
  15. {
  16. public static bool IsRunning;
  17. internal readonly EditModeRunner m_EditModeRunner;
  18. public bool launchedOutsideApi;
  19. // provided for backward compatibility with Rider UnitTesting prior to Rider package v.1.1.1
  20. public EditModeLauncher(TestRunnerFilter filter, TestPlatform platform)
  21. {
  22. launchedOutsideApi = true;
  23. var apiFilter = new[]
  24. {
  25. new Filter()
  26. {
  27. testMode = TestMode.EditMode,
  28. testNames = filter.testNames,
  29. categoryNames = filter.categoryNames,
  30. groupNames = filter.groupNames,
  31. assemblyNames = filter.assemblyNames
  32. }
  33. };
  34. ScriptableObject.CreateInstance<TestRunnerApi>().Execute(new ExecutionSettings(apiFilter));
  35. }
  36. public EditModeLauncher(Filter[] filters, TestPlatform platform, bool runSynchronously)
  37. {
  38. m_EditModeRunner = ScriptableObject.CreateInstance<EditModeRunner>();
  39. m_EditModeRunner.UnityTestAssemblyRunnerFactory = new UnityTestAssemblyRunnerFactory();
  40. m_EditModeRunner.Init(filters, platform, runSynchronously);
  41. }
  42. public override void Run()
  43. {
  44. if (launchedOutsideApi)
  45. {
  46. // Do not use the launcher, as it will be relaunched trough the api. See ctor.
  47. return;
  48. }
  49. IsRunning = true;
  50. SceneSetup[] previousSceneSetup;
  51. if (!OpenNewScene(out previousSceneSetup))
  52. return;
  53. var callback = AddEventHandler<EditModeRunnerCallback>();
  54. callback.previousSceneSetup = previousSceneSetup;
  55. callback.runner = m_EditModeRunner;
  56. AddEventHandler<CallbacksDelegatorListener>();
  57. m_EditModeRunner.Run();
  58. AddEventHandler<BackgroundListener>();
  59. AddEventHandler<TestRunCallbackListener>();
  60. if (m_EditModeRunner.RunningSynchronously)
  61. m_EditModeRunner.CompleteSynchronously();
  62. }
  63. private static bool OpenNewScene(out SceneSetup[] previousSceneSetup)
  64. {
  65. previousSceneSetup = null;
  66. var sceneCount = SceneManager.sceneCount;
  67. var scene = SceneManager.GetSceneAt(0);
  68. var isSceneNotPersisted = string.IsNullOrEmpty(scene.path);
  69. if (sceneCount == 1 && isSceneNotPersisted)
  70. {
  71. EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single);
  72. return true;
  73. }
  74. RemoveUntitledScenes();
  75. // In case the user chose not to save the dirty scenes we reload them
  76. ReloadUnsavedDirtyScene();
  77. previousSceneSetup = EditorSceneManager.GetSceneManagerSetup();
  78. scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive);
  79. SceneManager.SetActiveScene(scene);
  80. return true;
  81. }
  82. private static void ReloadUnsavedDirtyScene()
  83. {
  84. for (var i = 0; i < SceneManager.sceneCount; i++)
  85. {
  86. var scene = SceneManager.GetSceneAt(i);
  87. var isSceneNotPersisted = string.IsNullOrEmpty(scene.path);
  88. var isSceneDirty = scene.isDirty;
  89. if (isSceneNotPersisted && isSceneDirty)
  90. {
  91. EditorSceneManager.ReloadScene(scene);
  92. }
  93. }
  94. }
  95. private static void RemoveUntitledScenes()
  96. {
  97. int sceneCount = SceneManager.sceneCount;
  98. var scenesToClose = new List<Scene>();
  99. for (var i = 0; i < sceneCount; i++)
  100. {
  101. var scene = SceneManager.GetSceneAt(i);
  102. var isSceneNotPersisted = string.IsNullOrEmpty(scene.path);
  103. if (isSceneNotPersisted)
  104. {
  105. scenesToClose.Add(scene);
  106. }
  107. }
  108. foreach (Scene scene in scenesToClose)
  109. {
  110. EditorSceneManager.CloseScene(scene, true);
  111. }
  112. }
  113. public class BackgroundListener : ScriptableObject, ITestRunnerListener
  114. {
  115. public void RunStarted(ITest testsToRun)
  116. {
  117. }
  118. public void RunFinished(ITestResult testResults)
  119. {
  120. IsRunning = false;
  121. }
  122. public void TestStarted(ITest test)
  123. {
  124. }
  125. public void TestFinished(ITestResult result)
  126. {
  127. }
  128. }
  129. public T AddEventHandler<T>() where T : ScriptableObject, ITestRunnerListener
  130. {
  131. return m_EditModeRunner.AddEventHandler<T>();
  132. }
  133. }
  134. }