def test_piece_scores(self): test_board = Board() test_board.from_fen( "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
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)
def setUp(self): self.board = Board() self.board.from_fen( "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1")
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_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 setUp(self): self.board = Board() self.board.from_fen("r3k2N/ppp1q1pp/5n2/3Pp3/Q1Bn2b1/2P5/PP1P1bPP/RNB2K1R b q - 2 10")
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))
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))
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)