using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine.SceneManagement; using UnityEngine.TestRunner.NUnitExtensions; using UnityEngine.TestRunner.NUnitExtensions.Runner; using UnityEngine.TestTools.NUnitExtensions; using UnityEngine.TestTools.Utils; namespace UnityEngine.TestTools.TestRunner { [Serializable] [AddComponentMenu("")] internal class PlaymodeTestsController : MonoBehaviour { private IEnumerator m_TestSteps; [SerializeField] private List m_AssembliesWithTests; public List AssembliesWithTests { get { return m_AssembliesWithTests; } set { m_AssembliesWithTests = value; } } [SerializeField] internal TestStartedEvent testStartedEvent = new TestStartedEvent(); [SerializeField] internal TestFinishedEvent testFinishedEvent = new TestFinishedEvent(); [SerializeField] internal RunStartedEvent runStartedEvent = new RunStartedEvent(); [SerializeField] internal RunFinishedEvent runFinishedEvent = new RunFinishedEvent(); internal const string kPlaymodeTestControllerName = "Code-based tests runner"; [SerializeField] public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings(); internal UnityTestAssemblyRunner m_Runner; public IEnumerator Start() { //Skip 2 frame because Unity. yield return null; yield return null; StartCoroutine(Run()); } internal static bool IsControllerOnScene() { return GameObject.Find(kPlaymodeTestControllerName) != null; } internal static PlaymodeTestsController GetController() { return GameObject.Find(kPlaymodeTestControllerName).GetComponent(); } public IEnumerator TestRunnerCorotine() { while (m_TestSteps.MoveNext()) { yield return m_TestSteps.Current; } if (m_Runner.IsTestComplete) { runFinishedEvent.Invoke(m_Runner.Result); Cleanup(); yield return null; } } public IEnumerator Run() { CoroutineTestWorkItem.monoBehaviourCoroutineRunner = this; gameObject.hideFlags |= HideFlags.DontSave; if (settings.sceneBased) { SceneManager.LoadScene(1, LoadSceneMode.Additive); yield return null; } var testListUtil = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), m_AssembliesWithTests); m_Runner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), new PlaymodeWorkItemFactory()); var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode)); loadedTests.ParseForNameDuplicates(); runStartedEvent.Invoke(m_Runner.LoadedTest); var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent); m_TestSteps = m_Runner.Run(testListenerWrapper, settings.filter.BuildNUnitFilter()).GetEnumerator(); yield return TestRunnerCorotine(); } public void Cleanup() { if (m_Runner != null) { m_Runner.StopRun(); m_Runner = null; } if (Application.isEditor) { Destroy(gameObject); } } public static void TryCleanup() { var controller = GetController(); if (controller != null) { controller.Cleanup(); } } } }