#[macro_export]
macro_rules! assert_fn_lt_as_result {
($a_function:path, $a_param:expr, $b_function:path, $b_param:expr $(,)?) => {
match (&$a_function, &$a_param, &$b_function, &$b_param) {
(_a_function, a_param, _b_function, b_param) => {
let a = $a_function($a_param);
let b = $b_function($b_param);
if a < b {
Ok((a, b))
} else {
Err(
format!(
concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `{}`,\n",
" a_param label: `{}`,\n",
" a_param debug: `{:?}`,\n",
" b_function label: `{}`,\n",
" b_param label: `{}`,\n",
" b_param debug: `{:?}`,\n",
" a: `{:?}`,\n",
" b: `{:?}`"
),
stringify!($a_function),
stringify!($a_param),
a_param,
stringify!($b_function),
stringify!($b_param),
b_param,
a,
b
)
)
}
}
}
};
($a_function:path, $b_function:path) => {
match (&$a_function, &$b_function) {
(_a_function, _b_function) => {
let a = $a_function();
let b = $b_function();
if a < b {
Ok((a, b))
} else {
Err(
format!(
concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `{}`,\n",
" b_function label: `{}`,\n",
" a: `{:?}`,\n",
" b: `{:?}`"
),
stringify!($a_function),
stringify!($b_function),
a,
b
)
)
}
}
}
};
}
#[cfg(test)]
mod test_assert_fn_lt_as_result {
mod arity_1 {
fn f(i: i8) -> i8 {
return i;
}
fn g(i: i8) -> i8 {
return i;
}
#[test]
fn lt() {
let a: i8 = 1;
let b: i8 = 2;
for _ in 0..1 {
let actual = assert_fn_lt_as_result!(f, a, g, b);
assert_eq!(actual.unwrap(), (1, 2));
}
}
#[test]
fn eq() {
let a: i8 = 1;
let b: i8 = 1;
let actual = assert_fn_lt_as_result!(f, a, g, b);
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `1`,\n",
" b_function label: `g`,\n",
" b_param label: `b`,\n",
" b_param debug: `1`,\n",
" a: `1`,\n",
" b: `1`"
);
assert_eq!(actual.unwrap_err(), message);
}
#[test]
fn gt() {
let a: i8 = 2;
let b: i8 = 1;
let actual = assert_fn_lt_as_result!(f, a, g, b);
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `2`,\n",
" b_function label: `g`,\n",
" b_param label: `b`,\n",
" b_param debug: `1`,\n",
" a: `2`,\n",
" b: `1`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod arity_0 {
fn f() -> i8 {
return 1;
}
fn g() -> i8 {
return 2;
}
#[test]
fn lt() {
for _ in 0..1 {
let actual = assert_fn_lt_as_result!(f, g);
assert_eq!(actual.unwrap(), (1, 2));
}
}
#[test]
fn eq() {
let actual = assert_fn_lt_as_result!(f, f);
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" b_function label: `f`,\n",
" a: `1`,\n",
" b: `1`"
);
assert_eq!(actual.unwrap_err(), message);
}
#[test]
fn gt() {
let actual = assert_fn_lt_as_result!(g, f);
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `g`,\n",
" b_function label: `f`,\n",
" a: `2`,\n",
" b: `1`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
}
#[macro_export]
macro_rules! assert_fn_lt {
($a_function:path, $a_param:expr, $b_function:path, $b_param:expr $(,)?) => {
match $crate::assert_fn_lt_as_result!($a_function, $a_param, $b_function, $b_param) {
Ok(x) => x,
Err(err) => panic!("{}", err),
}
};
($a_function:path, $a_param:expr, $b_function:path, $b_param:expr, $($message:tt)+) => {
match $crate::assert_fn_lt_as_result!($a_function, $a_param, $b_function, $b_param) {
Ok(x) => x,
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
($a_function:path, $b_function:path) => {
match $crate::assert_fn_lt_as_result!($a_function, $b_function) {
Ok(x) => x,
Err(err) => panic!("{}", err),
}
};
($a_function:path, $b_function:path, $($message:tt)+) => {
match $crate::assert_fn_lt_as_result!($a_function, $b_function) {
Ok(x) => x,
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_fn_lt {
use std::panic;
mod arity_1 {
use super::*;
fn f(i: i8) -> i8 {
return i;
}
fn g(i: i8) -> i8 {
return i;
}
#[test]
fn lt() {
let a: i8 = 1;
let b: i8 = 2;
for _ in 0..1 {
let actual = assert_fn_lt!(f, a, g, b);
let expect = (1, 2);
assert_eq!(actual, expect);
}
}
#[test]
fn eq() {
let result = panic::catch_unwind(|| {
let a: i8 = 1;
let b: i8 = 1;
let _actual = assert_fn_lt!(f, a, g, b);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `1`,\n",
" b_function label: `g`,\n",
" b_param label: `b`,\n",
" b_param debug: `1`,\n",
" a: `1`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn gt() {
let result = panic::catch_unwind(|| {
let a: i8 = 2;
let b: i8 = 1;
let _actual = assert_fn_lt!(f, a, g, b);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `2`,\n",
" b_function label: `g`,\n",
" b_param label: `b`,\n",
" b_param debug: `1`,\n",
" a: `2`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod arity_0 {
use super::*;
fn f() -> i8 {
return 1;
}
fn g() -> i8 {
return 2;
}
#[test]
fn lt() {
for _ in 0..1 {
let actual = assert_fn_lt!(f, g);
let expect = (1, 2);
assert_eq!(actual, expect);
}
}
#[test]
fn eq() {
let result = panic::catch_unwind(|| {
let _actual = assert_fn_lt!(f, f);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" b_function label: `f`,\n",
" a: `1`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn gt() {
let result = panic::catch_unwind(|| {
let _actual = assert_fn_lt!(g, f);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `g`,\n",
" b_function label: `f`,\n",
" a: `2`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
}
#[macro_export]
macro_rules! debug_assert_fn_lt {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_fn_lt!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_fn_lt {
use std::panic;
mod arity_1 {
use super::*;
fn f(i: i8) -> i8 {
return i;
}
fn g(i: i8) -> i8 {
return i;
}
#[test]
fn lt() {
let a: i8 = 1;
let b: i8 = 2;
for _ in 0..1 {
let _actual = debug_assert_fn_lt!(f, a, g, b);
let _expect = (1, 2);
}
}
#[test]
fn eq() {
let result = panic::catch_unwind(|| {
let a: i8 = 1;
let b: i8 = 1;
let _actual = debug_assert_fn_lt!(f, a, g, b);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `1`,\n",
" b_function label: `g`,\n",
" b_param label: `b`,\n",
" b_param debug: `1`,\n",
" a: `1`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn gt() {
let result = panic::catch_unwind(|| {
let a: i8 = 2;
let b: i8 = 1;
let _actual = debug_assert_fn_lt!(f, a, g, b);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, a_param, b_function, b_param)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" a_param label: `a`,\n",
" a_param debug: `2`,\n",
" b_function label: `g`,\n",
" b_param label: `b`,\n",
" b_param debug: `1`,\n",
" a: `2`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod arity_0 {
use super::*;
fn f() -> i8 {
return 1;
}
fn g() -> i8 {
return 2;
}
#[test]
fn lt() {
for _ in 0..1 {
let _actual = debug_assert_fn_lt!(f, g);
let _expect = (1, 2);
}
}
#[test]
fn eq() {
let result = panic::catch_unwind(|| {
let _actual = debug_assert_fn_lt!(f, f);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `f`,\n",
" b_function label: `f`,\n",
" a: `1`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn gt() {
let result = panic::catch_unwind(|| {
let _actual = debug_assert_fn_lt!(g, f);
});
let message = concat!(
"assertion failed: `assert_fn_lt!(a_function, b_function)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_fn_lt.html\n",
" a_function label: `g`,\n",
" b_function label: `f`,\n",
" a: `2`,\n",
" b: `1`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
}