bolero-engine 0.13.4

fuzz and property testing framework
Documentation
use super::*;
use std::time::Duration;

macro_rules! shrink_test_assert {
    ($test:ident, $input:ident, $options:ident, (None)) => {
        assert!(Shrinker::new(&mut $test, $input, None, &$options)
            .shrink()
            .is_none());
    };

    ($test:ident, $input:ident, $options:ident, ($($expected:tt)+)) => {
        let failure = Shrinker::new(&mut $test, $input, None, &$options)
            .shrink()
            .expect("should produce a result");

        assert_eq!(failure.input, $($expected)+);
    };
}

macro_rules! shrink_test {
    ($name:ident, $gen:expr, $input:expr, $duration:expr, ($($expected:tt)+), $check:expr) => {
        #[test]
        fn $name() {
            #[allow(unused_imports)]
            use bolero_generator::{produce, ValueGenerator};

            panic::forward_panic(true);
            panic::capture_backtrace(true);

            let mut test = crate::ClonedGeneratorTest::new($check, $gen);
            let input = ($input).to_vec();

            let options = driver::Options::default().with_shrink_time($duration);

            shrink_test_assert!(test, input, options, ($($expected)+));
        }
    };
}

shrink_test!(
    u16_shrink_test_zero_time,
    produce::<u16>(),
    [255u8; 2],
    Duration::ZERO,
    (None),
    |_| {}
);

shrink_test!(
    u16_shrink_test,
    produce::<u16>(),
    [255u8; 2],
    Duration::from_secs(1),
    (1),
    |value| {
        assert!(value < 20);
        assert!(value % 7 == 0);
    }
);

shrink_test!(
    u32_shrink_test,
    produce::<u32>(),
    [255u8; 4],
    Duration::from_secs(1),
    (20),
    |value| {
        assert!(value < 20);
    }
);

shrink_test!(
    vec_shrink_test,
    produce::<Vec<u32>>().filter_gen(|vec| vec.len() >= 3),
    [255u8; 256],
    Duration::from_secs(1),
    (vec![4, 0, 0]),
    |value: Vec<u32>| {
        assert!(value[0] < 4);
        assert!(value[1] < 5);
        assert!(value[2] < 6);
    }
);

shrink_test!(
    non_start_vec_shrink_test,
    produce::<Vec<u32>>().filter_gen(|vec| vec.len() >= 3),
    [255u8; 256],
    Duration::from_secs(1),
    (vec![0, 5, 0]),
    |value: Vec<u32>| {
        assert!(value[1] < 5);
        assert!(value[2] < 6);
    }
);

shrink_test!(
    middle_vec_shrink_test,
    produce::<Vec<u8>>().filter_gen(|vec| vec.len() >= 3),
    [255u8; 256],
    Duration::from_secs(1),
    (vec![1, 1, 1]),
    |value: Vec<u8>| {
        if value[0] > 0 && *value.last().unwrap() > 0 {
            assert_eq!(value[1], 0);
        }
    }
);