testing_utils/
lib.rs

1use std::net::{IpAddr, Ipv4Addr};
2
3pub trait Randomize {
4    fn random() -> Self
5    where
6        Self: Sized;
7
8    fn rand_list0(range: u32) -> Vec<Self>
9    where
10        Self: Sized,
11    {
12        (0..=rand_num_from(1..=range))
13            .map(|_| Self::random())
14            .collect::<Vec<Self>>()
15    }
16
17    fn rand_list1(range: u32) -> Vec<Self>
18    where
19        Self: Sized,
20    {
21        (1..=rand_num_from(1..=range))
22            .map(|_| Self::random())
23            .collect::<Vec<Self>>()
24    }
25
26    fn list(size: u16) -> Vec<Self>
27    where
28        Self: Sized,
29    {
30        (1..=size).map(|_| Self::random()).collect::<Vec<Self>>()
31    }
32}
33
34pub fn opt<T: Clone>(t: T) -> Option<T> {
35    sample(&[Some(t), None])
36}
37
38impl crate::Randomize for bool {
39    fn random() -> Self {
40        use rand::Rng;
41
42        let mut rng = rand::thread_rng();
43
44        rng.gen_range(0..1000) > 500
45    }
46}
47
48pub fn sample<T: Clone, const N: usize>(array: &[T; N]) -> T {
49    use rand::Rng;
50
51    let mut rng = rand::thread_rng();
52
53    array[rng.gen_range(0..array.len())].clone()
54}
55
56pub fn sample_vec<T: Clone>(vector: &[T]) -> T {
57    use rand::Rng;
58
59    let mut rng = rand::thread_rng();
60
61    vector.get(rng.gen_range(0..vector.len())).cloned().unwrap()
62}
63
64pub fn rand_str_of(size: usize) -> String {
65    use rand::{distributions::Alphanumeric, Rng};
66
67    rand::thread_rng()
68        .sample_iter(&Alphanumeric)
69        .take(size)
70        .map(char::from)
71        .collect()
72}
73
74impl Randomize for String {
75    fn random() -> Self {
76        use rand::{distributions::Alphanumeric, Rng};
77
78        rand::thread_rng()
79            .sample_iter(&Alphanumeric)
80            .take(10)
81            .map(char::from)
82            .collect()
83    }
84}
85
86pub fn rand_num_from<T, R>(range: R) -> T
87where
88    T: rand::distributions::uniform::SampleUniform,
89    R: rand::distributions::uniform::SampleRange<T>,
90{
91    use rand::Rng;
92
93    let mut rng = rand::thread_rng();
94
95    rng.gen_range(range)
96}
97
98impl Randomize for IpAddr {
99    fn random() -> Self {
100        IpAddr::V4(Randomize::random())
101    }
102}
103
104impl Randomize for Ipv4Addr {
105    fn random() -> Self {
106        let ip_part = || rand_num_from(1..255);
107
108        Ipv4Addr::new(ip_part(), ip_part(), ip_part(), ip_part())
109    }
110}