checkito 5.0.0

A safe, efficient and simple QuickCheck-inspired library to generate shrinkable random data mainly oriented towards generative/property/exploratory testing.
Documentation
pub mod common;
use common::*;

#[test]
fn finds_minimum() {
    let fail = <(usize, usize)>::generator()
        .check(|(left, right)| left >= right)
        .unwrap();
    assert_eq!(fail.item, (0, 1));
}

#[test]
fn integer_shrink_to_minimum() {
    for high in (1usize..1_000_000_000).samples(1_000) {
        let fail = usize::generator().check(|item| item < high).unwrap();
        assert_eq!(fail.item, high);
    }
}

#[test]
fn vec_removes_irrelevant_then_shrinks() {
    let fail = (..100usize)
        .collect::<Vec<_>>()
        .check(|items| items.len() < 10 || items.iter().all(|&item| item < 10))
        .unwrap();
    let shrunk = fail.item;
    assert_eq!(shrunk.len(), 10);
    assert_eq!(shrunk.iter().filter(|&&item| item == 10).count(), 1);
}

#[cfg(feature = "check")]
mod check {
    use super::*;

    #[check(1usize..=1_000_000_000)]
    fn integer_shrink_to_exact_boundary(high: usize) {
        let fail = usize::generator().check(|item| item < high).unwrap();
        assert_eq!(fail.item, high);
    }

    #[check(1u8..=100)]
    fn u8_shrink_to_exact_boundary(high: u8) {
        let fail = u8::generator().check(|item| item < high).unwrap();
        assert_eq!(fail.item, high);
    }

    #[check(1i16..=1_000)]
    fn i16_shrink_to_exact_positive_boundary(high: i16) {
        let fail = i16::generator().check(|item| item < high).unwrap();
        assert_eq!(fail.item, high);
    }
}