#[macro_export]
macro_rules! assert_ge {
($left:expr, $right:expr $(,)?) => {
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val >= *right_val) {
::core::panic!(r#"assertion failed: `(left >= right)`
left: `{:?}`,
right: `{:?}`"#, &*left_val, &*right_val)
}
}
}
};
($left:expr, $right:expr, $($arg:tt)+) => {
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val >= *right_val) {
::core::panic!(r#"assertion failed: `(left >= right)`
left: `{:?}`,
right: `{:?}`: {}"#, &*left_val, &*right_val, ::core::format_args!($($arg)+))
}
}
}
};
}
#[macro_export]
macro_rules! debug_assert_ge {
($($arg:tt)*) => {
#[cfg(debug_assertions)]
$crate::assert_ge!($($arg)*);
}
}
#[cfg(test)]
mod tests {
#[test]
fn greater_than() {
assert_ge!(5, 3);
}
#[test]
fn equal() {
assert_ge!(3, 3);
}
#[test]
#[should_panic(
expected = "assertion failed: `(left >= right)`\n left: `1`,\n right: `3`"
)]
fn less_than() {
assert_ge!(1, 3);
}
#[test]
#[should_panic(
expected = "assertion failed: `(left >= right)`\n left: `1`,\n right: `3`: foo"
)]
fn less_than_custom_message() {
assert_ge!(1, 3, "foo");
}
#[test]
#[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
fn debug_greater_than() {
debug_assert_ge!(5, 3);
}
#[test]
#[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
fn debug_equal() {
debug_assert_ge!(3, 3);
}
#[test]
#[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
#[should_panic(
expected = "assertion failed: `(left >= right)`\n left: `1`,\n right: `3`"
)]
fn debug_less_than() {
debug_assert_ge!(1, 3);
}
#[test]
#[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
#[should_panic(
expected = "assertion failed: `(left >= right)`\n left: `1`,\n right: `3`: foo"
)]
fn debug_less_than_custom_message() {
debug_assert_ge!(1, 3, "foo");
}
#[test]
#[cfg_attr(debug_assertions, ignore = "only run in release mode")]
fn debug_release_less_than() {
debug_assert_ge!(1, 3);
}
}