71 lines
2.4 KiB
C#
71 lines
2.4 KiB
C#
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Reflection;
|
||
|
using NUnit.Framework;
|
||
|
using NUnit.Framework.Interfaces;
|
||
|
using NUnit.Framework.Internal;
|
||
|
using NUnit.Framework.Internal.Commands;
|
||
|
using UnityEngine.TestRunner.NUnitExtensions.Runner;
|
||
|
|
||
|
namespace UnityEngine.TestTools
|
||
|
{
|
||
|
internal class EnumerableRetryTestCommand : DelegatingTestCommand, IEnumerableTestMethodCommand
|
||
|
{
|
||
|
private int retryCount;
|
||
|
|
||
|
public EnumerableRetryTestCommand(RetryAttribute.RetryCommand commandToReplace) : base(commandToReplace.GetInnerCommand())
|
||
|
{
|
||
|
retryCount = (int) typeof(RetryAttribute.RetryCommand)
|
||
|
.GetField("_retryCount", BindingFlags.NonPublic | BindingFlags.Instance)
|
||
|
.GetValue(commandToReplace);
|
||
|
}
|
||
|
|
||
|
public override TestResult Execute(ITestExecutionContext context)
|
||
|
{
|
||
|
throw new NotImplementedException("Use ExecuteEnumerable");
|
||
|
}
|
||
|
|
||
|
public IEnumerable ExecuteEnumerable(ITestExecutionContext context)
|
||
|
{
|
||
|
var unityContext = (UnityTestExecutionContext)context;
|
||
|
if (unityContext.EnumerableTestState?.GetHashCode() == null)
|
||
|
{
|
||
|
unityContext.EnumerableTestState = new EnumerableTestState();
|
||
|
}
|
||
|
int count = unityContext.EnumerableTestState.Retry;
|
||
|
var firstCycleAfterResume = count > 0;
|
||
|
|
||
|
while (count < retryCount || (firstCycleAfterResume && count <= retryCount))
|
||
|
{
|
||
|
if (!firstCycleAfterResume)
|
||
|
{
|
||
|
count++;
|
||
|
}
|
||
|
|
||
|
firstCycleAfterResume = false;
|
||
|
|
||
|
unityContext.EnumerableTestState.Retry = count;
|
||
|
|
||
|
if (innerCommand is IEnumerableTestMethodCommand)
|
||
|
{
|
||
|
var executeEnumerable = ((IEnumerableTestMethodCommand)innerCommand).ExecuteEnumerable(context);
|
||
|
foreach (var iterator in executeEnumerable)
|
||
|
{
|
||
|
yield return iterator;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
context.CurrentResult = innerCommand.Execute(context);
|
||
|
}
|
||
|
|
||
|
if (context.CurrentResult.ResultState != ResultState.Failure)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unityContext.EnumerableTestState.Retry = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|