bolero_generator/
array.rs1use crate::{Driver, TypeGenerator, TypeGeneratorWithParams, TypeValueGenerator, ValueGenerator};
2
3impl<T: TypeGenerator, const LEN: usize> TypeGenerator for [T; LEN] {
4    fn generate<D: Driver>(driver: &mut D) -> Option<Self> {
5        driver.enter_product::<Self, _, _>(|driver| {
6            let mut maybe_init: [Option<T>; LEN] = [(); LEN].map(|_| None);
10
11            for value in &mut maybe_init {
12                *value = Some(T::generate(driver)?);
13            }
14
15            Some(maybe_init.map(|t| t.unwrap()))
16        })
17    }
18
19    fn mutate<D: Driver>(&mut self, driver: &mut D) -> Option<()> {
20        driver.enter_product::<Self, _, _>(|driver| {
21            for item in self.iter_mut() {
22                item.mutate(driver)?;
23            }
24            Some(())
25        })
26    }
27}
28
29impl<G: ValueGenerator, const LEN: usize> ValueGenerator for [G; LEN] {
30    type Output = [G::Output; LEN];
31
32    fn generate<D: Driver>(&self, driver: &mut D) -> Option<Self::Output> {
33        driver.enter_product::<Self::Output, _, _>(|driver| {
34            let mut maybe_init: [Option<G::Output>; LEN] = [(); LEN].map(|_| None);
38
39            for (generator, value) in self.iter().zip(&mut maybe_init) {
40                *value = Some(generator.generate(driver)?);
41            }
42
43            Some(maybe_init.map(|t| t.unwrap()))
44        })
45    }
46
47    fn mutate<D: Driver>(&self, driver: &mut D, value: &mut Self::Output) -> Option<()> {
48        driver.enter_product::<Self::Output, _, _>(|driver| {
49            for (generator, value) in self.iter().zip(value.iter_mut()) {
50                generator.mutate(driver, value)?;
51            }
52            Some(())
53        })
54    }
55}
56
57impl<T: TypeGenerator, const LEN: usize> TypeGeneratorWithParams for [T; LEN] {
58    type Output = [TypeValueGenerator<T>; LEN];
59
60    fn gen_with() -> Self::Output {
61        [T::produce(); LEN]
62    }
63}
64
65#[test]
66fn array_type_test() {
67    let _ = generator_test!(produce::<[u8; 10]>());
68}
69
70#[test]
71fn array_gen_test() {
72    let _ = generator_test!([produce::<u8>(), produce::<u8>()]);
73}