1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
//! This crate is a port of //! [Haskell's QuickCheck](http://hackage.haskell.org/package/QuickCheck). //! //! For detailed examples, please see the //! [README](https://github.com/BurntSushi/quickcheck). #![allow(deprecated)] // for connect -> join in 1.3 extern crate env_logger; #[macro_use] extern crate log; extern crate rand; pub use arbitrary::{ Arbitrary, Gen, StdGen, empty_shrinker, single_shrinker, }; pub use rand::Rng; pub use tester::{QuickCheck, Testable, TestResult, quickcheck}; /// A macro for writing quickcheck tests. /// /// This macro takes as input one or more property functions to test, and /// produces a proper `#[test]` function for each property. If the property /// fails, the behavior is as if `quickcheck` were called on the property /// (i.e., it panics and fails the test). /// /// Note that this macro doesn't support `mut` or patterns in parameters. /// /// # Example /// /// ```rust /// # #[macro_use] extern crate quickcheck; fn main() { /// quickcheck! { /// fn prop_reverse_reverse(xs: Vec<usize>) -> bool { /// let rev: Vec<_> = xs.clone().into_iter().rev().collect(); /// let revrev: Vec<_> = rev.into_iter().rev().collect(); /// xs == revrev /// } /// }; /// # } /// ``` #[macro_export] macro_rules! quickcheck { (@as_items $($i:item)*) => ($($i)*); { $( fn $fn_name:ident($($arg_name:ident : $arg_ty:ty),*) -> $ret:ty { $($code:tt)* } )* } => ( quickcheck! { @as_items $( #[test] fn $fn_name() { fn prop($($arg_name: $arg_ty),*) -> $ret { $($code)* } $crate::quickcheck(prop as fn($($arg_ty),*) -> $ret); } )* } ) } mod arbitrary; mod tester; #[cfg(test)] mod tests;