Crates.io | derive-quickcheck |
lib.rs | derive-quickcheck |
version | 0.2.0 |
source | src |
created_at | 2023-05-20 11:25:52.72865 |
updated_at | 2023-07-02 10:49:02.465131 |
description | Automatic `derive` for `quickcheck::Arbitrary`. |
homepage | |
repository | https://github.com/wrsturgeon/derive-quickcheck |
max_upload_size | |
id | 869352 |
size | 88,984 |
#[derive(QuickCheck)]
Automatically implements quickcheck::Arbitrary
for any data structure.
Rules:
struct
s (or, generally, when you have all of a collection of types), we simply call quickcheck::Arbitrary::arbitrary
on each.enum
s (or, generally, when you have one of a collection of types), we weight all variants equally.<A, ...>
) must implement quickcheck::Arbitrary
. If not, the struct will still work outside quickcheck
, but you can't property-test it.
PhantomData<A>
still requires <A: Arbitrary>
).// vvvvvvvvvv
#[derive(Clone, Debug, QuickCheck)]
struct StructWithABunchOfEdgeCases<A, B, T, const N: usize> {
a: A,
b: B,
t1: T,
t2: T,
t3: T,
}
automatically writes the following:
impl<
A: ::quickcheck::Arbitrary,
B: ::quickcheck::Arbitrary,
T: ::quickcheck::Arbitrary,
const N: usize, // recognizes this is not a type
> ::quickcheck::Arbitrary for StructWithABunchOfEdgeCases<A, B, T, { N }> {
#[inline]
fn arbitrary(g: &mut ::quickcheck::Gen) -> Self {
a: <A as ::quickcheck::Arbitrary>::arbitrary(g),
b: <B as ::quickcheck::Arbitrary>::arbitrary(g),
t1: <T as ::quickcheck::Arbitrary>::arbitrary(g),
t2: <T as ::quickcheck::Arbitrary>::arbitrary(g),
t3: <T as ::quickcheck::Arbitrary>::arbitrary(g),
}
}
#[derive(Clone, Debug, QuickCheck)]
enum Enum<A, B, C> {
First(A, B, C),
Second(A, B, C),
Third(A, B, C),
}
becomes
impl<
A: ::quickcheck::Arbitrary,
B: ::quickcheck::Arbitrary,
C: ::quickcheck::Arbitrary,
> ::quickcheck::Arbitrary for Enum<A, B, C> {
#[inline]
fn arbitrary(g: &mut ::quickcheck::Gen) -> Self {
g.choose::<fn(&mut ::quickcheck::Gen) -> Self>(&[
(move |g| Self::First(
<A as ::quickcheck::Arbitrary>::arbitrary(g),
<B as ::quickcheck::Arbitrary>::arbitrary(g),
<C as ::quickcheck::Arbitrary>::arbitrary(g),
)) as fn(&mut ::quickcheck::Gen) -> Self,
(move |g| Self::Second(
<A as ::quickcheck::Arbitrary>::arbitrary(g),
<B as ::quickcheck::Arbitrary>::arbitrary(g),
<C as ::quickcheck::Arbitrary>::arbitrary(g),
)) as fn(&mut ::quickcheck::Gen) -> Self,
(move |g| Self::Third(
<A as ::quickcheck::Arbitrary>::arbitrary(g),
<B as ::quickcheck::Arbitrary>::arbitrary(g),
<C as ::quickcheck::Arbitrary>::arbitrary(g),
)) as fn(&mut ::quickcheck::Gen) -> Self,
]).unwrap()(g)
}
}
All credit for the incredible quickcheck
library goes to its authors, not me! :)