pub(crate) fn fill_random_bytes(buffer: &mut [u8]) {
getrandom::fill(buffer).expect("failed to fill buffer with random bytes");
}
pub(crate) fn random_range_u16(range: core::ops::RangeInclusive<u16>) -> u16 {
let (min, max) = (*range.start(), *range.end());
let mut bytes = [0u8; 2];
fill_random_bytes(&mut bytes);
let random = u16::from_le_bytes(bytes);
let span = (max - min) as u32 + 1;
min + ((random as u32 * span) >> 16) as u16
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fill_random_bytes_fills_buffer() {
let mut buffer = [0u8; 16];
fill_random_bytes(&mut buffer);
assert!(buffer.iter().any(|&b| b != 0));
}
#[test]
fn fill_random_bytes_produces_different_values() {
let mut buffer1 = [0u8; 16];
let mut buffer2 = [0u8; 16];
fill_random_bytes(&mut buffer1);
fill_random_bytes(&mut buffer2);
assert_ne!(buffer1, buffer2);
}
#[test]
fn random_range_u16_within_bounds() {
for _ in 0..1000 {
let value = random_range_u16(10..=20);
assert!(
(10..=20).contains(&value),
"value {} out of range 10..=20",
value
);
}
}
#[test]
fn random_range_u16_single_value() {
for _ in 0..100 {
let value = random_range_u16(42..=42);
assert_eq!(value, 42);
}
}
#[test]
fn random_range_u16_full_range() {
let mut seen_low = false;
let mut seen_high = false;
for _ in 0..1000 {
let value = random_range_u16(0..=100);
if value < 20 {
seen_low = true;
}
if value > 80 {
seen_high = true;
}
}
assert!(seen_low, "never saw values in low range");
assert!(seen_high, "never saw values in high range");
}
#[test]
fn random_range_u16_edge_values() {
for _ in 0..1000 {
let value = random_range_u16(0..=u16::MAX);
let _ = value;
}
}
}