#[macro_export]
macro_rules! assert_all_as_result {
($collection:expr, $predicate:expr $(,)?) => {
match ($collection, $predicate) {
(mut collection, predicate) => {
if collection.all(predicate) {
Ok(())
} else {
Err(format!(
concat!(
"assertion failed: `assert_all!(collection, predicate)`\n",
"https://docs.rs/assertables/9.8.4/assertables/macro.assert_all.html\n",
" collection label: `{}`,\n",
" collection debug: `{:?}`,\n",
" predicate: `{}`"
),
stringify!($collection),
$collection,
stringify!($predicate)
))
}
}
}
};
}
#[cfg(test)]
mod test_assert_all_as_result {
use std::sync::Once;
#[test]
fn success() {
let a = [1, 2, 3];
for _ in 0..1 {
let actual = assert_all_as_result!(a.iter(), |&x| x > 0);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> [i8; 3] {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
[1, 2, 3]
}
assert_eq!(A.is_completed(), false);
let result = assert_all_as_result!(a().iter(), |&x| x > 0);
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
}
#[test]
fn failure() {
let a = [1, -2, 3];
let actual = assert_all_as_result!(a.iter(), |&x| x > 0);
let message = concat!(
"assertion failed: `assert_all!(collection, predicate)`\n",
"https://docs.rs/assertables/9.8.4/assertables/macro.assert_all.html\n",
" collection label: `a.iter()`,\n",
" collection debug: `Iter([1, -2, 3])`,\n",
" predicate: `|&x| x > 0`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
#[macro_export]
macro_rules! assert_all {
($collection:expr, $predicate:expr $(,)?) => {
match $crate::assert_all_as_result!($collection, $predicate) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
};
($collection:expr, $predicate:expr, $($message:tt)+) => {
match $crate::assert_all_as_result!($collection, $predicate) {
Ok(()) => (),
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_all {
use std::panic;
#[test]
fn success() {
let a = [1, 2, 3];
for _ in 0..1 {
let actual = assert_all!(a.iter(), |&x| x > 0);
assert_eq!(actual, ());
}
}
#[test]
fn failure() {
let a = [1, -2, 3];
let result = panic::catch_unwind(|| {
let _actual = assert_all!(a.iter(), |&x| x > 0);
});
let message = concat!(
"assertion failed: `assert_all!(collection, predicate)`\n",
"https://docs.rs/assertables/9.8.4/assertables/macro.assert_all.html\n",
" collection label: `a.iter()`,\n",
" collection debug: `Iter([1, -2, 3])`,\n",
" predicate: `|&x| x > 0`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
#[macro_export]
macro_rules! debug_assert_all {
($($arg:tt)*) => {
if $crate::cfg!(debug_assertions) {
$crate::assert_all!($($arg)*);
}
};
}