using System; using NUnit.Framework.Interfaces; using UnityEngine; using UnityEngine.TestTools; namespace UnityEditor.TestTools.TestRunner { internal abstract class TestLauncherBase { public abstract void Run(); protected virtual RuntimePlatform? TestTargetPlatform { get { return Application.platform; } } protected bool ExecutePreBuildSetupMethods(ITest tests, ITestFilter testRunnerFilter) { var attributeFinder = new PrebuildSetupAttributeFinder(); var logString = "Executing setup for: {0}"; return ExecuteMethods(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Setup(), TestTargetPlatform); } public void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter) { ExecutePostBuildCleanupMethods(tests, testRunnerFilter, TestTargetPlatform); } public static void ExecutePostBuildCleanupMethods(ITest tests, ITestFilter testRunnerFilter, RuntimePlatform? testTargetPlatform) { var attributeFinder = new PostbuildCleanupAttributeFinder(); var logString = "Executing cleanup for: {0}"; ExecuteMethods(tests, testRunnerFilter, attributeFinder, logString, targetClass => targetClass.Cleanup(), testTargetPlatform); } private static bool ExecuteMethods(ITest tests, ITestFilter testRunnerFilter, AttributeFinderBase attributeFinder, string logString, Action action, RuntimePlatform? testTargetPlatform) { var exceptionsThrown = false; if (testTargetPlatform == null) { Debug.LogError("Could not determine test target platform from build target " + EditorUserBuildSettings.activeBuildTarget); return true; } foreach (var targetClassType in attributeFinder.Search(tests, testRunnerFilter, testTargetPlatform.Value)) { try { var targetClass = (T)Activator.CreateInstance(targetClassType); Debug.LogFormat(logString, targetClassType.FullName); action(targetClass); } catch (InvalidCastException) {} catch (Exception e) { Debug.LogException(e); exceptionsThrown = true; } } return exceptionsThrown; } } }