| // 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. |
| |
| #![allow(unused_variables)] |
| |
| use proptest::prelude::{prop_assert_eq, proptest, Arbitrary}; |
| use proptest_derive::Arbitrary; |
| |
| trait Func { |
| type Out; |
| } |
| trait FuncA { |
| type OutA: FuncB; |
| } |
| trait FuncB { |
| type OutB; |
| } |
| |
| #[derive(Debug)] |
| struct TypeA; |
| |
| #[derive(Debug)] |
| struct TypeB; |
| |
| #[derive(Debug, Arbitrary)] |
| struct OutTy { |
| #[proptest(value = "42")] |
| val: usize, |
| } |
| |
| impl Func for TypeA { |
| type Out = OutTy; |
| } |
| impl FuncA for TypeA { |
| type OutA = TypeB; |
| } |
| impl FuncB for TypeB { |
| type OutB = OutTy; |
| } |
| |
| #[derive(Debug, Arbitrary)] |
| struct T0 { |
| field: <TypeA as Func>::Out, |
| } |
| |
| #[derive(Debug, Arbitrary)] |
| struct T1 { |
| field: Vec<u8>, |
| } |
| |
| #[derive(Debug, Arbitrary)] |
| struct T2 { |
| field: Vec<Vec<u8>>, |
| } |
| |
| #[derive(Debug, Arbitrary)] |
| struct T3 { |
| field: Vec<<TypeA as Func>::Out>, |
| } |
| |
| #[derive(Debug, Arbitrary)] |
| struct T4<Tyvar: FuncB> { |
| field: Tyvar::OutB, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T5<Tyvar: FuncB> { |
| field: <Tyvar>::OutB, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T6<Tyvar: FuncB> { |
| field: <Tyvar as FuncB>::OutB, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T7<Tyvar: FuncA> { |
| field: <Tyvar::OutA as FuncB>::OutB, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T8<Tyvar: FuncA> { |
| field: <<Tyvar>::OutA as FuncB>::OutB, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T9<Tyvar: FuncA> { |
| field: <<Tyvar as FuncA>::OutA as FuncB>::OutB, |
| } |
| |
| #[derive(Debug, Arbitrary)] |
| struct T10<Tyvar: FuncB> { |
| field: Vec<Tyvar::OutB>, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T11<Tyvar: FuncB> { |
| field: Vec<<Tyvar>::OutB>, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T12<Tyvar: FuncB> { |
| field: Vec<<Tyvar as FuncB>::OutB>, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T13<Tyvar: FuncA> { |
| field: Vec<<Tyvar::OutA as FuncB>::OutB>, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T14<Tyvar: FuncA> { |
| field: Vec<<<Tyvar>::OutA as FuncB>::OutB>, |
| } |
| |
| #[derive(Arbitrary)] |
| struct T15<Tyvar: FuncA> { |
| field: Vec<<<Tyvar as FuncA>::OutA as FuncB>::OutB>, |
| } |
| |
| macro_rules! debug { |
| ($trait: path, $ty: ident) => { |
| impl<T: $trait> ::std::fmt::Debug for $ty<T> { |
| fn fmt( |
| &self, |
| fmt: &mut ::std::fmt::Formatter, |
| ) -> Result<(), ::std::fmt::Error> { |
| fmt.debug_struct(stringify!($ty)) |
| .field("field", &"<redacted>") |
| .finish() |
| } |
| } |
| }; |
| } |
| |
| debug!(FuncB, T5); |
| debug!(FuncB, T6); |
| debug!(FuncA, T7); |
| debug!(FuncA, T8); |
| debug!(FuncA, T9); |
| |
| debug!(FuncB, T11); |
| debug!(FuncB, T12); |
| debug!(FuncA, T13); |
| debug!(FuncA, T14); |
| debug!(FuncA, T15); |
| |
| #[test] |
| fn asserting_arbitrary() { |
| fn assert_arbitrary<T: Arbitrary>() {} |
| |
| assert_arbitrary::<T0>(); |
| assert_arbitrary::<T1>(); |
| assert_arbitrary::<T2>(); |
| assert_arbitrary::<T3>(); |
| |
| assert_arbitrary::<T4<TypeB>>(); |
| assert_arbitrary::<T5<TypeB>>(); |
| assert_arbitrary::<T6<TypeB>>(); |
| assert_arbitrary::<T7<TypeA>>(); |
| assert_arbitrary::<T8<TypeA>>(); |
| assert_arbitrary::<T9<TypeA>>(); |
| |
| assert_arbitrary::<T10<TypeB>>(); |
| assert_arbitrary::<T11<TypeB>>(); |
| assert_arbitrary::<T12<TypeB>>(); |
| assert_arbitrary::<T13<TypeA>>(); |
| assert_arbitrary::<T14<TypeA>>(); |
| assert_arbitrary::<T15<TypeA>>(); |
| } |
| |
| proptest! { |
| #[test] |
| fn t0_field_val_42(t: T0) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t1_no_panic(_: T1) {} |
| |
| #[test] |
| fn t2_no_panic(_: T2) {} |
| |
| #[test] |
| fn t3_all_42(t: T3) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| |
| #[test] |
| fn t4_field_val_42(t: T4<TypeB>) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t5_field_val_42(t: T5<TypeB>) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t6_field_val_42(t: T6<TypeB>) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t7_field_val_42(t: T7<TypeA>) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t8_field_val_42(t: T8<TypeA>) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t9_field_val_42(t: T9<TypeA>) { |
| prop_assert_eq!(t.field.val, 42); |
| } |
| |
| #[test] |
| fn t10_all_42(t: T10<TypeB>) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| |
| #[test] |
| fn t11_all_42(t: T11<TypeB>) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| |
| #[test] |
| fn t12_all_42(t: T12<TypeB>) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| |
| #[test] |
| fn t13_all_42(t: T13<TypeA>) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| |
| #[test] |
| fn t14_all_42(t: T14<TypeA>) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| |
| #[test] |
| fn t15_all_42(t: T15<TypeA>) { |
| t.field.iter().for_each(|x| assert_eq!(x.val, 42)) |
| } |
| } |