public void Setup()
        {
            rpsGameStore = Substitute.For <IRPSGameStore>();
            moveMaker    = Substitute.For <IMoveMaker>();
            rpsGame.AddGame(Move.Rock);
            rpsGame.Games[0].UpdateOutcome(Outcome.Win, Move.Warterbomb);

            rpsGameStore.GetGame().Returns(rpsGame);

            rpsPlayer = new RPSPlayer(rpsGameStore, moveMaker);
        }
        public void Should_throw_exception_if_game_already_in_progress()
        {
            // Arrange
            var rpsGame = new RPSGame(2, 1);

            rpsGame.AddGame(Move.Rock);
            rpsGameStore.GetGame().Returns(rpsGame);

            // Act & Assert
            rpsPlayer.Invoking(async r => await r.MakeMove()).Should().Throw <Exception>().WithMessage(Constants.GameInProgress);
        }
        public void Setup()
        {
            rpsGameStore = Substitute.For <IRPSGameStore>();
            moveMaker    = Substitute.For <IMoveMaker>();

            rpsGame.AddGame(Move.Paper);
            rpsGameStore.GetGame().Returns(rpsGame);
            moveMaker.MakeMove(Arg.Any <int>()).Returns(Move.Rock);

            rpsPlayer = new RPSPlayer(rpsGameStore, moveMaker);
        }
        public void Should_throw_exception_if_no_games_left_to_play()
        {
            // Arrange
            var rpsGame = new RPSGame(1, 1);

            rpsGame.AddGame(Move.Rock);
            rpsGameStore.GetGame().Returns(rpsGame);

            // Act & Assert
            rpsPlayer.Invoking(async r => await r.MakeMove())
            .Should().Throw <Exception>().WithMessage(Constants.NoGamesLeftToPlay);
        }
        public void Should_throw_exception_if_outcome_doesnt_match_moves(Outcome yourOutcome, Move move, Move opponentMove)
        {
            // Arrange
            var newRpsGame = new RPSGame(10, 0);

            newRpsGame.AddGame(move);
            rpsGameStore.GetGame().Returns(newRpsGame);

            // Act & Assert
            rpsPlayer.Invoking(async r => await r.GameResult(yourOutcome, opponentMove)).Should().Throw <ArgumentException>()
            .WithMessage(Constants.InvalidOutcome);
        }
        public void Should_throw_exception_if_opponent_dynamites_greater_than_allowed()
        {
            // Arrange
            var newRpsGame = new RPSGame(10, 0);

            newRpsGame.AddGame(Move.Paper);
            rpsGameStore.GetGame().Returns(newRpsGame);

            // Act && Assert
            rpsPlayer.Invoking(async r => await r.GameResult(Outcome.Win, Move.Dynamite))
            .Should().Throw <ArgumentException>().WithMessage(string.Format(Constants.TooManyDynamite, 0));
        }