1#![forbid(unsafe_code)]
2
3use rand::{seq::SliceRandom, seq::IteratorRandom};
4use std::iter::repeat_with;
5
6#[inline]
7pub fn generate(dictionary: &str, size: usize) -> String {
8 generate_vec(&dictionary.chars().collect(), size)
9 .iter()
10 .collect()
11}
12#[inline]
13pub fn generate_vec<T: Clone>(dictionary: &Vec<T>, size: usize) -> Vec<T> {
14 let mut rng = rand::thread_rng();
15
16 repeat_with(|| dictionary.choose(&mut rng).unwrap().clone())
17 .take(size)
18 .collect()
19}
20#[inline]
21pub fn generate_vec_clone_lately<T: Clone>(dictionary: &Vec<T>, size: usize) -> Vec<T> {
22 let mut rng = rand::thread_rng();
23
24 repeat_with(|| dictionary.choose(&mut rng).unwrap())
25 .take(size)
26 .cloned()
27 .collect()
28}
29
30#[inline]
31pub fn generate_vec_for<T: Clone>(dictionary: &Vec<T>, size: usize) -> Vec<T> {
32 let mut rng = rand::thread_rng();
33 let mut v = vec![];
34
35 for _ in 0..size {
36 v.push(dictionary.choose(&mut rng).unwrap().clone());
37 }
38
39 v
40}
41
42#[inline]
43pub fn generate_generic<T: Clone + IteratorRandom>(symbols: T, size: usize) -> Vec<T::Item> {
44 let mut rng = rand::thread_rng();
45 repeat_with(|| symbols.clone().choose(&mut rng).unwrap())
46 .take(size)
47 .collect()
48}
49
50#[inline]
51pub fn generate_old<T: AsRef<str>>(symbols: T, size: usize) -> String {
52 let symbols = symbols.as_ref();
53
54 let mut rng = rand::thread_rng();
55 repeat_with(|| symbols.chars().choose(&mut rng).unwrap())
56 .take(size)
57 .collect()
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63 #[test]
64 #[should_panic]
65 fn test_generate_empty() {
66 generate("", 256);
67 }
68 #[test]
69 fn test_generate_trivial() {
70 let s = generate("x", 5);
71 assert_eq!(s, "xxxxx")
72 }
73 #[test]
74 fn test_generate_simple() {
75 let s = generate("abc", 10);
76 assert_eq!(s.len(), 10);
77 assert_eq!(s.chars().count(), 10);
78 }
79 #[test]
80 fn test_generate_zero() {
81 let s = generate("abc", 0);
82 assert_eq!(s, "")
83 }
84 #[test]
85 fn test_generate_emojis_trivial() {
86 let s = generate("👍", 10);
87 assert_eq!(s, "👍👍👍👍👍👍👍👍👍👍")
88 }
89 #[test]
90 fn test_generate_emojis() {
91 let s = generate("🏉👍🌱", 10);
92 assert_eq!(s.len(), 40);
93 assert_eq!(s.chars().count(), 10)
94 }
95
96 #[test]
97 #[should_panic]
98 fn test_generate2_empty() {
99 generate_generic("".chars(), 256);
100 }
101 #[test]
102 fn test_generate2_trivial() {
103 let s = generate_generic("x".chars(), 5);
104 assert_eq!(s, "xxxxx".chars().collect::<Vec<char>>())
105 }
106 #[test]
107 fn test_generate2_simple() {
108 let s = generate_generic("abc".chars(), 10);
109 assert_eq!(s.len(), 10);
110 }
111 #[test]
112 fn test_generate2_zero() {
113 let s = generate_generic("abc".chars(), 0);
114 assert_eq!(s, Vec::<char>::new())
115 }
116 #[test]
117 fn test_generate2_emojis_trivial() {
118 let s = generate_generic("👍".chars(), 10);
119 assert_eq!(s, "👍👍👍👍👍👍👍👍👍👍".chars().collect::<Vec<char>>())
120 }
121 #[test]
122 fn test_generate2_emojis() {
123 let s = generate_generic("🏉👍🌱".chars(), 10);
124 assert_eq!(s.len(), 10);
125 }
126}