use arbitrary::{
size_hint,
Arbitrary,
Result,
Unstructured,
};
use crate::{
OrdMap,
OrdSet,
Vector,
};
impl<'a, A: Arbitrary<'a> + Clone> Arbitrary<'a> for Vector<A> {
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
u.arbitrary_iter()?.collect()
}
fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
u.arbitrary_take_rest_iter()?.collect()
}
fn size_hint(depth: usize) -> (usize, Option<usize>) {
size_hint::recursion_guard(depth, |depth| {
size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
})
}
}
impl<'a, K: Arbitrary<'a> + Ord + Clone, V: Arbitrary<'a> + Clone> Arbitrary<'a>
for OrdMap<K, V>
{
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
u.arbitrary_iter()?.collect()
}
fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
u.arbitrary_take_rest_iter()?.collect()
}
fn size_hint(depth: usize) -> (usize, Option<usize>) {
size_hint::recursion_guard(depth, |depth| {
size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
})
}
}
impl<'a, A: Arbitrary<'a> + Ord + Clone> Arbitrary<'a> for OrdSet<A> {
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
u.arbitrary_iter()?.collect()
}
fn arbitrary_take_rest(u: Unstructured<'a>) -> Result<Self> {
u.arbitrary_take_rest_iter()?.collect()
}
fn size_hint(depth: usize) -> (usize, Option<usize>) {
size_hint::recursion_guard(depth, |depth| {
size_hint::and(<usize as Arbitrary>::size_hint(depth), (0, None))
})
}
}
impl<A: quickcheck::Arbitrary + Ord + Clone> quickcheck::Arbitrary
for OrdSet<A>
{
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
OrdSet::from(Vec::<A>::arbitrary(g))
}
}
impl<A: quickcheck::Arbitrary + Ord + Clone> quickcheck::Arbitrary
for Vector<A>
{
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
Vector::from(Vec::<A>::arbitrary(g))
}
}
impl<A: quickcheck::Arbitrary + Ord + Clone> quickcheck::Arbitrary
for OrdMap<A, A>
{
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
OrdMap::from(Vec::<(A, A)>::arbitrary(g))
}
}