#[macro_export]
macro_rules! assert_any_le_x_as_result {
($iter:expr, $x:expr $(,)?) => {
match ($iter, &$x) {
(mut iter, x) => {
if iter.any(|e| e <= x) {
Ok(())
} else {
Err(format!(
concat!(
"assertion failed: `assert_any_le_x!(iter, x)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_any_le_x.html\n",
" iter label: `{}`,\n",
" iter debug: `{:?}`,\n",
" x label: `{}`,\n",
" x debug: `{:?}`"
),
stringify!($iter),
iter,
stringify!($x),
x
))
}
}
}
};
}
#[cfg(test)]
mod test_assert_any_le_x_as_result {
mod test_int {
#[test]
fn all_le() {
let a = [1, 2];
let b = 2;
for _ in 0..1 {
let actual = assert_any_le_x_as_result!(a.iter(), b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn all_eq() {
let a = [1, 1];
let b = 1;
for _ in 0..1 {
let actual = assert_any_le_x_as_result!(a.iter(), b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn all_not_le() {
let a = [1, 2];
let b = 0;
let actual = assert_any_le_x_as_result!(a.iter(), b);
let message = concat!(
"assertion failed: `assert_any_le_x!(iter, x)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_any_le_x.html\n",
" iter label: `a.iter()`,\n",
" iter debug: `Iter([])`,\n",
" x label: `b`,\n",
" x debug: `0`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod test_struct {
use std::cmp::Ordering;
#[derive(Debug, PartialEq)]
struct S {
i: i32,
}
impl PartialOrd for S {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.i.partial_cmp(&other.i)
}
}
#[test]
fn all_le() {
let a: [S; 2] = [S { i: 1 }, S { i: 2 }];
let b = S { i: 2 };
for _ in 0..1 {
let actual = assert_any_le_x_as_result!(a.iter(), b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn all_not_le() {
let a: [S; 2] = [S { i: 1 }, S { i: 2 }];
let b = S { i: 0 };
let actual = assert_any_le_x_as_result!(a.iter(), b);
let message = concat!(
"assertion failed: `assert_any_le_x!(iter, x)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_any_le_x.html\n",
" iter label: `a.iter()`,\n",
" iter debug: `Iter([])`,\n",
" x label: `b`,\n",
" x debug: `S { i: 0 }`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
}
#[macro_export]
macro_rules! assert_any_le_x {
($iter:expr, $x:expr $(,)?) => {
match $crate::assert_any_le_x_as_result!($iter, $x) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
};
($iter:expr, $x:expr, $($message:tt)+) => {
match $crate::assert_any_le_x_as_result!($iter, $x) {
Ok(()) => (),
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_any_le_x {
use std::panic;
#[test]
fn lt() {
let a = [1, 2];
let b = 3;
for _ in 0..1 {
let actual = assert_any_le_x!(a.iter(), b);
assert_eq!(actual, ());
}
}
#[test]
fn eq() {
let a = [1, 1];
let b = 1;
for _ in 0..1 {
let actual = assert_any_le_x!(a.iter(), b);
assert_eq!(actual, ());
}
}
#[test]
fn gt() {
let a = [1, 2];
let b = 0;
let result = panic::catch_unwind(|| {
let _actual = assert_any_le_x!(a.iter(), b);
});
let message = concat!(
"assertion failed: `assert_any_le_x!(iter, x)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_any_le_x.html\n",
" iter label: `a.iter()`,\n",
" iter debug: `Iter([])`,\n",
" x label: `b`,\n",
" x debug: `0`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
#[macro_export]
macro_rules! debug_assert_any_le_x {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_any_le_x!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_any_le_x {
use std::panic;
#[test]
fn success() {
let a = [1, 2];
let b = 2;
for _ in 0..1 {
let _actual = debug_assert_any_le_x!(a.iter(), b);
}
}
#[test]
fn failure() {
let a = [1, 2];
let b = 0;
let result = panic::catch_unwind(|| {
let _actual = debug_assert_any_le_x!(a.iter(), b);
});
let message = concat!(
"assertion failed: `assert_any_le_x!(iter, x)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_any_le_x.html\n",
" iter label: `a.iter()`,\n",
" iter debug: `Iter([])`,\n",
" x label: `b`,\n",
" x debug: `0`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}