123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using NUnit.Framework.Interfaces;
- using NUnit.Framework.Internal.Filters;
- using UnityEditor.TestTools.TestRunner.Api;
- using UnityEditor.TestTools.TestRunner.TestRun;
- using UnityEngine;
- using UnityEngine.SceneManagement;
- using UnityEngine.TestRunner.Utils;
- using UnityEngine.TestTools.TestRunner;
- using UnityEngine.TestTools.TestRunner.Callbacks;
-
- namespace UnityEditor.TestTools.TestRunner
- {
- internal class PlaymodeLauncher : RuntimeTestLauncherBase
- {
- public static bool IsRunning;
- private Scene m_Scene;
- private bool m_IsTestSetupPerformed;
- private readonly PlaymodeTestsControllerSettings m_Settings;
- private ITestFilter testFilter;
-
- [SerializeField]
- private List<Type> m_EventHandlers = new List<Type>();
-
- public PlaymodeLauncher(PlaymodeTestsControllerSettings settings)
- {
- m_Settings = settings;
- }
-
- public override void Run()
- {
- IsRunning = true;
- m_Settings.consoleErrorPaused = ConsoleWindow.GetConsoleErrorPause();
- m_Settings.runInBackgroundValue = Application.runInBackground;
- ConsoleWindow.SetConsoleErrorPause(false);
- Application.runInBackground = true;
-
- var sceneName = CreateSceneName();
- m_Scene = CreateBootstrapScene(sceneName, runner =>
- {
- runner.AddEventHandlerMonoBehaviour<PlayModeRunnerCallback>();
- runner.AddEventHandlerScriptableObject<TestRunnerCallback>();
- runner.AddEventHandlerScriptableObject<CallbacksDelegatorListener>();
- runner.AddEventHandlerScriptableObject<TestRunCallbackListener>();
-
- foreach (var eventHandler in m_EventHandlers)
- {
- var obj = ScriptableObject.CreateInstance(eventHandler);
- runner.AddEventHandlerScriptableObject(obj as ITestRunnerListener);
- }
-
- runner.settings = m_Settings;
- });
-
- if (m_Settings.sceneBased)
- {
- var newListOfScenes =
- new List<EditorBuildSettingsScene> {new EditorBuildSettingsScene(sceneName, true)};
- newListOfScenes.AddRange(EditorBuildSettings.scenes);
- EditorBuildSettings.scenes = newListOfScenes.ToArray();
- }
-
- EditorApplication.update += UpdateCallback;
- }
-
- public void UpdateCallback()
- {
- if (m_IsTestSetupPerformed)
- {
- if (m_Scene.IsValid())
- SceneManager.SetActiveScene(m_Scene);
- EditorApplication.update -= UpdateCallback;
- EditorApplication.isPlaying = true;
- }
- else
- {
- testFilter = m_Settings.BuildNUnitFilter();
- var runner = LoadTests(testFilter);
-
- var exceptionThrown = ExecutePreBuildSetupMethods(runner.LoadedTest, testFilter);
- if (exceptionThrown)
- {
- EditorApplication.update -= UpdateCallback;
- IsRunning = false;
- var controller = PlaymodeTestsController.GetController();
- ReopenOriginalScene(controller);
- AssetDatabase.DeleteAsset(controller.settings.bootstrapScene);
- CallbacksDelegator.instance.RunFailed("Run Failed: One or more errors in a prebuild setup. See the editor log for details.");
- return;
- }
- m_IsTestSetupPerformed = true;
- }
- }
-
- [InitializeOnLoad]
- public class BackgroundWatcher
- {
- static BackgroundWatcher()
- {
- EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
- }
-
- private static void OnPlayModeStateChanged(PlayModeStateChange state)
- {
- if (!PlaymodeTestsController.IsControllerOnScene())
- return;
- var runner = PlaymodeTestsController.GetController();
- if (runner == null)
- return;
- if (state == PlayModeStateChange.ExitingPlayMode)
- {
- AssetDatabase.DeleteAsset(runner.settings.bootstrapScene);
- ExecutePostBuildCleanupMethods(runner.m_Runner.LoadedTest, runner.settings.BuildNUnitFilter(), Application.platform);
- IsRunning = false;
- }
- else if (state == PlayModeStateChange.EnteredEditMode)
- {
- ConsoleWindow.SetConsoleErrorPause(runner.settings.consoleErrorPaused);
- Application.runInBackground = runner.settings.runInBackgroundValue;
- //reopen the original scene once we exit playmode
- ReopenOriginalScene(runner);
- }
- }
- }
-
- protected static void ReopenOriginalScene(PlaymodeTestsController runner)
- {
- ReopenOriginalScene(runner.settings.originalScene);
- }
-
- public void AddEventHandler<T>() where T : ScriptableObject, ITestRunnerListener
- {
- m_EventHandlers.Add(typeof(T));
- }
- }
- }
|