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));
        }
        public void should_execute_systems_when_predicate_met_after_period()
        {
            var guid1        = Guid.NewGuid();
            var guid2        = Guid.NewGuid();
            var expectedDate = DateTime.Now + TimeSpan.FromSeconds(1);

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

            fakeEntity1.Id.Returns(guid1);
            fakeEntity2.Id.Returns(guid2);

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

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

            var mockCollectionManager = Substitute.For <IEntityCollectionManager>();

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

            mockCollectionManager.CreateObservableGroup(Arg.Is(fakeGroup)).Returns(mockObservableGroup);

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

            mockSystem.TargetGroup.Returns(fakeGroup);

            var systemHandler = new SetupSystemHandler(mockCollectionManager);

            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(1100);
            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));
        }
        public void should_execute_system_when_entity_added_without_predicate()
        {
            var fakeEntity1 = Substitute.For <IEntity>();
            var fakeEntity2 = Substitute.For <IEntity>();

            fakeEntity1.Id.Returns(Guid.NewGuid());
            fakeEntity2.Id.Returns(Guid.NewGuid());
            var fakeEntities = new IEntity[] { };

            var mockObservableGroup = Substitute.For <IObservableGroup>();
            var addingSubject       = new Subject <IEntity>();

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

            var mockCollectionManager = Substitute.For <IEntityCollectionManager>();

            var fakeGroup = Substitute.For <IGroup>();

            fakeGroup.MatchesComponents.Returns(new Type[0]);
            mockCollectionManager.CreateObservableGroup(Arg.Is(fakeGroup)).Returns(mockObservableGroup);

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

            mockSystem.TargetGroup.Returns(fakeGroup);

            var systemHandler = new SetupSystemHandler(mockCollectionManager);

            systemHandler.SetupSystem(mockSystem);

            mockSystem.Received(0).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(0, systemHandler._entitySubscriptions[mockSystem].Count);

            addingSubject.OnNext(fakeEntity1);
            addingSubject.OnNext(fakeEntity2);

            mockSystem.Received(1).Setup(Arg.Is(fakeEntity1));
            mockSystem.Received(1).Setup(Arg.Is(fakeEntity2));
            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);
            Assert.Equal(1, systemHandler._entitySubscriptions.Count);
            Assert.Equal(0, systemHandler._entitySubscriptions[mockSystem].Count);
        }
        public void should_execute_system_when_entity_added_without_predicate()
        {
            var fakeEntity1 = Substitute.For <IEntity>();
            var fakeEntity2 = Substitute.For <IEntity>();

            fakeEntity1.Id.Returns(1);
            fakeEntity2.Id.Returns(2);
            var fakeEntities = new List <IEntity>();

            var mockObservableGroup = Substitute.For <IObservableGroup>();
            var addingSubject       = new Subject <IEntity>();

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

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

            var fakeGroup = Substitute.For <IGroup>();

            fakeGroup.RequiredComponents.Returns(new Type[0]);
            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);

            mockSystem.Received(0).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(0, systemHandler._entitySubscriptions[mockSystem].Count);

            addingSubject.OnNext(fakeEntity1);
            addingSubject.OnNext(fakeEntity2);

            mockSystem.Received(1).Setup(Arg.Is(fakeEntity1));
            mockSystem.Received(1).Setup(Arg.Is(fakeEntity2));
            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);
            Assert.Equal(1, systemHandler._entitySubscriptions.Count);
            Assert.Equal(0, systemHandler._entitySubscriptions[mockSystem].Count);
        }
Beispiel #5
0
        public void should_execute_systems_when_predicate_met()
        {
            var id1 = 1;
            var id2 = 2;

            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 mockCollectionManager = Substitute.For <IEntityCollectionManager>();

            var fakeGroup = new Group(x => x.Id == fakeEntity1.Id);

            mockCollectionManager.GetObservableGroup(Arg.Is(fakeGroup)).Returns(mockObservableGroup);

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

            mockSystem.Group.Returns(fakeGroup);

            var systemHandler = new SetupSystemHandler(mockCollectionManager);

            systemHandler.SetupSystem(mockSystem);

            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));
        }
        public void should_dispose_observables_when_entity_removed()
        {
            var fakeEntity1 = Substitute.For <IEntity>();

            fakeEntity1.Id.Returns(Guid.NewGuid());
            var fakeEntities = new IEntity[] { };

            var mockObservableGroup = Substitute.For <IObservableGroup>();
            var removingSubject     = new Subject <IEntity>();

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

            var mockCollectionManager = Substitute.For <IEntityCollectionManager>();

            var fakeGroup = Substitute.For <IGroup>();

            fakeGroup.MatchesComponents.Returns(new Type[0]);
            mockCollectionManager.CreateObservableGroup(Arg.Is(fakeGroup)).Returns(mockObservableGroup);

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

            mockSystem.TargetGroup.Returns(fakeGroup);

            var systemHandler = new SetupSystemHandler(mockCollectionManager);

            systemHandler.SetupSystem(mockSystem);

            var mockDisposable = Substitute.For <IDisposable>();

            systemHandler._entitySubscriptions[mockSystem].Add(fakeEntity1.Id, mockDisposable);

            removingSubject.OnNext(fakeEntity1);

            mockDisposable.Received(1).Dispose();

            Assert.Equal(1, systemHandler._systemSubscriptions.Count);
            Assert.NotNull(systemHandler._systemSubscriptions[mockSystem]);
            Assert.Equal(1, systemHandler._entitySubscriptions.Count);
            Assert.Equal(0, systemHandler._entitySubscriptions[mockSystem].Count);
        }
        public void should_dispose_observables_when_entity_removed()
        {
            var fakeEntity1 = Substitute.For <IEntity>();

            fakeEntity1.Id.Returns(1);
            var fakeEntities = new List <IEntity>();

            var mockObservableGroup = Substitute.For <IObservableGroup>();
            var removingSubject     = new Subject <IEntity>();

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

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

            var fakeGroup = Substitute.For <IGroup>();

            fakeGroup.RequiredComponents.Returns(new Type[0]);
            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);

            var mockDisposable = Substitute.For <IDisposable>();

            systemHandler._entitySubscriptions[mockSystem].Add(fakeEntity1.Id, mockDisposable);

            removingSubject.OnNext(fakeEntity1);

            mockDisposable.Received(1).Dispose();

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