use super::*;
impl<E: Environment> Distribution<IdentifierLiteral<E>> for Standard {
#[inline]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> IdentifierLiteral<E> {
let num_bytes = rng.gen_range(1..=SIZE_IN_BYTES);
let first_char = if rng.gen_bool(0.5) {
char::from(b'A' + rng.gen_range(0..26))
} else {
char::from(b'a' + rng.gen_range(0..26))
};
let rest: String = (0..num_bytes - 1)
.map(|_| {
let idx = rng.gen_range(0..63);
match idx {
0..26 => char::from(b'a' + u8::try_from(idx).unwrap()),
26..52 => char::from(b'A' + u8::try_from(idx - 26).unwrap()),
52..62 => char::from(b'0' + u8::try_from(idx - 52).unwrap()),
_ => '_',
}
})
.collect();
let string = format!("{first_char}{rest}");
IdentifierLiteral::new(&string).expect("Failed to generate random identifier literal")
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network_environment::Console;
use std::collections::HashSet;
type CurrentEnvironment = Console;
const ITERATIONS: usize = 1000;
#[test]
fn test_random() {
let mut rng = TestRng::default();
let mut seen = HashSet::new();
for _ in 0..ITERATIONS {
let literal: IdentifierLiteral<CurrentEnvironment> = Uniform::rand(&mut rng);
let display = literal.to_string();
let recovered = IdentifierLiteral::<CurrentEnvironment>::from_str(&display).unwrap();
assert_eq!(literal, recovered);
seen.insert(display);
}
assert!(seen.len() > ITERATIONS / 2);
}
}