A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections;
3using NUnit.Framework.Interfaces;
4using NUnit.Framework.Internal;
5using NUnit.Framework.Internal.Commands;
6using Unity.Profiling;
7using UnityEngine.TestRunner.NUnitExtensions.Runner;
8using UnityEngine.TestTools.TestRunner;
9
10namespace UnityEngine.TestTools
11{
12 internal class TaskTestMethodCommand : TestCommand, IEnumerableTestMethodCommand
13 {
14 private readonly TestMethod testMethod;
15
16 public TaskTestMethodCommand(TestMethod testMethod)
17 : base(testMethod)
18 {
19 this.testMethod = testMethod;
20 }
21
22 public IEnumerable ExecuteEnumerable(ITestExecutionContext context)
23 {
24 yield return null;
25
26 IEnumerator currentExecutingTestEnumerator;
27 try
28 {
29 currentExecutingTestEnumerator = new TestTaskWrapper(testMethod).Execute(context);
30 }
31 catch (Exception ex)
32 {
33 context.CurrentResult.RecordException(ex);
34 yield break;
35 }
36
37 if (currentExecutingTestEnumerator != null)
38 {
39 var testEnumeraterYieldInstruction = new TestEnumerator(context, currentExecutingTestEnumerator);
40
41 yield return testEnumeraterYieldInstruction;
42
43 var enumerator = testEnumeraterYieldInstruction.Execute();
44
45 var executingEnumerator = ExecuteEnumerableAndRecordExceptions(enumerator, context);
46 while (AdvanceEnumerator(executingEnumerator))
47 {
48 yield return executingEnumerator.Current;
49 }
50 }
51 else
52 {
53 if (context.CurrentResult.ResultState != ResultState.Ignored)
54 {
55 context.CurrentResult.SetResult(ResultState.Success);
56 }
57 }
58 }
59
60 private bool AdvanceEnumerator(IEnumerator enumerator)
61 {
62 using (new ProfilerMarker(testMethod.MethodName).Auto())
63 return enumerator.MoveNext();
64 }
65
66 private static IEnumerator ExecuteEnumerableAndRecordExceptions(IEnumerator enumerator, ITestExecutionContext context)
67 {
68 while (true)
69 {
70 try
71 {
72 if (!enumerator.MoveNext())
73 {
74 break;
75 }
76 }
77 catch (Exception ex)
78 {
79 context.CurrentResult.RecordException(ex);
80 break;
81 }
82
83 if (enumerator.Current is IEnumerator)
84 {
85 var current = (IEnumerator)enumerator.Current;
86 yield return ExecuteEnumerableAndRecordExceptions(current, context);
87 }
88 else
89 {
90 yield return enumerator.Current;
91 }
92 }
93 }
94
95 public override TestResult Execute(ITestExecutionContext context)
96 {
97 throw new NotImplementedException("Use ExecuteEnumerable");
98 }
99 }
100}