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;
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()
}
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()
}
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()
}
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()
}
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()
}