mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-01 17:47:24 +02:00
168 lines
6.0 KiB
C#
168 lines
6.0 KiB
C#
using NUnit.Framework;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Reflection;
|
|
using Robust.UnitTesting.Server;
|
|
|
|
namespace Robust.UnitTesting.Shared.GameObjects
|
|
{
|
|
internal sealed partial class EntityEventBusTests
|
|
{
|
|
|
|
[Test]
|
|
public void SubscribeCompRefDirectedEvent()
|
|
{
|
|
// Arrange.
|
|
var simulation = RobustServerSimulation
|
|
.NewSimulation()
|
|
.RegisterComponents(factory => factory.RegisterClass<DummyComponent>())
|
|
.RegisterEntitySystems(factory => factory.LoadExtraSystemType<SubscribeCompRefDirectedEventSystem>())
|
|
.InitializeInstance();
|
|
|
|
var entMan = simulation.Resolve<IEntityManager>();
|
|
var mapSys = entMan.System<SharedMapSystem>();
|
|
mapSys.CreateMap(out var map);
|
|
var entity = entMan.Spawn(null, new MapCoordinates(0, 0, map));
|
|
entMan.AddComponent<DummyComponent>(entity);
|
|
|
|
// Act.
|
|
var testEvent = new TestStructEvent {TestNumber = 5};
|
|
var eventBus = entMan.EventBus;
|
|
eventBus.RaiseLocalEvent(entity, ref testEvent, true);
|
|
|
|
// Check that the entity system changed the value correctly
|
|
Assert.That(testEvent.TestNumber, Is.EqualTo(10));
|
|
}
|
|
|
|
[Reflect(false)]
|
|
private sealed class SubscribeCompRefDirectedEventSystem : EntitySystem
|
|
{
|
|
public override void Initialize()
|
|
{
|
|
SubscribeLocalEvent<DummyComponent, TestStructEvent>(MyRefHandler);
|
|
}
|
|
|
|
private void MyRefHandler(EntityUid uid, DummyComponent component, ref TestStructEvent args)
|
|
{
|
|
Assert.That(args.TestNumber, Is.EqualTo(5));
|
|
args.TestNumber = 10;
|
|
}
|
|
}
|
|
|
|
[Reflect(false)]
|
|
private sealed class SubscriptionNoMixedRefValueDirectedEventSystem : EntitySystem
|
|
{
|
|
public override void Initialize()
|
|
{
|
|
// The below is not allowed, as you're subscribing by-ref and by-value to the same event...
|
|
SubscribeLocalEvent<DummyComponent, TestStructEvent>(MyRefHandler);
|
|
#pragma warning disable RA0013
|
|
SubscribeLocalEvent<DummyTwoComponent, TestStructEvent>(MyValueHandler);
|
|
#pragma warning restore RA0013
|
|
}
|
|
|
|
private void MyValueHandler(EntityUid uid, DummyTwoComponent component, TestStructEvent args) { }
|
|
private void MyRefHandler(EntityUid uid, DummyComponent component, ref TestStructEvent args) { }
|
|
}
|
|
|
|
[Test]
|
|
public void SortedDirectedRefEvents()
|
|
{
|
|
// Arrange.
|
|
var simulation = RobustServerSimulation
|
|
.NewSimulation()
|
|
.RegisterComponents(factory =>
|
|
{
|
|
factory.RegisterClass<OrderAComponent>();
|
|
factory.RegisterClass<OrderBComponent>();
|
|
factory.RegisterClass<OrderCComponent>();
|
|
})
|
|
.RegisterEntitySystems(factory =>
|
|
{
|
|
factory.LoadExtraSystemType<OrderASystem>();
|
|
factory.LoadExtraSystemType<OrderBSystem>();
|
|
factory.LoadExtraSystemType<OrderCSystem>();
|
|
})
|
|
.InitializeInstance();
|
|
|
|
var entMan = simulation.Resolve<IEntityManager>();
|
|
var mapSys = entMan.System<SharedMapSystem>();
|
|
mapSys.CreateMap(out var map);
|
|
var entity = entMan.Spawn(null, new MapCoordinates(0, 0, map));
|
|
entMan.AddComponent<OrderAComponent>(entity);
|
|
entMan.AddComponent<OrderBComponent>(entity);
|
|
entMan.AddComponent<OrderCComponent>(entity);
|
|
|
|
// Act.
|
|
var testEvent = new TestStructEvent {TestNumber = 5};
|
|
var eventBus = entMan.EventBus;
|
|
eventBus.RaiseLocalEvent(entity, ref testEvent, true);
|
|
|
|
// Check that the entity systems changed the value correctly
|
|
Assert.That(testEvent.TestNumber, Is.EqualTo(15));
|
|
}
|
|
|
|
[Reflect(false)]
|
|
private sealed class OrderASystem : EntitySystem
|
|
{
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<OrderAComponent, TestStructEvent>(OnA, new[]{typeof(OrderBSystem)}, new[]{typeof(OrderCSystem)});
|
|
}
|
|
|
|
private static void OnA(EntityUid uid, OrderAComponent component, ref TestStructEvent args)
|
|
{
|
|
// Second handler being ran.
|
|
Assert.That(args.TestNumber, Is.EqualTo(0));
|
|
args.TestNumber = 10;
|
|
}
|
|
}
|
|
|
|
[Reflect(false)]
|
|
private sealed class OrderBSystem : EntitySystem
|
|
{
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<OrderBComponent, TestStructEvent>(OnB, null, new []{typeof(OrderASystem)});
|
|
}
|
|
|
|
private static void OnB(EntityUid uid, OrderBComponent component, ref TestStructEvent args)
|
|
{
|
|
// Last handler being ran.
|
|
Assert.That(args.TestNumber, Is.EqualTo(10));
|
|
args.TestNumber = 15;
|
|
}
|
|
}
|
|
|
|
[Reflect(false)]
|
|
private sealed class OrderCSystem : EntitySystem
|
|
{
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<OrderCComponent, TestStructEvent>(OnC);
|
|
}
|
|
|
|
private static void OnC(EntityUid uid, OrderCComponent component, ref TestStructEvent args)
|
|
{
|
|
// First handler being ran.
|
|
Assert.That(args.TestNumber, Is.EqualTo(5));
|
|
args.TestNumber = 0;
|
|
}
|
|
}
|
|
|
|
private sealed partial class DummyTwoComponent : Component;
|
|
|
|
[ByRefEvent]
|
|
private struct TestStructEvent
|
|
{
|
|
public int TestNumber;
|
|
}
|
|
}
|
|
}
|