use checkito::*;
#[check]
fn empty() {}
#[check(letter())]
fn is_letter(value: char) {
assert!(value.is_ascii_alphabetic());
}
#[check(0usize..=100)]
fn is_in_range(value: usize) -> bool {
value <= 100
}
#[check(regex("{", None).ok(), regex!("[a-zA-Z0-9_]*"))]
fn is_ascii(invalid: Option<String>, valid: String) {
assert!(invalid.is_none());
assert!(valid.is_ascii());
}
#[check(..)]
#[check(_, _, _, _)]
#[check(negative::<f64>(), ..)]
#[check(.., negative::<i16>())]
#[check(_, .., _)]
#[check(negative::<f64>(), _, .., _, negative::<i16>())]
#[should_panic]
fn is_negative(first: f64, second: i8, third: isize, fourth: i16) {
assert!(first < 0.0);
assert!(second < 0);
assert!(third < 0);
assert!(fourth < 0);
}
#[check(0u64..1_000_000, color = false, verbose = true)]
#[should_panic]
fn is_small(value: u64) {
assert!(value < 1000);
}
#[check(3001, 6000)]
#[check(4500, 4501)]
#[check(9000, 1)]
fn sums_to_9001(left: i32, right: i32) {
assert_eq!(left + right, 9001);
}
#[check(111119)]
#[check(Generate::map(10..1000, |value| value * 10 - 1))]
#[check("a string that ends with 9")]
#[check(regex!("[a-z]*9"))]
fn ends_with_9(value: impl std::fmt::Display) -> bool {
format!("{value}").ends_with('9')
}
pub struct Person {
pub name: String,
pub age: usize,
}
#[check((letter().collect(), 18usize..=100).map(|(name, age)| Person { name, age }), debug = false)]
fn person_has_valid_name_and_is_major(person: Person) {
assert!(person.name.is_ascii());
assert!(person.age >= 18);
}
#[check(_, 0u8..=9)]
fn exhaustive_when_small_domain(sign: bool, digit: u8) {
let signed = if sign { digit as i16 } else { -(digit as i16) };
assert!((-9..=9).contains(&signed));
}
#[check(0u64..1000)]
async fn asynchronous_support(value: u64) {
let doubled = async { value * 2 }.await;
assert!(doubled < 2000);
}
#[test]
fn has_even_hundred() {
(0..100, 200..300, 400..500)
.any()
.unify::<i32>()
.check(|value| assert!((value / 100) % 2 == 0));
}
#[test]
fn weighted() {
any((
Weight::new(1.0, 9i32..90),
Weight::new(10.0, 90i32..900),
Weight::new(100.0, 900i32..9000),
))
.unify::<i32>()
.check(|value| assert!((9..9000).contains(&value)));
}
#[test]
fn sampling() {
let strings = letter().collect::<String>().samples(10).collect::<Vec<_>>();
assert_eq!(strings.len(), 10);
let mut sampler = (0u32..1000).sampler();
sampler.seed = 12345;
sampler.count = 5;
let first = sampler.clone().samples().collect::<Vec<_>>();
let second = sampler.samples().collect::<Vec<_>>();
assert_eq!(first, second);
}
fn main() {
let generator = &[(); 10].map(|_| number::<f64>());
let mut checker = generator.checker();
checker.generate.count = 1_000_000;
checker.shrink.items = false;
for result in checker.checks(|values| values.iter().sum::<f64>() < 1000.0) {
match result {
check::Result::Pass(_pass) => {}
check::Result::Shrink(_pass) => {}
check::Result::Shrunk(_fail) => {}
check::Result::Fail(_fail) => {}
}
}
for _sample in generator.samples(1000) {}
}