Example #1
0
        public void WhitePawns_CannotTakeMoveDiagonally_IfEnPassantIsNoLongerActive()
        {
            var board = new Board();
            var pawn  = new Pawn(Player.White);

            board.AddPiece(Square.At(5, 1), pawn);

            var enemyPawn = new Pawn(Player.Black);

            board.AddPiece(Square.At(1, 0), enemyPawn);

            var enemyPiece = new Rook(Player.Black);

            board.AddPiece(Square.At(1, 7), enemyPiece);

            pawn.MoveTo(board, Square.At(4, 1));
            enemyPawn.MoveTo(board, Square.At(3, 0));

            pawn.MoveTo(board, Square.At(3, 1));
            enemyPiece.MoveTo(board, Square.At(7, 7));

            var moves = pawn.GetAvailableMoves(board).ToList();

            moves.Should().NotContain(Square.At(2, 0));
        }
Example #2
0
        public void Whether_Piece_UpdatesPosition_On_MoveTo()
        {
            var board  = new Board();
            var newPos = new Square(1, 6);
            var rook   = new Rook(new Square(1, 1), board, PieceColor.White);

            rook.MoveTo(newPos);

            Assert.That(rook.Position.Equals(newPos));
        }
Example #3
0
        public void Kings_WithARookWhichHasAlreadyMoved_CannotCastle()
        {
            var board = new Board();
            var king  = new King(Player.White);

            board.AddPiece(Square.At(7, 4), king);
            var rook = new Rook(Player.White);

            board.AddPiece(Square.At(7, 7), rook);
            var pawn = new Rook(Player.Black);

            board.AddPiece(Square.At(0, 3), pawn);

            rook.MoveTo(board, Square.At(6, 7));
            pawn.MoveTo(board, Square.At(1, 3));
            rook.MoveTo(board, Square.At(7, 7));

            var moves = king.GetAvailableMoves(board);

            moves.Should().NotContain(Square.At(7, 6));
        }
Example #4
0
        public void Black_CannotMoveKing_IntoCheck()
        {
            var board = new Board();
            var king  = new King(Player.Black);

            board.AddPiece(Square.At(4, 4), king);
            var rook = new Rook(Player.White);

            board.AddPiece(Square.At(5, 5), rook);
            rook.MoveTo(board, Square.At(5, 6));
            king.MoveTo(board, Square.At(5, 4));
        }
Example #5
0
        public void Whether_Piece_CantMoveWhenIsWhiteMove_On_MoveTo()
        {
            var board  = new Board();
            var newPos = new Square(1, 6);
            var oldPos = new Square(1, 1);
            var rook   = new Rook(oldPos, board, PieceColor.Black);

            var hasMoved = rook.MoveTo(newPos);

            Assert.That(board.IsWhiteMove);
            Assert.That(rook.Position.Equals(oldPos));
            Assert.That(!hasMoved);
        }
Example #6
0
        public void Whether_Board_UpdatesIsWhiteMove_On_MoveTo()
        {
            var board  = new Board();
            var newPos = new Square(1, 6);
            var oldPos = new Square(1, 1);
            var rook   = new Rook(oldPos, board, PieceColor.White);

            var hasMoved = rook.MoveTo(newPos);

            Assert.That(rook.Position.Equals(newPos));
            Assert.IsFalse(board.IsWhiteMove);
            Assert.That(hasMoved);
        }
Example #7
0
        public void MoveTo_should_ignore_squares_that_are_not_allowed()
        {
            // Arrange
            const string currentSquare = "f1";
            const string targetSquare  = "g8";
            ChessmenBase rook          = new Rook(Color.Black, currentSquare);

            // Act
            rook.MoveTo(targetSquare);

            // Assert
            Assert.That(rook.Square, Is.EqualTo(currentSquare));
        }
Example #8
0
        public void Rook_CannotCastle_IfMoved()
        {
            var board = new Board();
            var rook  = new Rook(Player.White);
            var king  = new King(Player.White);

            board.AddPiece(Square.At(6, 0), rook);
            board.AddPiece(Square.At(7, 4), king);
            rook.MoveTo(board, Square.At(7, 0));
            var moves = rook.GetAvailableMoves(board);

            moves.Should().NotContain(Square.At(7, 3));
        }
Example #9
0
        public void MoveTo_should_set_square_to_target_square()
        {
            // Arrange
            const string currentSquare = "f1";
            const string targetSquare  = "b1";
            ChessmenBase rook          = new Rook(Color.Black, currentSquare);

            // Act
            rook.MoveTo(targetSquare);

            // Assert
            Assert.That(rook.Square, Is.EqualTo(targetSquare));
        }
Example #10
0
        public void Whether_Piece_PositionUpdatedRaised_On_PieceMoved()
        {
            var board  = new Board();
            var newPos = new Square(1, 6);
            var moved  = false;
            var rook   = new Rook(new Square(1, 1), board, PieceColor.White);

            rook.PositionUpdated += (s, p) => moved = true;

            rook.MoveTo(newPos);

            Assert.That(moved, Is.True);
        }
