Fix promotion in 'ChessBoard::{,un}play_move'
All checks were successful
ci/woodpecker/push/check Pipeline was successful
All checks were successful
ci/woodpecker/push/check Pipeline was successful
This commit is contained in:
parent
4960286557
commit
dd49c6474b
|
@ -199,8 +199,9 @@ impl ChessBoard {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Revertible state modification
|
// 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.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.total_plies += 1;
|
||||||
self.side = !self.side;
|
self.side = !self.side;
|
||||||
|
|
||||||
|
@ -227,8 +228,9 @@ impl ChessBoard {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore revertible state
|
// 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.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.total_plies -= 1;
|
||||||
self.side = !self.side;
|
self.side = !self.side;
|
||||||
}
|
}
|
||||||
|
@ -808,4 +810,19 @@ mod test {
|
||||||
position.unplay_move(capture, state);
|
position.unplay_move(capture, state);
|
||||||
assert_eq!(position, original);
|
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 promotion = Move::new(Square::A7, Square::A8, Some(Piece::Knight));
|
||||||
|
|
||||||
|
let state = position.play_move_inplace(promotion);
|
||||||
|
assert_eq!(position, expected);
|
||||||
|
|
||||||
|
position.unplay_move(promotion, state);
|
||||||
|
assert_eq!(position, original);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue