1#![cfg_attr(all(test, feature = "_bench"), feature(test))]
12#![cfg_attr(docsrs, feature(doc_cfg))]
13
14extern crate alloc;
15#[cfg(all(test, feature = "_bench"))]
16extern crate test;
17
18use std::path::Path;
19
20mod base64;
21mod config;
22mod cover;
23mod distrib;
24mod env;
25mod generator;
26mod hash;
27mod hash_identity;
28mod libfuzzer;
29mod math;
30mod num;
31mod permute;
32mod rand;
33mod range;
34mod reduce;
35mod source;
36mod tape;
37mod tape_event;
38mod tape_mutate;
39mod tape_mutate_crossover;
40mod tape_reduce;
41mod tape_validate;
42#[cfg(test)]
43mod tests;
44#[cfg(test)]
45mod tests_shrinking_challenge;
46mod unwind;
47mod util;
48mod varint;
49
50mod make_cell;
51mod make_char;
52mod make_collection;
53mod make_combine;
54mod make_core;
55mod make_float;
56#[cfg(feature = "hashbrown")]
57mod make_hashbrown;
58#[cfg(feature = "indexmap")]
59mod make_indexmap;
60mod make_integer;
61#[cfg(feature = "ordered_float")]
62mod make_ordered_float;
63#[cfg(feature = "regex")]
64mod make_regex;
65mod make_special;
66mod make_string;
67mod make_sync;
68mod make_time;
69#[cfg(feature = "tinyvec")]
70mod make_tinyvec;
71mod make_tuple;
72
73pub use config::*;
74pub use env::*;
75pub use generator::*;
76pub use num::*;
77pub use source::*;
78pub use unwind::*;
79pub use util::*;
80
81pub mod make {
83 pub use crate::make_cell::*;
84 pub use crate::make_char::*;
85 pub use crate::make_collection::*;
86 pub use crate::make_combine::*;
87 pub use crate::make_core::*;
88 pub use crate::make_float::*;
89 pub use crate::make_integer::*;
90 #[cfg(feature = "regex")]
91 pub use crate::make_regex::*;
92 pub use crate::make_special::*;
93 pub use crate::make_string::*;
94 pub use crate::make_sync::*;
95 pub use crate::make_time::*;
96
97 use crate::{Arbitrary, Generator};
98
99 pub fn arbitrary<T: Arbitrary>() -> impl Generator<Item = T> {
103 T::arbitrary()
104 }
105
106 #[cfg(feature = "hashbrown")]
107 pub mod hashbrown {
109 pub use crate::make_hashbrown::*;
110 }
111
112 #[cfg(feature = "indexmap")]
113 pub mod indexmap {
115 pub use crate::make_indexmap::*;
116 }
117
118 #[cfg(feature = "ordered_float")]
119 pub mod ordered_float {
121 pub use crate::make_ordered_float::*;
122 }
123
124 #[cfg(feature = "tinyvec")]
125 pub mod tinyvec {
127 pub use crate::make_tinyvec::*;
128 }
129}
130
131pub fn check(prop: impl Fn(&mut Source)) {
136 Env::new().check(prop);
137}
138
139pub fn fuzz_write_seed(
154 seed_dir: impl AsRef<Path>,
155 prop: impl Fn(&mut Source),
156) -> Result<(), &'static str> {
157 Env::new().fuzz_write_seed(seed_dir, prop)
158}
159
160#[must_use]
165pub fn fuzz_check(
166 input: &[u8],
167 out: Option<(&mut [u8], &mut usize)>,
168 prop: impl Fn(&mut Source),
169) -> bool {
170 Env::new().fuzz_check(input, out, prop)
171}
172
173#[expect(clippy::type_complexity)]
178pub fn fuzz_mutate(
179 data: &mut [u8],
180 size: usize,
181 max_size: usize,
182 seed: u32,
183 allow_void: bool,
184 mutate_bin: Option<fn(&mut [u8], usize, usize) -> usize>,
185) -> usize {
186 Env::new().fuzz_mutate(data, size, max_size, seed, allow_void, mutate_bin)
187}
188
189pub fn fuzz_mutate_crossover(
194 input: &[u8],
195 other: &[u8],
196 out: &mut [u8],
197 seed: u32,
198 allow_void: bool,
199) -> usize {
200 Env::new().fuzz_mutate_crossover(input, other, out, seed, allow_void)
201}
202
203pub(crate) type Set<K> = std::collections::HashSet<K, hash::FxBuildHasher>;
204pub(crate) type Map<K, V> = std::collections::HashMap<K, V, hash::FxBuildHasher>;