166 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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;
 | |
| 
 | |
|         public static PlaymodeTestsController ActiveController { get; set; }
 | |
|         public Exception RaisedException { get; set; }
 | |
| 
 | |
|         [SerializeField]
 | |
|         private List<string> m_AssembliesWithTests;
 | |
|         public List<string> 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();
 | |
| 
 | |
|         //DO NOT change this string, third party code is using this string to identify the test runner game object.
 | |
|         internal const string kPlaymodeTestControllerName = "Code-based tests runner";
 | |
| 
 | |
|         [SerializeField]
 | |
|         public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings();
 | |
|         [NonSerialized]
 | |
|         public bool RunInfrastructureHasRegistered = false;
 | |
| 
 | |
|         internal UnityTestAssemblyRunner m_Runner;
 | |
| 
 | |
|         public IEnumerator Start()
 | |
|         {
 | |
|             UnityTestExecutionContext.CurrentContext = new UnityTestExecutionContext()
 | |
|             {
 | |
|                 FeatureFlags = settings.featureFlags,
 | |
|                 RetryCount = settings.retryCount,
 | |
|                 RepeatCount = settings.repeatCount,
 | |
|                 Automated = settings.automated
 | |
|             };
 | |
|             ActiveController = this;
 | |
|             //Skip 2 frame because Unity.
 | |
|             yield return null;
 | |
|             yield return null;
 | |
| 
 | |
|             if (Application.isEditor && !RunInfrastructureHasRegistered)
 | |
|             {
 | |
|                 yield return null;
 | |
|             }
 | |
|             
 | |
|             StartCoroutine(Run());
 | |
|         }
 | |
| 
 | |
|         internal static bool IsControllerOnScene()
 | |
|         {
 | |
|             return GameObject.Find(kPlaymodeTestControllerName) != null;
 | |
|         }
 | |
| 
 | |
|         internal static PlaymodeTestsController GetController()
 | |
|         {
 | |
|             return GameObject.Find(kPlaymodeTestControllerName).GetComponent<PlaymodeTestsController>();
 | |
|         }
 | |
| 
 | |
|         public IEnumerator TestRunnerCoroutine()
 | |
|         {
 | |
|             while (true)
 | |
|             {
 | |
|                 try
 | |
|                 {
 | |
|                     if (!m_TestSteps.MoveNext())
 | |
|                     {
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
|                 catch (Exception e)
 | |
|                 {
 | |
|                     RaisedException = e;
 | |
|                     throw;
 | |
|                 }
 | |
| 
 | |
|                 yield return m_TestSteps.Current;
 | |
|             }
 | |
| 
 | |
|             if (m_Runner.IsTestComplete)
 | |
|             {
 | |
|                 runFinishedEvent.Invoke(m_Runner.Result);
 | |
| 
 | |
|                 yield return null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public IEnumerator Run()
 | |
|         {
 | |
|             if (!RunInfrastructureHasRegistered)
 | |
|             {
 | |
|                 // Wait for the infrastructure to be ready
 | |
|                 yield return null;
 | |
|             }
 | |
|             
 | |
|             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(settings.orderedTestNames, settings.randomOrderSeed), new PlaymodeWorkItemFactory(), UnityTestExecutionContext.CurrentContext);
 | |
| 
 | |
|             var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));
 | |
|             loadedTests.ParseForNameDuplicates();
 | |
|             runStartedEvent.Invoke(m_Runner.LoadedTest);
 | |
| 
 | |
|             var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent);
 | |
|             m_TestSteps = m_Runner.Run(testListenerWrapper, settings.BuildNUnitFilter()).GetEnumerator();
 | |
| 
 | |
|             yield return TestRunnerCoroutine();
 | |
|         }
 | |
| 
 | |
|         public void Cleanup()
 | |
|         {
 | |
|             if (m_Runner != null)
 | |
|             {
 | |
|                 m_Runner.StopRun();
 | |
|                 m_Runner = null;
 | |
|             }
 | |
|             if (Application.isEditor)
 | |
|             {
 | |
|                 if (Application.isPlaying)
 | |
|                 {
 | |
|                     Destroy(gameObject);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     DestroyImmediate(gameObject);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |