コード例 #1
0
 def test_piece_scores(self):
     test_board = Board()
     test_board.from_fen(
         "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
コード例 #2
0
class PerftTests(unittest.TestCase):
    def setUp(self):
        self.board = Board()
        self.board.from_fen(
            "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")

    def _perft(self, current_board, depth):
        number_moves = 0
        if not depth:
            return 1
        for move in current_board.gen_legal_moves():
            new_board = current_board.board_copy()
            new_board = new_board.make_generated_move(move)
            number_moves += self._perft(new_board, depth - 1)
        return number_moves

    def test_perft(self):
        self.assertEqual(self._perft(self.board, 1), 20)
        self.assertEqual(self._perft(self.board, 2), 400)
        self.assertEqual(self._perft(self.board, 3), 8902)
        # self.assertEqual(self._perft(self.board, 4), 197_281)
        # self.assertEqual(self._perft(self.board, 5), 4_865_609)

    def test_perft_pos2(self):
        self.board.from_fen(
            "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 1 1"
        )
        self.assertEqual(self._perft(self.board, 1), 48)
        self.assertEqual(self._perft(self.board, 2), 2039)
        # self.assertEqual(self._perft(self.board, 3), 97_862)
        # self.assertEqual(self._perft(self.board, 4), 4_085_603)

    def test_perft_pos3(self):
        self.board.from_fen("8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 1 1")
        self.assertEqual(self._perft(self.board, 1), 14)
        self.assertEqual(self._perft(self.board, 2), 191)
        self.assertEqual(self._perft(self.board, 3), 2812)
        # self.assertEqual(self._perft(self.board, 4), 43_238)
        # self.assertEqual(self._perft(self.board, 5), 674_624)
        # self.assertEqual(self._perft(self.board, 6), 11_030_083)

    def test_perft_pos4(self):
        self.board.from_fen(
            "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1")
        self.assertEqual(self._perft(self.board, 1), 6)
        self.assertEqual(self._perft(self.board, 2), 264)
        self.assertEqual(self._perft(self.board, 3), 9467)
        # self.assertEqual(self._perft(self.board, 4), 422_333)
        # self.assertEqual(self._perft(self.board, 5), 15_833_292)

    def test_perft_pos5(self):
        self.board.from_fen(
            "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8")
        self.assertEqual(self._perft(self.board, 1), 44)
        self.assertEqual(self._perft(self.board, 2), 1486)
        self.assertEqual(self._perft(self.board, 3), 62_379)
        #self.assertEqual(self._perft(self.board, 4), 2_103_487)
        #self.assertEqual(self._perft(self.board, 5), 89_941_194)

    def test_perft_pos6(self):
        self.board.from_fen(
            "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10"
        )
        self.assertEqual(self._perft(self.board, 1), 46)
        self.assertEqual(self._perft(self.board, 2), 2079)
        # self.assertEqual(self._perft(self.board, 3), 89_890)
        # self.assertEqual(self._perft(self.board, 4), 3_894_594)

    def test_perft_pos7(self):
        self.board.from_fen("8/8/3rk3/8/8/2N1K3/8/8 w - - 0 1")
        self.assertEqual(self._perft(self.board, 1), 13)
        self.assertEqual(self._perft(self.board, 2), 205)
        self.assertEqual(self._perft(self.board, 3), 2250)
        self.assertEqual(self._perft(self.board, 4), 40097)
コード例 #3
0
 def setUp(self):
     self.board = Board()
     self.board.from_fen(
         "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
コード例 #4
0
 def test_in_check(self):
     test_board = Board()
     test_board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
     self.assertEqual(test_board.in_check(), True)
     test_board.make_generated_move((index_of_square('c7'), index_of_square('c6'), None))
     self.assertEqual(test_board.in_check(), False)
     test_board.make_generated_move((index_of_square('c4'), index_of_square('b3'), None))
     self.assertEqual(test_board.in_check(), False)
     test_board.make_generated_move((index_of_square('g4'), index_of_square('e2'), None))
     self.assertEqual(test_board.in_check(), True)
コード例 #5
0
 def test_is_checkmate(self):
     test_board = Board()
     test_board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
     self.assertEqual(test_board.is_checkmate(), False)
     test_board.make_generated_move((index_of_square('c7'), index_of_square('c6'), None))
     self.assertEqual(test_board.is_checkmate(), False)
     test_board.make_generated_move((index_of_square('c4'), index_of_square('b3'), None))
     test_board.make_generated_move((index_of_square('f6'), index_of_square('e4'), None))
     test_board.make_generated_move((index_of_square('a2'), index_of_square('a3'), None))
     test_board.make_generated_move((index_of_square('g4'), index_of_square('e2'), None))
     self.assertEqual(test_board.is_checkmate(), True)
     test_board.from_fen("r1bqkbnr/1ppp1ppp/p1n5/4p3/2B1P3/5Q2/PPPP1PPP/RNB1K1NR w KQkq - 0 4")
     self.assertEqual(test_board.is_checkmate(), False)
     test_board.make_generated_move((index_of_square('f3'), index_of_square('f7'), None))
     self.assertEqual(test_board.is_checkmate(), True)
コード例 #6
0
    def test_make_moves(self):
        test_board = Board()
        test_board.from_fen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
        test_board.make_generated_move((index_of_square('e2'), index_of_square('e4'), None))
        self.assertEqual(test_board.to_move, 0)
        self.assertEqual(test_board.piece_on(28), None)
        self.assertEqual(test_board.piece_on(52), 0)
        self.assertEqual(test_board.piece_on(63), 3)
        self.assertEqual(test_board.piece_on(12), None)
        self.assertEqual(test_board.fullmove_counter, 1)
        self.assertEqual(test_board.halfmove_clock, 0)

        test_board = Board()
        test_board.from_fen("rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8")
        test_board.make_generated_move((index_of_square('a2'), index_of_square('a3'), None))
        test_board.make_generated_move((index_of_square('f2'), index_of_square('h1'), None))
コード例 #7
0
 def setUp(self):
     self.board = Board()
     self.board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
コード例 #8
0
 def test_make_move(self):
     test_board = Board()
     test_board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
     with pytest.raises(IndexError):
         test_board.make_move((60, 68, None))
     with pytest.raises(ValueError):
         test_board.make_move((index_of_square('f7'), index_of_square('d7'), None))
     with pytest.raises(ValueError):
         test_board.make_move((index_of_square('e8'), index_of_square('d7'), None))
     with pytest.raises(ValueError):
         test_board.make_move((index_of_square('f6'), index_of_square('e4'), None))
     with pytest.raises(ValueError):
         test_board.make_move((index_of_square('e8'), index_of_square('g8'), None))
     test_board.make_move((index_of_square('c7'), index_of_square('c6'), None))
     with pytest.raises(ValueError):
         test_board.make_move((index_of_square('a1'), index_of_square('a3'), None))
コード例 #9
0
class BoardTests(unittest.TestCase):

    def setUp(self):
        self.board = Board()
        self.board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")

    def test_from_fen(self):
        self.assertEqual(self.board.to_move, 0)
        self.assertEqual(self.board.castling_rights['white kingside'], 0)
        self.assertEqual(self.board.castling_rights['white queenside'], 0)
        self.assertEqual(self.board.castling_rights['black kingside'], 0)
        self.assertEqual(self.board.castling_rights['black queenside'], 1)
        self.assertEqual(self.board.en_passant, 0)
        self.assertEqual(self.board.halfmove_clock, 2)
        self.assertEqual(self.board.fullmove_counter, 10)
        self.assertEqual(self.board.pieces[0][0],
                         0b00000000011000111000000000001000000000000000000000000000000000000)
        self.assertEqual(self.board.pieces[0][1],
                         bitboard_of_square('f6') | bitboard_of_square('d4'))
        self.assertEqual(self.board.pieces[0][2],
                         bitboard_of_square('f2') | bitboard_of_square('g4'))
        self.assertEqual(self.board.pieces[0][3],
                         bitboard_of_square('a8'))
        self.assertEqual(self.board.pieces[0][4],
                         bitboard_of_square('e7'))
        self.assertEqual(self.board.pieces[0][5],
                         bitboard_of_square('e8'))

        self.assertEqual(self.board.pieces[1][0],
                         0b00000000000000000000000000000100000000000000001001100101100000000)
        self.assertEqual(self.board.pieces[1][1],
                         bitboard_of_square('b1') | bitboard_of_square('h8'))
        self.assertEqual(self.board.pieces[1][2],
                         bitboard_of_square('c4') | bitboard_of_square('c1'))
        self.assertEqual(self.board.pieces[1][3],
                         bitboard_of_square('a1') | bitboard_of_square('h1'))
        self.assertEqual(self.board.pieces[1][4],
                         bitboard_of_square('a4'))
        self.assertEqual(self.board.pieces[1][5],
                         bitboard_of_square('f1'))

    def test_in_check_after_move(self):
        self.assertEqual(self.board.in_check_after_move((52, 51, None)), False)
        self.assertEqual(self.board.in_check_after_move((52, 53, None)), True)
        self.assertEqual(self.board.in_check_after_move((60, 59, None)), False)
        self.assertEqual(self.board.in_check_after_move((60, 51, None)), True)

    def test_make_moves(self):
        test_board = Board()
        test_board.from_fen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
        test_board.make_generated_move((index_of_square('e2'), index_of_square('e4'), None))
        self.assertEqual(test_board.to_move, 0)
        self.assertEqual(test_board.piece_on(28), None)
        self.assertEqual(test_board.piece_on(52), 0)
        self.assertEqual(test_board.piece_on(63), 3)
        self.assertEqual(test_board.piece_on(12), None)
        self.assertEqual(test_board.fullmove_counter, 1)
        self.assertEqual(test_board.halfmove_clock, 0)

        test_board = Board()
        test_board.from_fen("rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8")
        test_board.make_generated_move((index_of_square('a2'), index_of_square('a3'), None))
        test_board.make_generated_move((index_of_square('f2'), index_of_square('h1'), None))

    def test_in_check(self):
        test_board = Board()
        test_board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
        self.assertEqual(test_board.in_check(), True)
        test_board.make_generated_move((index_of_square('c7'), index_of_square('c6'), None))
        self.assertEqual(test_board.in_check(), False)
        test_board.make_generated_move((index_of_square('c4'), index_of_square('b3'), None))
        self.assertEqual(test_board.in_check(), False)
        test_board.make_generated_move((index_of_square('g4'), index_of_square('e2'), None))
        self.assertEqual(test_board.in_check(), True)

    def test_is_checkmate(self):
        test_board = Board()
        test_board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
        self.assertEqual(test_board.is_checkmate(), False)
        test_board.make_generated_move((index_of_square('c7'), index_of_square('c6'), None))
        self.assertEqual(test_board.is_checkmate(), False)
        test_board.make_generated_move((index_of_square('c4'), index_of_square('b3'), None))
        test_board.make_generated_move((index_of_square('f6'), index_of_square('e4'), None))
        test_board.make_generated_move((index_of_square('a2'), index_of_square('a3'), None))
        test_board.make_generated_move((index_of_square('g4'), index_of_square('e2'), None))
        self.assertEqual(test_board.is_checkmate(), True)
        test_board.from_fen("r1bqkbnr/1ppp1ppp/p1n5/4p3/2B1P3/5Q2/PPPP1PPP/RNB1K1NR w KQkq - 0 4")
        self.assertEqual(test_board.is_checkmate(), False)
        test_board.make_generated_move((index_of_square('f3'), index_of_square('f7'), None))
        self.assertEqual(test_board.is_checkmate(), True)

    def test_is_stalemate(self):
        test_board = Board()
        test_board.from_fen("8/8/8/8/3k4/q7/2K5/8 w - - 0 1")
        self.assertEqual(test_board.is_stalemate(), False)
        test_board.make_generated_move((index_of_square('c2'), index_of_square('b1'), None))
        self.assertEqual(test_board.is_stalemate(), False)
        test_board.make_generated_move((index_of_square('d4'), index_of_square('c3'), None))
        self.assertEqual(test_board.is_stalemate(), True)

    def test_make_move(self):
        test_board = Board()
        test_board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
        with pytest.raises(IndexError):
            test_board.make_move((60, 68, None))
        with pytest.raises(ValueError):
            test_board.make_move((index_of_square('f7'), index_of_square('d7'), None))
        with pytest.raises(ValueError):
            test_board.make_move((index_of_square('e8'), index_of_square('d7'), None))
        with pytest.raises(ValueError):
            test_board.make_move((index_of_square('f6'), index_of_square('e4'), None))
        with pytest.raises(ValueError):
            test_board.make_move((index_of_square('e8'), index_of_square('g8'), None))
        test_board.make_move((index_of_square('c7'), index_of_square('c6'), None))
        with pytest.raises(ValueError):
            test_board.make_move((index_of_square('a1'), index_of_square('a3'), None))

    def test_move_from_san(self):
        self.assertEqual(move_from_san('e1e2'), (4, 12, None))
        self.assertEqual(move_from_san('c4b5'), (26, 33, None))
        self.assertEqual(move_from_san('e7e8q'), (52, 60, 4))
        self.assertEqual(move_from_san('d7d8r'), (51, 59, 3))
        self.assertEqual(move_from_san('c7c8b'), (50, 58, 2))
        self.assertEqual(move_from_san('b7b8n'), (49, 57, 1))
コード例 #10
0
 def test_is_stalemate(self):
     test_board = Board()
     test_board.from_fen("8/8/8/8/3k4/q7/2K5/8 w - - 0 1")
     self.assertEqual(test_board.is_stalemate(), False)
     test_board.make_generated_move((index_of_square('c2'), index_of_square('b1'), None))
     self.assertEqual(test_board.is_stalemate(), False)
     test_board.make_generated_move((index_of_square('d4'), index_of_square('c3'), None))
     self.assertEqual(test_board.is_stalemate(), True)