extern crate fuzzcheck_mutators; extern crate fuzzcheck_mutators_derive; use fuzzcheck_mutators::fuzzcheck_traits::Mutator; use fuzzcheck_mutators::DefaultMutator; #[derive(PartialEq, Eq, Debug, Default, DefaultMutator)] pub struct S { pub a: A, pub b: Vec, pub c: Vec, } impl Clone for S where A: Clone, Vec: Clone, Vec: Clone, { fn clone(&self) -> Self { Self { a: self.a.clone(), b: self.b.clone(), c: self.c.clone(), } } } fn main() { let mut m = S::::default_mutator(); let x = S::::default(); let x_cache = m.cache_from_value(&x); let x_step = m.initial_step_from_value(&x); let mut results = vec![(x, x_cache, x_step)]; let mut ar_step = <_>::default(); for _ in 0..10 { let (x, x_cache) = m.ordered_arbitrary(&mut ar_step, 100.0).unwrap(); let x_step = m.initial_step_from_value(&x); results.push((x, x_cache, x_step)); } for _ in 0..100_000 { let len = results.len(); let (x, cache, step) = &mut results[fastrand::usize(0..len)]; let prev_x = x.clone(); // println!("{:?}", x); if let Some(token) = m.ordered_mutate(x, cache, step, 100.0) { let next = (x.clone(), cache.clone(), m.initial_step_from_value(x)); let cplx = m.complexity(x, cache); assert!(cplx.is_finite() && cplx > 0.0, "{:.2}", cplx); let cache_from_scratch = m.cache_from_value(x); let cplx_from_scratch = m.complexity(x, &cache_from_scratch); assert!( (cplx - cplx_from_scratch).abs() < 0.01, "{:.15} != {:.15}", cplx, cplx_from_scratch ); m.unmutate(x, cache, token); assert!(x.clone() == prev_x); results.push(next); } else { panic!() } } for _ in 0..100_000 { let len = results.len(); let (x, cache, step) = &mut results[fastrand::usize(0..len)]; let prev_x = x.clone(); if let Some(token) = m.ordered_mutate(x, cache, step, 100.0) { let cplx = m.complexity(x, cache); assert!(cplx.is_finite() && cplx > 0.0, "{:.2}", cplx); let cache_from_scratch = m.cache_from_value(x); let cplx_from_scratch = m.complexity(x, &cache_from_scratch); assert!( (cplx - cplx_from_scratch).abs() < 0.01, "{:.15} != {:.15}", cplx, cplx_from_scratch ); m.unmutate(x, cache, token); assert!(x.clone() == prev_x); } else { panic!() } } println!("{}", results.len()); }