malvin 0.2.6

Non-interactive research and coding agent
use rand::Rng;

#[must_use]
pub fn random_alnum(len: usize) -> String {
    const ALPHABET: &[u8] = b"abcdefghijklmnopqrstuvwxyz0123456789";
    let mut rng = rand::thread_rng();
    (0..len)
        .map(|_| {
            let i = rng.gen_range(0..ALPHABET.len());
            ALPHABET[i] as char
        })
        .collect()
}

#[cfg(test)]
mod tests {
    #[test]
    fn random_alnum_len_matches_request() {
        assert_eq!(super::random_alnum(12).len(), 12);
        assert_eq!(super::random_alnum(0).len(), 0);
    }

    #[test]
    fn random_alnum_charset_fuzz_samples() {
        for len in [1usize, 8, 32, 64] {
            let s = super::random_alnum(len);
            assert_eq!(s.len(), len);
            assert!(
                s.chars()
                    .all(|c| c.is_ascii_lowercase() || c.is_ascii_digit()),
                "non-alnum char in {s:?}"
            );
            assert!(!s.chars().any(|c| c.is_ascii_uppercase()));
        }
    }
}