diff options
Diffstat (limited to 'vendor/im-rc/src/proptest.rs')
-rw-r--r-- | vendor/im-rc/src/proptest.rs | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/vendor/im-rc/src/proptest.rs b/vendor/im-rc/src/proptest.rs new file mode 100644 index 000000000..9180ef273 --- /dev/null +++ b/vendor/im-rc/src/proptest.rs @@ -0,0 +1,164 @@ +//! Proptest strategies. +//! +//! These are only available when using the `proptest` feature flag. + +use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector}; +use ::proptest::collection::vec; +use ::proptest::strategy::{BoxedStrategy, Strategy, ValueTree}; +use std::hash::Hash; +use std::iter::FromIterator; +use std::ops::Range; + +/// A strategy for generating a [`Vector`][Vector] of a certain size. +/// +/// # Examples +/// +/// ```rust,no_run +/// # use ::proptest::proptest; +/// proptest! { +/// #[test] +/// fn proptest_a_vector(ref l in vector(".*", 10..100)) { +/// assert!(l.len() < 100); +/// assert!(l.len() >= 10); +/// } +/// } +/// ``` +/// +/// [Vector]: ../struct.Vector.html +pub fn vector<A: Strategy + 'static>( + element: A, + size: Range<usize>, +) -> BoxedStrategy<Vector<<A::Tree as ValueTree>::Value>> +where + <A::Tree as ValueTree>::Value: Clone, +{ + vec(element, size).prop_map(Vector::from_iter).boxed() +} + +/// A strategy for an [`OrdMap`][OrdMap] of a given size. +/// +/// # Examples +/// +/// ```rust,no_run +/// # use ::proptest::proptest; +/// proptest! { +/// #[test] +/// fn proptest_works(ref m in ord_map(0..9999, ".*", 10..100)) { +/// assert!(m.len() < 100); +/// assert!(m.len() >= 10); +/// } +/// } +/// ``` +/// +/// [OrdMap]: ../struct.OrdMap.html +pub fn ord_map<K: Strategy + 'static, V: Strategy + 'static>( + key: K, + value: V, + size: Range<usize>, +) -> BoxedStrategy<OrdMap<<K::Tree as ValueTree>::Value, <V::Tree as ValueTree>::Value>> +where + <K::Tree as ValueTree>::Value: Ord + Clone, + <V::Tree as ValueTree>::Value: Clone, +{ + ::proptest::collection::vec((key, value), size.clone()) + .prop_map(OrdMap::from) + .prop_filter("OrdMap minimum size".to_owned(), move |m| { + m.len() >= size.start + }) + .boxed() +} + +/// A strategy for an [`OrdSet`][OrdSet] of a given size. +/// +/// # Examples +/// +/// ```rust,no_run +/// # use ::proptest::proptest; +/// proptest! { +/// #[test] +/// fn proptest_a_set(ref s in ord_set(".*", 10..100)) { +/// assert!(s.len() < 100); +/// assert!(s.len() >= 10); +/// } +/// } +/// ``` +/// +/// [OrdSet]: ../struct.OrdSet.html +pub fn ord_set<A: Strategy + 'static>( + element: A, + size: Range<usize>, +) -> BoxedStrategy<OrdSet<<A::Tree as ValueTree>::Value>> +where + <A::Tree as ValueTree>::Value: Ord + Clone, +{ + ::proptest::collection::vec(element, size.clone()) + .prop_map(OrdSet::from) + .prop_filter("OrdSet minimum size".to_owned(), move |s| { + s.len() >= size.start + }) + .boxed() +} + +/// A strategy for a [`HashMap`][HashMap] of a given size. +/// +/// # Examples +/// +/// ```rust,no_run +/// # use ::proptest::proptest; +/// proptest! { +/// #[test] +/// fn proptest_works(ref m in hash_map(0..9999, ".*", 10..100)) { +/// assert!(m.len() < 100); +/// assert!(m.len() >= 10); +/// } +/// } +/// ``` +/// +/// [HashMap]: ../struct.HashMap.html +pub fn hash_map<K: Strategy + 'static, V: Strategy + 'static>( + key: K, + value: V, + size: Range<usize>, +) -> BoxedStrategy<HashMap<<K::Tree as ValueTree>::Value, <V::Tree as ValueTree>::Value>> +where + <K::Tree as ValueTree>::Value: Hash + Eq + Clone, + <V::Tree as ValueTree>::Value: Clone, +{ + ::proptest::collection::vec((key, value), size.clone()) + .prop_map(HashMap::from) + .prop_filter("Map minimum size".to_owned(), move |m| { + m.len() >= size.start + }) + .boxed() +} + +/// A strategy for a [`HashSet`][HashSet] of a given size. +/// +/// # Examples +/// +/// ```rust,no_run +/// # use ::proptest::proptest; +/// proptest! { +/// #[test] +/// fn proptest_a_set(ref s in hash_set(".*", 10..100)) { +/// assert!(s.len() < 100); +/// assert!(s.len() >= 10); +/// } +/// } +/// ``` +/// +/// [HashSet]: ../struct.HashSet.html +pub fn hash_set<A: Strategy + 'static>( + element: A, + size: Range<usize>, +) -> BoxedStrategy<HashSet<<A::Tree as ValueTree>::Value>> +where + <A::Tree as ValueTree>::Value: Hash + Eq + Clone, +{ + ::proptest::collection::vec(element, size.clone()) + .prop_map(HashSet::from) + .prop_filter("HashSet minimum size".to_owned(), move |s| { + s.len() >= size.start + }) + .boxed() +} |