use super::RamInitMode;
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
pub fn initialize_ram(buffer: &mut [u8], mode: RamInitMode) {
match mode {
RamInitMode::Zero => {
buffer.fill(0x00);
}
RamInitMode::Random => {
let mut rng = rand::rng();
rng.fill(buffer);
}
RamInitMode::SeededRandom(seed) => {
let mut rng = StdRng::seed_from_u64(seed);
rng.fill(buffer);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_zero_mode_initializes_to_zero() {
let mut buffer = vec![0xFF; 1024];
initialize_ram(&mut buffer, RamInitMode::Zero);
assert!(buffer.iter().all(|&b| b == 0x00));
}
#[test]
fn test_seeded_random_is_deterministic() {
let mut buffer1 = vec![0; 1024];
let mut buffer2 = vec![0; 1024];
initialize_ram(&mut buffer1, RamInitMode::SeededRandom(42));
initialize_ram(&mut buffer2, RamInitMode::SeededRandom(42));
assert_eq!(
buffer1, buffer2,
"Same seed should produce identical results"
);
}
#[test]
fn test_seeded_random_different_seeds_produce_different_values() {
let mut buffer1 = vec![0; 1024];
let mut buffer2 = vec![0; 1024];
initialize_ram(&mut buffer1, RamInitMode::SeededRandom(42));
initialize_ram(&mut buffer2, RamInitMode::SeededRandom(43));
assert_ne!(
buffer1, buffer2,
"Different seeds should produce different results"
);
}
#[test]
fn test_seeded_random_produces_nonzero_values() {
let mut buffer = vec![0; 1024];
initialize_ram(&mut buffer, RamInitMode::SeededRandom(42));
assert!(buffer.iter().any(|&b| b != 0x00));
}
#[test]
fn test_random_mode_produces_nonzero_values() {
let mut buffer = vec![0; 1024];
initialize_ram(&mut buffer, RamInitMode::Random);
assert!(buffer.iter().any(|&b| b != 0x00));
}
}