use super::helpers::apply_usi_move;
use crate::board::position_from_sfen;
use crate::types::Color;
#[test]
fn apply_move_carries_plies_from_null() {
let mut pos = crate::board::hirate_position();
let prev_plies = pos.current_state().plies_from_null;
apply_usi_move(&mut pos, "7g7f");
assert_eq!(pos.current_state().plies_from_null, prev_plies + 1);
let prev_plies = pos.current_state().plies_from_null;
apply_usi_move(&mut pos, "3c3d");
assert_eq!(pos.current_state().plies_from_null, prev_plies + 1);
}
#[test]
fn apply_move_carries_continuous_check_for_non_mover() {
let mut pos = crate::board::hirate_position();
pos.state_stack_mut().current_mut().continuous_check = [3, 5];
apply_usi_move(&mut pos, "7g7f");
let new_check = pos.current_state().continuous_check;
assert_eq!(new_check[Color::BLACK.to_index()], 0);
assert_eq!(new_check[Color::WHITE.to_index()], 5);
}
#[test]
fn apply_null_move_resets_plies_from_null() {
let mut pos = crate::board::hirate_position();
apply_usi_move(&mut pos, "7g7f");
apply_usi_move(&mut pos, "3c3d");
assert!(pos.current_state().plies_from_null > 0);
pos.apply_null_move().expect("null move from non-check is legal");
assert_eq!(pos.current_state().plies_from_null, 0);
}
#[test]
fn apply_null_move_resets_prev_side_continuous_check() {
let mut pos = crate::board::hirate_position();
pos.state_stack_mut().current_mut().continuous_check = [3, 0];
let turn_before = pos.turn();
pos.apply_null_move().expect("null move from non-check is legal");
let after = pos.current_state().continuous_check;
assert_eq!(after[turn_before.to_index()], 0);
assert_eq!(after[turn_before.flip().to_index()], 0);
}
#[test]
fn apply_null_move_initializes_null_specific_fields() {
let mut pos = crate::board::hirate_position();
apply_usi_move(&mut pos, "7g7f");
pos.apply_null_move().expect("null move from non-check is legal");
let state = pos.current_state();
assert_eq!(state.cold.captured_piece(), crate::types::Piece::NONE);
assert!(state.hot.tactical.checkers().is_empty());
assert_eq!(state.repetition_counter, 0);
assert_eq!(state.repetition_distance, 0);
assert_eq!(state.repetition_times, 0);
assert_eq!(state.repetition_type, crate::types::RepetitionState::None);
}
#[test]
fn apply_move_after_sfen_load_carries_plies() {
let sfen = "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1";
let mut pos = position_from_sfen(sfen).expect("valid sfen");
let prev_plies = pos.current_state().plies_from_null;
apply_usi_move(&mut pos, "7g7f");
assert_eq!(pos.current_state().plies_from_null, prev_plies + 1);
}