コード例 #1
0
        public IChessGame Create()
        {
            var piecesFactory   = new PiecesFactory();
            var movementHistory = new MovementHistory();
            var piecePromoter   = new PiecePromoter(movementHistory);
            var castlingMover   = new CastlingMover(movementHistory);
            var enPassantMover  = new EnPassantMover(movementHistory);
            var pieceMover      = new PieceMover(movementHistory, piecePromoter,
                                                 castlingMover, enPassantMover);
            var chessBoard = new ChessBoard(piecesFactory, pieceMover);

            List <IMovement> movements = new();
            var pawnMovement           = new PawnMovement(chessBoard);
            var enPassantMovement      = new EnPassantMovement(chessBoard);
            var kingMovement           = new KingMovement(chessBoard);
            var horizontalMovement     = new HorizontalMovement(chessBoard);
            var verticalMovement       = new VerticalMovement(chessBoard);
            var pdiagonalMovement      = new PositiveDiagonalMovement(chessBoard);
            var ndiagonalMovement      = new NegativeDiagonalMovement(chessBoard);
            var knightMovement         = new KnightMovement(chessBoard);

            movements.Add(pawnMovement);
            movements.Add(enPassantMovement);
            movements.Add(kingMovement);
            movements.Add(horizontalMovement);
            movements.Add(verticalMovement);
            movements.Add(pdiagonalMovement);
            movements.Add(ndiagonalMovement);
            movements.Add(knightMovement);
            var movementComposite = new MovementComposite(movements);

            List <IMovement> movementsWithCastling = new();
            var queensideCastlingMovement          =
                new QueensideCastlingMovement(chessBoard, movementComposite);
            var kingsideCastlingMovement =
                new KingsideCastlingMovement(chessBoard, movementComposite);

            movementsWithCastling.Add(movementComposite);
            movementsWithCastling.Add(queensideCastlingMovement);
            movementsWithCastling.Add(kingsideCastlingMovement);
            var movementCompositeWithCastling = new MovementComposite(movementsWithCastling);

            var promotionDetector = new PromotionDetector(chessBoard);

            var checkDetector = new CheckDetector(chessBoard, movementCompositeWithCastling);

            var legalMovement = new LegalMovement(chessBoard,
                                                  movementCompositeWithCastling, checkDetector);

            var moveValidator = new MoveValidator(chessBoard,
                                                  legalMovement, promotionDetector);

            var gameFinishedDetector = new GameFinishedDetector(checkDetector,
                                                                legalMovement);

            return(new ChessGame(chessBoard, moveValidator,
                                 promotionDetector, gameFinishedDetector, legalMovement));
        }
コード例 #2
0
        public void WhenLastMoveWasNotPromotionReturnTheSameChessMove()
        {
            var movementHistoryMock = new Mock <IMovementHistory>(MockBehavior.Strict);
            var piecesMock          = new Mock <IEnumerable <IChessPiece> >(MockBehavior.Strict);

            var notPromotionMove = new ChessMove(new Position(0, 1), new Position(0, 3));

            var piecePromoter = new PiecePromoter(movementHistoryMock.Object);

            var result = piecePromoter
                         .DepromoteIfPromotionMove(notPromotionMove, piecesMock.Object);

            Assert.AreEqual(notPromotionMove, result);
        }
コード例 #3
0
        public void WhenMoveIsNotPromotionReturnFalse()
        {
            var movementHistoryMock = new Mock <IMovementHistory>(MockBehavior.Strict);
            var piecesMock          = new Mock <IEnumerable <IChessPiece> >(MockBehavior.Strict);

            var notPromotionMove = new ChessMove(new Position(0, 1), new Position(0, 3));

            var piecePromoter = new PiecePromoter(movementHistoryMock.Object);

            var result = piecePromoter
                         .PromoteIfPromotionMove(notPromotionMove, piecesMock.Object);

            Assert.IsFalse(result);
        }
コード例 #4
0
        public void WhenMoveIsPromotionPromotePawnAndReturnTrue()
        {
            var movementHistoryMock = new Mock <IMovementHistory>(MockBehavior.Strict);
            var promotedPawn        = new Mock <IChessPiece>(MockBehavior.Strict);

            var promoteType = ChessPieceType.Queen;

            var promotionMove = new ChessMove(new Position(0, 0), new Position(0, 0),
                                              pawnPromotion: promoteType);

            var pawnPosition = new Position(3, 0);

            var moves = new List <ChessMove>()
            {
                new ChessMove(new Position(0, 1), new Position(0, 3)),
                new ChessMove(new Position(3, 1), pawnPosition),
            };

            promotedPawn
            .SetupGet(p => p.Position)
            .Returns(pawnPosition);
            promotedPawn
            .Setup(p => p.Promote(promoteType));

            movementHistoryMock
            .SetupGet(h => h.ChessMoves)
            .Returns(moves);
            movementHistoryMock
            .Setup(h => h.Add(promotionMove));

            var piecePromoter = new PiecePromoter(movementHistoryMock.Object);

            var pieces = new List <IChessPiece>()
            {
                promotedPawn.Object
            };
            var result = piecePromoter
                         .PromoteIfPromotionMove(promotionMove, pieces);

            Assert.IsTrue(result);
            promotedPawn
            .Verify(p => p.Promote(promoteType));
            movementHistoryMock
            .Verify(h => h.Add(promotionMove));
        }
コード例 #5
0
        public void WhenLastMoveWasPromotionDepromotePieceAndReturnLastMove()
        {
            var movementHistoryMock = new Mock <IMovementHistory>(MockBehavior.Strict);
            var promotedPawn        = new Mock <IChessPiece>(MockBehavior.Strict);

            var promoteType = ChessPieceType.Queen;

            var promotionMove = new ChessMove(new Position(0, 0), new Position(0, 0),
                                              pawnPromotion: promoteType);

            var pawnPosition = new Position(3, 0);

            var lastMove = new ChessMove(new Position(3, 1), pawnPosition);

            promotedPawn
            .SetupGet(p => p.Position)
            .Returns(pawnPosition);
            promotedPawn
            .Setup(p => p.Depromote());

            movementHistoryMock
            .Setup(h => h.RemoveLastMove())
            .Returns(lastMove);

            var piecePromoter = new PiecePromoter(movementHistoryMock.Object);

            var pieces = new List <IChessPiece>()
            {
                promotedPawn.Object
            };
            var result = piecePromoter
                         .DepromoteIfPromotionMove(promotionMove, pieces);

            Assert.AreEqual(lastMove, result);
            promotedPawn
            .Verify(p => p.Depromote());
            movementHistoryMock
            .Verify(h => h.RemoveLastMove());
        }