public void should_only_execute_system_when_predicate_met()
        {
            var fakeEntity1  = Substitute.For <IEntity>();
            var fakeEntity2  = Substitute.For <IEntity>();
            var fakeEntities = new List <IEntity> {
                fakeEntity1, fakeEntity2
            };

            var id1 = 1;
            var id2 = 2;

            fakeEntity1.Id.Returns(id1);
            fakeEntity2.Id.Returns(id2);

            var mockObservableGroup = Substitute.For <IObservableGroup>();

            mockObservableGroup.GetEnumerator().Returns(fakeEntities.GetEnumerator());
            mockObservableGroup.OnEntityAdded.Returns(new Subject <IEntity>());
            mockObservableGroup.OnEntityRemoved.Returns(new Subject <IEntity>());

            var observableGroupManager = Substitute.For <IObservableGroupManager>();

            var fakeGroup = new GroupWithPredicate(x => x.Id == id1);

            observableGroupManager.GetObservableGroup(Arg.Is(fakeGroup), Arg.Any <int[]>()).Returns(mockObservableGroup);

            var firstEntitySubject  = new Subject <IEntity>();
            var secondEntitySubject = new Subject <IEntity>();
            var mockSystem          = Substitute.For <IReactToEntitySystem>();

            mockSystem.Group.Returns(fakeGroup);
            mockSystem.ReactToEntity(Arg.Is(fakeEntity1)).Returns(firstEntitySubject);
            mockSystem.ReactToEntity(Arg.Is(fakeEntity2)).Returns(secondEntitySubject);

            var systemHandler = new ReactToEntitySystemHandler(observableGroupManager);

            systemHandler.SetupSystem(mockSystem);

            firstEntitySubject.OnNext(fakeEntity1);
            secondEntitySubject.OnNext(fakeEntity2);

            mockSystem.Received(1).Process(Arg.Is(fakeEntity1));
            mockSystem.Received(0).Process(Arg.Is(fakeEntity2));

            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);

            Assert.Equal(1, systemHandler._entitySubscriptions.Count);
            Assert.Equal(2, systemHandler._entitySubscriptions[mockSystem].Count);
            Assert.True(systemHandler._entitySubscriptions[mockSystem].Keys.Contains(id1));
            Assert.True(systemHandler._entitySubscriptions[mockSystem].Keys.Contains(id2));
            Assert.All(systemHandler._entitySubscriptions[mockSystem].Values, Assert.NotNull);
        }
Пример #2
0
        public void should_execute_systems_when_predicate_met_after_period()
        {
            var id1          = 1;
            var id2          = 2;
            var expectedDate = DateTime.Now + TimeSpan.FromMilliseconds(500);

            var fakeEntity1  = Substitute.For <IEntity>();
            var fakeEntity2  = Substitute.For <IEntity>();
            var fakeEntities = new List <IEntity> {
                fakeEntity1, fakeEntity2
            };

            fakeEntity1.Id.Returns(id1);
            fakeEntity2.Id.Returns(id2);

            var mockObservableGroup = Substitute.For <IObservableGroup>();

            mockObservableGroup.OnEntityAdded.Returns(new Subject <IEntity>());
            mockObservableGroup.OnEntityRemoved.Returns(new Subject <IEntity>());
            mockObservableGroup.GetEnumerator().Returns(fakeEntities.GetEnumerator());

            var observableGroupManager = Substitute.For <IObservableGroupManager>();

            var fakeGroup = new GroupWithPredicate(x => x.Id == fakeEntity1.Id && DateTime.Now >= expectedDate);

            observableGroupManager.GetObservableGroup(Arg.Is(fakeGroup), Arg.Any <int[]>()).Returns(mockObservableGroup);

            var mockSystem = Substitute.For <ISetupSystem>();

            mockSystem.Group.Returns(fakeGroup);

            var systemHandler = new SetupSystemHandler(observableGroupManager);

            systemHandler.SetupSystem(mockSystem);

            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);
            Assert.Equal(1, systemHandler._entitySubscriptions.Count);
            Assert.Equal(2, systemHandler._entitySubscriptions[mockSystem].Count);
            Assert.True(systemHandler._entitySubscriptions[mockSystem].ContainsKey(fakeEntity1.Id));
            Assert.True(systemHandler._entitySubscriptions[mockSystem].ContainsKey(fakeEntity2.Id));

            Thread.Sleep(2000);
            mockSystem.Received(1).Setup(Arg.Is(fakeEntity1));
            mockSystem.Received(0).Setup(Arg.Is(fakeEntity2));

            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);
            Assert.Equal(1, systemHandler._entitySubscriptions.Count);
            Assert.Equal(1, systemHandler._entitySubscriptions[mockSystem].Count);
            Assert.True(systemHandler._entitySubscriptions[mockSystem].ContainsKey(fakeEntity2.Id));
        }
Пример #3
0
        public void should_only_execute_system_when_predicate_met()
        {
            var entityToMatch = Substitute.For <IEntity>();
            var idToMatch     = 1;

            entityToMatch.Id.Returns(idToMatch);

            var fakeEntities = new List <IEntity>
            {
                entityToMatch,
                Substitute.For <IEntity>()
            };

            var mockObservableGroup = Substitute.For <IObservableGroup>();

            mockObservableGroup.GetEnumerator().Returns(fakeEntities.GetEnumerator());
            mockObservableGroup[0].Returns(fakeEntities[0]);
            mockObservableGroup[1].Returns(fakeEntities[1]);
            mockObservableGroup.Count.Returns(fakeEntities.Count);

            var observableGroupManager = Substitute.For <IObservableGroupManager>();
            var threadHandler          = Substitute.For <IThreadHandler>();
            var observableScheduler    = Substitute.For <IUpdateScheduler>();
            var observableSubject      = new Subject <ElapsedTime>();

            observableScheduler.OnUpdate.Returns(observableSubject);

            var fakeGroup = new GroupWithPredicate(x => x.Id == idToMatch);

            observableGroupManager.GetObservableGroup(Arg.Is(fakeGroup), Arg.Any <int[]>()).Returns(mockObservableGroup);

            var mockSystem = Substitute.For <IBasicEntitySystem>();

            mockSystem.Group.Returns(fakeGroup);

            var systemHandler = new BasicEntitySystemHandler(observableGroupManager, threadHandler, observableScheduler);

            systemHandler.SetupSystem(mockSystem);

            observableSubject.OnNext(new ElapsedTime());

            mockSystem.ReceivedWithAnyArgs(1).Process(Arg.Is(entityToMatch));
            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);
        }