fuzzcheck 0.13.0

A modular, structure-aware, and feedback-driven fuzzing engine for Rust functions
Documentation
use std::any::TypeId;

use fuzzcheck::mutators::integer::U8Mutator;
use fuzzcheck::mutators::option::OptionMutator;
use fuzzcheck::subvalue_provider::{CrossoverSubValueProvider, Generation, SubValueProviderId};
use fuzzcheck::{DefaultMutator, Mutator, SubValueProvider};

#[test]
fn test_crossover_option() {
    let crossover_value = vec![None, Some(83638), Some(1), Some(2), Some(3), Some(19373246372)];
    let crossover_mutator = <Vec<Option<usize>>>::default_mutator();
    crossover_mutator.initialize();
    let crossover_cache = crossover_mutator.validate_value(&crossover_value).unwrap();

    let subvalue_provider = CrossoverSubValueProvider::new(
        SubValueProviderId {
            idx: 0,
            generation: Generation(0),
        },
        &crossover_value,
        &crossover_cache,
        &crossover_mutator,
    );

    let mut index = 0;
    for _ in 0..100 {
        let x = subvalue_provider
            .get_subvalue(TypeId::of::<usize>(), 100.0, &mut index)
            .and_then(|(x, cplx)| x.downcast_ref::<usize>().map(|x| (x, cplx)));
        if let Some((x, cplx)) = x {
            println!("{x}  {cplx:.2}");
        } else {
            break;
        }
    }
    let mutator = <Option<usize>>::default_mutator();
    mutator.initialize();

    let mut value = Option::Some(0);
    let mut cache = mutator.validate_value(&value).unwrap();
    let mut step = mutator.default_mutation_step(&value, &cache);

    let mut found = false;
    for i in 0..100000 {
        let (token, _) = mutator
            .ordered_mutate(&mut value, &mut cache, &mut step, &subvalue_provider, 10000.)
            .unwrap();
        if value == Some(19373246372) {
            found = true;
            println!("found after {i} iterations");
            break;
        }
        mutator.unmutate(&mut value, &mut cache, token);
    }
    assert!(found);
}

#[test]
fn test_option() {
    let m = OptionMutator::new(U8Mutator::default());
    fuzzcheck::mutators::testing_utilities::test_mutator(m, 100.0, 100.0, false, true, 500, 500);
}