use super::helpers::apply_usi_move;
use crate::board::position_from_sfen;
use crate::types::{Color, PieceType};
fn check_sfens() -> &'static [&'static str] {
&[
"lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1",
"ln1g3nl/1r3kg2/p2pppsp1/3s2p1p/1pp4P1/P1P1SP2P/1PSPP1P2/2GK3R1/LN3G1NL b Bb 1",
"9/9/9/4k4/9/9/9/4K4/4R4 b - 1",
]
}
fn assert_cache_matches_position(pos: &crate::board::position::Position, label: &str) {
let cache = pos.current_state_cache();
assert_eq!(cache.checkers(), pos.checkers(), "checkers mismatch after {label}");
for color in [Color::BLACK, Color::WHITE] {
assert_eq!(
cache.blockers_for_king(color),
pos.blockers_for_king(color),
"blockers mismatch ({color:?}) after {label}"
);
assert_eq!(
cache.pinners(color),
pos.pinners(color),
"pinners mismatch ({color:?}) after {label}"
);
}
for pt in PieceType::iter() {
assert_eq!(
cache.check_square(pt),
pos.check_square(pt),
"check_square mismatch ({pt:?}) after {label}"
);
}
let view_ptr = std::ptr::from_ref(cache.check_squares());
let getter_ptr = std::ptr::from_ref(pos.check_squares_cache());
assert_eq!(view_ptr, getter_ptr, "check_squares alias mismatch after {label}");
}
#[test]
fn cache_view_matches_individual_getters() {
for sfen in check_sfens() {
let pos = position_from_sfen(sfen).expect("valid sfen");
assert_cache_matches_position(&pos, sfen);
}
}
#[test]
fn cache_view_check_squares_returns_borrow_of_state() {
let pos = crate::board::hirate_position();
let cache = pos.current_state_cache();
let view_ptr = std::ptr::from_ref(cache.check_squares());
let getter_ptr = std::ptr::from_ref(pos.check_squares_cache());
assert_eq!(view_ptr, getter_ptr, "check_squares() must alias check_squares_cache()");
}
#[test]
fn cache_view_reflects_current_state_after_apply() {
let mut pos = crate::board::hirate_position();
let initial_checkers = pos.current_state_cache().checkers();
apply_usi_move(&mut pos, "7g7f");
let after_cache = pos.current_state_cache();
assert_eq!(after_cache.checkers(), pos.checkers());
assert!(after_cache.checkers().is_empty());
assert_eq!(initial_checkers, after_cache.checkers());
}
#[test]
fn cache_view_matches_individual_getters_after_tactical_sequence() {
let mut pos = crate::board::hirate_position();
for mv in ["7g7f", "3c3d", "8h3c+", "2b3c", "5g5f", "B*8e", "5i6h"] {
apply_usi_move(&mut pos, mv);
assert_cache_matches_position(&pos, mv);
}
}
#[test]
fn cache_view_is_copy_and_supports_multiple_accessors() {
let pos = crate::board::hirate_position();
let cache = pos.current_state_cache();
let _checkers = cache.checkers();
let _blockers_b = cache.blockers_for_king(Color::BLACK);
let _pinners_b = cache.pinners(Color::BLACK);
let _check_square_pawn = cache.check_square(PieceType::PAWN);
let _check_squares_ref = cache.check_squares();
}