use rand::{rngs::StdRng, SeedableRng};
pub fn test_rng() -> StdRng {
if let Ok(seed) = std::env::var("SEED") {
let bytes = seed.as_bytes();
let mut seed_arr = [0u8; 32];
let len = bytes.len().min(32);
seed_arr[..len].copy_from_slice(&bytes[..len]);
StdRng::from_seed(seed_arr)
} else {
StdRng::from_os_rng()
}
}
#[cfg(test)]
mod tests {
use rand::Rng;
use super::*;
#[test]
fn test_rng_returns_usable_rng() {
let mut rng = test_rng();
let _value: u64 = rng.random();
}
#[test]
fn test_rng_deterministic_with_seed_env() {
std::env::set_var("SEED", "deterministic-test-seed");
let mut rng1 = test_rng();
let mut rng2 = test_rng();
let values1: Vec<u64> = (0..10).map(|_| rng1.random()).collect();
let values2: Vec<u64> = (0..10).map(|_| rng2.random()).collect();
assert_eq!(values1, values2, "same SEED must produce identical sequences");
std::env::remove_var("SEED");
}
}