use rand::seq::SliceRandom;
use rand::Rng;
use chrono::{NaiveDate, Duration};
use rand::prelude::IndexedRandom;
use chrono::Datelike;
pub fn random_first_name() -> String {
let names = ["Alice", "Bob", "Charlie", "Diana", "Eve", "Frank", "Grace", "Hank"];
let mut rng = rand::thread_rng();
names.choose(&mut rng).unwrap().to_string()
}
pub fn random_last_name() -> String {
let names = ["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis"];
let mut rng = rand::thread_rng();
names.choose(&mut rng).unwrap().to_string()
}
pub fn random_full_name() -> String {
format!("{} {}", random_first_name(), random_last_name())
}
pub fn random_email() -> String {
let domains = ["example.com", "test.com", "demo.com", "sample.org"];
let mut rng = rand::thread_rng();
let username = random_first_name().to_lowercase();
let domain = domains.choose(&mut rng).unwrap();
format!("{}@{}", username, domain)
}
pub fn random_phone_number() -> String {
let mut rng = rand::thread_rng();
let area_code = rng.gen_range(100..=999);
let exchange = rng.gen_range(100..=999);
let subscriber = rng.gen_range(1000..=9999);
format!("({}) {}-{}", area_code, exchange, subscriber)
}
pub fn random_date(start_year: i32, end_year: i32) -> NaiveDate {
let mut rng = rand::thread_rng();
let start = NaiveDate::from_ymd_opt(start_year, 1, 1).unwrap();
let end = NaiveDate::from_ymd_opt(end_year, 12, 31).unwrap();
let days = (end - start).num_days();
start + Duration::days(rng.gen_range(0..=days))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_random_first_name() {
let name = random_first_name();
assert!(!name.is_empty());
}
#[test]
fn test_random_last_name() {
let name = random_last_name();
assert!(!name.is_empty());
}
#[test]
fn test_random_full_name() {
let name = random_full_name();
assert!(name.contains(' '));
}
#[test]
fn test_random_email() {
let email = random_email();
assert!(email.contains('@'));
}
#[test]
fn test_random_phone_number() {
let phone = random_phone_number();
assert_eq!(phone.len(), 14); }
#[test]
fn test_random_date() {
let date = random_date(2000, 2023);
assert!(date.year() >= 2000 && date.year() <= 2023);
}
}