1use crate::BoxGen;
2
3pub 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}