cw_bigint/bigint/
arbitrary.rs1use super::{BigInt, Sign};
2
3#[cfg(feature = "quickcheck")]
4use crate::std_alloc::Box;
5use crate::BigUint;
6
7#[cfg(feature = "quickcheck")]
8impl quickcheck::Arbitrary for BigInt {
9 fn arbitrary(g: &mut quickcheck::Gen) -> Self {
10 let positive = bool::arbitrary(g);
11 let sign = if positive { Sign::Plus } else { Sign::Minus };
12 Self::from_biguint(sign, BigUint::arbitrary(g))
13 }
14
15 fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
16 let sign = self.sign();
17 let unsigned_shrink = self.data.shrink();
18 Box::new(unsigned_shrink.map(move |x| BigInt::from_biguint(sign, x)))
19 }
20}
21
22#[cfg(feature = "arbitrary")]
23impl arbitrary::Arbitrary<'_> for BigInt {
24 fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
25 let positive = bool::arbitrary(u)?;
26 let sign = if positive { Sign::Plus } else { Sign::Minus };
27 Ok(Self::from_biguint(sign, BigUint::arbitrary(u)?))
28 }
29
30 fn arbitrary_take_rest(mut u: arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
31 let positive = bool::arbitrary(&mut u)?;
32 let sign = if positive { Sign::Plus } else { Sign::Minus };
33 Ok(Self::from_biguint(sign, BigUint::arbitrary_take_rest(u)?))
34 }
35
36 fn size_hint(depth: usize) -> (usize, Option<usize>) {
37 arbitrary::size_hint::and(bool::size_hint(depth), BigUint::size_hint(depth))
38 }
39}