monkey_test/gen/
chain.rs

1use crate::BoxGen;
2
3/// Concatenate together two generators.
4///
5/// Second generator is used only when first generator is emptied.
6/// If first generator is infinite, second generator will never be used.
7///
8/// ```
9/// use monkey_test::gen::fixed::sequence;
10/// use monkey_test::*;
11///
12/// let a = sequence::<u32>(&[1, 2]);
13/// let b = sequence::<u32>(&[3, 4]);
14/// let c = a.chain(b);
15/// let mut it = c.examples(77);
16///
17/// assert_eq!(it.collect::<Vec<_>>(), vec![1, 2, 3, 4]);
18/// ```
19pub fn chain<E>(first_gen: BoxGen<E>, second_gen: BoxGen<E>) -> BoxGen<E>
20where
21    E: Clone + 'static,
22{
23    let shrinker = first_gen.shrinker();
24
25    crate::gen::from_fn(move |seed| {
26        first_gen.examples(seed).chain(second_gen.examples(seed))
27    })
28    .with_shrinker(shrinker)
29}
30
31#[cfg(test)]
32mod test {
33    use crate::{gen::fixed, testing::assert_iter_eq};
34
35    #[test]
36    fn empty_generators() {
37        let gen = super::chain(
38            fixed::sequence::<u8>(&[]),
39            fixed::sequence::<u8>(&[]),
40        );
41
42        assert_iter_eq(
43            gen.examples(1234),
44            vec![],
45            "empty generators has no examples to concatenate",
46        );
47    }
48
49    #[test]
50    fn some_elements_in_each_generator() {
51        let gen = super::chain(
52            fixed::sequence::<u8>(&[1, 2]),
53            fixed::sequence::<u8>(&[3, 4]),
54        );
55
56        assert_iter_eq(
57            gen.examples(1234),
58            vec![1, 2, 3, 4],
59            "given generators' examples are concatenated",
60        );
61    }
62}