blob: 75ac5908ad3e7b0205dcd1568fac883bb364c2dc [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::{Arbitrary, proptest, prop_assert, prop_assert_eq};
use proptest_derive::Arbitrary;
#[derive(Debug, Arbitrary)]
struct T0 {
#[proptest(value = "42")]
field: usize,
#[proptest(value("24"))]
bar: usize,
#[proptest(value = "24 + 24usize")]
baz: usize,
#[proptest(value = 1337)]
quux: usize,
#[proptest(value(7331))]
wibble: usize,
#[proptest(value("3 * 2 + 3usize / 3"))]
wobble: usize,
}
#[derive(Debug, Arbitrary)]
struct T1(
#[proptest(value = "24")]
usize,
);
#[derive(Debug, Arbitrary)]
enum T2 {
V0,
#[proptest(value = "T2::V1 { field: 1337 }")]
V1 {
field: usize,
},
}
#[derive(Debug, Arbitrary)]
enum T3 {
V0,
#[proptest(value = "T3::V1(7331)")]
V1(usize),
}
#[derive(Debug, Arbitrary)]
enum T4 {
V0,
V1 {
#[proptest(value = "6")]
field: usize,
},
}
#[derive(Debug, Arbitrary)]
enum T5 {
V0,
V1(
#[proptest(value = "9")]
usize
),
}
#[derive(Debug, Arbitrary)]
struct T6 {
#[proptest(value = "\"alpha\".to_string()")]
alpha: String,
#[proptest(strategy = "0..100usize")]
beta: usize,
}
fn foo() -> usize {
42
}
#[derive(Debug, Arbitrary)]
struct CallFun {
#[proptest(value = "foo()")]
foo: usize,
#[proptest(value(foo))]
bar: usize,
}
proptest! {
#[test]
fn t0_fixed_fields(v: T0) {
prop_assert_eq!(v.field, 42);
prop_assert_eq!(v.bar, 24);
prop_assert_eq!(v.baz, 48);
prop_assert_eq!(v.quux, 1337);
prop_assert_eq!(v.wibble, 7331);
prop_assert_eq!(v.wobble, 7);
}
#[test]
fn t1_field_always_24(v: T1) {
prop_assert_eq!(v.0, 24);
}
#[test]
fn t2_v1_always_1337(v: T2) {
if let T2::V1 { field } = v {
prop_assert_eq!(field, 1337);
}
}
#[test]
fn t3_v1_always_7331(v: T3) {
if let T3::V1(v) = v {
prop_assert_eq!(v, 7331);
}
}
#[test]
fn t4_v1_always_1337(v: T4) {
if let T4::V1 { field } = v {
prop_assert_eq!(field, 6);
}
}
#[test]
fn t5_v1_always_7331(v: T5) {
if let T5::V1(v) = v {
prop_assert_eq!(v, 9);
}
}
#[test]
fn t6_alpha_beta(v: T6) {
prop_assert_eq!(v.alpha, "alpha".to_string());
prop_assert!(v.beta < 100);
}
#[test]
fn call_fun_always_42(v: CallFun) {
assert_eq!(v.foo, 42);
assert_eq!(v.bar, 42);
}
}
#[test]
fn asserting_arbitrary() {
fn assert_arbitrary<T: Arbitrary>() {}
assert_arbitrary::<T0>();
assert_arbitrary::<T1>();
assert_arbitrary::<T2>();
assert_arbitrary::<T3>();
assert_arbitrary::<T4>();
assert_arbitrary::<T5>();
assert_arbitrary::<T6>();
assert_arbitrary::<CallFun>();
}