use std::sync::Arc;
use crate::eval::EvalHash;
use crate::search::SearchTuneParams;
use crate::search::alpha_beta::{SearchWorker, reduction};
use crate::tt::TranspositionTable;
#[test]
fn test_reduction_values() {
let tune = SearchTuneParams::default();
let root_delta = 64;
let delta = 32;
assert!(reduction(&tune, true, 10, 5, delta, root_delta) / 1024 >= 0);
assert!(
reduction(&tune, false, 10, 5, delta, root_delta) / 1024
>= reduction(&tune, true, 10, 5, delta, root_delta) / 1024
);
}
#[test]
fn test_reduction_bounds() {
let tune = SearchTuneParams::default();
let root_delta = 64;
let delta = 32;
assert_eq!(reduction(&tune, true, 0, 0, delta, root_delta), 0); assert!(reduction(&tune, true, 63, 63, delta, root_delta) / 1024 < 64);
assert!(reduction(&tune, false, 63, 63, delta, root_delta) / 1024 < 64);
}
#[test]
fn test_reduction_returns_nonzero_for_large_values() {
let tune = SearchTuneParams::default();
let root_delta = 64;
let delta = 32;
let r = reduction(&tune, false, 10, 10, delta, root_delta) / 1024;
assert!(
r > 0,
"reduction should return positive value for depth=10, move_count=10, got {r}"
);
let r_imp = reduction(&tune, true, 10, 10, delta, root_delta) / 1024;
assert!(r >= r_imp, "non-improving should have >= reduction than improving");
}
#[test]
fn test_reduction_small_values() {
let tune = SearchTuneParams::default();
let root_delta = 64;
let delta = 32;
let r = reduction(&tune, true, 1, 1, delta, root_delta) / 1024;
assert!(r >= 0, "reduction should not be negative");
}
#[test]
fn test_reduction_extremes_no_overflow() {
let tune = SearchTuneParams::default();
let delta = 0;
let root_delta = 1;
let r = reduction(&tune, false, 63, 63, delta, root_delta);
assert!(
(0..i32::MAX / 2).contains(&r),
"reduction extreme should be in safe range, got {r}"
);
}
#[test]
fn test_reduction_zero_root_delta_clamped() {
let tune = SearchTuneParams::default();
let r = reduction(&tune, false, 10, 10, 0, 0) / 1024;
assert!(r >= 0, "reduction should clamp root_delta to >=1 even when 0 is passed");
}
#[test]
fn test_sentinel_initialization() {
let tt = Arc::new(TranspositionTable::new(16));
let eval_hash = Arc::new(EvalHash::new(1));
let worker = SearchWorker::new(tt, eval_hash, 0, 0, SearchTuneParams::default());
let sentinel = worker.cont_history_sentinel;
let sentinel_ref = unsafe { sentinel.as_ref() };
assert_eq!(
sentinel_ref.get(crate::types::Piece::B_PAWN, crate::types::Square::SQ_11),
crate::search::history::CONTINUATION_HISTORY_INIT,
"sentinel table should be initialized with YO-standard value"
);
for (i, stack) in worker.state.stack.iter().enumerate() {
assert_eq!(
stack.cont_history_ptr, sentinel,
"stack[{i}].cont_history_ptr should be initialized to sentinel"
);
}
}