use ts_control::sampling;
use ts_wire::{decode_bytes, SamplingParams};
fn unhex(text: &str) -> Vec<u8> {
(0..text.len())
.step_by(2)
.map(|i| u8::from_str_radix(&text[i..i + 2], 16).unwrap())
.collect()
}
fn assert_same(rid: &str, rust: &SamplingParams, python: &SamplingParams) {
assert_eq!(rust, python, "{rid}");
}
#[test]
fn rust_resolves_parameters_as_python_does() {
let path = format!("{}/tests/fixtures/sampling.hex", env!("CARGO_MANIFEST_DIR"));
let text = std::fs::read_to_string(path).unwrap();
let mut cases = 0;
for line in text.lines() {
let [raw, rid, expected, verdict] = line.split(' ').collect::<Vec<_>>()[..] else {
panic!("malformed line {line:?}");
};
let rid = String::from_utf8(unhex(rid)).unwrap();
let mut params: SamplingParams = decode_bytes(&unhex(raw)).unwrap();
sampling::resolve(&mut params, &rid);
let python: SamplingParams = decode_bytes(&unhex(expected)).unwrap();
assert_same(&rid, ¶ms, &python);
let valid = sampling::verify(¶ms, 1000);
assert_eq!(valid.is_ok(), verdict == "ok", "{rid}: {valid:?}");
cases += 1;
}
assert!(cases >= 20, "only {cases} cases");
}