cs_utils/test/random_vec.rs
1use rand::distributions::uniform::SampleRange;
2
3use crate::{traits::Random, random_number};
4
5/// Generates a vector of items that implement the `Random` trait.
6///
7/// ### Examples
8///
9/// ```
10/// // Note: `test` or `all` crate features must be enabled to access the `test` module.
11/// #[cfg(any(feature = "test", feature = "all"))]
12/// use cs_utils::test::random_vec;
13/// // Note: `traits` or `all` crate features must be enabled to access the `traits` module.
14/// #[cfg(any(feature = "traits", feature = "all"))]
15/// use cs_utils::traits::Random;
16/// use cs_utils::{random_number, random_str};
17///
18/// #[derive(Debug)]
19/// struct SomeStruct {
20/// id: u16,
21/// name: String,
22/// }
23///
24/// impl Random for SomeStruct {
25/// fn random() -> Self {
26/// return SomeStruct {
27/// id: random_number(0..=u16::MAX),
28/// name: random_str(10),
29/// };
30/// }
31/// }
32///
33/// let items_count = random_number(3..=5);
34/// let result: Vec<SomeStruct> = random_vec(items_count);
35///
36/// assert_eq!(
37/// result.len() as u32,
38/// items_count,
39/// "Must create {} items.", &items_count,
40/// );
41/// println!("{:?}", &result);
42/// ```
43pub fn random_vec<T: Random>(items_count: u32) -> Vec<T> {
44 let mut result = vec![];
45 let mut i = items_count;
46
47 while i > 0 {
48 result.push(T::random());
49 i -= 1;
50 }
51
52 return result;
53}
54
55/// Generates a vector of items that implement the `Random` trait.
56///
57/// ### Examples
58///
59/// ```
60/// use cs_utils::test::random_vec_rg;
61/// use cs_utils::traits::Random;
62/// use cs_utils::{random_number, random_str};
63///
64/// #[derive(Debug)]
65/// struct SomeStruct {
66/// id: u16,
67/// name: String,
68/// }
69///
70/// impl Random for SomeStruct {
71/// fn random() -> Self {
72/// return SomeStruct {
73/// id: random_number(0..=u16::MAX),
74/// name: random_str(10),
75/// };
76/// }
77/// }
78///
79/// let result: Vec<SomeStruct> = random_vec_rg(3..7);
80///
81/// assert!(
82/// result.len() >= 3,
83/// "Must create at least 3 items.",
84/// );
85///
86/// assert!(
87/// result.len() < 7,
88/// "Must create at most 6 items.",
89/// );
90///
91/// println!("{:?}", &result);
92/// ```
93pub fn random_vec_rg<T: Random, R: SampleRange<u32>>(range: R) -> Vec<T> {
94 let messages_count = random_number(range);
95
96 return random_vec::<T>(messages_count);
97}