using System; using UnityEngine.Scripting; namespace UnityEngine.TestRunner { /// /// An assembly level attribute that indicates that a given type implementing should be subscribed to updates on the test progress. You can invoke the callbacks with [NUnit](http://www.nunit.org/) `ITest` and `ITestResult` classes. /// /// At the `RunStarted` and `RunFinished` methods, the test and test results are for the whole test tree. These methods invoke at each node in the test tree; first with the whole test assembly, then with the test class, and last with the test method. /// /// From these callbacks, it's possible to read the partial or the full results, and to save the XML version of the result for further processing or continuous integration. /// /// /// /// /// /// > Note: The `TestRunCallback` does not need any references to the `UnityEditor` namespace and can run in standalone Players on the Player side. /// [AttributeUsage(AttributeTargets.Assembly)] public class TestRunCallbackAttribute : Attribute { private Type m_Type; /// /// Constructs a new instance of the class. /// /// A target type that implements . /// Throws an ArgumentException if the provided type does not implement . public TestRunCallbackAttribute(Type type) { var interfaceType = typeof(ITestRunCallback); if (!interfaceType.IsAssignableFrom(type)) { throw new ArgumentException(string.Format( "Type {2} provided to {0} does not implement {1}. If the stripping level is set to high, the implementing class should have the {3}.", GetType().Name, interfaceType.Name, type.Name, typeof(PreserveAttribute).Name)); } m_Type = type; } internal ITestRunCallback ConstructCallback() { return Activator.CreateInstance(m_Type) as ITestRunCallback; } } }