using System; using System.Linq; using NUnit.Framework.Interfaces; using UnityEditor.Events; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.TestRunner.NUnitExtensions.Runner; using UnityEngine.TestTools; using UnityEngine.TestTools.NUnitExtensions; using UnityEngine.TestTools.TestRunner; using UnityEngine.TestTools.Utils; namespace UnityEditor.TestTools.TestRunner { internal abstract class RuntimeTestLauncherBase : TestLauncherBase { internal readonly PlaymodeTestsControllerSettings m_Settings; protected RuntimeTestLauncherBase(PlaymodeTestsControllerSettings mSettings) { m_Settings = mSettings; } protected Scene CreateBootstrapScene(string sceneName, Action runnerSetup) { var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); var go = new GameObject(PlaymodeTestsController.kPlaymodeTestControllerName); var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); var runner = go.AddComponent(); runnerSetup(runner); runner.settings.bootstrapScene = sceneName; runner.settings.orderedTestNames = m_Settings.orderedTestNames; runner.AssembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList(); EditorSceneManager.MarkSceneDirty(scene); AssetDatabase.SaveAssets(); EditorSceneManager.SaveScene(scene, sceneName, false); return scene; } public string CreateSceneName() { return "Assets/InitTestScene" + DateTime.Now.Ticks + ".unity"; } protected UnityTestAssemblyRunner LoadTests(ITestFilter filter) { var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy()); var assembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList(); var nUnitTestAssemblyRunner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(m_Settings.orderedTestNames), null); var assemblyProvider = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), assembliesWithTests); nUnitTestAssemblyRunner.Load(assemblyProvider.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode)); return nUnitTestAssemblyRunner; } protected static void ReopenOriginalScene(string originalSceneName) { EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects); if (!string.IsNullOrEmpty(originalSceneName)) { EditorSceneManager.OpenScene(originalSceneName); } } } internal static class PlaymodeTestsControllerExtensions { internal static T AddEventHandlerMonoBehaviour(this PlaymodeTestsController controller) where T : MonoBehaviour, ITestRunnerListener { var eventHandler = controller.gameObject.AddComponent(); SetListeners(controller, eventHandler); return eventHandler; } internal static T AddEventHandlerScriptableObject(this PlaymodeTestsController controller) where T : ScriptableObject, ITestRunnerListener { var eventListener = ScriptableObject.CreateInstance(); AddEventHandlerScriptableObject(controller, eventListener); return eventListener; } internal static void AddEventHandlerScriptableObject(this PlaymodeTestsController controller, ITestRunnerListener obj) { SetListeners(controller, obj); } private static void SetListeners(PlaymodeTestsController controller, ITestRunnerListener eventHandler) { UnityEventTools.AddPersistentListener(controller.testStartedEvent, eventHandler.TestStarted); UnityEventTools.AddPersistentListener(controller.testFinishedEvent, eventHandler.TestFinished); UnityEventTools.AddPersistentListener(controller.runStartedEvent, eventHandler.RunStarted); UnityEventTools.AddPersistentListener(controller.runFinishedEvent, eventHandler.RunFinished); } } }