use crypto_api_osrandom::error::Error;
const TEST_ITERATIONS: usize = 8;
const TEST_LENS: &[usize] = &[1024 * 1024, 4 * 1024 * 1024, (4 * 1024 * 1024) + 15];
fn test_uniform_dist(buf: &[u8]) {
let mut occurrences = vec![0f64; 256];
buf.iter().for_each(|b| occurrences[*b as usize] += 1.0);
let est_avg = (buf.len() as f64) / 256.0;
let (est_avg_min, est_avg_max) = (est_avg * 0.9, est_avg * 1.1);
occurrences.iter().for_each(|d| {
assert!(*d > est_avg_min, "{d} is not > {est_avg_min}");
assert!(*d < est_avg_max, "{d} is not < {est_avg_max}");
});
}
#[test]
fn test() -> Result<(), Error> {
for _ in 0..TEST_ITERATIONS {
for len in TEST_LENS {
let buf = crypto_api_osrandom::to_vec(*len)?;
test_uniform_dist(&buf)
}
}
Ok(())
}
#[test]
#[should_panic]
fn test_test_uniform_dist() {
let mut non_uniform_data = vec![0; (4 * 1024 * 1024) + 15];
non_uniform_data.extend(vec![7; (4 * 1024 * 1024) + 15]);
non_uniform_data.extend(vec![255; (4 * 1024 * 1024) + 15]);
test_uniform_dist(&non_uniform_data);
}