Example #11
0
        public void Kings_CannotCastleRook_IfRookHasMovedBefore()
        {
            var board = new Board();
            var king  = new King(Player.White);

            board.AddPiece(Square.At(7, 5), king);
            var rook = new Rook(Player.White);

            board.AddPiece(Square.At(4, 0), rook);

            rook.MoveTo(board, new Square(7, 0));

            var moves = king.GetAvailableMoves(board);

            moves.Should().NotContain(Square.At(7, 3));
        }
Example #12
0
    void AddCastling(King from, GridIndex to)
    {
        var castlingSeq = from.QueryCastling(board, out var bQueenSide, out var bKingSide);

        castlingSeq.Build(board, MoveType.StandardMove);

        if (castlingSeq.ContainsMove(to))
        {
            var kingX = from.CellIndex.X;
            var kingY = from.CellIndex.Y;

            Rook      rook = null;
            GridIndex rookFrom;
            GridIndex rookTo;
            if (to.X > kingX && bKingSide)
            {
                rookFrom = new GridIndex(7, kingY);
                rook     = board[rookFrom] as Rook;
                rookTo   = to + new GridIndex(-1, 0);
            }
            else if (to.X < kingX && bQueenSide)
            {
                rookFrom = new GridIndex(0, kingY);
                rook     = board[rookFrom] as Rook;
                rookTo   = to + new GridIndex(+1, 0);
            }
            else
            {
                throw new Exception("Unspecified exception");
            }

            if (rook != null)
            {
                var fromIndex = from.CellIndex;

                var kingAction = from.MoveTo(to);
                var rookAction = rook.MoveTo(rookTo);

                undoStack.Push(ActionCommand.SimpleMove(kingAction, rookAction));
                redoStack.Clear();
                GenericAction();
                board.Turnover();
            }
        }
    }
Example #13
0
        public void BlackPawns_CanNotEnPassant_IfPieceIsNotPawn()
        {
            var board = new Board();
            var pawn  = new Pawn(Player.Black);

            board.AddPiece(Square.At(4, 3), pawn);

            var enemyUnit = new Rook(Player.White);

            board.AddPiece(Square.At(5, 4), enemyUnit);

            enemyUnit.MoveTo(board, Square.At(4, 4));

            var moves = pawn.GetAvailableMoves(board).ToList();


            moves.Should().NotContain(Square.At(5, 4));
            moves.Should().NotContain(Square.At(5, 6));
        }
Example #14
0
        public void BlackPawn_CannotTakeEnPassant_IfWhitePawnHasNotJustMovedToPosition()
        {
            var board     = new Board();
            var whitePawn = new Pawn(Player.White);
            var whiteRook = new Rook(Player.White);
            var blackPawn = new Pawn(Player.Black);
            var blackRook = new Rook(Player.Black);

            board.AddPiece(Square.At(6, 3), whitePawn);
            board.AddPiece(Square.At(2, 3), whiteRook);
            board.AddPiece(Square.At(4, 4), blackPawn);
            board.AddPiece(Square.At(4, 0), blackRook);

            whitePawn.MoveTo(board, Square.At(4, 3));
            blackRook.MoveTo(board, Square.At(0, 0));
            whiteRook.MoveTo(board, Square.At(0, 3));

            var moves = blackPawn.GetAvailableMoves(board).ToList();

            moves.Should().NotContain(Square.At(5, 3));
        }
Example #15
0
        public void Whether_Board_UpdatesIsWhiteMove_On_MoveTo()
        {
            var board = new Board();
            var newPos = new Square(1, 6);
            var oldPos = new Square(1, 1);
            var rook = new Rook(oldPos, board, PieceColor.White);

            var hasMoved = rook.MoveTo(newPos);

            Assert.That(rook.Position.Equals(newPos));
            Assert.IsFalse(board.IsWhiteMove);
            Assert.That(hasMoved);
        }
Example #16
0
        public void Whether_Piece_CantMoveWhenIsWhiteMove_On_MoveTo()
        {
            var board = new Board();
            var newPos = new Square(1, 6);
            var oldPos = new Square(1, 1);
            var rook = new Rook(oldPos, board, PieceColor.Black);

            var hasMoved = rook.MoveTo(newPos);

            Assert.That(board.IsWhiteMove);
            Assert.That(rook.Position.Equals(oldPos));
            Assert.That(!hasMoved);
        }
Example #17
0
        public void Whether_Piece_UpdatesPosition_On_MoveTo()
        {
            var board = new Board();
            var newPos = new Square(1, 6);
            var rook = new Rook(new Square(1, 1), board, PieceColor.White);

            rook.MoveTo(newPos);

            Assert.That(rook.Position.Equals(newPos));
        }
Example #18
0
        public void Whether_Piece_PositionUpdatedRaised_On_PieceMoved()
        {
            var board = new Board();
            var newPos = new Square(1, 6);
            var moved = false;
            var rook = new Rook(new Square(1, 1), board, PieceColor.White);
            rook.PositionUpdated += (s, p) => moved = true;

            rook.MoveTo(newPos);

            Assert.That(moved, Is.True);
        }