use crate::std_facade::fmt;
#[macro_export]
macro_rules! proptest {
(#![proptest_config($config:expr)]
$(
$(#[$meta:meta])*
fn $test_name:ident($($parm:pat in $strategy:expr),+ $(,)?) $body:block
)*) => {
$(
$(#[$meta])*
fn $test_name() {
let mut config = $config.clone();
config.test_name = Some(
concat!(module_path!(), "::", stringify!($test_name)));
$crate::proptest_helper!(@_BODY config ($($parm in $strategy),+) [] $body);
}
)*
};
(#![proptest_config($config:expr)]
$(
$(#[$meta:meta])*
fn $test_name:ident($($arg:tt)+) $body:block
)*) => {
$(
$(#[$meta])*
fn $test_name() {
let mut config = $config.clone();
config.test_name = Some(
concat!(module_path!(), "::", stringify!($test_name)));
$crate::proptest_helper!(@_BODY2 config ($($arg)+) [] $body);
}
)*
};
($(
$(#[$meta:meta])*
fn $test_name:ident($($parm:pat in $strategy:expr),+ $(,)?) $body:block
)*) => { $crate::proptest! {
#![proptest_config($crate::test_runner::Config::default())]
$($(#[$meta])*
fn $test_name($($parm in $strategy),+) $body)*
} };
($(
$(#[$meta:meta])*
fn $test_name:ident($($arg:tt)+) $body:block
)*) => { $crate::proptest! {
#![proptest_config($crate::test_runner::Config::default())]
$($(#[$meta])*
fn $test_name($($arg)+) $body)*
} };
(|($($parm:pat in $strategy:expr),+ $(,)?)| $body:expr) => {
$crate::proptest!(
$crate::test_runner::Config::default(),
|($($parm in $strategy),+)| $body)
};
(move |($($parm:pat in $strategy:expr),+ $(,)?)| $body:expr) => {
$crate::proptest!(
$crate::test_runner::Config::default(),
move |($($parm in $strategy),+)| $body)
};
(|($($arg:tt)+)| $body:expr) => {
$crate::proptest!(
$crate::test_runner::Config::default(),
|($($arg)+)| $body)
};
(move |($($arg:tt)+)| $body:expr) => {
$crate::proptest!(
$crate::test_runner::Config::default(),
move |($($arg)+)| $body)
};
($config:expr, |($($parm:pat in $strategy:expr),+ $(,)?)| $body:expr) => { {
let mut config = $config.__sugar_to_owned();
$crate::sugar::force_no_fork(&mut config);
$crate::proptest_helper!(@_BODY config ($($parm in $strategy),+) [] $body)
} };
($config:expr, move |($($parm:pat in $strategy:expr),+ $(,)?)| $body:expr) => { {
let mut config = $config.__sugar_to_owned();
$crate::sugar::force_no_fork(&mut config);
$crate::proptest_helper!(@_BODY config ($($parm in $strategy),+) [move] $body)
} };
($config:expr, |($($arg:tt)+)| $body:expr) => { {
let mut config = $config.__sugar_to_owned();
$crate::sugar::force_no_fork(&mut config);
$crate::proptest_helper!(@_BODY2 config ($($arg)+) [] $body);
} };
($config:expr, move |($($arg:tt)+)| $body:expr) => { {
let mut config = $config.__sugar_to_owned();
$crate::sugar::force_no_fork(&mut config);
$crate::proptest_helper!(@_BODY2 config ($($arg)+) [move] $body);
} };
}
#[macro_export]
macro_rules! prop_assume {
($expr:expr) => {
$crate::prop_assume!($expr, "{}", stringify!($expr))
};
($expr:expr, $fmt:tt $(, $fmt_arg:expr),* $(,)?) => {
if !$expr {
return ::std::result::Result::Err(
$crate::test_runner::TestCaseError::reject(
format!(concat!("{}:{}:{}: ", $fmt),
file!(), line!(), column!()
$(, $fmt_arg)*)));
}
};
}
#[macro_export]
macro_rules! prop_oneof {
($($item:expr),+ $(,)?) => {
$crate::prop_oneof![
$(1 => $item),*
]
};
($_weight0:expr => $item0:expr $(,)?) => { $item0 };
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr,
$weight4:expr => $item4:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3),
($weight4, $item4)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr,
$weight4:expr => $item4:expr,
$weight5:expr => $item5:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3),
($weight4, $item4), ($weight5, $item5)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr,
$weight4:expr => $item4:expr,
$weight5:expr => $item5:expr,
$weight6:expr => $item6:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3),
($weight4, $item4), ($weight5, $item5),
($weight6, $item6)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr,
$weight4:expr => $item4:expr,
$weight5:expr => $item5:expr,
$weight6:expr => $item6:expr,
$weight7:expr => $item7:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3),
($weight4, $item4), ($weight5, $item5),
($weight6, $item6), ($weight7, $item7)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr,
$weight4:expr => $item4:expr,
$weight5:expr => $item5:expr,
$weight6:expr => $item6:expr,
$weight7:expr => $item7:expr,
$weight8:expr => $item8:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3),
($weight4, $item4), ($weight5, $item5),
($weight6, $item6), ($weight7, $item7),
($weight8, $item8)))
};
($weight0:expr => $item0:expr,
$weight1:expr => $item1:expr,
$weight2:expr => $item2:expr,
$weight3:expr => $item3:expr,
$weight4:expr => $item4:expr,
$weight5:expr => $item5:expr,
$weight6:expr => $item6:expr,
$weight7:expr => $item7:expr,
$weight8:expr => $item8:expr,
$weight9:expr => $item9:expr $(,)?) => {
$crate::strategy::TupleUnion::new(
(($weight0, $item0), ($weight1, $item1),
($weight2, $item2), ($weight3, $item3),
($weight4, $item4), ($weight5, $item5),
($weight6, $item6), ($weight7, $item7),
($weight8, $item8), ($weight9, $item9)))
};
($($weight:expr => $item:expr),+ $(,)?) => {
$crate::strategy::Union::new_weighted(vec![
$(($weight, $crate::strategy::Strategy::boxed($item))),*
])
};
}
#[macro_export]
macro_rules! prop_compose {
($(#[$meta:meta])*
$vis:vis
$([$($modi:tt)*])? fn $name:ident $params:tt
($($var:pat in $strategy:expr),+ $(,)?)
-> $return_type:ty $body:block) =>
{
#[must_use = "strategies do nothing unless used"]
$(#[$meta])*
$vis
$($($modi)*)? fn $name $params
-> impl $crate::strategy::Strategy<Value = $return_type> {
let strat = $crate::proptest_helper!(@_WRAP ($($strategy)*));
$crate::strategy::Strategy::prop_map(strat,
|$crate::proptest_helper!(@_WRAPPAT ($($var),*))| $body)
}
};
($(#[$meta:meta])*
$vis:vis
$([$($modi:tt)*])? fn $name:ident $params:tt
($($var:pat in $strategy:expr),+ $(,)?)
($($var2:pat in $strategy2:expr),+ $(,)?)
-> $return_type:ty $body:block) =>
{
#[must_use = "strategies do nothing unless used"]
$(#[$meta])*
$vis
$($($modi)*)? fn $name $params
-> impl $crate::strategy::Strategy<Value = $return_type> {
let strat = $crate::proptest_helper!(@_WRAP ($($strategy)*));
let strat = $crate::strategy::Strategy::prop_flat_map(
strat,
|$crate::proptest_helper!(@_WRAPPAT ($($var),*))|
$crate::proptest_helper!(@_WRAP ($($strategy2)*)));
$crate::strategy::Strategy::prop_map(strat,
|$crate::proptest_helper!(@_WRAPPAT ($($var2),*))| $body)
}
};
($(#[$meta:meta])*
$vis:vis
$([$($modi:tt)*])? fn $name:ident $params:tt
($($arg:tt)+)
-> $return_type:ty $body:block) =>
{
#[must_use = "strategies do nothing unless used"]
$(#[$meta])*
$vis
$($($modi)*)? fn $name $params
-> impl $crate::strategy::Strategy<Value = $return_type> {
let strat = $crate::proptest_helper!(@_EXT _STRAT ($($arg)+));
$crate::strategy::Strategy::prop_map(strat,
|$crate::proptest_helper!(@_EXT _PAT ($($arg)+))| $body)
}
};
($(#[$meta:meta])*
$vis:vis
$([$($modi:tt)*])? fn $name:ident $params:tt
($($arg:tt)+ $(,)?)
($($arg2:tt)+ $(,)?)
-> $return_type:ty $body:block) =>
{
#[must_use = "strategies do nothing unless used"]
$(#[$meta])*
$vis
$($($modi)*)? fn $name $params
-> impl $crate::strategy::Strategy<Value = $return_type> {
let strat = $crate::proptest_helper!(@_WRAP ($($strategy)*));
let strat = $crate::strategy::Strategy::prop_flat_map(
strat,
|$crate::proptest_helper!(@_EXT _PAT ($($arg)+))|
$crate::proptest_helper!(@_EXT _STRAT ($($arg2)*)));
$crate::strategy::Strategy::prop_map(strat,
|$crate::proptest_helper!(@_EXT _PAT ($($arg2)*))| $body)
}
};
}
#[macro_export]
macro_rules! prop_assert {
($cond:expr) => {
$crate::prop_assert!($cond, concat!("assertion failed: ", stringify!($cond)))
};
($cond:expr, $($fmt:tt)*) => {
if !$cond {
let message = format!($($fmt)*);
let message = format!("{} at {}:{}", message, file!(), line!());
return ::std::result::Result::Err(
$crate::test_runner::TestCaseError::fail(message));
}
};
}
#[macro_export]
macro_rules! prop_assert_eq {
($left:expr, $right:expr) => {{
let left = $left;
let right = $right;
$crate::prop_assert!(
left == right,
"assertion failed: `(left == right)` (left: `{:?}`, right: `{:?}`)",
left, right);
}};
($left:expr, $right:expr, $fmt:tt $($args:tt)*) => {{
let left = $left;
let right = $right;
$crate::prop_assert!(
left == right,
concat!(
"assertion failed: `(left == right)` (left: `{:?}`, right: `{:?}`): ", $fmt),
left, right $($args)*);
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! proptest_helper {
(@_WRAP ($a:tt)) => { $a };
(@_WRAP ($a0:tt $a1:tt)) => { ($a0, $a1) };
(@_WRAP ($a0:tt $a1:tt $a2:tt)) => { ($a0, $a1, $a2) };
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt)) => { ($a0, $a1, $a2, $a3) };
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt $a4:tt)) => {
($a0, $a1, $a2, $a3, $a4)
};
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt $a4:tt $a5:tt)) => {
($a0, $a1, $a2, $a3, $a4, $a5)
};
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt $a4:tt $a5:tt $a6:tt)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6)
};
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt
$a4:tt $a5:tt $a6:tt $a7:tt)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7)
};
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt $a4:tt
$a5:tt $a6:tt $a7:tt $a8:tt)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8)
};
(@_WRAP ($a0:tt $a1:tt $a2:tt $a3:tt $a4:tt
$a5:tt $a6:tt $a7:tt $a8:tt $a9:tt)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9)
};
(@_WRAP ($a:tt $($rest:tt)*)) => {
($a, $crate::proptest_helper!(@_WRAP ($($rest)*)))
};
(@_WRAPPAT ($item:pat)) => { $item };
(@_WRAPPAT ($a0:pat, $a1:pat)) => { ($a0, $a1) };
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat)) => { ($a0, $a1, $a2) };
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat)) => {
($a0, $a1, $a2, $a3)
};
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat)) => {
($a0, $a1, $a2, $a3, $a4)
};
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat, $a5:pat)) => {
($a0, $a1, $a2, $a3, $a4, $a5)
};
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat,
$a4:pat, $a5:pat, $a6:pat)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6)
};
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat,
$a4:pat, $a5:pat, $a6:pat, $a7:pat)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7)
};
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat,
$a5:pat, $a6:pat, $a7:pat, $a8:pat)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8)
};
(@_WRAPPAT ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat,
$a5:pat, $a6:pat, $a7:pat, $a8:pat, $a9:pat)) => {
($a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9)
};
(@_WRAPPAT ($a:pat, $($rest:pat),*)) => {
($a, $crate::proptest_helper!(@_WRAPPAT ($($rest),*)))
};
(@_WRAPSTR ($item:pat)) => { stringify!($item) };
(@_WRAPSTR ($a0:pat, $a1:pat)) => { (stringify!($a0), stringify!($a1)) };
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2), stringify!($a3))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2),
stringify!($a3), stringify!($a4))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat, $a5:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2), stringify!($a3),
stringify!($a4), stringify!($a5))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat,
$a4:pat, $a5:pat, $a6:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2), stringify!($a3),
stringify!($a4), stringify!($a5), stringify!($a6))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat,
$a4:pat, $a5:pat, $a6:pat, $a7:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2), stringify!($a3),
stringify!($a4), stringify!($a5), stringify!($a6), stringify!($a7))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat,
$a5:pat, $a6:pat, $a7:pat, $a8:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2), stringify!($a3),
stringify!($a4), stringify!($a5), stringify!($a6), stringify!($a7),
stringify!($a8))
};
(@_WRAPSTR ($a0:pat, $a1:pat, $a2:pat, $a3:pat, $a4:pat,
$a5:pat, $a6:pat, $a7:pat, $a8:pat, $a9:pat)) => {
(stringify!($a0), stringify!($a1), stringify!($a2), stringify!($a3),
stringify!($a4), stringify!($a5), stringify!($a6), stringify!($a7),
stringify!($a8), stringify!($a9))
};
(@_WRAPSTR ($a:pat, $($rest:pat),*)) => {
(stringify!($a), $crate::proptest_helper!(@_WRAPSTR ($($rest),*)))
};
(@_BODY $config:ident ($($parm:pat in $strategy:expr),+) [$($mod:tt)*] $body:expr) => {{
$config.source_file = Some(file!());
let mut runner = $crate::test_runner::TestRunner::new($config);
let names = $crate::proptest_helper!(@_WRAPSTR ($($parm),*));
match runner.run(
&$crate::strategy::Strategy::prop_map(
$crate::proptest_helper!(@_WRAP ($($strategy)*)),
|values| $crate::sugar::NamedArguments(names, values)),
$($mod)* |$crate::sugar::NamedArguments(
_, $crate::proptest_helper!(@_WRAPPAT ($($parm),*)))|
{
$body;
Ok(())
})
{
Ok(_) => (),
Err(e) => panic!("{}\n{}", e, runner),
}
}};
(@_BODY2 $config:ident ($($arg:tt)+) [$($mod:tt)*] $body:expr) => {{
$config.source_file = Some(file!());
let mut runner = $crate::test_runner::TestRunner::new($config);
let names = $crate::proptest_helper!(@_EXT _STR ($($arg)*));
match runner.run(
&$crate::strategy::Strategy::prop_map(
$crate::proptest_helper!(@_EXT _STRAT ($($arg)*)),
|values| $crate::sugar::NamedArguments(names, values)),
$($mod)* |$crate::sugar::NamedArguments(
_, $crate::proptest_helper!(@_EXT _PAT ($($arg)*)))|
{
$body;
Ok(())
})
{
Ok(_) => (),
Err(e) => panic!("{}\n{}", e, runner),
}
}};
(@_STRAT [$s:ty] [$p:pat]) => { $crate::arbitrary::any::<$s>() };
(@_PAT [$s:ty] [$p:pat]) => { $p };
(@_STR [$s:ty] [$p:pat]) => { stringify!($p) };
(@_STRAT in [$s:expr] [$p:pat]) => { $s };
(@_PAT in [$s:expr] [$p:pat]) => { $p };
(@_STR in [$s:expr] [$p:pat]) => { stringify!($p) };
(@_EXT $cmd:ident ($p:pat in $s:expr $(,)?)) => {
$crate::proptest_helper!(@$cmd in [$s] [$p])
};
(@_EXT $cmd:ident (($p:pat) : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [$p])
};
(@_EXT $cmd:ident (_ : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [_])
};
(@_EXT $cmd:ident (ref mut $p:ident : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [ref mut $p])
};
(@_EXT $cmd:ident (ref $p:ident : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [ref $p])
};
(@_EXT $cmd:ident (mut $p:ident : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [mut $p])
};
(@_EXT $cmd:ident ($p:ident : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [$p])
};
(@_EXT $cmd:ident ([$($p:tt)*] : $s:ty $(,)?)) => {
$crate::proptest_helper!(@$cmd [$s] [[$($p)*]])
};
(@_EXT $cmd:ident ($p:pat in $s:expr, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd in [$s] [$p]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident (($p:pat) : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [$p]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident (_ : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [_]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident (ref mut $p:ident : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [ref mut $p]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident (ref $p:ident : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [ref $p]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident (mut $p:ident : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [mut $p]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident ($p:ident : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [$p]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
(@_EXT $cmd:ident ([$($p:tt)*] : $s:ty, $($r:tt)*)) => {
($crate::proptest_helper!(@$cmd [$s] [[$($p)*]]), $crate::proptest_helper!(@_EXT $cmd ($($r)*)))
};
}
#[doc(hidden)]
#[derive(Clone, Copy)]
pub struct NamedArguments<N, V>(
#[doc(hidden)] pub N, #[doc(hidden)] pub V);
impl<V : fmt::Debug> fmt::Debug for NamedArguments<&'static str, V> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{} = ", self.0)?;
self.1.fmt(f)
}
}
macro_rules! named_arguments_tuple {
($($ix:tt $argn:ident $argv:ident)*) => {
impl<'a, $($argn : Copy),*, $($argv),*> fmt::Debug
for NamedArguments<($($argn,)*),&'a ($($argv,)*)>
where $(NamedArguments<$argn, &'a $argv> : fmt::Debug),*,
$($argv : 'a),*
{
#[allow(unused_assignments)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut first = true;
$(
if !first {
write!(f, ", ")?;
}
first = false;
fmt::Debug::fmt(
&NamedArguments((self.0).$ix, &(self.1).$ix), f)?;
)*
Ok(())
}
}
impl<$($argn : Copy),*, $($argv),*> fmt::Debug
for NamedArguments<($($argn,)*), ($($argv,)*)>
where $(for<'a> NamedArguments<$argn, &'a $argv> : fmt::Debug),*
{
#[allow(unused_assignments)]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut first = true;
$(
if !first {
write!(f, ", ")?;
}
first = false;
fmt::Debug::fmt(
&NamedArguments((self.0).$ix, &(self.1).$ix), f)?;
)*
Ok(())
}
}
}
}
named_arguments_tuple!(0 AN AV);
named_arguments_tuple!(0 AN AV 1 BN BV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV 4 EN EV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV 4 EN EV
5 FN FV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV 4 EN EV
5 FN FV 6 GN GV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV 4 EN EV
5 FN FV 6 GN GV 7 HN HV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV 4 EN EV
5 FN FV 6 GN GV 7 HN HV 8 IN IV);
named_arguments_tuple!(0 AN AV 1 BN BV 2 CN CV 3 DN DV 4 EN EV
5 FN FV 6 GN GV 7 HN HV 8 IN IV 9 JN JV);
#[macro_export]
macro_rules! prop_assert_ne {
($left:expr, $right:expr) => {{
let left = $left;
let right = $right;
prop_assert!(left != right, "assertion failed: `(left != right)` \
(left: `{:?}`, right: `{:?}`)",
left, right);
}};
($left:expr, $right:expr, $fmt:tt $($args:tt)*) => {{
let left = $left;
let right = $right;
prop_assert!(left != right, concat!(
"assertion failed: `(left != right)` \
(left: `{:?}`, right: `{:?}`): ", $fmt),
left, right $($args)*);
}};
}
#[cfg(feature = "std")]
#[doc(hidden)]
pub fn force_no_fork(config: &mut crate::test_runner::Config) {
if config.fork() {
eprintln!("proptest: Forking/timeout not supported in closure-style \
invocations; ignoring");
#[cfg(feature = "fork")] {
config.fork = false;
}
#[cfg(feature = "timeout")] {
config.timeout = 0;
}
assert!(!config.fork());
}
}
#[cfg(not(feature = "std"))]
pub fn force_no_fork(_: &mut crate::test_runner::Config) { }
#[cfg(test)]
mod test {
use crate::strategy::Just;
prop_compose! {
#[allow(dead_code)]
fn two_ints(relative: i32)(a in 0..relative, b in relative..)
-> (i32, i32) {
(a, b)
}
}
prop_compose! {
#[allow(dead_code)]
pub fn two_ints_pub(relative: i32)(a in 0..relative, b in relative..)
-> (i32, i32) {
(a, b)
}
}
prop_compose! {
#[allow(dead_code)]
pub [extern "C"] fn two_ints_pub_with_attrs
(relative: i32)(a in 0..relative, b in relative..)
-> (i32, i32)
{
(a, b)
}
}
prop_compose! {
#[allow(dead_code)]
[extern "C"] fn with_modifier(relative: i32)(a in 0..relative) -> i32 {
a
}
}
prop_compose! {
#[allow(dead_code)]
fn a_less_than_b()(b in 0..1000)(a in 0..b, b in Just(b))
-> (i32, i32) {
(a, b)
}
}
proptest! {
#[test]
fn test_something(a in 0u32..42u32, b in 1u32..10u32) {
prop_assume!(a != 41 || b != 9);
assert!(a + b < 50);
}
}
#[allow(unused_variables)]
mod test_arg_counts {
use crate::strategy::Just;
proptest! {
#[test]
fn test_1_arg(a in Just(0)) { }
#[test]
fn test_2_arg(a in Just(0), b in Just(0)) { }
#[test]
fn test_3_arg(a in Just(0), b in Just(0), c in Just(0)) { }
#[test]
fn test_4_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0)) { }
#[test]
fn test_5_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0)) { }
#[test]
fn test_6_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0)) { }
#[test]
fn test_7_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0),
g in Just(0)) { }
#[test]
fn test_8_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0),
g in Just(0), h in Just(0)) { }
#[test]
fn test_9_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0),
g in Just(0), h in Just(0), i in Just(0)) { }
#[test]
fn test_a_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0),
g in Just(0), h in Just(0), i in Just(0),
j in Just(0)) { }
#[test]
fn test_b_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0),
g in Just(0), h in Just(0), i in Just(0),
j in Just(0), k in Just(0)) { }
#[test]
fn test_c_arg(a in Just(0), b in Just(0), c in Just(0),
d in Just(0), e in Just(0), f in Just(0),
g in Just(0), h in Just(0), i in Just(0),
j in Just(0), k in Just(0), l in Just(0)) { }
}
}
#[test]
fn named_arguments_is_debug_for_needed_cases() {
use super::NamedArguments;
println!("{:?}", NamedArguments("foo", &"bar"));
println!("{:?}", NamedArguments(("foo",), &(1,)));
println!("{:?}", NamedArguments(("foo","bar"), &(1,2)));
println!("{:?}", NamedArguments(("a","b","c"), &(1,2,3)));
println!("{:?}", NamedArguments(("a","b","c","d"), &(1,2,3,4)));
println!("{:?}", NamedArguments(("a","b","c","d","e"),
&(1,2,3,4,5)));
println!("{:?}", NamedArguments(("a","b","c","d","e","f"),
&(1,2,3,4,5,6)));
println!("{:?}", NamedArguments(("a","b","c","d","e","f","g"),
&(1,2,3,4,5,6,7)));
println!("{:?}", NamedArguments(("a","b","c","d","e","f","g","h"),
&(1,2,3,4,5,6,7,8)));
println!("{:?}", NamedArguments(("a","b","c","d","e","f","g","h","i"),
&(1,2,3,4,5,6,7,8,9)));
println!("{:?}", NamedArguments(("a","b","c","d","e","f","g","h","i","j"),
&(1,2,3,4,5,6,7,8,9,10)));
println!("{:?}", NamedArguments((("a","b"),"c","d"), &((1,2),3,4)));
}
#[test]
fn oneof_all_counts() {
use crate::strategy::{Strategy, TupleUnion, Union, Just as J};
fn expect_count(n: usize, s: impl Strategy<Value = i32>) {
use std::collections::HashSet;
use crate::strategy::*;
use crate::test_runner::*;
let mut runner = TestRunner::default();
let mut seen = HashSet::new();
for _ in 0..1024 {
seen.insert(s.new_tree(&mut runner).unwrap().current());
}
assert_eq!(n, seen.len());
}
fn assert_static<T>(v: TupleUnion<T>) -> TupleUnion<T> { v }
fn assert_dynamic<T: Strategy>(v: Union<T>) -> Union<T> { v }
expect_count(1, prop_oneof![J(0i32)]);
expect_count(2, assert_static(prop_oneof![
J(0i32),
J(1i32),
]));
expect_count(3, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
]));
expect_count(4, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
]));
expect_count(5, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
]));
expect_count(6, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
J(5i32),
]));
expect_count(7, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
J(5i32),
J(6i32),
]));
expect_count(8, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
J(5i32),
J(6i32),
J(7i32),
]));
expect_count(9, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
J(5i32),
J(6i32),
J(7i32),
J(8i32),
]));
expect_count(10, assert_static(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
J(5i32),
J(6i32),
J(7i32),
J(8i32),
J(9i32),
]));
expect_count(11, assert_dynamic(prop_oneof![
J(0i32),
J(1i32),
J(2i32),
J(3i32),
J(4i32),
J(5i32),
J(6i32),
J(7i32),
J(8i32),
J(9i32),
J(10i32),
]));
}
}
#[cfg(all(test, feature = "timeout"))]
mod test_timeout {
proptest! {
#![proptest_config(crate::test_runner::Config {
fork: true,
.. crate::test_runner::Config::default()
})]
#[test]
fn test_name_set_correctly_for_fork(_ in 0u32..1u32) { }
}
}
#[cfg(test)]
mod another_test {
use crate::sugar;
#[allow(dead_code)]
fn can_access_pub_compose() {
let _ = sugar::test::two_ints_pub(42);
let _ = sugar::test::two_ints_pub_with_attrs(42);
}
}
#[cfg(test)]
mod ownership_tests {
#[cfg(feature = "std")]
proptest! {
#[test]
fn accept_ref_arg(ref s in "[0-9]") {
use crate::std_facade::String;
fn assert_string(_s: &String) {}
assert_string(s);
}
#[test]
fn accept_move_arg(s in "[0-9]") {
use crate::std_facade::String;
fn assert_string(_s: String) {}
assert_string(s);
}
}
#[derive(Debug)]
struct NotClone();
const MK: fn() -> NotClone = NotClone;
proptest! {
#[test]
fn accept_noclone_arg(nc in MK) {
let _nc2: NotClone = nc;
}
#[test]
fn accept_noclone_ref_arg(ref nc in MK) {
let _nc2: &NotClone = nc;
}
}
}
#[cfg(test)]
mod closure_tests {
#[test]
fn test_simple() {
let x = 420;
proptest!(|(y: i32)| {
assert!(x != y);
});
proptest!(|(y in 0..100)| {
println!("{}", y);
assert!(x != y);
});
proptest!(|(y: i32,)| {
assert!(x != y);
});
proptest!(|(y in 0..100,)| {
println!("{}", y);
assert!(x != y);
});
}
#[test]
fn test_move() {
let foo = Foo;
proptest!(move |(x in 1..100, y in 0..100)| {
assert!(x + y > 0, "foo: {:?}", foo);
});
let foo = Foo;
proptest!(move |(x: (), y: ())| {
assert!(x == y, "foo: {:?}", foo);
});
#[derive(Debug)]
struct Foo;
}
#[test]
#[should_panic]
#[allow(unreachable_code)]
fn fails_if_closure_panics() {
proptest!(|(_ in 0..1)| {
panic!()
});
}
#[test]
fn accepts_unblocked_syntax() {
proptest!(|(x in 0u32..10, y in 10u32..20)| assert!(x < y));
proptest!(|(x in 0u32..10, y in 10u32..20,)| assert!(x < y));
}
#[test]
fn accepts_custom_config() {
let conf = crate::test_runner::Config::default();
proptest!(conf, |(x in 0u32..10, y in 10u32..20)| assert!(x < y));
proptest!(&conf, |(x in 0u32..10, y in 10u32..20)| assert!(x < y));
proptest!(conf, move |(x in 0u32..10, y in 10u32..20)| assert!(x < y));
proptest!(conf, |(_x: u32, _y: u32)| { });
proptest!(conf, move |(_x: u32, _y: u32)| { });
proptest!(conf, |(x in 0u32..10, y in 10u32..20,)| assert!(x < y));
proptest!(&conf, |(x in 0u32..10, y in 10u32..20,)| assert!(x < y));
proptest!(conf, move |(x in 0u32..10, y in 10u32..20,)| assert!(x < y));
proptest!(conf, |(_x: u32, _y: u32,)| { });
proptest!(conf, move |(_x: u32, _y: u32,)| { });
}
}
#[cfg(test)]
mod any_tests {
proptest! {
#[test]
fn test_something
(
a: bool,
b in 25u8..,
c in 25u8..,
_d: (),
mut _e: (),
ref _f: (),
ref mut _g: (),
[_, _]: [(); 2],
) {
if a {}
assert!(b as usize + c as usize >= 50);
}
}
#[test]
fn proptest_ext_test() {
struct Y(pub u8);
let _ = proptest_helper!(@_EXT _STRAT( _ : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( x : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( ref x : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( mut x : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( ref mut x : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( [_, _] : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( (&mut &Y(ref x)) : u8 ));
let _ = proptest_helper!(@_EXT _STRAT( x in 1..2 ));
let proptest_helper!(@_EXT _PAT( _ : u8 )) = 1;
let proptest_helper!(@_EXT _PAT( _x : u8 )) = 1;
let proptest_helper!(@_EXT _PAT( mut _x : u8 )) = 1;
let proptest_helper!(@_EXT _PAT( ref _x : u8 )) = 1;
let proptest_helper!(@_EXT _PAT( ref mut _x : u8 )) = 1;
let proptest_helper!(@_EXT _PAT( [_, _] : u8 )) = [1, 2];
let proptest_helper!(@_EXT _PAT( (&mut &Y(ref _x)) : u8 )) = &mut &Y(1);
let proptest_helper!(@_EXT _PAT( _x in 1..2 )) = 1;
}
}