using System; using System.Collections; using NUnit.Framework.Interfaces; using NUnit.Framework.Internal; using NUnit.Framework.Internal.Commands; using UnityEngine.TestTools.TestRunner; using UnityEngine.TestTools.Utils; namespace UnityEngine.TestRunner.NUnitExtensions.Runner { internal class CoroutineTestWorkItem : UnityWorkItem { private static MonoBehaviour m_MonoBehaviourCoroutineRunner; private TestCommand m_Command; public static MonoBehaviour monoBehaviourCoroutineRunner { get { if (m_MonoBehaviourCoroutineRunner == null) { throw new NullReferenceException("MonoBehaviour coroutine runner not set"); } return m_MonoBehaviourCoroutineRunner; } set { m_MonoBehaviourCoroutineRunner = value; } } public CoroutineTestWorkItem(TestMethod test, ITestFilter filter) : base(test, null) { m_Command = m_Command = TestCommandBuilder.BuildTestCommand(test, filter); } protected override IEnumerable PerformWork() { if (m_Command is SkipCommand) { m_Command.Execute(Context); Result = Context.CurrentResult; WorkItemComplete(); yield break; } var enumerableTestMethodCommand = (IEnumerableTestMethodCommand)m_Command; try { var executeEnumerable = enumerableTestMethodCommand.ExecuteEnumerable(Context).GetEnumerator(); var coroutineRunner = new CoroutineRunner(monoBehaviourCoroutineRunner, Context); yield return coroutineRunner.HandleEnumerableTest(executeEnumerable); while (executeEnumerable.MoveNext()) {} Result = Context.CurrentResult; } finally { WorkItemComplete(); } } } }