Trait Arbitrary

pub trait Arbitrary: Clone + 'static {
    // Required method
    fn arbitrary(g: &mut Gen) -> Self;

    // Provided method
    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> { ... }
}
Expand description

Arbitrary describes types whose values can be randomly generated and shrunk.

Aside from shrinking, Arbitrary is different from typical RNGs in that it respects Gen::size() for controlling how much memory a particular value uses, for practical purposes. For example, Vec::arbitrary() respects Gen::size() to decide the maximum len() of the vector. This behavior is necessary due to practical speed and size limitations. Conversely, i32::arbitrary() ignores size() since all i32 values require O(1) memory and operations between i32s require O(1) time (with the exception of exponentiation).

Additionally, all types that implement Arbitrary must also implement Clone.

Required Methods§

fn arbitrary(g: &mut Gen) -> Self

Return an arbitrary value.

Implementations should respect Gen::size() when decisions about how big a particular value should be. Implementations should generally defer to other Arbitrary implementations to generate other random values when necessary. The Gen type also offers a few RNG helper routines.

Provided Methods§

fn shrink(&self) -> Box<dyn Iterator<Item = Self>>

Return an iterator of values that are smaller than itself.

The way in which a value is “smaller” is implementation defined. In some cases, the interpretation is obvious: shrinking an integer should produce integers smaller than itself. Others are more complex, for example, shrinking a Vec should both shrink its size and shrink its component values.

The iterator returned should be bounded to some reasonable size.

It is always correct to return an empty iterator, and indeed, this is the default implementation. The downside of this approach is that witnesses to failures in properties will be more inscrutable.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

§

impl Arbitrary for IpAddr

§

fn arbitrary(g: &mut Gen) -> IpAddr

§

impl Arbitrary for SocketAddr

§

fn arbitrary(g: &mut Gen) -> SocketAddr

§

impl Arbitrary for bool

§

fn arbitrary(g: &mut Gen) -> bool

§

fn shrink(&self) -> Box<dyn Iterator<Item = bool>>

§

impl Arbitrary for char

§

fn arbitrary(g: &mut Gen) -> char

§

fn shrink(&self) -> Box<dyn Iterator<Item = char>>

§

impl Arbitrary for f32

§

fn arbitrary(g: &mut Gen) -> f32

§

fn shrink(&self) -> Box<dyn Iterator<Item = f32>>

§

impl Arbitrary for f64

§

fn arbitrary(g: &mut Gen) -> f64

§

fn shrink(&self) -> Box<dyn Iterator<Item = f64>>

§

impl Arbitrary for i8

§

fn arbitrary(g: &mut Gen) -> i8

§

fn shrink(&self) -> Box<dyn Iterator<Item = i8>>

§

impl Arbitrary for i16

§

fn arbitrary(g: &mut Gen) -> i16

§

fn shrink(&self) -> Box<dyn Iterator<Item = i16>>

§

impl Arbitrary for i32

§

fn arbitrary(g: &mut Gen) -> i32

§

fn shrink(&self) -> Box<dyn Iterator<Item = i32>>

§

impl Arbitrary for i64

§

fn arbitrary(g: &mut Gen) -> i64

§

fn shrink(&self) -> Box<dyn Iterator<Item = i64>>

§

impl Arbitrary for i128

§

fn arbitrary(g: &mut Gen) -> i128

§

fn shrink(&self) -> Box<dyn Iterator<Item = i128>>

§

impl Arbitrary for isize

§

fn arbitrary(g: &mut Gen) -> isize

§

fn shrink(&self) -> Box<dyn Iterator<Item = isize>>

§

impl Arbitrary for u8

§

fn arbitrary(g: &mut Gen) -> u8

§

fn shrink(&self) -> Box<dyn Iterator<Item = u8>>

§

impl Arbitrary for u16

§

fn arbitrary(g: &mut Gen) -> u16

§

fn shrink(&self) -> Box<dyn Iterator<Item = u16>>

§

impl Arbitrary for u32

§

fn arbitrary(g: &mut Gen) -> u32

§

fn shrink(&self) -> Box<dyn Iterator<Item = u32>>

§

impl Arbitrary for u64

§

fn arbitrary(g: &mut Gen) -> u64

§

fn shrink(&self) -> Box<dyn Iterator<Item = u64>>

§

impl Arbitrary for u128

§

