#[macro_export]
macro_rules! rassert {
($expr: expr, $err: expr) => {
let _ = if $expr {
Ok(())
} else {
Err($err)
}?;
};
}
#[macro_export]
macro_rules! rassert_notify {
($expr: expr, $notify: expr) => {
if !$expr {
$notify;
return;
}
};
}
#[macro_export]
macro_rules! rassert_notify_continue {
($expr: expr, $notify: expr) => {
if !$expr {
$notify;
continue;
}
};
}
#[macro_export]
macro_rules! rassert_notify_break {
($expr: expr, $notify: expr) => {
if !$expr {
$notify;
break;
}
};
}
#[cfg(test)]
mod tests {
use crate::{rassert, rassert_notify};
struct TestError;
fn driver(f: impl Fn() -> Result<(), TestError>) -> Result<(), TestError> {
f()
}
#[test]
fn check_ok() {
let result = driver(|| {
rassert!(1 == 1, TestError);
Ok(())
});
assert!(result.is_ok());
}
#[test]
fn check_err() {
let result = driver(|| {
rassert!(1 != 1, TestError);
Ok(())
});
assert!(result.is_err());
}
#[allow(unused_assignments)]
#[test]
fn check_notify() {
let mut var = 72;
rassert_notify!(42 != 42, var = 42);
assert_eq!(var, 42);
}
#[allow(unused_assignments)]
#[test]
fn check_notify_continue() {
let mut var = 72;
while var != 42 {
rassert_notify_continue!(42 != 42, var = 42);
}
assert_eq!(var, 42);
}
#[allow(unused_assignments)]
#[test]
fn check_notify_break() {
let mut var = 72;
loop {
rassert_notify_break!(42 != 42, var = 42);
}
assert_eq!(var, 42);
}
}