public void WillHaveTheAiMakeAMoveIfGameIsNotOver()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <BoardGame> mockCloned = new Mock <BoardGame>();
            Mock <BoardGame> mockGame   = new Mock <BoardGame>(MockBehavior.Loose);

            mockGame.Setup(x => x.Clone())
            .Returns(mockCloned.Object);
            Mock <Player> p = new Mock <Player>();

            p.Setup(x => x.makeMove(mockCloned.Object, It.IsAny <List <INode> >(), 0))
            .Returns(new Mock <INode>().Object)
            .Verifiable();
            mockGame.Setup(x => x.getWinner())
            .Throws(new NoWinnerException());
            mockGame.SetupSequence(x => x.getWinner())
            .Throws(new NoWinnerException());
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("");
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            List <Player> players = new List <Player>
            {
                next.Object
            };

            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, players);

            p.Verify();
        }
        public void WillPopulateThePlayersArrayWithJObjectRepresentationsOfThePlayers()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <BoardGame> mockGame = new Mock <BoardGame>(MockBehavior.Loose);
            Mock <Player>    p        = new Mock <Player>();

            p.Setup(x => x.makeMove(mockGame.Object, It.IsAny <List <INode> >(), 0))
            .Returns(new Mock <INode>().Object);
            p.Setup(x => x.getPlayerType()).Returns(PlayerType.RANDOM);
            p.Setup(x => x.getName()).Returns("name");
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("name");
            next.Setup(x => x.getPlayerType()).Returns(PlayerType.RANDOM);
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            mockGame.Setup(x => x.getWinner()).Throws(new NoWinnerException());
            mockGame.SetupSequence(x => x.getWinner()).Throws(new NoWinnerException()).Returns(0);
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            mockGame.Setup(x => x.Clone()).Returns(mockGame.Object);
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, new List <Player>
            {
                p.Object, next.Object
            });

            Assert.IsTrue(result.players.Count == 2);
        }
        public void WillReturnTheAisTheWinnerIfItsMoveWinsTheGame()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <BoardGame> mockGame = new Mock <BoardGame>(MockBehavior.Loose);
            Mock <Player>    p        = new Mock <Player>();

            p.Setup(x => x.makeMove(mockGame.Object, It.IsAny <List <INode> >(), 0))
            .Returns(new Mock <INode>().Object);
            mockGame.Setup(x => x.Clone()).Returns(mockGame.Object);
            mockGame.SetupSequence(x => x.isWon()).Returns(false).Returns(true);
            mockGame.Setup(x => x.getWinner()).Returns(0);
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("");
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            List <Player> players = new List <Player>
            {
                next.Object, next.Object
            };
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, players);

            Assert.IsTrue(result.Winner == 0);
        }
        public void WillPassThePlayersArrayToTheGameService()
        {
            BoardGameDTO  dto        = new BoardGameDTO();
            Mock <Player> mockPlayer = new Mock <Player>();

            dto.players = new List <JObject>
            {
                new JObject()
            };
            List <Player> players = new List <Player>
            {
                mockPlayer.Object, mockPlayer.Object
            };
            Mock <IGameService>           gameService           = new Mock <IGameService>();
            Mock <BoardCreationService>   boardCreationService  = new Mock <BoardCreationService>();
            Mock <IPlayerCreationService> playerCreationService = new Mock <IPlayerCreationService>();

            playerCreationService.Setup(x => x.createPlayers(dto.players))
            .Returns(players);
            gameService.Setup(x => x.processMove(It.IsAny <BoardGame>(), It.IsAny <Player>(), players))
            .Returns((BoardGameDTO)null)
            .Verifiable();
            cont = new GameController(gameService.Object, boardCreationService.Object, playerCreationService.Object);
            cont.makeMove(dto);
            gameService.Verify();
        }
        public void WillAddTheNameOfTheNewCurPlayer()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <BoardGame> mockGame = new Mock <BoardGame>(MockBehavior.Loose);
            Mock <Player>    p        = new Mock <Player>();

            p.Setup(x => x.makeMove(mockGame.Object, It.IsAny <List <INode> >(), 0))
            .Returns(new Mock <INode>().Object);
            p.Setup(x => x.getPlayerType()).Returns(PlayerType.RANDOM);
            p.Setup(x => x.getName()).Returns("name");
            p.Setup(x => x.getColour()).Returns(PlayerColour.BLUE);
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("name");
            next.Setup(x => x.getPlayerType()).Returns((PlayerType)1000);
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            mockGame.Setup(x => x.getWinner()).Throws(new NoWinnerException());
            mockGame.SetupSequence(x => x.getWinner()).Throws(new NoWinnerException()).Returns(0);
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            mockGame.Setup(x => x.Clone()).Returns(mockGame.Object);
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, new List <Player>
            {
                p.Object, next.Object
            });

            Assert.IsTrue(result.cur["name"].ToObject <string>() == "name");
        }
        public void WillAddTilesAlongWidth()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <BoardGame> mockGame = new Mock <BoardGame>(MockBehavior.Loose);
            Mock <Player>    p        = new Mock <Player>();

            mockGame.Setup(x => x.getWinner()).Throws(new NoWinnerException());
            p.Setup(x => x.makeMove(mockGame.Object, It.IsAny <List <INode> >(), 0))
            .Returns(new Mock <INode>().Object);
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> > {
                new List <BoardGame>
                {
                    new Tile(), new Tile()
                }
            });
            mockGame.Setup(x => x.Clone()).Returns(mockGame.Object);
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("");
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            List <Player> players = new List <Player>
            {
                next.Object
            };
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, players);

            Assert.IsTrue(result.game[0].Count is 2);
        }
        public void WillAddOneTileWithPropertiesPopulated()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <BoardGame> mockGame = new Mock <BoardGame>(MockBehavior.Loose);
            Mock <Player>    p        = new Mock <Player>();

            mockGame.Setup(x => x.getWinner()).Throws(new NoWinnerException());
            mockGame.Setup(x => x.Clone()).Returns(mockGame.Object);
            p.Setup(x => x.makeMove(mockGame.Object, It.IsAny <List <INode> >(), 0))
            .Returns(new Mock <INode>().Object);
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> > {
                new List <BoardGame>
                {
                    new Tile
                    {
                        owner = 0
                    }
                }
            });
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("");
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            List <Player> players = new List <Player>
            {
                next.Object
            };
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, players);

            Assert.IsNotNull(result.game[0][0]["owner"]);
        }
        public void WillSetTheMoveMadeByTheAiAsTheLastMove()
        {
            Mock <NodeService> mockNodeService = new Mock <NodeService>();

            mockNodeService.Setup(x => x.process(It.IsAny <BoardGame>(), It.IsAny <PlayerColour>()))
            .Returns(new List <INode>());
            service = new GameService(mockNodeService.Object, new Mock <IDatabaseProvider>().Object);
            Mock <Player> mockAi   = new Mock <Player>();
            Move          m        = new Move();
            Mock <INode>  mockNode = new Mock <INode>();

            mockNode.Setup(x => x.getMove()).Returns(m);
            mockAi.Setup(x => x.makeMove(It.IsAny <BoardGame>(), It.IsAny <List <INode> >(), 0))
            .Returns(mockNode.Object);
            mockAi.Setup(x => x.getPlayerType()).Returns(PlayerType.RANDOM);
            Mock <BoardGame> mockGame = new Mock <BoardGame>();

            mockGame.Setup(x => x.Clone()).Returns(mockGame.Object);
            mockGame.Setup(x => x.getWinner()).Throws(new NoWinnerException());
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            Mock <Player> next = new Mock <Player>();

            next.Setup(x => x.getName()).Returns("");
            next.Setup(x => x.getColour()).Returns(PlayerColour.RED);
            List <Player> players = new List <Player>
            {
                next.Object
            };
            BoardGameDTO result = service.processMove(mockGame.Object, mockAi.Object, players);

            Assert.AreSame(m, result.lastMove);
        }
        public BoardGameDTO processMove(BoardGame game, Player cur, List <Player> players)
        {
            BoardGameDTO result = new BoardGameDTO();

            result.players = buildPlayersArray(players);
            if (game.isWon())
            {
                result.Winner = game.getWinner();
                SaveGame(players, game.getWinner());
            }
            else
            {
                if (cur.getPlayerType() != PlayerType.HUMAN)
                {
                    HandleAiMove(cur, game, result, players);
                    if (game.isWon())
                    {
                        result.Winner = game.getWinner();
                        SaveGame(players, result.Winner);
                    }
                }
                else
                {
                    result.cur  = convertToJObject(cur);
                    result.game = convertToJObject(game.getBoard());
                }
            }
            result.game           = convertToJObject(game.getBoard());
            result.availableMoves = game.getAvailableMoves();
            return(result);
        }
        public BoardGame createBoardGame(BoardGameDTO gameDto)
        {
            BoardGame result = createBoardGame(gameDto.game);

            result.validateBoard();
            result.registerMove(gameDto.lastMove);
            return(result);
        }
        public IActionResult makeMove([FromBody] BoardGameDTO gameDto)
        {
            BoardGame     game    = boardCreationService.createBoardGame(gameDto);
            Player        player  = playerCreationService.createPlayer(gameDto.cur);
            List <Player> players = playerCreationService.createPlayers(gameDto.players);

            return(ExecuteApiAction(() => new ApiResult <BoardGameDTO> {
                Model = gameService.processMove(game, player, players)
            }));
        }
        public void WillReturnTheCurPlayerAsTheNextPlayerIfItIsAHumanPlayer()
        {
            Mock <Player> mockHuman = new Mock <Player>();

            mockHuman.Setup(x => x.getPlayerType()).Returns(PlayerType.HUMAN);
            mockHuman.Setup(x => x.getName()).Returns("name");
            Mock <BoardGame> mockGame = new Mock <BoardGame>();

            mockGame.Setup(x => x.getWinner()).Throws(new NoWinnerException());
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            BoardGameDTO result = service.processMove(mockGame.Object, mockHuman.Object, new List <Player>());

            Assert.AreEqual(PlayerType.HUMAN, result.cur["type"].ToObject <PlayerType>());
        }
        public void WillSetTheWinningPlayerIfGameIsOver()
        {
            Mock <BoardGame> mockGame = new Mock <BoardGame>(MockBehavior.Loose);
            Mock <Player>    p        = new Mock <Player>();

            p.Setup(x => x.getPlayerType()).Returns((PlayerType)0);
            p.Setup(x => x.getName()).Returns("");
            mockGame.Setup(x => x.isWon()).Returns(true);
            mockGame.Setup(x => x.getWinner()).Returns(0);
            mockGame.Setup(x => x.getBoard()).Returns(new List <List <BoardGame> >());
            BoardGameDTO result = service.processMove(mockGame.Object, p.Object, new List <Player> {
                p.Object, p.Object
            });

            Assert.AreEqual((PlayerColour)0, result.Winner);
        }
        public void WillPassTheGameToTheBoardGameCreationService()
        {
            BoardGameDTO           dto = new BoardGameDTO();
            List <List <JObject> > obj = new List <List <JObject> >
            {
                new List <JObject>
                {
                    new JObject()
                }
            };
            Mock <BoardCreationService> mockService = new Mock <BoardCreationService>(MockBehavior.Loose);

            mockService.Setup(x => x.createBoardGame(dto)).Verifiable();
            cont = new GameController(new Mock <IGameService>(MockBehavior.Loose).Object, mockService.Object, new Mock <IPlayerCreationService>().Object);
            cont.makeMove(dto);
            mockService.Verify();
        }
        public void WillCallPlayerCreationServiceToCreatePlayers()
        {
            BoardGameDTO  dto        = new BoardGameDTO();
            Mock <Player> mockPlayer = new Mock <Player>();

            dto.players = new List <JObject>
            {
                new JObject()
            };
            Mock <IGameService>           gameService           = new Mock <IGameService>();
            Mock <BoardCreationService>   boardCreationService  = new Mock <BoardCreationService>();
            Mock <IPlayerCreationService> playerCreationService = new Mock <IPlayerCreationService>();

            playerCreationService.Setup(x => x.createPlayers(dto.players))
            .Returns(new List <Player>())
            .Verifiable();
            cont = new GameController(gameService.Object, boardCreationService.Object, playerCreationService.Object);
            cont.makeMove(dto);
            playerCreationService.Verify();
        }
        public void WillAddTheAvailableMovesToTheDto()
        {
            Mock <BoardGame> mockGame = new Mock <BoardGame>();

            mockGame.Setup(x => x.getBoard())
            .Returns(new List <List <BoardGame> >());
            List <Move> available = new List <Move>();

            mockGame.Setup(x => x.getAvailableMoves()).Returns(available);
            Mock <Player> mockHuman = new Mock <Player>();

            mockHuman.Setup(x => x.getPlayerType()).Returns(PlayerType.HUMAN);
            mockHuman.Setup(x => x.getName()).Returns("name");
            mockHuman.Setup(x => x.makeMove(It.IsAny <BoardGame>(), It.IsNotNull <List <INode> >(), 0))
            .Returns((INode)null)
            .Verifiable();
            BoardGameDTO result = service.processMove(mockGame.Object, mockHuman.Object, new List <Player>());

            Assert.AreSame(available, result.availableMoves);
        }
        private void HandleAiMove(Player Ai, BoardGame game, BoardGameDTO result, List <Player> players)
        {
            List <INode> nodes = nodeService.process(game, Ai.getColour());
            Player       next  = players.Find(x => !x.getColour().Equals(Ai.getColour()));
            INode        move  = Ai.makeMove(game.Clone() as BoardGame, nodes, next.getUserId());

            provider.updateUser(Ai.getUserId(), move.getReward());
            game.makeMove(move.getMove());
            List <List <BoardGame> > board = game.getBoard();

            result.lastMove       = move.getMove();
            result.cur            = convertToJObject(next);
            result.lastMoveRating = move.getReward();
            int    place = 0;
            double high  = -1;
            double low   = 1;

            foreach (INode node in nodes)
            {
                double reward = node.getReward();
                if (reward > high)
                {
                    high = reward;
                }
                if (reward < low)
                {
                    low = reward;
                }
                if (move.getReward() < reward)
                {
                    place++;
                }
            }
            provider.saveMove(Ai.getUserId(), move.getReward(), place);
            result.highOption = high;
            result.lowOption  = low;
        }