fn arbitrary(g: &mut Gen) -> u128

§

fn shrink(&self) -> Box<dyn Iterator<Item = u128>>

§

impl Arbitrary for ()

§

fn arbitrary(_: &mut Gen)

§

impl Arbitrary for usize

§

fn arbitrary(g: &mut Gen) -> usize

§

fn shrink(&self) -> Box<dyn Iterator<Item = usize>>

§

impl Arbitrary for CString

§

fn arbitrary(g: &mut Gen) -> CString

§

fn shrink(&self) -> Box<dyn Iterator<Item = CString>>

§

impl Arbitrary for String

§

fn arbitrary(g: &mut Gen) -> String

§

fn shrink(&self) -> Box<dyn Iterator<Item = String>>

§

impl Arbitrary for Ipv4Addr

§

fn arbitrary(g: &mut Gen) -> Ipv4Addr

§

impl Arbitrary for Ipv6Addr

§

fn arbitrary(g: &mut Gen) -> Ipv6Addr

§

impl Arbitrary for SocketAddrV4

§

impl Arbitrary for SocketAddrV6

§

impl Arbitrary for NonZero<u8>

§

fn arbitrary(g: &mut Gen) -> NonZero<u8>

§

fn shrink(&self) -> Box<dyn Iterator<Item = NonZero<u8>>>

§

impl Arbitrary for NonZero<u16>

§

fn arbitrary(g: &mut Gen) -> NonZero<u16>

§

fn shrink(&self) -> Box<dyn Iterator<Item = NonZero<u16>>>

§

impl Arbitrary for NonZero<u32>

§

fn arbitrary(g: &mut Gen) -> NonZero<u32>

§

fn shrink(&self) -> Box<dyn Iterator<Item = NonZero<u32>>>

§

impl Arbitrary for NonZero<u64>

§

fn arbitrary(g: &mut Gen) -> NonZero<u64>

§

fn shrink(&self) -> Box<dyn Iterator<Item = NonZero<u64>>>

§

impl Arbitrary for NonZero<u128>

§

fn arbitrary(g: &mut Gen) -> NonZero<u128>

§

fn shrink(&self) -> Box<dyn Iterator<Item = NonZero<u128>>>

§

impl Arbitrary for NonZero<usize>

§

fn arbitrary(g: &mut Gen) -> NonZero<usize>

§

fn shrink(&self) -> Box<dyn Iterator<Item = NonZero<usize>>>

§

impl Arbitrary for RangeFull

§

fn arbitrary(_: &mut Gen) -> RangeFull

§

impl Arbitrary for Duration

§

fn arbitrary(gen: &mut Gen) -> Duration

§

fn shrink(&self) -> Box<dyn Iterator<Item = Duration>>

§

impl Arbitrary for OsString

§

fn arbitrary(g: &mut Gen) -> OsString

§

fn shrink(&self) -> Box<dyn Iterator<Item = OsString>>

§

impl Arbitrary for PathBuf

§

fn arbitrary(g: &mut Gen) -> PathBuf

§

fn shrink(&self) -> Box<dyn Iterator<Item = PathBuf>>

§

impl Arbitrary for SystemTime

§

fn arbitrary(gen: &mut Gen) -> SystemTime

§

fn shrink(&self) -> Box<dyn Iterator<Item = SystemTime>>

§

impl<A> Arbitrary for Option<A>
where A: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> Option<A>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Option<A>>>

§

impl<A> Arbitrary for (A,)
where A: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> (A,)

§

fn shrink(&self) -> Box<dyn Iterator<Item = (A,)>>

§

impl<A> Arbitrary for Box<A>
where A: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> Box<A>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Box<A>>>

§

impl<A> Arbitrary for Arc<A>
where A: Arbitrary + Sync,

§

fn arbitrary(g: &mut Gen) -> Arc<A>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Arc<A>>>

§

impl<A> Arbitrary for Vec<A>
where A: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> Vec<A>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Vec<A>>>

§

impl<A, B> Arbitrary for Result<A, B>
where A: Arbitrary, B: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> Result<A, B>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Result<A, B>>>

§

impl<A, B> Arbitrary for (A, B)
where A: Arbitrary, B: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> (A, B)

§

fn shrink(&self) -> Box<dyn Iterator<Item = (A, B)>>

§

impl<A, B, C> Arbitrary for (A, B, C)
where A: Arbitrary, B: Arbitrary, C: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> (A, B, C)

