public void Handle_WhenAppropriateGameDoesNotExist_ShouldThrowNotFoundException()
        {
            // arrange
            int gameId  = 999;
            var command = new CheckAndUpdateGameWinConditionsCommand(gameId);
            var handler = new CheckAndUpdateGameWinConditionsCommandHandler(Context);

            // act
            // assert
            Should.ThrowAsync <NotFoundException>(() => handler.Handle(command, CancellationToken.None));
        }
        public void IsValid_WhenGameIdIsNought_ShouldBeFalse()
        {
            // arrange
            int gameId    = 0;
            var command   = new CheckAndUpdateGameWinConditionsCommand(gameId);
            var validator = new CheckAndUpdateGameWinConditionsCommandValidator();

            // act
            FluentValidation.Results.ValidationResult result = validator.Validate(command);

            // assert
            result.IsValid.ShouldBe(false);
        }
        public void IsValid_WhenGameIdIsGreaterThan0_ShouldBeTrue()
        {
            // arrange
            int gameId    = 10;
            var command   = new CheckAndUpdateGameWinConditionsCommand(gameId);
            var validator = new CheckAndUpdateGameWinConditionsCommandValidator();

            // act
            FluentValidation.Results.ValidationResult result = validator.Validate(command);

            // assert
            result.IsValid.ShouldBe(true);
        }
        public async Task Handle_WhenGameWithTurnNumberLessThanMinimal_ShouldOnlyIncrementTurnNumber()
        {
            // arrange
            int gameId  = 5;
            var command = new CheckAndUpdateGameWinConditionsCommand(gameId);
            var handler = new CheckAndUpdateGameWinConditionsCommandHandler(Context);

            // act
            await handler.Handle(command, CancellationToken.None);

            Domain.Entities.Game entity = Context.Games.Find(command.GameId);

            // assert
            entity.ShouldNotBeNull();
            entity.TurnNumber.ShouldBe((byte)4);
        }
        public async Task Handle_WhenNoneOfThePlayersHaveWinConditionTilesButThereArePossibility_ShouldReturnActive()
        {
            // arrange
            int gameId  = 7;
            var command = new CheckAndUpdateGameWinConditionsCommand(gameId);
            var handler = new CheckAndUpdateGameWinConditionsCommandHandler(Context);

            // act
            GameResult result = await handler.Handle(command, CancellationToken.None);

            Domain.Entities.Game entity = Context.Games.Find(command.GameId);

            // assert
            entity.TurnNumber.ShouldBe((byte)6);
            result.ShouldBe(GameResult.Active);
            entity.Result.ShouldBe(GameResult.Active);
        }
        public async Task Handle_WhenNoughtPlayerHasWinConditionTiles_ShouldReturnLoss()
        {
            // arrange
            int gameId  = 8;
            var command = new CheckAndUpdateGameWinConditionsCommand(gameId);
            var handler = new CheckAndUpdateGameWinConditionsCommandHandler(Context);

            // act
            GameResult result = await handler.Handle(command, CancellationToken.None);

            Domain.Entities.Game entity = Context.Games.Find(command.GameId);

            // assert
            entity.TurnNumber.ShouldBe((byte)7);
            result.ShouldBe(GameResult.Loss);
            entity.Result.ShouldBe(GameResult.Loss);
        }