1use rand::RngCore;
2
3use crate::{RandomSequence, RandomSequenceBuilder};
4
5macro_rules! init_rand {
6 ($type:ident, $tests:ident) => {
7 impl RandomSequenceBuilder<$type> {
8 pub fn rand(rng: &mut impl RngCore) -> Self {
10 let seed_base = rng.next_u64() as $type;
11 let seed_offset = rng.next_u64() as $type;
12 Self::new(seed_base, seed_offset)
13 }
14 }
15
16 impl RandomSequence<$type> {
17 pub fn rand(rng: &mut impl RngCore) -> Self {
19 RandomSequenceBuilder::<$type>::rand(rng).into_iter()
20 }
21 }
22
23 #[cfg(test)]
24 mod $tests {
25 use rand::rngs::OsRng;
26
27 use super::*;
28
29 #[test]
30 fn test_rand() {
31 let mut rng = OsRng;
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);