A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Linq;
5using System.Reflection;
6using NUnit;
7using NUnit.Framework.Interfaces;
8using NUnit.Framework.Internal;
9using NUnit.Framework.Internal.Execution;
10using UnityEngine.TestTools;
11using UnityEngine.TestTools.NUnitExtensions;
12
13namespace UnityEngine.TestRunner.NUnitExtensions.Runner
14{
15 internal interface IUnityTestAssemblyRunner
16 {
17 ITest LoadedTest { get; }
18 ITestResult Result { get; }
19 bool IsTestLoaded { get; }
20 bool IsTestRunning { get; }
21 bool IsTestComplete { get; }
22 UnityWorkItem TopLevelWorkItem { get; set; }
23 UnityTestExecutionContext GetCurrentContext();
24 ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary<string, object> settings);
25 void LoadTestTree(ITest testTree);
26 IEnumerable Run(ITestListener listener, ITestFilter filter);
27 void StopRun();
28 }
29
30 internal class UnityTestAssemblyRunner : IUnityTestAssemblyRunner
31 {
32 private readonly UnityTestAssemblyBuilder unityBuilder;
33 private readonly WorkItemFactory m_Factory;
34
35 protected UnityTestExecutionContext Context { get; set; }
36
37 public UnityTestExecutionContext GetCurrentContext()
38 {
39 return UnityTestExecutionContext.CurrentContext;
40 }
41
42 protected IDictionary<string, object> Settings { get; set; }
43 public ITest LoadedTest { get; protected set; }
44
45 public ITestResult Result
46 {
47 get { return TopLevelWorkItem == null ? null : TopLevelWorkItem.Result; }
48 }
49
50 public bool IsTestLoaded
51 {
52 get { return LoadedTest != null; }
53 }
54
55 public bool IsTestRunning
56 {
57 get { return TopLevelWorkItem != null && TopLevelWorkItem.State == WorkItemState.Running; }
58 }
59 public bool IsTestComplete
60 {
61 get { return TopLevelWorkItem != null && TopLevelWorkItem.State == WorkItemState.Complete; }
62 }
63
64 public UnityTestAssemblyRunner(UnityTestAssemblyBuilder builder, WorkItemFactory factory, UnityTestExecutionContext context)
65 {
66 unityBuilder = builder;
67 m_Factory = factory;
68 Context = context;
69 }
70
71 public ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary<string, object> settings)
72 {
73 // The setting of the TestMode should happen when running tests.
74 if (Context != null)
75 {
76 Context.TestMode = testPlatform;
77 }
78 Settings = settings;
79
80 if (settings.ContainsKey(FrameworkPackageSettings.RandomSeed))
81 Randomizer.InitialSeed = (int)settings[FrameworkPackageSettings.RandomSeed];
82
83 var tree = unityBuilder.Build(assemblies, Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings);
84
85 return LoadedTest = tree;
86 }
87
88 public void LoadTestTree(ITest testTree)
89 {
90 LoadedTest = testTree;
91 }
92
93 public IEnumerable Run(ITestListener listener, ITestFilter filter)
94 {
95 TopLevelWorkItem = m_Factory.Create(LoadedTest, filter);
96 TopLevelWorkItem.InitializeContext(Context);
97 Context.Listener = listener;
98
99 return TopLevelWorkItem.Execute();
100 }
101
102 public UnityWorkItem TopLevelWorkItem { get; set; }
103
104 public void StopRun()
105 {
106 if (IsTestRunning)
107 {
108 TopLevelWorkItem.Cancel(false);
109 }
110 }
111 }
112}