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}