use rand::Rng;
const USERNAME_PARTS: &[&str] =
&["bongo", "demit", "charles", "hotate", "mike"];
const ADJETIVES: &[&str] = &["happy", "sad", "angry", "tired"];
pub fn gen_username(with_num: bool) -> String {
let idx = rand::rng().random_range(0..USERNAME_PARTS.len());
let username = USERNAME_PARTS[idx];
let idx = rand::rng().random_range(0..ADJETIVES.len());
let adj = ADJETIVES[idx];
if with_num {
let num = rand::rng().random_range(0..4);
format!("{}_{}_{}", adj, username, num)
} else {
format!("{}_{}", adj, username)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_gen_username_structure() {
let user_with_num = gen_username(true);
let parts: Vec<&str> = user_with_num.split("_").collect();
assert_eq!(parts.len(), 3);
let user_without_num = gen_username(false);
let parts: Vec<&str> = user_without_num.split("_").collect();
assert_eq!(parts.len(), 2);
}
#[test]
fn test_username_integrity() {
let username = gen_username(false);
let mut parts = username.split("_");
let adj = parts.next().unwrap();
let name = parts.next().unwrap();
assert!(ADJETIVES.contains(&adj));
assert!(USERNAME_PARTS.contains(&name));
}
}