in lain/src/new_fuzzed.rs [431:489]
fn new_fuzzed<R: Rng>(
mutator: &mut Mutator<R>,
constraints: Option<&Constraints<Self::RangeType>>,
) -> Self {
let min: Self::RangeType;
let max: Self::RangeType;
let weight: Weighted;
let mut output: AsciiString;
trace!(
"Generating random AsciiString with constraints: {:#?}",
constraints
);
// if no min/max were supplied, we'll take a conservative approach
match constraints {
Some(ref constraints) => {
min = constraints.min.unwrap_or(0);
max = constraints.max.unwrap_or(256);
weight = constraints.weighted;
}
None => {
min = 0;
max = 256;
weight = Weighted::None;
}
}
let string_length = mutator.gen_weighted_range(min, max, weight);
output = AsciiString {
inner: Vec::with_capacity(string_length),
};
let mut idx = 0;
let mut chr = AsciiChar::new_fuzzed(mutator, None);
while idx < string_length {
output.inner.push(chr.clone());
idx += 1;
if string_length - idx > 0 {
if mutator.gen_chance(crate::mutator::CHANCE_TO_REPEAT_ARRAY_VALUE) {
let repeat_end_idx = mutator.gen_range(idx, string_length);
while idx < repeat_end_idx {
output.inner.push(chr.clone());
idx += 1;
}
if string_length - idx > 0 {
chr = AsciiChar::new_fuzzed(mutator, None);
}
} else {
chr = AsciiChar::new_fuzzed(mutator, None);
}
}
}
output
}