243 lines
6.7 KiB
C#
243 lines
6.7 KiB
C#
using System;
|
|
using NUnit.Framework;
|
|
using Assert = ModestTree.Assert;
|
|
|
|
namespace Zenject.Tests.Signals
|
|
{
|
|
[TestFixture]
|
|
public class TestSignalsAdvanced : ZenjectUnitTestFixture
|
|
{
|
|
[SetUp]
|
|
public void CommonInstall()
|
|
{
|
|
ZenjectManagersInstaller.Install(Container);
|
|
SignalBusInstaller.Install(Container);
|
|
Container.Inject(this);
|
|
}
|
|
|
|
[Test]
|
|
public void TestSubscribeDeterministicOrder()
|
|
{
|
|
Container.DeclareSignal<FooSignal>();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
|
|
int count = 1;
|
|
|
|
int order1 = 0;
|
|
Action handler1 = () => order1 = count++;
|
|
|
|
int order2 = 0;
|
|
Action handler2 = () => order2 = count++;
|
|
|
|
int order3 = 0;
|
|
Action handler3 = () => order3 = count++;
|
|
|
|
signalBus.Subscribe<FooSignal>(handler1);
|
|
signalBus.Subscribe<FooSignal>(handler2);
|
|
signalBus.Subscribe<FooSignal>(handler3);
|
|
|
|
signalBus.Fire<FooSignal>();
|
|
|
|
Assert.IsEqual(order1, 1);
|
|
Assert.IsEqual(order2, 2);
|
|
Assert.IsEqual(order3, 3);
|
|
}
|
|
|
|
[Test]
|
|
public void TestSubscribeUnsubscribeInsideHandler()
|
|
{
|
|
Container.DeclareSignal<FooSignal>();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
|
|
bool received = false;
|
|
|
|
Action handler2 = () => received = true;
|
|
|
|
Action handler = () =>
|
|
{
|
|
signalBus.Subscribe<FooSignal>(handler2);
|
|
};
|
|
|
|
Action handler3 = () =>
|
|
{
|
|
signalBus.Unsubscribe<FooSignal>(handler2);
|
|
};
|
|
|
|
signalBus.Subscribe<FooSignal>(handler);
|
|
|
|
Assert.That(!received);
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.That(!received);
|
|
// handler2 is subscribed now
|
|
|
|
signalBus.Unsubscribe<FooSignal>(handler);
|
|
|
|
Assert.That(!received);
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.That(received);
|
|
received = false;
|
|
|
|
signalBus.Subscribe<FooSignal>(handler3);
|
|
Assert.That(!received);
|
|
signalBus.Fire<FooSignal>();
|
|
// Should be called before handler 3 so should receive it
|
|
Assert.That(received);
|
|
received = false;
|
|
signalBus.Unsubscribe<FooSignal>(handler3);
|
|
|
|
Assert.That(!received);
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.That(!received);
|
|
received = false;
|
|
|
|
Assert.IsEqual(signalBus.NumSubscribers, 0);
|
|
|
|
// Now test unsubscribing ourself in our own handler
|
|
|
|
Action handler4 = null;
|
|
handler4 = () =>
|
|
{
|
|
received = true;
|
|
signalBus.Unsubscribe<FooSignal>(handler4);
|
|
};
|
|
signalBus.Subscribe<FooSignal>(handler4);
|
|
|
|
Assert.That(!received);
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.That(received);
|
|
received = false;
|
|
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.That(!received);
|
|
}
|
|
|
|
[Test]
|
|
public void TestSubcontainers1()
|
|
{
|
|
Container.DeclareSignal<FooSignal>();
|
|
|
|
var signalBus1 = Container.Resolve<SignalBus>();
|
|
|
|
var subContainer = Container.CreateSubContainer();
|
|
|
|
var signalBus2 = subContainer.Resolve<SignalBus>();
|
|
|
|
bool received = false;
|
|
Action callback = () => received = true;
|
|
|
|
signalBus2.Subscribe<FooSignal>(callback);
|
|
|
|
Assert.That(!received);
|
|
signalBus1.Fire<FooSignal>();
|
|
Assert.That(received);
|
|
|
|
subContainer.Resolve<DisposableManager>().LateDispose();
|
|
|
|
// Signal should unregister automatically when the subcontainer is disposed
|
|
received = false;
|
|
signalBus1.Fire<FooSignal>();
|
|
Assert.That(!received);
|
|
}
|
|
|
|
[Test]
|
|
public void TestSignalDeclarationSettingsRequireHandlerMissing()
|
|
{
|
|
Container.DeclareSignal<FooSignal>();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
|
|
signalBus.Fire<FooSignal>();
|
|
}
|
|
|
|
[Test]
|
|
public void TestSignalDeclarationSettingsRequireHandler()
|
|
{
|
|
Container.DeclareSignal<FooSignal>().RequireSubscriber();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
|
|
Assert.Throws(() => signalBus.Fire<FooSignal>());
|
|
}
|
|
|
|
[Test]
|
|
public void TestSignalDeclarationSettingsRunAsync1()
|
|
{
|
|
Container.DeclareSignal<FooSignal>().RunAsync();
|
|
Container.ResolveRoots();
|
|
Container.Resolve<InitializableManager>().Initialize();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
|
|
bool received = false;
|
|
signalBus.Subscribe<FooSignal>(() => received = true);
|
|
|
|
Assert.That(!received);
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.That(!received);
|
|
|
|
Container.Resolve<TickableManager>().Update();
|
|
Assert.That(received);
|
|
}
|
|
|
|
[Test]
|
|
public void TestIsDeclared1()
|
|
{
|
|
Container.DeclareSignal<FooSignal>();
|
|
Container.ResolveRoots();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
Assert.That(signalBus.IsSignalDeclared<FooSignal>());
|
|
}
|
|
|
|
[Test]
|
|
public void TestIsDeclared2()
|
|
{
|
|
Container.ResolveRoots();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
Assert.That(!signalBus.IsSignalDeclared<FooSignal>());
|
|
}
|
|
|
|
[Test]
|
|
public void TestSignalDeclarationSettingsRunAsync2()
|
|
{
|
|
Container.DeclareSignal<FooSignal>().RunAsync();
|
|
Container.ResolveRoots();
|
|
Container.Resolve<InitializableManager>().Initialize();
|
|
|
|
var signalBus = Container.Resolve<SignalBus>();
|
|
|
|
int callCount = 0;
|
|
|
|
Action handler = () =>
|
|
{
|
|
callCount++;
|
|
signalBus.Fire<FooSignal>();
|
|
};
|
|
|
|
signalBus.Subscribe<FooSignal>(handler);
|
|
|
|
Assert.IsEqual(callCount, 0);
|
|
signalBus.Fire<FooSignal>();
|
|
Assert.IsEqual(callCount, 0);
|
|
|
|
Container.Resolve<TickableManager>().Update();
|
|
Assert.IsEqual(callCount, 1);
|
|
Container.Resolve<TickableManager>().Update();
|
|
Assert.IsEqual(callCount, 2);
|
|
}
|
|
|
|
public class FooSignal
|
|
{
|
|
}
|
|
|
|
public class BarSignal
|
|
{
|
|
public string Value;
|
|
}
|
|
}
|
|
}
|
|
|