public void OnReserveEntityIdsResponse_should_add_received_responses_to_entity()
        {
            var entity = SetupTestEntity();

            var emptyRequest = new WorldCommands.ReserveEntityIds.Request();
            var context      = "Some context";

            reserveEntityIdsStorage.CommandRequestsInFlight.Add(TestCommandRequestId,
                                                                new CommandRequestStore <WorldCommands.ReserveEntityIds.Request>(entity,
                                                                                                                                 emptyRequest, context, TestCommandRequestId));

            using (var wrappedOp = WorkerOpFactory.CreateReserveEntityIdsResponseOp(TestCommandRequestId))
            {
                receiveSystem.OnReserveEntityIdsResponse(wrappedOp.Op);

                Assert.IsTrue(entityManager.HasComponent <WorldCommands.ReserveEntityIds.CommandResponses>(entity));

                var responses = entityManager.GetComponentData <WorldCommands.ReserveEntityIds.CommandResponses>(entity);

                var count = 0;
                Assert.DoesNotThrow(() => { count = responses.Responses.Count; });
                Assert.AreEqual(1, count);

                var response = responses.Responses[0];

                Assert.AreEqual(emptyRequest, response.RequestPayload);
                Assert.AreEqual(context, response.Context);
                Assert.AreEqual(TestCommandRequestId, response.RequestId);
                Assert.AreEqual(wrappedOp.Op.StatusCode, response.StatusCode);
                Assert.AreEqual(wrappedOp.Op.Message, response.Message);
                Assert.AreEqual(wrappedOp.Op.FirstEntityId, response.FirstEntityId);
                Assert.AreEqual(wrappedOp.Op.NumberOfEntityIds, response.NumberOfEntityIds);
            }
        }
 public void OnAuthorityChange_should_error_if_unknown_component_id_received()
 {
     using (var wrappedOp = WorkerOpFactory.CreateAuthorityChangeOp(TestEntityId, InvalidComponentId))
     {
         Assert.Throws <UnknownComponentIdException>(() => { receiveSystem.OnAuthorityChange(wrappedOp.Op); });
     }
 }
 public void OnEntityQueryResponse_should_error_if_request_id_not_found()
 {
     using (var wrappedOp = WorkerOpFactory.CreateEntityQueryResponseOp(TestCommandRequestId))
     {
         Assert.Throws <UnknownRequestIdException>(() => { receiveSystem.OnEntityQueryResponse(wrappedOp.Op); });
     }
 }
        public void OnDisconnect_should_add_OnDisconnected_to_WorkerEntity_and_deallocate_world_command_senders()
        {
            const string DisconnectReason = "Testing disconnect.";

            var createEntityRequestsHandle =
                entityManager.GetComponentData <WorldCommands.CreateEntity.CommandSender>(worker.WorkerEntity).Handle;
            var deleteEntityRequestsHandle =
                entityManager.GetComponentData <WorldCommands.DeleteEntity.CommandSender>(worker.WorkerEntity).Handle;
            var entityQueryRequestsHandle =
                entityManager.GetComponentData <WorldCommands.EntityQuery.CommandSender>(worker.WorkerEntity).Handle;
            var reserveEntityIdsRequestsHandle =
                entityManager.GetComponentData <WorldCommands.ReserveEntityIds.CommandSender>(worker.WorkerEntity)
                .Handle;

            using (var wrappedOp = WorkerOpFactory.CreateDisconnectOp(DisconnectReason))
            {
                receiveSystem.OnDisconnect(wrappedOp.Op);
            }

            Assert.IsTrue(entityManager.HasComponent <OnDisconnected>(worker.WorkerEntity));
            Assert.AreEqual(DisconnectReason,
                            entityManager.GetSharedComponentData <OnDisconnected>(worker.WorkerEntity).ReasonForDisconnect);

            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.CreateEntity.RequestsProvider.Get(createEntityRequestsHandle));
            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.DeleteEntity.RequestsProvider.Get(deleteEntityRequestsHandle));
            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.EntityQuery.RequestsProvider.Get(entityQueryRequestsHandle));
            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.ReserveEntityIds.RequestsProvider.Get(reserveEntityIdsRequestsHandle));
        }
        public void OnRemoveEntity_should_remove_entity_and_deallocate_world_command_providers()
        {
            var entity = SetupTestEntity();

            var createEntityRequestsHandle =
                entityManager.GetComponentData <WorldCommands.CreateEntity.CommandSender>(entity).Handle;
            var deleteEntityRequestsHandle =
                entityManager.GetComponentData <WorldCommands.DeleteEntity.CommandSender>(entity).Handle;
            var entityQueryRequestsHandle =
                entityManager.GetComponentData <WorldCommands.EntityQuery.CommandSender>(entity).Handle;
            var reserveEntityIdsRequestsHandle =
                entityManager.GetComponentData <WorldCommands.ReserveEntityIds.CommandSender>(entity).Handle;

            using (var wrappedOp = WorkerOpFactory.CreateRemoveEntityOp(TestEntityId))
            {
                receiveSystem.OnRemoveEntity(wrappedOp.Op);
            }

            Assert.IsFalse(entityManager.Exists(entity));
            Assert.IsFalse(worker.TryGetEntity(new EntityId(TestEntityId), out _));

            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.CreateEntity.RequestsProvider.Get(createEntityRequestsHandle));
            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.DeleteEntity.RequestsProvider.Get(deleteEntityRequestsHandle));
            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.EntityQuery.RequestsProvider.Get(entityQueryRequestsHandle));
            Assert.Throws <ArgumentException>(() =>
                                              WorldCommands.ReserveEntityIds.RequestsProvider.Get(reserveEntityIdsRequestsHandle));
        }
        public void OnAddEntity_should_add_entity_and_command_components()
        {
            using (var wrappedOp = WorkerOpFactory.CreateAddEntityOp(TestEntityId))
            {
                receiveSystem.OnAddEntity(wrappedOp.Op);
            }

            Assert.IsTrue(worker.TryGetEntity(new EntityId(TestEntityId), out var entity));

            var id = new SpatialEntityId(); // Default value

            Assert.DoesNotThrow(() => { id = entityManager.GetComponentData <SpatialEntityId>(entity); });
            Assert.AreEqual(TestEntityId, id.EntityId.Id);

            ComponentType[] worldCommandComponentTypes =
            {
                ComponentType.Create <WorldCommands.CreateEntity.CommandSender>(),
                ComponentType.Create <WorldCommands.DeleteEntity.CommandSender>(),
                ComponentType.Create <WorldCommands.EntityQuery.CommandSender>(),
                ComponentType.Create <WorldCommands.ReserveEntityIds.CommandSender>()
            };

            foreach (var type in worldCommandComponentTypes)
            {
                Assert.IsTrue(entityManager.HasComponent(entity, type));
            }

            Assert.IsTrue(entityManager.HasComponent(entity,
                                                     ComponentType.Create <FirstComponentDispatcher.CommandComponent>()));
            Assert.IsTrue(entityManager.HasComponent(entity,
                                                     ComponentType.Create <SecondComponentDispatcher.CommandComponent>()));
        }
 public void OnCommandResponse_should_error_if_unknown_component_id_received()
 {
     using (var wrappedOp =
                WorkerOpFactory.CreateCommandResponseOp(InvalidComponentId, TestCommandIndex, TestCommandRequestId))
     {
         Assert.Throws <UnknownComponentIdException>(() => { receiveSystem.OnCommandResponse(wrappedOp.Op); });
     }
 }
        public void OnAddEntity_should_throw_if_entity_already_exists()
        {
            SetupTestEntity();

            using (var wrappedOp = WorkerOpFactory.CreateAddEntityOp(TestEntityId))
            {
                Assert.Throws <InvalidSpatialEntityStateException>(() => { receiveSystem.OnAddEntity(wrappedOp.Op); });
            }
        }
        public void OnAuthorityChange_should_be_delegated_to_correct_dispatcher()
        {
            using (var wrappedOp = WorkerOpFactory.CreateAuthorityChangeOp(TestEntityId, FirstTestComponentId))
            {
                receiveSystem.OnAuthorityChange(wrappedOp.Op);
            }

            Assert.IsTrue(firstComponentDispatcher.HasAuthorityChangedReceived);
            Assert.IsFalse(secondComponentDispatcher.HasAuthorityChangedReceived);
        }
 public void OnRemoveEntity_should_error_if_entity_does_not_exist()
 {
     using (var wrappedOp = WorkerOpFactory.CreateRemoveEntityOp(TestEntityId))
     {
         Assert.Throws <InvalidSpatialEntityStateException>(() =>
         {
             receiveSystem.OnRemoveEntity(wrappedOp.Op);
         });
     }
 }
        public void OnCommandResponse_should_be_delegated_to_correct_dispatcher()
        {
            using (var wrappedOp =
                       WorkerOpFactory.CreateCommandResponseOp(FirstTestComponentId, TestCommandIndex, TestCommandRequestId))
            {
                receiveSystem.OnCommandResponse(wrappedOp.Op);
            }

            Assert.IsTrue(firstComponentDispatcher.HasCommandResponseReceived);
            Assert.IsFalse(secondComponentDispatcher.HasCommandResponseReceived);
        }
        public void OnReserveEntityIdsResponse_should_log_if_corresponding_entity_not_found()
        {
            var emptyRequest = new WorldCommands.ReserveEntityIds.Request();

            reserveEntityIdsStorage.CommandRequestsInFlight.Add(TestCommandRequestId,
                                                                new CommandRequestStore <WorldCommands.ReserveEntityIds.Request>(Entity.Null,
                                                                                                                                 emptyRequest, null, TestCommandRequestId));

            using (var wrappedOp = WorkerOpFactory.CreateReserveEntityIdsResponseOp(TestCommandRequestId))
            {
                using (var expectingScope = logDispatcher.EnterExpectingScope())
                {
                    expectingScope.Expect(LogType.Log, LoggingUtils.LoggerName, "Op");
                    receiveSystem.OnReserveEntityIdsResponse(wrappedOp.Op);
                }
            }
        }
        public void OnEntityQueryResponse_should_add_received_responses_to_entity()
        {
            var entity = SetupTestEntity();

            var emptyRequest = new WorldCommands.EntityQuery.Request();
            var context      = "Some context";

            entityQueryStorage.CommandRequestsInFlight.Add(TestCommandRequestId,
                                                           new CommandRequestStore <WorldCommands.EntityQuery.Request>(entity,
                                                                                                                       emptyRequest, context, TestCommandRequestId));

            using (var wrappedOp = WorkerOpFactory.CreateEntityQueryResponseOp(TestCommandRequestId))
            {
                receiveSystem.OnEntityQueryResponse(wrappedOp.Op);

                Assert.IsTrue(entityManager.HasComponent <WorldCommands.EntityQuery.CommandResponses>(entity));

                var responses = entityManager.GetComponentData <WorldCommands.EntityQuery.CommandResponses>(entity);

                var count = 0;
                Assert.DoesNotThrow(() => { count = responses.Responses.Count; });
                Assert.AreEqual(1, count);

                var response = responses.Responses[0];

                Assert.AreEqual(emptyRequest, response.RequestPayload);
                Assert.AreEqual(context, response.Context);
                Assert.AreEqual(TestCommandRequestId, response.RequestId);
                Assert.AreEqual(wrappedOp.Op.StatusCode, response.StatusCode);
                Assert.AreEqual(wrappedOp.Op.Message, response.Message);
                Assert.AreEqual(wrappedOp.Op.ResultCount, response.ResultCount);

                // Check that the result and the op contain snapshots of the same entities
                // Or that they are both null if one of them is null
                // todo UTY-1361 clean this up
                if (wrappedOp.Op.Result == null)
                {
                    Assert.IsNull(response.Result);
                }
                else
                {
                    CollectionAssert.AreEquivalent(wrappedOp.Op.Result.Keys, response.Result.Keys);
                }
            }
        }