A game about forced loneliness, made by TACStudios
1using System;
2using UnityEditor.TestRunner.CommandLineParser;
3using UnityEditor.TestTools.TestRunner.Api;
4using UnityEngine;
5
6namespace UnityEditor.TestTools.TestRunner.CommandLineTest
7{
8 internal class TestStarter
9 {
10 [InitializeOnLoadMethod]
11 internal static void Initialize()
12 {
13 new TestStarter().Init();
14 }
15
16 internal Action<EditorApplication.CallbackFunction> registerEditorUpdateCallback = action =>
17 {
18 EditorApplication.update += action;
19 };
20 internal Action<EditorApplication.CallbackFunction> unregisterEditorUpdateCallback = action =>
21 {
22 EditorApplication.update -= action;
23 };
24 internal Func<bool> isCompiling = () => EditorApplication.isCompiling;
25 internal IRunData runData = RunData.instance;
26 internal Func<string[]> GetCommandLineArgs = Environment.GetCommandLineArgs;
27
28 internal void Init()
29 {
30 if (!ShouldRunTests())
31 {
32 return;
33 }
34
35 if (isCompiling())
36 {
37 return;
38 }
39
40 executer.ExitOnCompileErrors();
41
42 if (runData.IsRunning)
43 {
44 executer.SetUpCallbacks(runData.ExecutionSettings);
45 registerEditorUpdateCallback(executer.ExitIfRunIsCompleted);
46 return;
47 }
48
49 // Execute the test run on the next editor update to allow other framework components
50 // (the TestJobDataHolder.ResumeRunningJobs method in particular) to register themselves
51 // or modify the test run environment using InitializeOnLoad and InitializeOnLoadMethod calls
52 registerEditorUpdateCallback(InitializeAndExecuteRun);
53 }
54
55 internal void InitializeAndExecuteRun()
56 {
57 unregisterEditorUpdateCallback(InitializeAndExecuteRun);
58
59 runData.IsRunning = true;
60 var commandLineArgs = GetCommandLineArgs();
61 runData.ExecutionSettings = executer.BuildExecutionSettings(commandLineArgs);
62 executer.SetUpCallbacks(runData.ExecutionSettings);
63 runData.RunState = default;
64 runData.RunId = executer.InitializeAndExecuteRun(commandLineArgs);
65 registerEditorUpdateCallback(executer.ExitIfRunIsCompleted);
66 }
67
68 private bool ShouldRunTests()
69 {
70 var shouldRunTests = false;
71 var optionSet = new CommandLineOptionSet(
72 new CommandLineOption("runTests", () => { shouldRunTests = true; }),
73 new CommandLineOption("runEditorTests", () => { shouldRunTests = true; })
74 );
75 optionSet.Parse(GetCommandLineArgs());
76 return shouldRunTests;
77 }
78
79 internal IExecuter m_Executer;
80 private IExecuter executer
81 {
82 get
83 {
84 if (m_Executer == null)
85 {
86 Func<bool> compilationCheck = () => EditorUtility.scriptCompilationFailed;
87 Action<string> actionLogger = msg => { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); };
88 var apiSettingsBuilder = new SettingsBuilder(new TestSettingsDeserializer(() => new TestSettings()), actionLogger, Debug.LogWarning, compilationCheck);
89 m_Executer = new Executer(ScriptableObject.CreateInstance<TestRunnerApi>(), apiSettingsBuilder, Debug.LogErrorFormat, Debug.LogException, Debug.Log, EditorApplication.Exit, compilationCheck, TestRunnerApi.IsRunActive);
90 }
91
92 return m_Executer;
93 }
94 }
95 }
96}