using System;
using NUnit.Framework;
using Unity.PerformanceTesting;
using UnityEngine.Events;


public class CSEventTests
{
    private event Action<int> _event;

    private void Setup () => _event = default;
    private void Teardown () => _event = default;

    private void SubscribeEvent ()
    {
        _event += NoOpInt;
        _event += IncrementInt;
        _event += NoOpAction;
    }

    private void UnsubscribeEvent ()
    {
        _event -= NoOpInt;
        _event -= IncrementInt;
        _event -= NoOpAction;
    }

    [Test, Performance]
    public void Subscribe () => Measure.Method(SubscribeEvent).WarmupCount(5).MeasurementCount(100).SetUp(Setup).CleanUp(Teardown).Run();

    [Test, Performance]
    public void Unsubscribe ()
    {
        Measure.Method(UnsubscribeEvent).WarmupCount(5).MeasurementCount(100).SetUp(() => { Setup(); SubscribeEvent(); }).CleanUp(Teardown).Run();
    }

    [Test, Performance]
    public void Invoke ()
    {
        Measure.Method(() => _event.Invoke(0)).WarmupCount(5).MeasurementCount(100).SetUp(() => { Setup(); SubscribeEvent(); }).CleanUp(Teardown).Run();
    }

    private Action<int> NoOpAction = _ => NoOp();
    private static void NoOp () { }
    private void NoOpInt (int i) { }
    private void IncrementInt (int i) { i++; }
}