123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Runtime.ExceptionServices;
- using System.Threading.Tasks;
- using NUnit.Framework;
- using NUnit.Framework.Internal;
- using NUnit.Framework.Internal.Commands;
- using Unity.Profiling;
- using UnityEngine.TestRunner.NUnitExtensions.Runner;
-
- namespace UnityEngine.TestTools
- {
- internal class SetUpTearDownCommand : BeforeAfterTestCommandBase<MethodInfo>
- {
- private static readonly Dictionary<Type, List<MethodInfo>> m_BeforeActionsCache = new Dictionary<Type, List<MethodInfo>>();
- private static readonly Dictionary<Type, List<MethodInfo>> m_AfterActionsCache = new Dictionary<Type, List<MethodInfo>>();
-
- public SetUpTearDownCommand(TestCommand innerCommand)
- : base(innerCommand, "SetUp", "TearDown")
- {
- using (new ProfilerMarker(nameof(SetUpTearDownCommand)).Auto())
- {
- if (Test.TypeInfo.Type != null)
- {
- BeforeActions = GetActions(m_BeforeActionsCache, Test.TypeInfo.Type, typeof(SetUpAttribute), new[] {typeof(void), typeof(Task)});
- AfterActions = GetActions(m_AfterActionsCache, Test.TypeInfo.Type, typeof(TearDownAttribute), new[] {typeof(void), typeof(Task)}).Reverse().ToArray();
- }
- }
- }
-
- protected override bool AllowFrameSkipAfterAction(MethodInfo action)
- {
- return action.ReturnType == typeof(Task);
- }
-
- protected override IEnumerator InvokeBefore(MethodInfo action, Test test, UnityTestExecutionContext context)
- {
- if (action.ReturnType == typeof(Task))
- {
- Task task;
- using (new ProfilerMarker(test.Name + ".Setup").Auto())
- task = HandleTaskCommand(action, context);
- while (!task.IsCompleted)
- {
- yield return null;
- }
-
- if (task.IsFaulted)
- {
- ExceptionDispatchInfo.Capture(task.Exception.InnerExceptions.Count == 1 ? task.Exception.InnerException : task.Exception).Throw();
- }
- }
- else
- {
- using (new ProfilerMarker(test.Name + ".Setup").Auto())
- Reflect.InvokeMethod(action, context.TestObject);
- yield return null;
- }
- }
-
- protected override IEnumerator InvokeAfter(MethodInfo action, Test test, UnityTestExecutionContext context)
- {
- if (action.ReturnType == typeof(Task))
- {
- Task task;
- using (new ProfilerMarker(test.Name + ".TearDown").Auto())
- task = HandleTaskCommand(action, context);
- while (!task.IsCompleted)
- {
- yield return null;
- }
-
- if (task.IsFaulted)
- {
- ExceptionDispatchInfo.Capture(task.Exception.InnerExceptions.Count == 1 ? task.Exception.InnerException : task.Exception).Throw();
- }
- }
- else
- {
- using (new ProfilerMarker(test.Name + ".TearDown").Auto())
- Reflect.InvokeMethod(action, context.TestObject);
- yield return null;
- }
- }
-
- private Task HandleTaskCommand(MethodInfo action, UnityTestExecutionContext context)
- {
- try
- {
- return Reflect.InvokeMethod(action, context.TestObject) as Task;
- }
- catch (TargetInvocationException e)
- {
- throw e;
- }
- }
-
- protected override BeforeAfterTestCommandState GetState(UnityTestExecutionContext context)
- {
- // Normal Setup/Teardown does not support domain reloads and will not need a persisted state.
- return new BeforeAfterTestCommandState();
- }
- }
- }
|