monkey_test/gen/
vec.rs

1//! Generators for vectors.
2//!
3//! One design choice of the vector generator implementation is that example
4//! vectors are expected to over time be potentially longer and longer,
5//! when iterating over the example iterator.
6//!
7//! ```rust
8//! use monkey_test::*;
9//!
10//! let some_seed = 1337;
11//! let vectors_of_nine = gen::vec::any(gen::fixed::constant(9));
12//!
13//! let actual_examples = vectors_of_nine
14//!     .examples(some_seed)
15//!     .take(20)
16//!     .collect::<Vec<Vec<i32>>>();
17//!
18//! assert_eq!{
19//!     actual_examples,
20//!     vec![
21//!         vec![],
22//!         vec![9],
23//!         vec![9, 9],
24//!         vec![9, 9, 9],
25//!         vec![9, 9, 9, 9],
26//!         vec![9, 9, 9],
27//!         vec![9, 9, 9, 9, 9, 9],
28//!         vec![9, 9, 9, 9, 9],
29//!         vec![9, 9, 9, 9, 9, 9],
30//!         vec![9, 9, 9],
31//!         vec![9, 9, 9, 9, 9, 9, 9],
32//!         vec![9, 9, 9],
33//!         vec![9],
34//!         vec![9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
35//!         vec![9],
36//!
37//!         vec![9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
38//!
39//!         vec![9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
40//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
41//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
42//!
43//!         vec![9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
44//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
45//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
46//!              9],
47//!
48//!         vec![9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
49//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
50//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
51//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
52//!              9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9],
53//!
54//!         vec![9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
55//!     ]
56//! };
57//! ```
58
59use crate::BoxGen;
60
61/// Any vector filled with values from given element generator
62pub fn any<E: Clone + 'static>(element_gen: BoxGen<E>) -> BoxGen<Vec<E>> {
63    let element_shrinker = element_gen.shrinker();
64
65    crate::gen::from_fn(move |seed| {
66        let sizes = crate::gen::sized::default().examples(seed);
67        let seeds = crate::gen::seeds().examples(seed);
68        let element_gen = element_gen.clone();
69
70        sizes.zip(seeds).map(move |(size, seed)| {
71            element_gen.examples(seed).take(size).collect::<Vec<_>>()
72        })
73    })
74    .with_shrinker(crate::shrink::vec::default(element_shrinker))
75}