mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-04 11:07:12 +02:00
* IComponentManager holds a reference to IComponentFactory. * Directed events for a same <TComp, TEvent> can be duplicated, component references of a component are added to the entity's event tables. * Fix tests. * Improvements, duplicated subscriptions are no more * Cache component factory for faster access * when the
185 lines
6.9 KiB
C#
185 lines
6.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Immutable;
|
|
using Moq;
|
|
using NUnit.Framework;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Prototypes;
|
|
|
|
namespace Robust.UnitTesting.Shared.GameObjects
|
|
{
|
|
public partial class EntityEventBusTests
|
|
{
|
|
[Test]
|
|
public void SubscribeCompEvent()
|
|
{
|
|
// Arrange
|
|
var entUid = new EntityUid(7);
|
|
var compInstance = new MetaDataComponent();
|
|
|
|
var compRegistration = new Mock<IComponentRegistration>();
|
|
|
|
var entManMock = new Mock<IEntityManager>();
|
|
|
|
|
|
var compManMock = new Mock<IComponentManager>();
|
|
var compFacMock = new Mock<IComponentFactory>();
|
|
|
|
compRegistration.Setup(m => m.References).Returns(new List<Type> {typeof(MetaDataComponent)});
|
|
compFacMock.Setup(m => m.GetRegistration(typeof(MetaDataComponent))).Returns(compRegistration.Object);
|
|
compManMock.Setup(m => m.ComponentFactory).Returns(compFacMock.Object);
|
|
|
|
IComponent? outIComponent = compInstance;
|
|
compManMock.Setup(m => m.TryGetComponent(entUid, typeof(MetaDataComponent), out outIComponent))
|
|
.Returns(true);
|
|
|
|
compManMock.Setup(m => m.GetComponent(entUid, typeof(MetaDataComponent)))
|
|
.Returns(compInstance);
|
|
|
|
|
|
entManMock.Setup(m => m.ComponentManager).Returns(compManMock.Object);
|
|
var bus = new EntityEventBus(entManMock.Object);
|
|
|
|
// Subscribe
|
|
int calledCount = 0;
|
|
bus.SubscribeLocalEvent<MetaDataComponent, TestEvent>(HandleTestEvent);
|
|
|
|
// add a component to the system
|
|
entManMock.Raise(m=>m.EntityAdded += null, entManMock.Object, entUid);
|
|
compManMock.Raise(m => m.ComponentAdded += null, new AddedComponentEventArgs(compInstance, entUid));
|
|
|
|
// Raise
|
|
var evntArgs = new TestEvent(5);
|
|
bus.RaiseLocalEvent(entUid, evntArgs);
|
|
|
|
// Assert
|
|
Assert.That(calledCount, Is.EqualTo(1));
|
|
void HandleTestEvent(EntityUid uid, MetaDataComponent component, TestEvent args)
|
|
{
|
|
calledCount++;
|
|
Assert.That(uid, Is.EqualTo(entUid));
|
|
Assert.That(component, Is.EqualTo(compInstance));
|
|
Assert.That(args.TestNumber, Is.EqualTo(5));
|
|
}
|
|
|
|
}
|
|
|
|
[Test]
|
|
public void UnsubscribeCompEvent()
|
|
{
|
|
// Arrange
|
|
var entUid = new EntityUid(7);
|
|
var compInstance = new MetaDataComponent();
|
|
|
|
var entManMock = new Mock<IEntityManager>();
|
|
|
|
var compRegistration = new Mock<IComponentRegistration>();
|
|
|
|
var compManMock = new Mock<IComponentManager>();
|
|
var compFacMock = new Mock<IComponentFactory>();
|
|
|
|
compRegistration.Setup(m => m.References).Returns(new List<Type> {typeof(MetaDataComponent)});
|
|
compFacMock.Setup(m => m.GetRegistration(typeof(MetaDataComponent))).Returns(compRegistration.Object);
|
|
compManMock.Setup(m => m.ComponentFactory).Returns(compFacMock.Object);
|
|
|
|
IComponent? outIComponent = compInstance;
|
|
compManMock.Setup(m => m.TryGetComponent(entUid, typeof(MetaDataComponent), out outIComponent))
|
|
.Returns(true);
|
|
|
|
compManMock.Setup(m => m.GetComponent(entUid, typeof(MetaDataComponent)))
|
|
.Returns(compInstance);
|
|
|
|
entManMock.Setup(m => m.ComponentManager).Returns(compManMock.Object);
|
|
var bus = new EntityEventBus(entManMock.Object);
|
|
|
|
// Subscribe
|
|
int calledCount = 0;
|
|
bus.SubscribeLocalEvent<MetaDataComponent, TestEvent>(HandleTestEvent);
|
|
bus.UnsubscribeLocalEvent<MetaDataComponent, TestEvent>();
|
|
|
|
// add a component to the system
|
|
entManMock.Raise(m => m.EntityAdded += null, entManMock.Object, entUid);
|
|
compManMock.Raise(m => m.ComponentAdded += null, new AddedComponentEventArgs(compInstance, entUid));
|
|
|
|
// Raise
|
|
var evntArgs = new TestEvent(5);
|
|
bus.RaiseLocalEvent(entUid, evntArgs);
|
|
|
|
// Assert
|
|
Assert.That(calledCount, Is.EqualTo(0));
|
|
void HandleTestEvent(EntityUid uid, MetaDataComponent component, TestEvent args)
|
|
{
|
|
calledCount++;
|
|
}
|
|
|
|
}
|
|
|
|
[Test]
|
|
public void SubscribeCompLifeEvent()
|
|
{
|
|
// Arrange
|
|
var entUid = new EntityUid(7);
|
|
var compInstance = new MetaDataComponent();
|
|
var mockEnt = new Mock<IEntity>();
|
|
mockEnt.SetupGet(m => m.Uid).Returns(entUid);
|
|
compInstance.Owner = mockEnt.Object;
|
|
|
|
var entManMock = new Mock<IEntityManager>();
|
|
|
|
var compRegistration = new Mock<IComponentRegistration>();
|
|
|
|
var compManMock = new Mock<IComponentManager>();
|
|
var compFacMock = new Mock<IComponentFactory>();
|
|
|
|
compRegistration.Setup(m => m.References).Returns(new List<Type> {typeof(MetaDataComponent)});
|
|
compFacMock.Setup(m => m.GetRegistration(typeof(MetaDataComponent))).Returns(compRegistration.Object);
|
|
compManMock.Setup(m => m.ComponentFactory).Returns(compFacMock.Object);
|
|
|
|
IComponent? outIComponent = compInstance;
|
|
compManMock.Setup(m => m.TryGetComponent(entUid, typeof(MetaDataComponent), out outIComponent))
|
|
.Returns(true);
|
|
|
|
compManMock.Setup(m => m.GetComponent(entUid, typeof(MetaDataComponent)))
|
|
.Returns(compInstance);
|
|
|
|
entManMock.Setup(m => m.ComponentManager).Returns(compManMock.Object);
|
|
var bus = new EntityEventBus(entManMock.Object);
|
|
|
|
// Subscribe
|
|
int calledCount = 0;
|
|
bus.SubscribeLocalEvent<MetaDataComponent, ComponentInit>(HandleTestEvent);
|
|
|
|
// add a component to the system
|
|
entManMock.Raise(m=>m.EntityAdded += null, entManMock.Object, entUid);
|
|
compManMock.Raise(m => m.ComponentAdded += null, new AddedComponentEventArgs(compInstance, entUid));
|
|
|
|
// Raise
|
|
bus.RaiseComponentEvent(compInstance, new ComponentInit());
|
|
|
|
// Assert
|
|
Assert.That(calledCount, Is.EqualTo(1));
|
|
void HandleTestEvent(EntityUid uid, MetaDataComponent component, ComponentInit args)
|
|
{
|
|
calledCount++;
|
|
Assert.That(uid, Is.EqualTo(entUid));
|
|
Assert.That(component, Is.EqualTo(compInstance));
|
|
}
|
|
}
|
|
|
|
private class DummyComponent : Component
|
|
{
|
|
public override string Name => "Dummy";
|
|
}
|
|
|
|
private class TestEvent : EntityEventArgs
|
|
{
|
|
public int TestNumber { get; }
|
|
|
|
public TestEvent(int testNumber)
|
|
{
|
|
TestNumber = testNumber;
|
|
}
|
|
}
|
|
}
|
|
}
|