1use rand::Rng;
2const CHARSET: &[u8] = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
3
4pub fn generate_random_string(length: usize) -> String {
5 let mut rng = rand::thread_rng();
6 let random_string: String = (0..length)
7 .map(|_| {
8 let index = rng.gen_range(0..CHARSET.len());
9 CHARSET[index] as char
10 })
11 .collect();
12
13 random_string
14}
15
16#[cfg(test)]
17mod tests {
18 use super::*;
19
20 #[test]
21 fn test_generate_random_string_length() {
22 let length = 10;
23 let result = generate_random_string(length);
24 assert_eq!(result.len(), length, "Generated string should have correct length");
25 }
26
27 #[test]
28 fn test_generate_random_string_zero_length() {
29 let result = generate_random_string(0);
30 assert_eq!(result.len(), 0, "Zero length should return empty string");
31 }
32
33 #[test]
34 fn test_generate_random_string_charset() {
35 let result = generate_random_string(100);
36 for ch in result.chars() {
37 assert!(CHARSET.contains(&(ch as u8)),
38 "All characters should be from the charset");
39 }
40 }
41
42 #[test]
43 fn test_generate_random_string_uniqueness() {
44 let str1 = generate_random_string(20);
46 let str2 = generate_random_string(20);
47 let str3 = generate_random_string(20);
48
49 assert_ne!(str1, str2, "Generated strings should be different");
52 assert_ne!(str2, str3, "Generated strings should be different");
53 assert_ne!(str1, str3, "Generated strings should be different");
54 }
55
56 #[test]
57 fn test_generate_random_string_large_length() {
58 let length = 1000;
59 let result = generate_random_string(length);
60 assert_eq!(result.len(), length, "Should handle large lengths");
61 }
62}