sharing/
string.rs

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        // Generate multiple strings and check they're different
45        let str1 = generate_random_string(20);
46        let str2 = generate_random_string(20);
47        let str3 = generate_random_string(20);
48        
49        // While it's theoretically possible they're the same, it's extremely unlikely
50        // with 20 characters from a 62-character charset
51        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}