def test_knight_capture(self): """ Move knight to a middle square with a piece on a capture square. Expected result is position with opponent piece is in legal move list and piece is captured when knight moves to that position. :return: """ board = ChessBoard() start_position = 'd4' capture_position = 'f5' board[start_position] = Knight(Color.WHITE) board[capture_position] = Bishop(Color.BLACK) expected_possible_moves = [ 'b3', 'b5', 'c2', 'c6', 'e2', 'e6', 'f3', 'f5' ] possible_moves = board.get_legal_moves(start_position) possible_moves.sort() message = 'Expected move list does not match actual move list' self.assertListEqual(expected_possible_moves, possible_moves, message) # Move knight to capture a piece move_result = board.move_piece(start_position, capture_position) message = 'Knight should have captured piece on ' + capture_position + ' square' self.assertIsInstance(board[capture_position], Knight, message) # Test move result expected_move_result = { start_position: None, capture_position: Knight(Color.WHITE) } self.assertDictEqual(expected_move_result, move_result, 'Expected move result does not match actual')
def test_empty_fen(self): """ Create fen object without supplying a FEN string Expect default chess board :return: """ fen = Fen() expected_board = { 'a1': Rook(Color.WHITE), 'b1': Knight(Color.WHITE), 'c1': Bishop(Color.WHITE), 'd1': Queen(Color.WHITE), 'e1': King(Color.WHITE), 'f1': Bishop(Color.WHITE), 'g1': Knight(Color.WHITE), 'h1': Rook(Color.WHITE), 'a2': Pawn(Color.WHITE), 'b2': Pawn(Color.WHITE), 'c2': Pawn(Color.WHITE), 'd2': Pawn(Color.WHITE), 'e2': Pawn(Color.WHITE), 'f2': Pawn(Color.WHITE), 'g2': Pawn(Color.WHITE), 'h2': Pawn(Color.WHITE), 'a8': Rook(Color.BLACK), 'b8': Knight(Color.BLACK), 'c8': Bishop(Color.BLACK), 'd8': Queen(Color.BLACK), 'e8': King(Color.BLACK), 'f8': Bishop(Color.BLACK), 'g8': Knight(Color.BLACK), 'h8': Rook(Color.BLACK), 'a7': Pawn(Color.BLACK), 'b7': Pawn(Color.BLACK), 'c7': Pawn(Color.BLACK), 'd7': Pawn(Color.BLACK), 'e7': Pawn(Color.BLACK), 'f7': Pawn(Color.BLACK), 'g7': Pawn(Color.BLACK), 'h7': Pawn(Color.BLACK), } self.assertEqual(expected_board, fen.board)
def test_different_board_setups(self): """ Create Fen object using empty board, middle game, end game Expect board config to match expected value :return: """ # Empty board fen_str = '8/8/8/8/8/8/8/8 w - -' expected_board1 = {} fen = Fen(fen_str) self.assertEqual(expected_board1, fen.board) # Partial game fen_str = 'r2qkbnr/2pp1ppp/b1n5/1N2p3/4P1Q1/8/PPPP1PPP/R1B1K1NR w KQkq -' expected_board2 = { 'a1': Rook(Color.WHITE), 'c1': Bishop(Color.WHITE), 'e1': King(Color.WHITE), 'g1': Knight(Color.WHITE), 'h1': Rook(Color.WHITE), 'a2': Pawn(Color.WHITE), 'b2': Pawn(Color.WHITE), 'c2': Pawn(Color.WHITE), 'd2': Pawn(Color.WHITE), 'f2': Pawn(Color.WHITE), 'g2': Pawn(Color.WHITE), 'h2': Pawn(Color.WHITE), 'a8': Rook(Color.BLACK), 'd8': Queen(Color.BLACK), 'e8': King(Color.BLACK), 'f8': Bishop(Color.BLACK), 'g8': Knight(Color.BLACK), 'h8': Rook(Color.BLACK),'c7': Pawn(Color.BLACK), 'd7': Pawn(Color.BLACK), 'f7': Pawn(Color.BLACK), 'g7': Pawn(Color.BLACK), 'h7': Pawn(Color.BLACK), 'a6': Bishop(Color.BLACK), 'c6': Knight(Color.BLACK), 'e5': Pawn(Color.BLACK), 'b5': Knight(Color.WHITE), 'e4': Pawn(Color.WHITE), 'g4': Queen(Color.WHITE) } fen = Fen(fen_str) self.assertEqual(expected_board2, fen.board) # End game fen_str = '5rk1/7p/8/4p1p1/2nP4/2PB4/bP4QP/2K4R w - -' expected_board3 = { 'c1': King(Color.WHITE), 'h1': Rook(Color.WHITE), 'b2': Pawn(Color.WHITE), 'g2': Queen(Color.WHITE), 'h2': Pawn(Color.WHITE), 'c3': Pawn(Color.WHITE), 'd3': Bishop(Color.WHITE), 'd4': Pawn(Color.WHITE), 'a2': Bishop(Color.BLACK), 'c4': Knight(Color.BLACK), 'e5': Pawn(Color.BLACK), 'g5': Pawn(Color.BLACK), 'h7': Pawn(Color.BLACK), 'f8': Rook(Color.BLACK), 'g8': King(Color.BLACK) } fen = Fen(fen_str) self.assertEqual(expected_board3, fen.board)
def test_pawn_capture(self): """ Move a pawn to a square where there is a piece of the opposite color on one of the most immediate diagonal squares. Expected result is that the square that contains the piece of the opposite color is in the list of possible moves for the pawn. Opposing piece is also successfully captured by pawn. :return: """ # Test diagonal move when a piece of the opposite color is present board = ChessBoard() start_position = 'b1' capture_position = 'c2' board[start_position] = Pawn(Color.WHITE) board['c2'] = Bishop(Color.BLACK) expected_possible_moves = ['b2', 'b3', 'c2'] possible_moves = board.get_legal_moves(start_position) possible_moves.sort() message = 'Expected pawn to be able to move diagonally' self.assertListEqual(expected_possible_moves, possible_moves, message) # place a second piece and confirm both diagonals show as possible moves board['a2'] = Rook(Color.BLACK) expected_possible_moves = ['a2', 'b2', 'b3', 'c2'] possible_moves = board.get_legal_moves(start_position) possible_moves.sort() message = 'Expected pawn to be able to move diagonally in both directions' self.assertListEqual(expected_possible_moves, possible_moves, message) # Move pawn to capture a piece move_result = board.move_piece(start_position, capture_position) message = 'Pawn should have captured piece on ' + capture_position + ' square' self.assertIsInstance(board[capture_position], Pawn, message) # Test move result expected_move_result = { start_position: None, capture_position: Pawn(Color.WHITE) } self.assertDictEqual(expected_move_result, move_result, 'Expected move result does not match actual')