1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use rand::RngCore;

use crate::{RandomSequence, RandomSequenceBuilder};

macro_rules! init_rand {
    ($type:ident, $tests:ident) => {
        impl RandomSequenceBuilder<$type> {
            /// Initialise a RandomSequenceBuilder from a random seed.
            pub fn rand(rng: &mut impl RngCore) -> Self {
                let seed_base = rng.next_u64() as $type;
                let seed_offset = rng.next_u64() as $type;
                Self::new(seed_base, seed_offset)
            }
        }

        impl RandomSequence<$type> {
            /// Initialise a RandomSequence from a random seed.
            pub fn rand(rng: &mut impl RngCore) -> Self {
                RandomSequenceBuilder::<$type>::rand(rng).into_iter()
            }
        }

        #[cfg(test)]
        mod $tests {
            use rand::rngs::OsRng;

            use super::*;

            #[test]
            fn test_rand() {
                let mut rng = OsRng;
                let config1 = RandomSequenceBuilder::<$type>::rand(&mut rng);
                let config2 = RandomSequenceBuilder::<$type>::rand(&mut rng);
                assert_ne!(config1, config2);

                let mut sequence = RandomSequence::<$type>::rand(&mut rng);
                assert_ne!(sequence.next(), sequence.next());
            }
        }
    };
}

init_rand!(u8, tests_u8);
init_rand!(u16, tests_u16);
init_rand!(u32, tests_u32);
init_rand!(u64, tests_u64);