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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|