use {
super::fortuna::NoEntropy,
crate::{shuffle, uniform_random, util::CollectVec, Aes256, Fortuna, Sha256},
std::{collections::HashSet, ops::Range},
};
#[test]
fn random_within_range() {
let rng = Fortuna::new(NoEntropy, Aes256::default(), Sha256::default()).unwrap();
let mut iter = rng.into_iter();
test_range(&mut iter, 0..1);
test_range(&mut iter, 0..2);
test_range(&mut iter, 5..50);
}
#[test]
fn random_empty_range_returns_zero() {
let rng = Fortuna::new(NoEntropy, Aes256::default(), Sha256::default()).unwrap();
let mut iter = rng.into_iter();
let draw = uniform_random(&mut iter, 0..0);
assert_eq!(draw, 0);
}
#[test]
fn random_shuffle() {
let rng = Fortuna::new(NoEntropy, Aes256::default(), Sha256::default()).unwrap();
let mut iter = rng.into_iter();
let original = (0..100).collect_vec();
let mut shuffled = original.clone();
shuffle(&mut iter, &mut shuffled);
assert_ne!(original, shuffled);
assert!(original.iter().all(|x| shuffled.contains(x)));
assert!(shuffled.iter().all(|x| original.contains(x)));
}
fn test_range(iter: &mut impl Iterator<Item = u8>, range: Range<u32>) {
let mut draws = HashSet::new();
for _ in 0..100 {
let draw = uniform_random(iter, range.clone());
draws.insert(draw);
assert!(range.contains(&draw));
}
if range.len() > 1 {
assert!(draws.len() > 1);
}
}