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;
        }
    }
}