§

fn shrink(&self) -> Box<dyn Iterator<Item = (A, B, C)>>

§

impl<A, B, C, D> Arbitrary for (A, B, C, D)
where A: Arbitrary, B: Arbitrary, C: Arbitrary, D: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> (A, B, C, D)

§

fn shrink(&self) -> Box<dyn Iterator<Item = (A, B, C, D)>>

§

impl<A, B, C, D, E> Arbitrary for (A, B, C, D, E)
where A: Arbitrary, B: Arbitrary, C: Arbitrary, D: Arbitrary, E: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> (A, B, C, D, E)

§

fn shrink(&self) -> Box<dyn Iterator<Item = (A, B, C, D, E)>>

§

impl<A, B, C, D, E, F> Arbitrary for (A, B, C, D, E, F)

§

fn arbitrary(g: &mut Gen) -> (A, B, C, D, E, F)

§

fn shrink(&self) -> Box<dyn Iterator<Item = (A, B, C, D, E, F)>>

§

impl<A, B, C, D, E, F, G> Arbitrary for (A, B, C, D, E, F, G)

§

impl<A, B, C, D, E, F, G, H> Arbitrary for (A, B, C, D, E, F, G, H)

§

impl<K, V> Arbitrary for BTreeMap<K, V>
where K: Arbitrary + Ord, V: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> BTreeMap<K, V>

§

fn shrink(&self) -> Box<dyn Iterator<Item = BTreeMap<K, V>>>

§

impl<K, V, S> Arbitrary for HashMap<K, V, S>
where K: Arbitrary + Eq + Hash, V: Arbitrary, S: BuildHasher + Default + Clone + 'static,

§

fn arbitrary(g: &mut Gen) -> HashMap<K, V, S>

§

fn shrink(&self) -> Box<dyn Iterator<Item = HashMap<K, V, S>>>

§

impl<T> Arbitrary for Bound<T>
where T: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> Bound<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Bound<T>>>

§

impl<T> Arbitrary for BinaryHeap<T>
where T: Arbitrary + Ord,

§

fn arbitrary(g: &mut Gen) -> BinaryHeap<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = BinaryHeap<T>>>

§

impl<T> Arbitrary for BTreeSet<T>
where T: Arbitrary + Ord,

§

fn arbitrary(g: &mut Gen) -> BTreeSet<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = BTreeSet<T>>>

§

impl<T> Arbitrary for LinkedList<T>
where T: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> LinkedList<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = LinkedList<T>>>

§

impl<T> Arbitrary for VecDeque<T>
where T: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> VecDeque<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = VecDeque<T>>>

§

impl<T> Arbitrary for Wrapping<T>
where T: Arbitrary,

§

fn arbitrary(g: &mut Gen) -> Wrapping<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Wrapping<T>>>

§

impl<T> Arbitrary for Range<T>
where T: Arbitrary + Clone + PartialOrd,

§

fn arbitrary(g: &mut Gen) -> Range<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = Range<T>>>

§

impl<T> Arbitrary for RangeFrom<T>
where T: Arbitrary + Clone + PartialOrd,

§

fn arbitrary(g: &mut Gen) -> RangeFrom<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = RangeFrom<T>>>

§

impl<T> Arbitrary for RangeInclusive<T>
where T: Arbitrary + Clone + PartialOrd,

§

fn arbitrary(g: &mut Gen) -> RangeInclusive<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = RangeInclusive<T>>>

§

impl<T> Arbitrary for RangeTo<T>
where T: Arbitrary + Clone + PartialOrd,

§

fn arbitrary(g: &mut Gen) -> RangeTo<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = RangeTo<T>>>

§

impl<T> Arbitrary for RangeToInclusive<T>
where T: Arbitrary + Clone + PartialOrd,

§

fn arbitrary(g: &mut Gen) -> RangeToInclusive<T>

§

fn shrink(&self) -> Box<dyn Iterator<Item = RangeToInclusive<T>>>

§

impl<T, S> Arbitrary for HashSet<T, S>
where T: Arbitrary + Eq + Hash, S: BuildHasher + Default + Clone + 'static,

§

fn arbitrary(g: &mut Gen) -> HashSet<T, S>

§

fn shrink(&self) -> Box<dyn Iterator<Item = HashSet<T, S>>>

Implementors§