87 lines
2.8 KiB
C#
87 lines
2.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using NUnit.Framework;
|
|
using NUnit.Framework.Interfaces;
|
|
using NUnit.Framework.Internal;
|
|
using NUnit.Framework.Internal.Commands;
|
|
using NUnit.Framework.Internal.Execution;
|
|
using UnityEngine.TestRunner.NUnitExtensions.Runner;
|
|
using UnityEngine.TestTools.TestRunner;
|
|
|
|
namespace UnityEngine.TestTools
|
|
{
|
|
internal class EnumerableTestMethodCommand : TestCommand, IEnumerableTestMethodCommand
|
|
{
|
|
private readonly TestMethod testMethod;
|
|
|
|
public EnumerableTestMethodCommand(TestMethod testMethod)
|
|
: base(testMethod)
|
|
{
|
|
this.testMethod = testMethod;
|
|
}
|
|
|
|
public IEnumerable ExecuteEnumerable(ITestExecutionContext context)
|
|
{
|
|
yield return null;
|
|
|
|
var currentExecutingTestEnumerator = new TestEnumeratorWrapper(testMethod).GetEnumerator(context);
|
|
if (currentExecutingTestEnumerator != null)
|
|
{
|
|
var testEnumeraterYieldInstruction = new TestEnumerator(context, currentExecutingTestEnumerator);
|
|
|
|
yield return testEnumeraterYieldInstruction;
|
|
|
|
var enumerator = testEnumeraterYieldInstruction.Execute();
|
|
|
|
var executingEnumerator = ExecuteEnumerableAndRecordExceptions(enumerator, context);
|
|
while (executingEnumerator.MoveNext())
|
|
{
|
|
yield return executingEnumerator.Current;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (context.CurrentResult.ResultState != ResultState.Ignored)
|
|
{
|
|
context.CurrentResult.SetResult(ResultState.Success);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static IEnumerator ExecuteEnumerableAndRecordExceptions(IEnumerator enumerator, ITestExecutionContext context)
|
|
{
|
|
while (true)
|
|
{
|
|
try
|
|
{
|
|
if (!enumerator.MoveNext())
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
context.CurrentResult.RecordException(ex);
|
|
break;
|
|
}
|
|
|
|
if (enumerator.Current is IEnumerator)
|
|
{
|
|
var current = (IEnumerator)enumerator.Current;
|
|
yield return ExecuteEnumerableAndRecordExceptions(current, context);
|
|
}
|
|
else
|
|
{
|
|
yield return enumerator.Current;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override TestResult Execute(ITestExecutionContext context)
|
|
{
|
|
throw new NotImplementedException("Use ExecuteEnumerable");
|
|
}
|
|
}
|
|
}
|