use libzstd_bitexact_rs::cparams_for_testing;
const CONTENTSIZE_UNKNOWN: u64 = u64::MAX;
fn oracle(level: i32, src: u64, dict: u64) -> [u32; 7] {
let cp = unsafe { zstd_sys::ZSTD_getCParams(level, src, dict as usize) };
[
cp.windowLog,
cp.chainLog,
cp.hashLog,
cp.searchLog,
cp.minMatch,
cp.targetLength,
cp.strategy as u32,
]
}
#[test]
fn cparams_match_c_oracle_over_matrix() {
let levels: Vec<i32> = {
let mut v = vec![
i32::MIN,
-200_000,
-131_072, -131_071,
-1_000,
-10,
-3,
-2,
-1,
];
v.extend(0..=22);
v.extend([23, 24, 100, i32::MAX]);
v
};
let srcs: Vec<u64> = vec![
0,
1,
19,
63,
64,
65,
500,
512,
513,
1024,
16 * 1024 - 1,
16 * 1024,
16 * 1024 + 1,
60_000,
65_536,
128 * 1024 - 1,
128 * 1024,
128 * 1024 + 1,
256 * 1024 - 1,
256 * 1024,
256 * 1024 + 1,
1 << 20,
(1 << 30) - 1,
1 << 30,
(1 << 30) + 1,
1 << 31,
1 << 40,
];
let dicts: Vec<u64> = vec![
0,
1,
7,
8,
9,
64,
1024,
8 * 1024,
16 * 1024,
32 * 1024,
64 * 1024,
112_640, 128 * 1024,
256 * 1024,
1 << 20,
(1 << 30) - 1,
1 << 30,
(1 << 30) + 1,
1 << 31,
];
let mut checked = 0u64;
for &level in &levels {
for &src in &srcs {
for &dict in &dicts {
let src_hint = if src == 0 { CONTENTSIZE_UNKNOWN } else { src };
let mine = cparams_for_testing(level, src_hint, dict);
let theirs = oracle(level, src, dict);
assert_eq!(
mine, theirs,
"cParams mismatch at level={level} src={src} dict={dict}\n\
mine [w,c,h,s,mm,tl,strat] = {mine:?}\n\
C [w,c,h,s,mm,tl,strat] = {theirs:?}"
);
checked += 1;
}
}
}
assert_eq!(
checked,
levels.len() as u64 * srcs.len() as u64 * dicts.len() as u64
);
assert!(checked > 10_000, "matrix unexpectedly small: {checked}");
}