Crates.io | proptest-attr-macro |
lib.rs | proptest-attr-macro |
version | 1.0.0 |
source | src |
created_at | 2019-07-21 19:22:18.609156 |
updated_at | 2020-10-27 13:51:59.171512 |
description | Procedural attribute macro for writing proptest tests |
homepage | |
repository | https://github.com/dcreager/proptest-attr-macro/ |
max_upload_size | |
id | 150603 |
size | 22,237 |
This crate provides a procedural attribute macro version of proptest's proptest!
macro.
So instead of having to write:
use proptest::proptest;
proptest! {
fn test_excluded_middle(x: u32, y: u32) {
assert!(x == y || x != y);
}
}
you can write:
use proptest_attr_macro::proptest;
#[proptest]
fn test_excluded_middle(x: u32, y: u32) {
assert!(x == y || x != y);
}
Procedural attribute macros can only be used with valid Rust syntax, which means that you can't
use proptest's in
operator (which allows you to draw values from a specific strategy
function):
// This won't compile!
#[proptest]
fn test_even_numbers(x in even(any::<u32>())) {
assert!((x % 2) == 0);
}
Instead you must provide an actual parameter list, just like you would with a real Rust
function definition. That, in turn, means that your function parameters can only draw values
using the any
strategy for their types. If you want to use a custom strategy, you must
create a separately named type, and have the new type's Arbitrary
impl use that strategy:
struct Even { value: i32 }
impl Arbitrary for Even {
type Parameters = ();
type Strategy = BoxedStrategy<Even>;
fn arbitrary_with(_args: ()) -> Self::Strategy {
(0..100).prop_map(|x| Even { value: x * 2 }).boxed()
}
}
#[proptest]
fn test_even_numbers(even: Even) {
assert!((even.value % 2) == 0);
}
The main one is purely aesthetic: since you're applying the proptest
attribute macro to valid
Rust functions, rustfmt
works on them!