Skip to main content

rand_unique/
rand.rs

1use rand::TryRng;
2
3use crate::{RandomSequence, RandomSequenceBuilder};
4
5macro_rules! init_rand {
6    ($type:ident, $tests:ident) => {
7        impl RandomSequenceBuilder<$type> {
8            /// Initialise a RandomSequenceBuilder from a random seed.
9            pub fn rand(rng: &mut impl TryRng) -> Self {
10                let seed_base = rng.try_next_u64().unwrap() as $type;
11                let seed_offset = rng.try_next_u64().unwrap() as $type;
12                Self::new(seed_base, seed_offset)
13            }
14        }
15
16        impl RandomSequence<$type> {
17            /// Initialise a RandomSequence from a random seed.
18            pub fn rand(rng: &mut impl TryRng) -> Self {
19                RandomSequenceBuilder::<$type>::rand(rng).into_iter()
20            }
21        }
22
23        #[cfg(test)]
24        mod $tests {
25            use rand::rngs::SysRng;
26
27            use super::*;
28
29            #[test]
30            fn test_rand() {
31                let mut rng = SysRng;
32                let config1 = RandomSequenceBuilder::<$type>::rand(&mut rng);
33                let config2 = RandomSequenceBuilder::<$type>::rand(&mut rng);
34                assert_ne!(config1, config2);
35
36                let mut sequence = RandomSequence::<$type>::rand(&mut rng);
37                assert_ne!(sequence.next(), sequence.next());
38            }
39        }
40    };
41}
42
43init_rand!(u8, tests_u8);
44init_rand!(u16, tests_u16);
45init_rand!(u32, tests_u32);
46init_rand!(u64, tests_u64);
47init_rand!(usize, tests_usize);