#[macro_export]
macro_rules! assert_gt {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val > *right_val) {
panic!(r#"assertion failed: `(left > right) but here (left <= right)`
left: `{:?}`,
right: `{:?}`"#, &*left_val, &*right_val)
}
}
}
});
($left:expr, $right:expr,) => {
assert_gt!($left, $right)
};
($left:expr, $right:expr, $($arg:tt)+) => ({
match (&($left), &($right)) {
(left_val, right_val) => {
if !(*left_val > *right_val) {
panic!(r#"assertion failed: `(left > right) but here (left <= right)`
left: `{:?}`,
right: `{:?}`: {}"#, &*left_val, &*right_val,
format_args!($($arg)+))
}
}
}
});
}
#[macro_export]
macro_rules! assert_ge {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val >= *right_val) {
panic!(r#"assertion failed: `(left >= right) but here (left < right)`
left: `{:?}`,
right: `{:?}`"#, &*left_val, &*right_val)
}
}
}
});
($left:expr, $right:expr,) => {
assert_ge!($left, $right)
};
($left:expr, $right:expr, $($arg:tt)+) => ({
match (&($left), &($right)) {
(left_val, right_val) => {
if !(*left_val > *right_val) {
panic!(r#"assertion failed: `(left >= right) but here (left < right)`
left: `{:?}`,
right: `{:?}`: {}"#, &*left_val, &*right_val,
format_args!($($arg)+))
}
}
}
});
}
#[macro_export]
macro_rules! assert_lt {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val < *right_val) {
panic!(r#"assertion failed: `(left < right) but here (left >= right)`
left: `{:?}`,
right: `{:?}`"#, &*left_val, &*right_val)
}
}
}
});
($left:expr, $right:expr,) => {
assert_lt!($left, $right)
};
($left:expr, $right:expr, $($arg:tt)+) => ({
match (&($left), &($right)) {
(left_val, right_val) => {
if !(*left_val < *right_val) {
panic!(r#"assertion failed: `(left < right) but here (left >= right)`
left: `{:?}`,
right: `{:?}`: {}"#, &*left_val, &*right_val,
format_args!($($arg)+))
}
}
}
});
}
#[macro_export]
macro_rules! assert_le {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if !(*left_val <= *right_val) {
panic!(r#"assertion failed: `(left <= right) but here (left > right)`
left: `{:?}`,
right: `{:?}`"#, &*left_val, &*right_val)
}
}
}
});
($left:expr, $right:expr,) => {
assert_le!($left, $right)
};
($left:expr, $right:expr, $($arg:tt)+) => ({
match (&($left), &($right)) {
(left_val, right_val) => {
if !(*left_val <= *right_val) {
panic!(r#"assertion failed: `(left <= right) but here (left > right)`
left: `{:?}`,
right: `{:?}`: {}"#, &*left_val, &*right_val,
format_args!($($arg)+))
}
}
}
});
}
#[macro_export]
macro_rules! assert_range {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if !(left_val.contains(right_val)) {
panic!(
r#"assertion failed: `{} is not in range of {:?}`: it should have been in this range"#,
right_val,
left_val
)
}
}
}
});
($left:expr, $right:expr,) => {
assert_range!($left, $right)
};
}
#[macro_export]
macro_rules! assert_nrange {
($left:expr, $right:expr) => ({
match (&$left, &$right) {
(left_val, right_val) => {
if (left_val.contains(right_val)) {
panic!(
r#"assertion failed: `{} is in range of {:?}`: it should not have been in this range"#,
right_val,
left_val
)
}
}
}
});
($left:expr, $right:expr,) => {
assert_nrange!($left, $right)
};
}
#[test]
#[should_panic]
fn panic_when_not_gt() {
assert_gt!(4, 4);
}
#[test]
#[should_panic]
fn panic_when_not_ge() {
assert_ge!(3, 4);
}
#[test]
#[should_panic]
fn panic_when_not_lt() {
assert_lt!(4, 4);
}
#[test]
#[should_panic]
fn panic_when_not_le() {
assert_le!(4, 3);
}
#[test]
fn test_assert_range_pass() {
assert_range!((0..=10), 10);
assert_range!((1.0..2.0), 1.5);
}
#[test]
#[should_panic]
fn test_assert_range_fail() {
assert_range!((0..10), 11);
assert_range!((1.0..=2.0), 2.1);
}
#[test]
fn test_assert_nrange_pass() {
assert_nrange!((10..20), 20);
assert_nrange!((1.0..2.0), 2.0);
}
#[test]
#[should_panic]
fn test_assert_nrange_fail() {
assert_nrange!((10..=20), 20);
assert_nrange!((1.0..=2.0), 2.0);
}