wp-solana-test-core 0.1.1

Protocol-agnostic Solana test infrastructure built on LiteSVM
Documentation
use rand::{rngs::StdRng, SeedableRng};

/// Create a test RNG. Respects `SEED` env var for reproducibility.
///
/// When a fuzz test fails in CI, rerun with:
///
/// ```sh
/// SEED=<value> cargo test <test_name>
/// ```
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() {
        // Set SEED env var for this test
        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");

        // Clean up
        std::env::remove_var("SEED");
    }
}