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); }
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_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]); }