public void FailToStartNewGameWithoutCategories()
        {
            var gameRepository      = new InMemoryGameRepository();
            var questionsRepository = new FakeQuestionsRepository();
            var gameServices        = new GameServices(gameRepository, questionsRepository, null);

            Check.ThatCode(() => gameServices.StartNewGame("test", new string[] { }))
            .Throws <Exception>();
        }
        public void AddFirstPlayer()
        {
            var game           = GetGame();
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            gameServices.AddPlayer(game.Id, "player1");

            Check.That(game.Players.Select(x => x.Name)).ContainsExactly("player1");
            Check.That(game.CurrentPlayer.Name).IsEqualTo("player1");
        }
        public void FailToMoveCurrentPlayerWhenLessThan2Players()
        {
            var player1 = new Player {
                Name = "player1"
            };
            var game           = GetGame(player1);
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            Check.ThatCode(() => gameServices.Move(game.Id, player1.Id))
            .Throws <Exception>().WithMessage("Game cannot be played with 1 players, at least 2 required");
        }
        public void FailToAnswerWhenNotEnoughPlayers()
        {
            var player1 = new Player {
                Name = "player1"
            };
            var game           = GetGame(player1);
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            Check.ThatCode(() => gameServices.Answer(game.Id, player1.Id, "answer"))
            .Throws <Exception>().WithMessage("Game cannot be played with 1 players, at least 2 required");
        }
        public void AddAnotherPlayerWithoutChangingCurrentPlayer()
        {
            var player1 = new Player {
                Name = "player1"
            };
            var game           = GetGame(player1);
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            gameServices.AddPlayer(game.Id, "player2");

            Check.That(game.Players.Select(x => x.Name)).ContainsExactly("player1", "player2");
            Check.That(game.CurrentPlayer).IsEqualTo(player1);
        }
        public void StartNewGame()
        {
            var gameRepository      = new InMemoryGameRepository();
            var questionsRepository = new FakeQuestionsRepository();
            var gameServices        = new GameServices(gameRepository, questionsRepository, null);

            var game = gameServices.StartNewGame("test", new [] { "Sports", "Science" });

            Check.That(game.Name).IsEqualTo("test");
            Check.That(game.Categories.Select(x => (x.Name, x.Questions.Count)))
            .ContainsExactly(("Sports", 50), ("Science", 50));
            Check.That(game.Players).IsNull();
            Check.That(game.CurrentPlayer).IsNull();
        }
        public void FailToAnswerWhenNotTheCurrentPlayer()
        {
            var player1 = new Player {
                Id = 1, Name = "player1"
            };
            var player2 = new Player {
                Id = 2, Name = "player2"
            };
            var game           = GetGame(player1, player2);
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            Check.ThatCode(() => gameServices.Answer(game.Id, player2.Id, "bad answer"))
            .Throws <Exception>().WithMessage("It is not 2 turn!");
        }
        public void FailToMovePlayerWhenLastQuestionNotAnswered()
        {
            var player1 = new Player {
                Id = 1, Name = "player1", LastQuestion = new Question()
            };
            var player2 = new Player {
                Id = 2, Name = "player2"
            };
            var game           = GetGame(player1, player2);
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            Check.ThatCode(() => gameServices.Move(game.Id, player1.Id))
            .Throws <Exception>().WithMessage("Player already moved, need to answer now");
        }
        public void DoNotMoveCurrentPlayerIfInPenaltyBoxAndRollEvenDice()
        {
            var player1 = new Player {
                Name = "player1", IsInPenaltyBox = true
            };
            var player2 = new Player {
                Name = "player2"
            };
            var game           = GetGame(player1, player2);
            var gameRepository = new InMemoryGameRepository(game);
            var fakeDice       = new FakeDice(2);
            var gameServices   = new GameServices(gameRepository, null, fakeDice);

            var question = gameServices.Move(game.Id, player1.Id);

            Check.That(question).IsNull();
            Check.That(game.CurrentPlayer).IsEqualTo(player2);
        }
        public void MoveCurrentPlayer()
        {
            var player1 = new Player {
                Name = "player1"
            };
            var player2 = new Player {
                Name = "player2"
            };
            Game game           = GetGame(player1, player2);
            var  gameRepository = new InMemoryGameRepository(game);
            var  fakeDice       = new FakeDice(2);
            var  gameServices   = new GameServices(gameRepository, null, fakeDice);

            var question = gameServices.Move(game.Id, player1.Id);

            var gameQuestion = game.Categories.Single(x => x.Id == question.CategoryId).Questions.First();

            Check.That(question.Text).IsEqualTo(gameQuestion.Question.Text);
            Check.That(gameQuestion.NotUsed).IsFalse();
            Check.That(game.CurrentPlayer.IsInPenaltyBox).IsFalse();
            Check.That(game.CurrentPlayer.LastQuestion).IsEqualTo(question);
            Check.That(game.CurrentPlayer.Place).IsEqualTo(2);
        }
        public void AnswerIncorrectly()
        {
            var player1 = new Player {
                Name         = "player1",
                LastQuestion = new Question {
                    Answer = "answer"
                }
            };
            var player2 = new Player {
                Name = "player2"
            };
            var game           = GetGame(player1, player2);
            var gameRepository = new InMemoryGameRepository(game);
            var gameServices   = new GameServices(gameRepository, null, null);

            var answer = gameServices.Answer(game.Id, player1.Id, "bad answer");

            Check.That(answer).IsFalse();
            Check.That(player1.LastQuestion).IsNull();
            Check.That(player1.GoldCoins).IsEqualTo(0);
            Check.That(player1.IsInPenaltyBox).IsTrue();
            Check.That(game.CurrentPlayer).IsEqualTo(player2);
        }