#[macro_export]
macro_rules! assert_fn_err_lt_expr_as_result {
($a_function:path, $a_param:expr, $b_expr:expr $(,)?) => {{
match (&$a_function, &$a_param, &$b_expr) {
(_a_function, a_param, b_expr) => {
let a_result = $a_function($a_param);
let a_is_err = a_result.is_err();
if !a_is_err {
Err(format!(
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, a_param, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `{}`,\n",
" a_param label: `{}`,\n",
" a_param debug: `{:?}`,\n",
" b_expr label: `{}`,\n",
" b_expr debug: `{:?}`,\n",
" a result: `{:?}`",
),
stringify!($a_function),
stringify!($a_param),
a_param,
stringify!($b_expr),
b_expr,
a_result
))
} else {
let a_err = a_result.unwrap_err();
if a_err < $b_expr {
Ok(())
} else {
Err(format!(
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, a_param, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `{}`,\n",
" a_param label: `{}`,\n",
" a_param debug: `{:?}`,\n",
" b_expr label: `{}`,\n",
" b_expr debug: `{:?}`,\n",
" a: `{:?}`,\n",
" b: `{:?}`",
),
stringify!($a_function),
stringify!($a_param),
a_param,
stringify!($b_expr),
b_expr,
a_err,
$b_expr
))
}
}
}
}
}};
($a_function:path, $b_expr:expr $(,)?) => {{
match (&$a_function, &$b_expr) {
(_a_function, b_expr) => {
let a_result = $a_function();
let a_is_err = a_result.is_err();
if !a_is_err {
Err(format!(
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `{}`,\n",
" b_expr label: `{}`,\n",
" b_expr debug: `{:?}`,\n",
" a result: `{:?}`",
),
stringify!($a_function),
stringify!($b_expr),
b_expr,
a_result
))
} else {
let a_err = a_result.unwrap_err();
if a_err < $b_expr {
Ok(())
} else {
Err(format!(
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `{}`,\n",
" b_expr label: `{}`,\n",
" b_expr debug: `{:?}`,\n",
" a: `{:?}`,\n",
" b: `{:?}`",
),
stringify!($a_function),
stringify!($b_expr),
b_expr,
a_err,
$b_expr
))
}
}
}
}
}};
}
#[cfg(test)]
mod tests {
mod assert_fn_err_lt_expr_as_result {
mod arity_1 {
fn f(i: i8) -> Result<i8, i8> {
Err(i)
}
#[test]
fn test_lt() {
let a: i8 = 1;
let b: i8 = 2;
let result = assert_fn_err_lt_expr_as_result!(f, a, b);
assert_eq!(result, Ok(()));
}
#[test]
fn test_eq() {
let a: i8 = 1;
let b: i8 = 1;
let result = assert_fn_err_lt_expr_as_result!(f, a, b);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, a_param, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `1`,\n",
" b_expr label: `b`,\n",
" b_expr debug: `1`,\n",
" a: `1`,\n",
" b: `1`"
)
);
}
#[test]
fn test_gt() {
let a: i8 = 1;
let b: i8 = 0;
let result = assert_fn_err_lt_expr_as_result!(f, a, b);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, a_param, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `1`,\n",
" b_expr label: `b`,\n",
" b_expr debug: `0`,\n",
" a: `1`,\n",
" b: `0`"
)
);
}
}
mod arity_0 {
fn f() -> Result<i8, i8> {
Err(1)
}
#[test]
fn test_lt() {
let b: i8 = 2;
let result = assert_fn_err_lt_expr_as_result!(f, b);
assert_eq!(result, Ok(()));
}
#[test]
fn test_eq() {
let b: i8 = 1;
let result = assert_fn_err_lt_expr_as_result!(f, b);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `f`,\n",
" b_expr label: `b`,\n",
" b_expr debug: `1`,\n",
" a: `1`,\n",
" b: `1`"
)
);
}
#[test]
fn test_gt() {
let b: i8 = 0;
let result = assert_fn_err_lt_expr_as_result!(f, b);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
concat!(
"assertion failed: `assert_fn_err_lt_expr!(a_function, b_expr)`\n",
"https://docs.rs/assertables/", env!("CARGO_PKG_VERSION"), "/assertables/macro.assert_fn_err_lt_expr.html\n",
" a_function label: `f`,\n",
" b_expr label: `b`,\n",
" b_expr debug: `0`,\n",
" a: `1`,\n",
" b: `0`"
)
);
}
}
}
}
#[macro_export]
macro_rules! assert_fn_err_lt_expr {
($a_function:path, $a_param:expr, $b_expr:expr $(,)?) => {{
match $crate::assert_fn_err_lt_expr_as_result!($a_function, $a_param, $b_expr) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
}};
($a_function:path, $a_param:expr, $b_expr:expr, $($message:tt)+) => {{
match $crate::assert_fn_err_lt_expr_as_result!($a_function, $a_param, $b_expr) {
Ok(()) => (),
Err(_err) => panic!("{}", $($message)+),
}
}};
($a_function:path, $b_expr:expr $(,)?) => {{
match $crate::assert_fn_err_lt_expr_as_result!($a_function, $b_expr) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
}};
($a_function:path, $b_expr:expr, $($message:tt)+) => {{
match $crate::assert_fn_err_lt_expr_as_result!($a_function, $b_expr) {
Ok(()) => (),
Err(_err) => panic!("{}", $($message)+),
}
}};
}
#[macro_export]
macro_rules! debug_assert_fn_err_lt_expr {
($($arg:tt)*) => {
if $crate::cfg!(debug_assertions) {
$crate::assert_fn_err_lt_expr!($($arg)*);
}
};
}