use approx::assert_ulps_eq;
use dds_bridge::{Hand, Holding};
use pons::eval::{
BUMRAP, BUMRAP_PLUS, FIFTHS, HandEvaluator, NLTC, SimpleEvaluator, hcp, hcp_plus, ltc,
shortness, zar,
};
#[test]
#[allow(clippy::unusual_byte_groupings)]
fn test_four_kings() {
const KXXX: Holding = Holding::from_bits_truncate(0b01000_0000_0111_00);
const KXX: Holding = Holding::from_bits_truncate(0b01000_0000_0011_00);
const HAND: Hand = Hand::new(KXXX, KXX, KXX, KXX);
assert_eq!(SimpleEvaluator(hcp::<u8>).eval(HAND), 12);
assert_ulps_eq!(FIFTHS.eval(HAND), 2.8 * 4.0);
assert_ulps_eq!(BUMRAP.eval(HAND), 12.0);
assert_eq!(SimpleEvaluator(ltc::<u8>).eval(HAND), 8);
assert_ulps_eq!(NLTC.eval(HAND), 8.0);
assert_eq!(zar::<u8>(HAND), 24);
}
#[test]
#[allow(clippy::unusual_byte_groupings)]
fn test_random_from_cuebids() {
const KJ53: Holding = Holding::from_bits_truncate(0b01010_0000_1010_00);
const K84: Holding = Holding::from_bits_truncate(0b01000_0100_0100_00);
const XX: Holding = Holding::from_bits_truncate(0b00000_0000_0110_00);
const KT85: Holding = Holding::from_bits_truncate(0b01001_0100_1000_00);
const HAND: Hand = Hand::new(KT85, XX, K84, KJ53);
assert_eq!(SimpleEvaluator(hcp::<u8>).eval(HAND), 10);
assert_eq!(SimpleEvaluator(hcp_plus::<u8>).eval(HAND), 11);
assert_ulps_eq!(FIFTHS.eval(HAND), 9.8);
assert_ulps_eq!(BUMRAP.eval(HAND), 10.0);
assert_ulps_eq!(BUMRAP_PLUS.eval(HAND), 11.0);
assert_eq!(SimpleEvaluator(ltc::<u8>).eval(HAND), 8);
assert_ulps_eq!(NLTC.eval(HAND), 8.5);
assert_eq!(zar::<u8>(HAND), 23);
}
#[test]
#[allow(clippy::unusual_byte_groupings)]
fn test_zar_waste() {
const A9876: Holding = Holding::from_bits_truncate(0b10000_1100_1100_00);
const K: Holding = Holding::from_bits_truncate(0b01000_0000_0000_00);
const QJ: Holding = Holding::from_bits_truncate(0b00110_0000_0000_00);
const T5432: Holding = Holding::from_bits_truncate(0b00001_0000_1111_00);
const HAND: Hand = Hand::new(T5432, QJ, K, A9876);
assert_eq!(zar::<u8>(HAND), 25);
}
#[test]
#[allow(clippy::unusual_byte_groupings)]
fn test_zar_aces() {
const AXXX: Holding = Holding::from_bits_truncate(0b10000_0000_0111_00);
const AXX: Holding = Holding::from_bits_truncate(0b10000_0000_0011_00);
const HAND: Hand = Hand::new(AXXX, AXX, AXX, AXX);
assert_eq!(zar::<u8>(HAND), 32);
}
#[test]
fn test_empty_hand() {
let hand = Hand::default();
assert_eq!(SimpleEvaluator(hcp::<u8>).eval(hand), 0);
assert_eq!(SimpleEvaluator(shortness::<u8>).eval(hand), 12);
assert_eq!(SimpleEvaluator(hcp_plus::<u8>).eval(hand), 12);
assert_ulps_eq!(FIFTHS.eval(hand), 0.0);
assert_ulps_eq!(BUMRAP.eval(hand), 0.0);
assert_ulps_eq!(BUMRAP_PLUS.eval(hand), 12.0);
assert_eq!(SimpleEvaluator(ltc::<u8>).eval(hand), 0);
assert_ulps_eq!(NLTC.eval(hand), 0.0);
assert_eq!(zar::<u8>(hand), 0);
}
#[test]
#[allow(clippy::unusual_byte_groupings)]
fn test_eval_pair() {
const KXXX: Holding = Holding::from_bits_truncate(0b01000_0000_0111_00);
const KXX: Holding = Holding::from_bits_truncate(0b01000_0000_0011_00);
const HAND: Hand = Hand::new(KXXX, KXX, KXX, KXX);
assert_eq!(SimpleEvaluator(hcp::<u8>).eval_pair([HAND, HAND]), 24);
}
#[test]
#[allow(clippy::unusual_byte_groupings)]
fn test_bumrap_plus_shortness() {
const A: Holding = Holding::from_bits_truncate(0b10000_0000_0000_00);
assert_ulps_eq!(BUMRAP_PLUS.0(A), 5.5);
assert_ulps_eq!(BUMRAP_PLUS.0(Holding::EMPTY), 3.0);
}