using System.Threading; using System.Threading.Tasks; using Gum.Signal.Core; using NUnit.Framework; namespace Tests.SignalTests { [TestFixture] public class SignalCenterTests { private SignalCenter _signalCenter; private const int VALUE = 5; [SetUp] public void Setup() { _signalCenter = new SignalCenter(); } [Test] public void Subscribe() { void Action(FooSignal _) { } _signalCenter.Subscribe(Action); Assert.IsTrue(_signalCenter.Exists(Action)); } [Test] public void Unsubscribe() { void BarAction(BarSignal _) { } void FooAction(FooSignal _) { } _signalCenter.Subscribe(BarAction); _signalCenter.Subscribe(FooAction); Assert.IsTrue(_signalCenter.Exists(FooAction)); _signalCenter.Unsubscribe(FooAction); Assert.IsFalse(_signalCenter.Exists(FooAction)); } [Test] public void TryUnsubscribe() { void BarAction(BarSignal _) { } void FooAction(FooSignal _) { } _signalCenter.Subscribe(BarAction); Assert.IsTrue(_signalCenter.Exists(BarAction)); Assert.IsFalse(_signalCenter.Exists(FooAction)); bool isUnsubscribedFromBar = _signalCenter.TryUnsubscribe(BarAction); bool isUnsubscribedFromFoo = _signalCenter.TryUnsubscribe(FooAction); Assert.IsFalse(_signalCenter.Exists(FooAction)); Assert.IsFalse(_signalCenter.Exists(BarAction)); Assert.IsTrue(isUnsubscribedFromBar); Assert.IsFalse(isUnsubscribedFromFoo); } [Test] public void Unsubscribe_From_Async_Method() { async Task BarActionAsync(BarSignal _) { await Task.Delay(100); } _signalCenter.Subscribe(BarActionAsync); Assert.IsTrue(_signalCenter.Exists(BarActionAsync)); _signalCenter.Unsubscribe(BarActionAsync); Assert.IsFalse(_signalCenter.Exists(BarActionAsync)); } [Test] public async Task Subscribe_Async_And_Fire() { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource.CancelAfter(200); CancellationToken cancellationToken = cancellationTokenSource.Token; bool isSignalReceived = false; async Task BarActionAsync(BarSignal _) { await Task.Delay(100, cancellationToken); isSignalReceived = true; } _signalCenter.Subscribe(BarActionAsync); _signalCenter.Fire(new BarSignal()); while (!isSignalReceived) { if (cancellationToken.IsCancellationRequested) { Assert.Fail("Timed out."); } await Task.Yield(); } cancellationTokenSource.Dispose(); } [Test] public void Subscribe_And_Fire() { void FooAction(FooSignal fooSignal) { Assert.AreEqual(VALUE, fooSignal.Value); } _signalCenter.Subscribe(FooAction); Assert.IsTrue(_signalCenter.Exists(FooAction)); _signalCenter.Fire(new FooSignal(VALUE)); } [Test] public async Task Subscribe_And_Fire_Async() { FooSignal fooSignalReceived = default; void FooAction(FooSignal fooSignal) { fooSignalReceived = fooSignal; } _signalCenter.Subscribe(FooAction); Assert.IsTrue(_signalCenter.Exists(FooAction)); await _signalCenter.FireAsync(new FooSignal(VALUE)); Assert.AreEqual(VALUE, fooSignalReceived.Value); } } }