public void PlayerInAGameCanSubmitAnEvent()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            // Submitting player can see their own events
            GetGameRoomEventsResponse gameEvents = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEvents.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEvents.GameEvents.Count);
            Assert.IsTrue(gameEvents.GameEvents.Any(it => it.Id == eventResponse.EventId));
        }
        public void PlayerCanViewTheirOwnEventsThatOccurInTheFutureButOthersCannot()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            // Submitting player can see their own events
            GetGameRoomEventsResponse gameEvents = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEvents.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEvents.GameEvents.Count);
            Assert.IsTrue(gameEvents.GameEvents.Any(it => it.Id == eventResponse.EventId));

            authHelper.loginToAccount(playerTwoInGame);
            // Other player cannot see the first player's plans as they are in the future
            GetGameRoomEventsResponse playerTwoGameEvents = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(playerTwoGameEvents.Status.IsSuccess, true);
            Assert.AreEqual(0, playerTwoGameEvents.GameEvents.Count);
        }
        public void PlayerCannotSubmitAnEventThatOccursInThePast()
        {
            SubmitGameEventResponse submitResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = -20,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(submitResponse.Status.IsSuccess, false);
            Assert.AreEqual(submitResponse.Status.Detail, ResponseType.INVALID_REQUEST.ToString());
        }
        public void PlayerCannotDeleteAnotherPlayersEvent()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            GetGameRoomEventsResponse gameEventsBeforeDelete = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEventsBeforeDelete.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEventsBeforeDelete.GameEvents.Count);
            Assert.IsTrue(gameEventsBeforeDelete.GameEvents.Any(it => it.Id == eventResponse.EventId));

            authHelper.loginToAccount(playerTwoInGame);

            DeleteGameEventResponse deleteResponse = client.DeleteGameEvent(new DeleteGameEventRequest()
            {
                EventId = eventResponse.EventId,
                RoomId  = gameId,
            });

            Assert.AreEqual(deleteResponse.Status.IsSuccess, false);
            Assert.AreEqual(deleteResponse.Status.Detail, ResponseType.PERMISSION_DENIED.ToString());

            // Login to player 1 to see the event in the future.
            authHelper.loginToAccount(playerOneInGame);
            GetGameRoomEventsResponse gameEventsAfterDelete = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEventsAfterDelete.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEventsAfterDelete.GameEvents.Count);
        }
        public void PlayerCannotUpdateAGameEventThatHasAlreadyOccurred()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 2,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            // Submitting player can see their own events
            GetGameRoomEventsResponse gameEvents = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEvents.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEvents.GameEvents.Count);
            Assert.IsTrue(gameEvents.GameEvents.Any(it => it.Id == eventResponse.EventId));

            Thread.Sleep(3000);

            // Attempt to delete
            SubmitGameEventResponse updateResponse = client.UpdateGameEvent(new UpdateGameEventRequest()
            {
                EventId   = eventResponse.EventId,
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("NewEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(updateResponse.Status.IsSuccess, true);
        }
        public void PlayerCannotUpdateAnotherPlayersEvent()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            GetGameRoomEventsResponse gameEvents = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEvents.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEvents.GameEvents.Count);
            Assert.IsTrue(gameEvents.GameEvents.Any(it => it.Id == eventResponse.EventId));

            authHelper.loginToAccount(playerTwoInGame);

            var submitGameEventResponse = client.UpdateGameEvent(new UpdateGameEventRequest()
            {
                EventId   = eventResponse.EventId,
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("NewEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(submitGameEventResponse.Status.IsSuccess, false);
            Assert.AreEqual(submitGameEventResponse.Status.Detail, ResponseType.PERMISSION_DENIED.ToString());
        }
        public void PlayerCanDeleteAnEventThatTheySubmitted()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            GetGameRoomEventsResponse gameEventsBeforeDelete = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEventsBeforeDelete.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEventsBeforeDelete.GameEvents.Count);
            Assert.IsTrue(gameEventsBeforeDelete.GameEvents.Any(it => it.Id == eventResponse.EventId));

            DeleteGameEventResponse deleteResponse = client.DeleteGameEvent(new DeleteGameEventRequest()
            {
                EventId = eventResponse.EventId,
                RoomId  = gameId,
            });

            Assert.AreEqual(deleteResponse.Status.IsSuccess, true);

            GetGameRoomEventsResponse gameEventsAfterDelete = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEventsAfterDelete.Status.IsSuccess, true);
            Assert.AreEqual(0, gameEventsAfterDelete.GameEvents.Count);
        }
        public void PlayerCanUpdateAGameEvent()
        {
            SubmitGameEventResponse eventResponse = client.SubmitGameEvent(new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);
            Assert.IsTrue(eventResponse.EventId != null);

            GetGameRoomEventsResponse gameEvents = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEvents.Status.IsSuccess, true);
            Assert.AreEqual(1, gameEvents.GameEvents.Count);
            Assert.IsTrue(gameEvents.GameEvents.Any(it => it.Id == eventResponse.EventId));

            SubmitGameEventResponse updateResponse = client.UpdateGameEvent(new UpdateGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 42,
                },
                RoomId  = gameId,
                EventId = eventResponse.EventId,
            });

            Assert.AreEqual(updateResponse.Status.IsSuccess, true);
            Assert.IsTrue(updateResponse.EventId == eventResponse.EventId);
        }