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}