From 6738698262baa42626983e874c37d21bd6d12c01 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 15 Apr 2024 22:44:28 +0100 Subject: [PATCH] Fix promotion in 'ChessBoard::{,un}play_move' --- src/board/chess_board/mod.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/board/chess_board/mod.rs b/src/board/chess_board/mod.rs index 63753a4..9451981 100644 --- a/src/board/chess_board/mod.rs +++ b/src/board/chess_board/mod.rs @@ -199,8 +199,9 @@ impl ChessBoard { } // Revertible state modification + let dest_piece = chess_move.promotion().unwrap_or(move_piece); self.xor(self.current_player(), move_piece, chess_move.start()); - self.xor(self.current_player(), move_piece, chess_move.destination()); + self.xor(self.current_player(), dest_piece, chess_move.destination()); self.total_plies += 1; self.side = !self.side; @@ -227,8 +228,9 @@ impl ChessBoard { } // Restore revertible state + let start_piece = chess_move.promotion().map_or(move_piece, |_| Piece::Pawn); self.xor(!self.current_player(), move_piece, chess_move.destination()); - self.xor(!self.current_player(), move_piece, chess_move.start()); + self.xor(!self.current_player(), start_piece, chess_move.start()); self.total_plies -= 1; self.side = !self.side; } @@ -808,4 +810,19 @@ mod test { position.unplay_move(capture, state); assert_eq!(position, original); } + + #[test] + fn play_move_undo_promotion() { + let mut position = ChessBoard::from_fen("7k/P7/8/8/8/8/8/K7 w - - 0 1").unwrap(); + let expected = ChessBoard::from_fen("N6k/8/8/8/8/8/8/K7 b - - 0 1").unwrap(); + let original = position.clone(); + + let capture = Move::new(Square::A7, Square::A8, Some(Piece::Knight)); + + let state = position.play_move_inplace(capture); + assert_eq!(position, expected); + + position.unplay_move(capture, state); + assert_eq!(position, original); + } }