#![deny(missing_docs)]
#[macro_export]
macro_rules! assert_lt {
($left:expr, $right:expr) => ({
let (left, right) = (&($left), &($right));
if !(left < right) {
panic!("assertion failed: `(left < right)`\n left: `{:?}`,\n right: `{:?}`",
left, right);
}
});
($left:expr, $right:expr, ) => ({
assert_lt!($left, $right);
});
($left:expr, $right:expr, $($msg_args:tt)+) => ({
let (left, right) = (&($left), &($right));
if !(left < right) {
panic!("assertion failed: `(left < right)`\n left: `{:?}`,\n right: `{:?}`: {}",
left, right, format_args!($($msg_args)+));
}
})
}
#[macro_export]
macro_rules! assert_gt {
($left:expr, $right:expr) => ({
let (left, right) = (&($left), &($right));
if !(left > right) {
panic!("assertion failed: `(left > right)`\n left: `{:?}`,\n right: `{:?}`",
left, right);
}
});
($left:expr, $right:expr, ) => ({
assert_gt!($left, $right);
});
($left:expr, $right:expr, $($msg_args:tt)+) => ({
let (left, right) = (&($left), &($right));
if !(left > right) {
panic!("assertion failed: `(left > right)`\n left: `{:?}`,\n right: `{:?}`: {}",
left, right, format_args!($($msg_args)+));
}
})
}
#[macro_export]
macro_rules! assert_le {
($left:expr, $right:expr) => ({
let (left, right) = (&($left), &($right));
if !(left <= right) {
panic!("assertion failed: `(left <= right)`\n left: `{:?}`,\n right: `{:?}`",
left, right);
}
});
($left:expr, $right:expr, ) => ({
assert_le!($left, $right);
});
($left:expr, $right:expr, $($msg_args:tt)+) => ({
let (left, right) = (&($left), &($right));
if !(left <= right) {
panic!("assertion failed: `(left <= right)`\n left: `{:?}`,\n right: `{:?}`: {}",
left, right, format_args!($($msg_args)+));
}
})
}
#[macro_export]
macro_rules! assert_ge {
($left:expr, $right:expr) => ({
let (left, right) = (&($left), &($right));
if !(left >= right) {
panic!("assertion failed: `(left >= right)`\n left: `{:?}`,\n right: `{:?}`",
left, right);
}
});
($left:expr, $right:expr, ) => ({
assert_ge!($left, $right);
});
($left:expr, $right:expr, $($msg_args:tt)+) => ({
let (left, right) = (&($left), &($right));
if !(left >= right) {
panic!("assertion failed: `(left >= right)`\n left: `{:?}`,\n right: `{:?}`: {}",
left, right, format_args!($($msg_args)+));
}
})
}
#[macro_export]
macro_rules! debug_assert_lt {
($($arg:tt)+) => {
if cfg!(debug_assertions) {
assert_lt!($($arg)+);
}
}
}
#[macro_export]
macro_rules! debug_assert_gt {
($($arg:tt)+) => {
if cfg!(debug_assertions) {
assert_gt!($($arg)+);
}
}
}
#[macro_export]
macro_rules! debug_assert_le {
($($arg:tt)+) => {
if cfg!(debug_assertions) {
assert_le!($($arg)+);
}
}
}
#[macro_export]
macro_rules! debug_assert_ge {
($($arg:tt)+) => {
if cfg!(debug_assertions) {
assert_ge!($($arg)+);
}
}
}
#[macro_export]
macro_rules! debug_unreachable {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
unreachable!($($arg)*);
}
}
}
#[cfg(test)]
mod tests {
use std::panic::catch_unwind;
#[derive(PartialOrd, PartialEq, Debug)]
enum DummyType {
Foo, Bar, Baz
}
#[test]
fn test_assert_lt() {
assert_lt!(3, 4);
assert_lt!(4.0, 4.5);
assert_lt!("a string", "b string");
assert_lt!(DummyType::Foo, DummyType::Bar,
"Message with {}", "cool formatting");
let a = &DummyType::Foo;
let b = &DummyType::Baz;
assert_lt!(a, b);
assert!(catch_unwind(|| assert_lt!(5, 3)).is_err());
assert!(catch_unwind(|| assert_lt!(5, 5)).is_err());
assert!(catch_unwind(|| assert_lt!(DummyType::Bar, DummyType::Foo)).is_err());
}
#[test]
fn test_assert_gt() {
assert_gt!(4, 3);
assert_gt!(4.5, 4.0);
assert_gt!("b string", "a string");
assert_gt!(DummyType::Bar, DummyType::Foo,
"Message with {}", "cool formatting");
let a = &DummyType::Foo;
let b = &DummyType::Baz;
assert_gt!(b, a);
assert!(catch_unwind(|| assert_gt!(3, 5)).is_err());
assert!(catch_unwind(|| assert_gt!(5, 5)).is_err());
assert!(catch_unwind(|| assert_gt!(DummyType::Foo, DummyType::Bar)).is_err());
}
#[test]
fn test_assert_le() {
assert_le!(3, 4);
assert_le!(4, 4);
assert_le!(4.0, 4.5);
assert_le!("a string", "a string");
assert_le!("a string", "b string");
assert_le!(DummyType::Foo, DummyType::Bar, "Message");
assert_le!(DummyType::Foo, DummyType::Foo,
"Message with {}", "cool formatting");
let a = &DummyType::Foo;
let b = &DummyType::Baz;
assert_le!(a, a);
assert_le!(a, b);
assert!(catch_unwind(|| assert_le!(5, 3)).is_err());
assert!(catch_unwind(|| assert_le!(DummyType::Bar, DummyType::Foo)).is_err());
}
#[test]
fn test_assert_ge() {
assert_ge!(4, 3);
assert_ge!(4, 4);
assert_ge!(4.5, 4.0);
assert_ge!(5.0, 5.0);
assert_ge!("a string", "a string");
assert_ge!("b string", "a string");
assert_ge!(DummyType::Bar, DummyType::Bar, "Example");
assert_ge!(DummyType::Bar, DummyType::Foo,
"Message with {}", "cool formatting");
let a = &DummyType::Foo;
let b = &DummyType::Baz;
assert_ge!(a, a);
assert_ge!(b, a);
assert!(catch_unwind(|| assert_ge!(3, 5)).is_err());
assert!(catch_unwind(|| assert_ge!(DummyType::Foo, DummyType::Bar)).is_err());
}
}