Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_bishop_fork(self):
# source https://lichess.org/training/61079
# source game https://lichess.org/1n12OmvV
# 34. Rb7
board = chess.Board(
'6k1/R4p2/1r3npp/2N5/P1b2P2/6P1/3r2BP/4R1K1 w - - 0 34'
)
puzzle = Puzzle(board, board.parse_san('Rb7'))
puzzle.generate(depth=15)
self.assertTrue(puzzle.is_complete())
self.assertFalse(puzzle.player_moves_first)
self.assertEqual(puzzle.category(), "Material")
expected_uci_moves = ['a7b7', 'd2g2', 'g1g2', 'c4d5', 'g2g1', 'd5b7']
self.assertEqual(
[str(p.initial_move) for p in puzzle.positions][:6],
expected_uci_moves
)
game = chess.pgn.read_game(io.StringIO(puzzle.to_pgn()))
self.assertEqual(
[m.uci() for m in game.mainline_moves()][:6],
expected_uci_moves
def test_puzzles_without_initial_move(self):
depth = 14
# https://www.chesstactics.org/removing-the-guard
# Figure 5.1.1.1
board = chess.Board(
'3rr1k1/ppq2pp1/2p1b2p/8/3P2n1/2N3P1/PP3PBP/R2QR1K1 w - - 0 1'
)
puzzle = Puzzle(board)
puzzle.generate(depth=depth)
self.assertTrue(puzzle.is_complete())
self.assertTrue(puzzle.player_moves_first)
self.assertEqual(puzzle.category(), "Material")
# Figure 5.1.1.2
board = chess.Board(
'1k6/p7/1p1prrB1/7P/4R3/2P3K1/PP3P2/8 b - - 0 1'
)
puzzle = Puzzle(board)
puzzle.generate(depth=depth)
self.assertTrue(puzzle.is_complete())
self.assertTrue(puzzle.player_moves_first)
def test_long_mating_pv(self):
""" A long pv that ends the game should not be truncated """
board = chess.Board('1Q3bk1/5p2/2p3p1/1p1bN2p/4n2P/8/r5PK/8 b - - 1 34') # noqa E501
line = [chess.Move.from_uci('g8g7'), chess.Move.from_uci('e5f7'),
chess.Move.from_uci('d5f7'), chess.Move.from_uci('b8e5'),
chess.Move.from_uci('e4f6'), chess.Move.from_uci('h2h3'),
chess.Move.from_uci('b5b4'), chess.Move.from_uci('g2g4'),
chess.Move.from_uci('f8d6'), chess.Move.from_uci('e5d6'),
chess.Move.from_uci('h5g4'), chess.Move.from_uci('h3g3'),
chess.Move.from_uci('f6e4'), chess.Move.from_uci('g3f4'),
chess.Move.from_uci('e4d6'), chess.Move.from_uci('f4e5'),
chess.Move.from_uci('b4b3'), chess.Move.from_uci('e5d6'),
chess.Move.from_uci('b3b2'), chess.Move.from_uci('h4h5'),
chess.Move.from_uci('g6h5'), chess.Move.from_uci('d6d7'),
chess.Move.from_uci('b2b1q'), chess.Move.from_uci('d7c7'),
chess.Move.from_uci('b1b4'), chess.Move.from_uci('c7c6'),
chess.Move.from_uci('a2c2'), chess.Move.from_uci('c6d7'),
chess.Move.from_uci('b4b8'), chess.Move.from_uci('d7e7'),
chess.Move.from_uci('b8c7')]
result = annotator.truncate_pv(board, line)
self.assertEqual(result, line)
def test_long_non_mating_pv(self):
"""
A long pv that does not end the game should be truncated to 10 moves
"""
board = chess.Board('1Q3bk1/5p2/2p3p1/1p1bN2p/4n2P/8/r5PK/8 b - - 1 34') # noqa E501
line = [chess.Move.from_uci('g8g7'), chess.Move.from_uci('e5f7'),
chess.Move.from_uci('d5f7'), chess.Move.from_uci('b8e5'),
chess.Move.from_uci('e4f6'), chess.Move.from_uci('h2h3'),
chess.Move.from_uci('b5b4'), chess.Move.from_uci('g2g4'),
chess.Move.from_uci('f8d6'), chess.Move.from_uci('e5d6'),
chess.Move.from_uci('h5g4'), chess.Move.from_uci('h3g3'),
chess.Move.from_uci('f6e4'), chess.Move.from_uci('g3f4'),
chess.Move.from_uci('e4d6'), chess.Move.from_uci('f4e5'),
chess.Move.from_uci('b4b3'), chess.Move.from_uci('e5d6'),
chess.Move.from_uci('b3b2'), chess.Move.from_uci('h4h5'),
chess.Move.from_uci('g6h5'), chess.Move.from_uci('d6d7'),
chess.Move.from_uci('b2b1q'), chess.Move.from_uci('d7c7'),
chess.Move.from_uci('b1b4'), chess.Move.from_uci('c7c6'),
chess.Move.from_uci('a2c2'), chess.Move.from_uci('c6d7'),
chess.Move.from_uci('b4b8'), chess.Move.from_uci('d7e7')]
target = line[:annotator.SHORT_PV_LEN]
result = annotator.truncate_pv(board, line)
self.assertEqual(len(result), annotator.SHORT_PV_LEN)
self.assertEqual(result, target)
def test_raises_assertionerror(self):
""" A line with an illegal move should raise an AssertionError """
board = chess.Board('1Q3bk1/5p2/2p3p1/1p1bN2p/4n2P/8/r5PK/8 b - - 1 34') # noqa E501
line = [chess.Move.from_uci('g8g7'), chess.Move.from_uci('e5f7'),
chess.Move.from_uci('d5f7'), chess.Move.from_uci('b8e5'),
chess.Move.from_uci('e4f6'), chess.Move.from_uci('h2h3'),
chess.Move.from_uci('b5b4'), chess.Move.from_uci('g2g4'),
chess.Move.from_uci('f8d6'), chess.Move.from_uci('e5d6'),
chess.Move.from_uci('h5g4'), chess.Move.from_uci('h3g3'),
chess.Move.from_uci('f6e4'), chess.Move.from_uci('g3f4'),
chess.Move.from_uci('e4d6'), chess.Move.from_uci('f4e5'),
chess.Move.from_uci('b4b3'), chess.Move.from_uci('e5d6'),
chess.Move.from_uci('b3b2'), chess.Move.from_uci('h4h5'),
chess.Move.from_uci('g6h5'), chess.Move.from_uci('d6c8'),
chess.Move.from_uci('b2b1q'), chess.Move.from_uci('d7c7'),
chess.Move.from_uci('b1b4'), chess.Move.from_uci('c7c6'),
chess.Move.from_uci('a2c2'), chess.Move.from_uci('c6d7'),
chess.Move.from_uci('b4b8'), chess.Move.from_uci('d7e7'),
chess.Move.from_uci('b8c7')]
self.assertRaises(AssertionError, annotator.truncate_pv, board, line)
print(loc)
for i in range(8):
for j in range(8):
if previous_board[i][j] <> current_board[i][j] and current_board[i][j] <> 0:
loc = loc + str(i) + str(j)
print(loc)
change_to_cord = {'0':'a', '1':'b', '2':'c', '3':'d', '4':'e', '5':'f', '6':'g', '7':'h'}
loc = change_to_cord[loc[0]] + str(int(loc[1])+1) + change_to_cord[loc[2]] + str(int(loc[3])+1)
move = chess.Move.from_uci(loc)
print(move)
print(board.is_capture(move))
board.push(move)
print(board)
def test_commented_game(self):
pgn_string = "{ Stockfish 8 64 POPCNT } 1. Nf3 { test comment } Nf6 2. g3 g6 { A05 King's Indian Attack: Symmetrical Defense } 3. Bg2 Bg7 4. O-O O-O 5. c4 d6 6. b3 e5 7. Bb2 c5 8. e3 Nc6 9. Nc3 Bf5 10. d4 e4 11. Ne1 Re8 12. Nc2 h5 13. Qd2 h4 14. Ba3 $6 { -1.13 } ( 14. h3 g5 15. g4 Bg6 16. Rad1 Qe7 17. Qe2 a6 18. Ba3 a5 { 0.19/25 } ) 14... b6 $6 { -0.04 } ( 14... Nh7 15. Nd5 Ng5 16. Bb2 Rc8 17. Rac1 Ne7 18. Nf4 h3 19. Bh1 { -1.11/24 } ) 15. Rfd1 $6 { -1.15 } ( 15. h3 d5 16. g4 Be6 17. cxd5 Nxd5 18. Nxe4 f5 19. gxf5 gxf5 { 0.00/26 } ) 15... Bg4 16. Rdc1 Qd7 17. b4 Qf5 18. Bb2 Rad8 19. Nb5 Bf3 20. d5 Ne5 $6 { -1.66 } ( 20... Nxb4 21. Ne1 Bxg2 22. Nxg2 Nd3 23. Nxh4 Qh3 24. Bxf6 Bxf6 25. f4 { -3.14/25 } ) 21. Bxe5 Rxe5 22. Ne1 hxg3 23. fxg3 Bh6 24. Rab1 Kg7 $6 { -1.08 } ( 24... Qh5 25. Rb3 Rf5 26. bxc5 dxc5 27. Rc2 Ng4 28. h3 Bxg2 29. Kxg2 { -2.48/24 } ) 25. Rb3 Qh5 26. h3 $6 { -3.08 } ( 26. bxc5 bxc5 27. Nxa7 Rh8 28. h4 Qg4 29. Nc6 Rh5 30. Qf2 Bd1 { -2.00/23 } ) 26... Nh7 $2 { -1.37 } ( 26... Rg5 27. Qf2 { -2.89/24 }) 27. g4 Bxg4 28. hxg4 Qxg4 29. Qd1 $4 { -5.69 } ( 29. Qb2 Ng5 30. Nxd6 Qg3 31. Nf5+ gxf5 32. Kf1 Nf3 33. Qf2 Nh2+ { -2.30/24 } ) 29... Qg3 30. Qe2 Ng5 31. Kh1 Rh8 32. Nxd6 Kg8 33. bxc5 Bf8+ 34. Kg1 Nh3+ 35. Kf1 Bxd6 36. cxd6 Rf5+ 37. Nf3 Rxf3+ 0-1" # noqa E501
pgn = StringIO(pgn_string)
game = chess.pgn.read_game(pgn)
result = annotator.clean_game(game)
node = result.end()
while True:
assert len(node.variations) <= 1
assert node.comment is None
assert node.nags == []
if node == game.root():
break
node = node.parent
board_creator_fn, and the second being a size 3 ndarray representing a move. The function must return a
boolean value, indicating if the move is legal
:param board_creator_fn: A function which takes as input a Python-Chess Board object, and outputs the board in the
representation to be used when testing move legality.
:param fens_to_test: An iterable of strings, each a FEN representation of a board.
:param moves_to_test: A uint8 ndarray of size [num_moves_to_test, 3], representing the moves to test for each
testing fen
:return: True if all tests were passed, False if not
"""
for cur_fen in fens_to_test:
cur_board = chess.Board(cur_fen)
cur_testing_board = board_creator_fn(cur_board)
for j in range(len(moves_to_test)):
if move_legality_tester(cur_testing_board, moves_to_test[j]) != cur_board.is_legal(
chess.Move(*moves_to_test[j]) if moves_to_test[j, 2] != 0 else chess.Move(*moves_to_test[j, :2])):
return False
return True
"""Tests the scholars mate."""
pos = chess.Position()
self.assertTrue(pos.has_queenside_castling_right("b"))
e4 = chess.Move.from_uci('e2e4')
self.assertTrue(e4 in pos.get_legal_moves())
pos.make_move(e4)
self.assertTrue(pos.has_queenside_castling_right("b"))
e5 = chess.Move.from_uci('e7e5')
self.assertTrue(e5 in pos.get_legal_moves())
self.assertFalse(e4 in pos.get_legal_moves())
pos.make_move(e5)
self.assertTrue(pos.has_queenside_castling_right("b"))
Qf3 = chess.Move.from_uci('d1f3')
self.assertTrue(Qf3 in pos.get_legal_moves())
pos.make_move(Qf3)
self.assertTrue(pos.has_queenside_castling_right("b"))
Nc6 = chess.Move.from_uci('b8c6')
self.assertTrue(Nc6 in pos.get_legal_moves())
pos.make_move(Nc6)
self.assertTrue(pos.has_queenside_castling_right("b"))
Bc4 = chess.Move.from_uci('f1c4')
self.assertTrue(Bc4 in pos.get_legal_moves())
pos.make_move(Bc4)
self.assertTrue(pos.has_queenside_castling_right("b"))
Rb8 = chess.Move.from_uci('a8b8')
self.assertTrue(Rb8 in pos.get_legal_moves())
def test_ambiguous_significant_advantages(self):
self.assertTrue(ambiguous_best_move([
Cp(767),
Cp(758),
Cp(177),
]))
self.assertTrue(ambiguous_best_move([
Cp(552),
Cp(505),
Cp(443),
]))
self.assertTrue(ambiguous_best_move([
Cp(408),
Cp(224),
Cp(219),
]))
self.assertTrue(ambiguous_best_move([
Cp(254),
Cp(254),
Cp(240),
]))