blob: 39f6b3ba8d129a180cdf536b708840f708ca94be [file] [log] [blame]
// Copyright 2018 The proptest developers
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use proptest::prelude::{Strategy, Arbitrary, proptest};
use proptest_derive::Arbitrary;
fn make_strategy(start: usize) -> impl Strategy<Value = usize> {
(start..100).prop_map(|x| x * 2)
}
fn make_strategy2() -> impl Strategy<Value = usize> {
make_strategy(88)
}
#[derive(Debug, Arbitrary)]
struct T0 {
#[proptest(strategy = "make_strategy(0)")]
foo: usize,
#[proptest(strategy("make_strategy(11)"))]
bar: usize,
#[proptest(strategy(make_strategy2))]
baz: usize,
}
#[derive(Debug, Arbitrary)]
struct T1(
#[proptest(strategy = "make_strategy(22)")]
usize,
#[proptest(strategy("make_strategy(33)"))]
usize,
#[proptest(strategy(make_strategy2))]
usize,
);
#[derive(Debug, Arbitrary)]
enum T2 {
V0(
#[proptest(strategy("make_strategy(44)"))]
usize
),
V1 {
#[proptest(strategy = "make_strategy(55)")]
field: usize,
},
V2(
#[proptest(strategy = "make_strategy(66)")]
usize
),
V3 {
#[proptest(strategy("make_strategy(77)"))]
field: usize,
},
V4(
#[proptest(strategy(make_strategy2))]
usize
),
V5 {
#[proptest(strategy(make_strategy2))]
field: usize
},
}
fn assert_consistency(start: usize, val: usize) {
assert!(val % 2 == 0 && val < 200 && val >= (start * 2));
}
proptest! {
#[test]
fn t0_test(v: T0) {
assert_consistency(0, v.foo);
assert_consistency(11, v.bar);
assert_consistency(88, v.baz);
}
#[test]
fn t1_test(v: T1) {
assert_consistency(22, v.0);
assert_consistency(33, v.1);
assert_consistency(88, v.2);
}
#[test]
fn t2_test(v: T2) {
match v {
T2::V0(v) => assert_consistency(44, v),
T2::V1 { field } => assert_consistency(55, field),
T2::V2(v) => assert_consistency(66, v),
T2::V3 { field } => assert_consistency(77, field),
T2::V4(v) => assert_consistency(88, v),
T2::V5 { field } => assert_consistency(88, field),
}
}
}
#[test]
fn asserting_arbitrary() {
fn assert_arbitrary<T: Arbitrary>() {}
assert_arbitrary::<T0>();
assert_arbitrary::<T1>();
assert_arbitrary::<T2>();
}