use parking_lot::Mutex;
use std::sync::LazyLock;
static THREAD_POOL: LazyLock<Mutex<()>> = LazyLock::new(|| {
unsafe { crate::SetMaxThreads(0) };
Mutex::new(())
});
#[allow(clippy::cast_possible_wrap)]
const SUCCESS: i32 = crate::RETURN_NO_FAULT as i32;
const FULL_SUIT: core::ffi::c_uint = ((1 << 13) - 1) << 2;
const FOUR_SF_DEAL: crate::ddTableDeal = crate::ddTableDeal {
cards: [
[0, 0, 0, FULL_SUIT], [0, 0, FULL_SUIT, 0], [0, FULL_SUIT, 0, 0], [FULL_SUIT, 0, 0, 0], ],
};
const FOUR_SF_TRICKS: crate::ddTableResults = crate::ddTableResults {
resTable: [
[0, 13, 0, 13], [13, 0, 13, 0], [0, 13, 0, 13], [13, 0, 13, 0], [0, 0, 0, 0], ],
};
#[test]
fn calc_dd_table_four_straight_flushes() {
let mut tricks = crate::ddTableResults::default();
let status = {
let _guard = THREAD_POOL.lock();
unsafe { crate::CalcDDtable(FOUR_SF_DEAL, &raw mut tricks) }
};
assert_eq!(status, SUCCESS);
assert_eq!(tricks, FOUR_SF_TRICKS);
}
#[test]
fn calc_all_tables_pbnx_one_deal() {
const PBN: &[u8] = b"N:...AKQJT98765432 ..AKQJT98765432. .AKQJT98765432.. AKQJT98765432...\0";
let mut deal = crate::ddTableDealPBN::default();
assert!(PBN.len() <= deal.cards.len());
for (dst, &b) in deal.cards.iter_mut().zip(PBN.iter()) {
*dst = b as _;
}
let mut deals = [deal];
let mut trump_filter = [0; crate::DDS_STRAINS as usize];
let mut results = [crate::ddTableResults::default(); 1];
let status = {
let _guard = THREAD_POOL.lock();
unsafe {
crate::CalcAllTablesPBNx(
1,
deals.as_mut_ptr(),
-1, trump_filter.as_mut_ptr(),
results.as_mut_ptr(),
core::ptr::null_mut(),
)
}
};
assert_eq!(status, SUCCESS);
assert_eq!(results[0], FOUR_SF_TRICKS);
}