| //- | 
 | // Copyright 2017, 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. | 
 |  | 
 | //! Arbitrary implementations for `std::ops`. | 
 |  | 
 | use core::ops::*; | 
 | use crate::std_facade::Arc; | 
 |  | 
 | use crate::strategy::*; | 
 | use crate::strategy::statics::static_map; | 
 | use crate::arbitrary::*; | 
 |  | 
 | arbitrary!(RangeFull; ..); | 
 | wrap_ctor!(RangeFrom, |a| a..); | 
 | wrap_ctor!(RangeTo, |a| ..a); | 
 |  | 
 | wrap_ctor!(RangeToInclusive, |a| ..=a); | 
 |  | 
 | arbitrary!( | 
 |     [A: PartialOrd + Arbitrary] RangeInclusive<A>, | 
 |     SMapped<(A, A), Self>, product_type![A::Parameters, A::Parameters]; | 
 |     args => static_map(any_with::<(A, A)>(args), | 
 |         |(a, b)| if b < a { b..=a } else { a..=b }) | 
 | ); | 
 |  | 
 | lift1!([PartialOrd] RangeInclusive<A>; base => { | 
 |     let base = Arc::new(base); | 
 |     (base.clone(), base).prop_map(|(a, b)| if b < a { b..=a } else { a..=b }) | 
 | }); | 
 |  | 
 | arbitrary!( | 
 |     [A: PartialOrd + Arbitrary] Range<A>, | 
 |     SMapped<(A, A), Self>, product_type![A::Parameters, A::Parameters]; | 
 |     args => static_map(any_with::<(A, A)>(args), | 
 |         |(a, b)| if b < a { b..a } else { a..b }) | 
 | ); | 
 |  | 
 | lift1!([PartialOrd] Range<A>; base => { | 
 |     let base = Arc::new(base); | 
 |     (base.clone(), base).prop_map(|(a, b)| if b < a { b..a } else { a..b }) | 
 | }); | 
 |  | 
 | #[cfg(feature = "unstable")] | 
 | arbitrary!( | 
 |     [Y: Arbitrary, R: Arbitrary] GeneratorState<Y, R>, | 
 |     TupleUnion<(W<SMapped<Y, Self>>, W<SMapped<R, Self>>)>, | 
 |     product_type![Y::Parameters, R::Parameters]; | 
 |     args => { | 
 |         let product_unpack![y, r] = args; | 
 |         prop_oneof![ | 
 |             static_map(any_with::<Y>(y), GeneratorState::Yielded), | 
 |             static_map(any_with::<R>(r), GeneratorState::Complete) | 
 |         ] | 
 |     } | 
 | ); | 
 |  | 
 | #[cfg(feature = "unstable")] | 
 | use core::fmt; | 
 |  | 
 | #[cfg(feature = "unstable")] | 
 | impl<A: fmt::Debug + 'static, B: fmt::Debug + 'static> | 
 |     functor::ArbitraryF2<A, B> | 
 | for GeneratorState<A, B> { | 
 |     type Parameters = (); | 
 |  | 
 |     fn lift2_with<AS, BS>(fst: AS, snd: BS, _args: Self::Parameters) | 
 |         -> BoxedStrategy<Self> | 
 |     where | 
 |         AS: Strategy<Value = A> + 'static, | 
 |         BS: Strategy<Value = B> + 'static, | 
 |     { | 
 |         prop_oneof![ | 
 |             fst.prop_map(GeneratorState::Yielded), | 
 |             snd.prop_map(GeneratorState::Complete) | 
 |         ].boxed() | 
 |     } | 
 | } | 
 |  | 
 | #[cfg(test)] | 
 | mod test { | 
 |     no_panic_test!( | 
 |         range_full => RangeFull, | 
 |         range_from => RangeFrom<usize>, | 
 |         range_to   => RangeTo<usize>, | 
 |         range      => Range<usize>, | 
 |         range_inclusive => RangeInclusive<usize>, | 
 |         range_to_inclusive => RangeToInclusive<usize> | 
 |     ); | 
 |  | 
 |     #[cfg(feature = "unstable")] | 
 |     no_panic_test!( | 
 |         generator_state => GeneratorState<u32, u64> | 
 |     ); | 
 | } |