113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using System.Reflection; | ||
|  | using NUnit; | ||
|  | using NUnit.Framework.Interfaces; | ||
|  | using NUnit.Framework.Internal; | ||
|  | using NUnit.Framework.Internal.Execution; | ||
|  | using UnityEngine.TestTools; | ||
|  | using UnityEngine.TestTools.NUnitExtensions; | ||
|  | 
 | ||
|  | namespace UnityEngine.TestRunner.NUnitExtensions.Runner | ||
|  | { | ||
|  |     internal interface IUnityTestAssemblyRunner | ||
|  |     { | ||
|  |         ITest LoadedTest { get; } | ||
|  |         ITestResult Result { get; } | ||
|  |         bool IsTestLoaded { get; } | ||
|  |         bool IsTestRunning { get; } | ||
|  |         bool IsTestComplete { get; } | ||
|  |         UnityWorkItem TopLevelWorkItem { get; set; } | ||
|  |         UnityTestExecutionContext GetCurrentContext(); | ||
|  |         ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary<string, object> settings); | ||
|  |         void LoadTestTree(ITest testTree); | ||
|  |         IEnumerable Run(ITestListener listener, ITestFilter filter); | ||
|  |         void StopRun(); | ||
|  |     } | ||
|  | 
 | ||
|  |     internal class UnityTestAssemblyRunner : IUnityTestAssemblyRunner | ||
|  |     { | ||
|  |         private readonly UnityTestAssemblyBuilder unityBuilder; | ||
|  |         private readonly WorkItemFactory m_Factory; | ||
|  | 
 | ||
|  |         protected UnityTestExecutionContext Context { get; set; } | ||
|  | 
 | ||
|  |         public UnityTestExecutionContext GetCurrentContext() | ||
|  |         { | ||
|  |             return UnityTestExecutionContext.CurrentContext; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected IDictionary<string, object> Settings { get; set; } | ||
|  |         public ITest LoadedTest { get; protected set; } | ||
|  | 
 | ||
|  |         public ITestResult Result | ||
|  |         { | ||
|  |             get { return TopLevelWorkItem == null ? null : TopLevelWorkItem.Result; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsTestLoaded | ||
|  |         { | ||
|  |             get { return LoadedTest != null; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public bool IsTestRunning | ||
|  |         { | ||
|  |             get { return TopLevelWorkItem != null && TopLevelWorkItem.State == WorkItemState.Running; } | ||
|  |         } | ||
|  |         public bool IsTestComplete | ||
|  |         { | ||
|  |             get { return TopLevelWorkItem != null && TopLevelWorkItem.State == WorkItemState.Complete; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public UnityTestAssemblyRunner(UnityTestAssemblyBuilder builder, WorkItemFactory factory, UnityTestExecutionContext context) | ||
|  |         { | ||
|  |             unityBuilder = builder; | ||
|  |             m_Factory = factory; | ||
|  |             Context = context; | ||
|  |         } | ||
|  | 
 | ||
|  |         public ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary<string, object> settings) | ||
|  |         { | ||
|  |             // The setting of the TestMode should happen when running tests. | ||
|  |             if (Context != null) | ||
|  |             { | ||
|  |                 Context.TestMode = testPlatform; | ||
|  |             } | ||
|  |             Settings = settings; | ||
|  | 
 | ||
|  |             if (settings.ContainsKey(FrameworkPackageSettings.RandomSeed)) | ||
|  |                 Randomizer.InitialSeed = (int)settings[FrameworkPackageSettings.RandomSeed]; | ||
|  | 
 | ||
|  |             var tree = unityBuilder.Build(assemblies, Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings); | ||
|  | 
 | ||
|  |             return LoadedTest = tree; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void LoadTestTree(ITest testTree) | ||
|  |         { | ||
|  |             LoadedTest = testTree; | ||
|  |         } | ||
|  | 
 | ||
|  |         public IEnumerable Run(ITestListener listener, ITestFilter filter) | ||
|  |         { | ||
|  |             TopLevelWorkItem = m_Factory.Create(LoadedTest, filter); | ||
|  |             TopLevelWorkItem.InitializeContext(Context); | ||
|  |             Context.Listener = listener; | ||
|  | 
 | ||
|  |             return TopLevelWorkItem.Execute(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public UnityWorkItem TopLevelWorkItem { get; set; } | ||
|  | 
 | ||
|  |         public void StopRun() | ||
|  |         { | ||
|  |             if (IsTestRunning) | ||
|  |             { | ||
|  |                 TopLevelWorkItem.Cancel(false); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |