private static EntityEventBus BusFactory()
        {
            var entManMock = new Mock <IEntityManager>();
            var bus        = new EntityEventBus(entManMock.Object);

            return(bus);
        }
 private static EntityEventBus BusFactory()
 {
     var entityMan = new Mock<IEntityManager>();
     var compMan = new Mock<IComponentManager>();
     entityMan.Setup(m => m.ComponentManager).Returns(compMan.Object);
     var bus = new EntityEventBus(entityMan.Object);
     return bus;
 }
        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));
            }
        }
        public void SubscribeEvent_NullSubscriber_NullArgumentException()
        {
            // Arrange
            var bus = new EntityEventBus();

            // Act
            void Code() => bus.SubscribeEvent <TestEventArgs>(EventSource.Local, null !, ev => {});

            //Assert: this should do nothing
            Assert.Throws <ArgumentNullException>(Code);
        }
        public void UnsubscribeEvent_NullSubscriber_NullArgumentException()
        {
            // Arrange
            var bus = new EntityEventBus();

            // Act
            void Code() => bus.UnsubscribeEvent <TestEventArgs>(EventSource.Local, null !);

            // Assert
            Assert.Throws <ArgumentNullException>(Code);
        }
        public void UnsubscribeEvent_NoSubscription_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            // Act
            bus.UnsubscribeEvent <TestEventArgs>(EventSource.Local, subscriber);

            // Assert: Does not throw
        }
        public void UnsubscribeEvents_NoSubscriptions_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            // Act
            bus.UnsubscribeEvents(subscriber);

            // Assert: no exception
        }
        public void QueueEvent_NullEvent_ArgumentNullException()
        {
            // Arrange
            var bus = new EntityEventBus();

            // Act
            void Code() => bus.QueueEvent(EventSource.Local, null !);

            // Assert
            Assert.Throws <ArgumentNullException>(Code);
        }
Example #9
0
        public void RaiseEvent_NullEvent_ArgumentNullException()
        {
            // Arrange
            var bus = new EntityEventBus();

            // Act
            void Code() => bus.RaiseEvent(null, null);

            // Assert
            Assert.Throws <ArgumentNullException>(Code);
        }
        public void AwaitEvent_SourceNone_ArgOutOfRange()
        {
            // Arrange
            var bus = new EntityEventBus();

            // Act
            void Code() => bus.AwaitEvent <TestEventArgs>(EventSource.None);

            // Assert
            Assert.Throws <ArgumentOutOfRangeException>(Code);
        }
        public void UnsubscribeEvents_NullSubscriber_NullArgumentException()
        {
            // Arrange
            var bus = new EntityEventBus();

            // Act
            void Code() => bus.UnsubscribeEvents(null !);

            // Assert
            Assert.Throws <ArgumentNullException>(Code);
        }
        public void UnsubscribeEvent_SourceNone_ArgOutOfRange()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            // Act
            void Code() => bus.UnsubscribeEvent <TestEventArgs>(EventSource.None, subscriber);

            // Assert
            Assert.Throws <ArgumentOutOfRangeException>(Code);
        }
        public void SubscribeEvent_NullHandler_NullArgumentException()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            // Act
            void Code() => bus.SubscribeEvent(EventSource.Local, subscriber, (EntityEventHandler <TestEventArgs>)null !);

            //Assert
            Assert.Throws <ArgumentNullException>(Code);
        }
        public void AwaitEvent_DoubleTask_InvalidException()
        {
            // Arrange
            var bus = new EntityEventBus();

            bus.AwaitEvent <TestEventArgs>(EventSource.Local);

            // Act
            void Code() => bus.AwaitEvent <TestEventArgs>(EventSource.Local);

            // Assert
            Assert.Throws <InvalidOperationException>(Code);
        }
        public async Task AwaitEvent()
        {
            // Arrange
            var bus  = new EntityEventBus();
            var args = new TestEventArgs();

            // Act
            var task = bus.AwaitEvent <TestEventArgs>(EventSource.Local);

            bus.RaiseEvent(EventSource.Local, args);
            var result = await task;

            // Assert
            Assert.That(result, Is.EqualTo(args));
        }
        public void RaiseEvent_NoSubscriptions_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delCalledCount = 0;

            bus.SubscribeEvent <TestEventTwoArgs>(EventSource.Local, subscriber, ev => delCalledCount++);

            // Act
            bus.RaiseEvent(EventSource.Local, new TestEventArgs());

            // Assert
            Assert.That(delCalledCount, Is.EqualTo(0));
        }
        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 compManMock = new Mock <IComponentManager>();

            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));
            }
        }
Example #18
0
        public void UnsubscribeEvent_DoubleUnsubscribe_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            void Handler(object sender, TestEventArgs ev)
            {
            }

            bus.SubscribeEvent <TestEventArgs>(Handler, subscriber);
            bus.UnsubscribeEvent <TestEventArgs>(subscriber);

            // Act
            bus.UnsubscribeEvent <TestEventArgs>(subscriber);

            // Assert: Does not throw
        }
        public void QueueEvent_EventQueued_DoesNotImmediatelyRaise()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delCallCount = 0;

            void Handler(TestEventArgs ev) => delCallCount++;

            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, Handler);

            // Act
            bus.QueueEvent(EventSource.Local, new TestEventArgs());

            // Assert
            Assert.That(delCallCount, Is.EqualTo(0));
        }
        public void UnsubscribeEvent_DoubleUnsubscribe_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            void Handler(TestEventArgs ev)
            {
            }

            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, Handler);
            bus.UnsubscribeEvent <TestEventArgs>(EventSource.Local, subscriber);

            // Act
            bus.UnsubscribeEvent <TestEventArgs>(EventSource.Local, subscriber);

            // Assert: Does not throw
        }
        public void UnsubscribeCompEvent()
        {
            // Arrange
            var entUid       = new EntityUid(7);
            var compInstance = new MetaDataComponent();

            var entManMock = new Mock <IEntityManager>();


            var compManMock = new Mock <IComponentManager>();

            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++;
            }
        }
        public void SubscribeEvent_MultipleDelegates_BothRaised()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delFooCount = 0;
            int delBarCount = 0;

            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, ev => delFooCount++);
            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, ev => delBarCount++);

            // Act
            bus.RaiseEvent(EventSource.Local, new TestEventArgs());

            // Assert
            Assert.That(delFooCount, Is.EqualTo(1));
            Assert.That(delBarCount, Is.EqualTo(1));
        }
Example #23
0
        public void RaiseEvent_Unsubscribed_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delCallCount = 0;

            void Handler(object sender, TestEventArgs ev) => delCallCount++;

            bus.SubscribeEvent <TestEventArgs>(Handler, subscriber);
            bus.UnsubscribeEvent <TestEventArgs>(subscriber);

            // Act
            bus.RaiseEvent(null, new TestEventArgs());

            // Assert
            Assert.That(delCallCount, Is.EqualTo(0));
        }
        public void ProcessQueue_EventQueued_HandlerRaised()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delCallCount = 0;

            void Handler(TestEventArgs ev) => delCallCount++;

            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, Handler);
            bus.QueueEvent(EventSource.Local, new TestEventArgs());

            // Act
            bus.ProcessEventQueue();

            // Assert
            Assert.That(delCallCount, Is.EqualTo(1));
        }
        public void UnsubscribeEvents_UnsubscribedHandler_Nop()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delCallCount = 0;

            void Handler(TestEventArgs ev) => delCallCount++;

            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, Handler);
            bus.UnsubscribeEvents(subscriber);

            // Act
            bus.RaiseEvent(EventSource.Local, new TestEventArgs());

            // Assert
            Assert.That(delCallCount, Is.EqualTo(0));
        }
        public void SubscribeEvent_DuplicateSubscription_RaisedOnce()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delegateCallCount = 0;

            void Handler(TestEventArgs ev) => delegateCallCount++;

            // 2 subscriptions 1 handler
            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, Handler);
            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, Handler);

            // Act
            bus.RaiseEvent(EventSource.Local, new TestEventArgs());

            //Assert
            Assert.That(delegateCallCount, Is.EqualTo(1));
        }
        public void SubscribeEvent_MultipleSubscriptions_IndividuallyCalled()
        {
            // Arrange
            var bus        = new EntityEventBus();
            var subscriber = new TestEventSubscriber();

            int delFooCount = 0;
            int delBarCount = 0;

            bus.SubscribeEvent <TestEventArgs>(EventSource.Local, subscriber, ev => delFooCount++);
            bus.SubscribeEvent <TestEventTwoArgs>(EventSource.Local, subscriber, ev => delBarCount++);

            // Act & Assert
            bus.RaiseEvent(EventSource.Local, new TestEventArgs());
            Assert.That(delFooCount, Is.EqualTo(1));
            Assert.That(delBarCount, Is.EqualTo(0));

            delFooCount = delBarCount = 0;

            bus.RaiseEvent(EventSource.Local, new TestEventTwoArgs());
            Assert.That(delFooCount, Is.EqualTo(0));
            Assert.That(delBarCount, Is.EqualTo(1));
        }
Example #28
0
        public void CompEventOrdered()
        {
            // Arrange
            var entUid = new EntityUid(7);

            var entManMock  = new Mock <IEntityManager>();
            var compFacMock = new Mock <IComponentFactory>();

            void Setup <T>(out T instance) where T : IComponent, new()
            {
                IComponent?inst = instance = new T();
                var        reg  = new Mock <IComponentRegistration>();

                reg.Setup(m => m.References).Returns(new Type[] { typeof(T) });

                compFacMock.Setup(m => m.GetRegistration(typeof(T))).Returns(reg.Object);
                entManMock.Setup(m => m.TryGetComponent(entUid, typeof(T), out inst)).Returns(true);
                entManMock.Setup(m => m.GetComponent(entUid, typeof(T))).Returns(inst);
            }

            Setup <OrderComponentA>(out var instA);
            Setup <OrderComponentB>(out var instB);
            Setup <OrderComponentC>(out var instC);

            entManMock.Setup(m => m.ComponentFactory).Returns(compFacMock.Object);
            var bus = new EntityEventBus(entManMock.Object);

            // Subscribe
            var a = false;
            var b = false;
            var c = false;

            void HandlerA(EntityUid uid, Component comp, TestEvent ev)
            {
                Assert.That(b, Is.False, "A should run before B");
                Assert.That(c, Is.False, "A should run before C");

                a = true;
            }

            void HandlerB(EntityUid uid, Component comp, TestEvent ev)
            {
                Assert.That(c, Is.True, "B should run after C");
                b = true;
            }

            void HandlerC(EntityUid uid, Component comp, TestEvent ev) => c = true;

            bus.SubscribeLocalEvent <OrderComponentA, TestEvent>(HandlerA, typeof(OrderComponentA), before: new [] { typeof(OrderComponentB), typeof(OrderComponentC) });
            bus.SubscribeLocalEvent <OrderComponentB, TestEvent>(HandlerB, typeof(OrderComponentB), after: new [] { typeof(OrderComponentC) });
            bus.SubscribeLocalEvent <OrderComponentC, TestEvent>(HandlerC, typeof(OrderComponentC));

            // add a component to the system
            entManMock.Raise(m => m.EntityAdded    += null, entManMock.Object, entUid);
            entManMock.Raise(m => m.ComponentAdded += null, new AddedComponentEventArgs(instA, entUid));
            entManMock.Raise(m => m.ComponentAdded += null, new AddedComponentEventArgs(instB, entUid));
            entManMock.Raise(m => m.ComponentAdded += null, new AddedComponentEventArgs(instC, entUid));

            // Raise
            var evntArgs = new TestEvent(5);

            bus.RaiseLocalEvent(entUid, evntArgs);

            // Assert
            Assert.That(a, Is.True, "A did not fire");
            Assert.That(b, Is.True, "B did not fire");
            Assert.That(c, Is.True, "C did not fire");
        }