Move MoveParameter handling inside make/unmake_move

This commit is contained in:
stefiosif
2024-09-15 17:08:51 +03:00
parent 6badbcd776
commit 3383435af7
5 changed files with 47 additions and 70 deletions

View File

@@ -5,6 +5,7 @@ use super::{
state::{Castle, State},
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct History {
pub move_parameters: Vec<MoveParameters>,
}
@@ -25,6 +26,7 @@ impl History {
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MoveParameters {
pub mv: Option<Move>,
pub captured_piece: Option<PieceType>,
@@ -86,39 +88,35 @@ impl MoveParameters {
}
}
impl Default for MoveParameters {
fn default() -> Self {
MoveParameters::new()
}
}
#[cfg(test)]
mod tests {
use crate::{
board::{fen::from_fen, history::MoveParameters, square::Square},
board::{fen::from_fen, square::Square},
movegen::r#move::{Move, MoveType, Promote},
};
const FEN: &str = "1r2k2r/2P1p1qp/2npb3/1p3p2/p3P1pP/P2B1Q2/1P1PNPP1/R3K2R w KQk - 0 1";
const FEN_2: &str = "1r2k2r/2P1p1qp/2npb3/1p3p2/pP2P1pP/P2B1Q2/3PNPP1/R3K2R b KQk b3 0 1";
#[test]
fn test_unmake_quiet_and_double_push() -> Result<(), String> {
let mut game = from_fen(FEN)?;
let board_before_make = game.board.clone();
let mv = Move::new_with_type(Square::B2, Square::B3, MoveType::Quiet);
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);
let mv = Move::new_with_type(Square::B2, Square::B4, MoveType::DoublePush);
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);
@@ -129,26 +127,15 @@ mod tests {
fn test_unmake_capture_and_promotion() -> Result<(), String> {
let mut game = from_fen(FEN)?;
let board_before_make = game.board.clone();
let mv = Move::new_with_type(Square::D3, Square::B5, MoveType::Capture);
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);
let mv = Move::new_with_type(Square::C7, Square::C8, MoveType::Promotion(Promote::Queen));
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);
@@ -157,13 +144,8 @@ mod tests {
Square::B8,
MoveType::PromotionCapture(Promote::Queen),
);
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);
@@ -172,19 +154,11 @@ mod tests {
#[test]
fn test_unmake_en_passant() -> Result<(), String> {
let mut game = from_fen(FEN)?;
let mv = Move::new_with_type(Square::B2, Square::B4, MoveType::DoublePush);
game.board.make_move(&mv);
let mut game = from_fen(FEN_2)?;
let board_before_make = game.board.clone();
let mv = Move::new_with_type(Square::A4, Square::B3, MoveType::EnPassant);
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);
@@ -195,15 +169,9 @@ mod tests {
fn test_unmake_castle() -> Result<(), String> {
let mut game = from_fen(FEN)?;
let board_before_make = game.board.clone();
let mv = Move::new_with_type(Square::E1, Square::C1, MoveType::Castle);
let mut move_parameters = MoveParameters::new();
move_parameters.add_move(mv);
move_parameters.add_irreversible_parameters(game.board.state);
move_parameters.add_capture_and_promotion_piece(&game.board, mv, game.current_player());
game.board.make_move(&mv);
game.board.unmake_move(&move_parameters);
game.board.unmake_move();
assert_eq!(board_before_make, game.board);