use std::fmt::Debug;
macro_rules! assert_eq {
($left:expr, $right:expr) => {
crate::test_utils::assert_eq_fn(&*&$left, &*&$right, file!(), line!(), column!())
};
($left:expr, $right:expr, ) => {
assert_eq!($left, $right)
};
($left:expr, $right:expr, $( $arg:tt ) + ) => {
std::assert_eq($left, $right, $($arg)+)
};
}
#[inline(never)]
pub(crate) fn assert_eq_fn<T, U>(left: &T, right: &U, file: &str, line: u32, col: u32)
where
T: Debug + PartialEq<U>,
U: Debug,
{
if left != right {
panic!(
"assert_eq failed:\n left: `{:?}`, \n right: `{:?}`\nAt: {}:{}:{}",
left,
right,
file,
line,
col,
)
}
}
macro_rules! assert_panic {
($($body:tt)*) => {{
let res = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
$($body)*
}));
if let Ok(x) = res {
panic!(
"expected panic for '{}', but got '{:?}' ",
stringify!($($body)*),
x,
);
}
}}
}
#[allow(unused_macros)]
macro_rules! assert_rotated_eq {
($lhs:expr, $rhs:expr) => {{
let lhs = $lhs;
let rhs = $rhs;
if crate::test_utils::cmp_rotated(&lhs, &rhs).is_err() {
panic!(
"assert_rotated_eq failed:n\
| left: {:?} ({})\n\
| right: {:?} ({})\n",
lhs,
stringify!($lhs),
rhs,
stringify!($rhs),
);
}
}};
}
pub(crate) fn cmp_rotated<T: Debug + PartialEq + Clone>(
actual: &[T],
expected: &[T],
) -> Result<(), Vec<T>> {
let mut rotated = expected.to_vec();
if actual.len() != expected.len() {
return Err(rotated);
}
if actual.len() > 0 {
let pos = match actual.iter().position(|e| e == &expected[0]) {
Some(pos) => pos,
None => return Err(rotated),
};
rotated.rotate_right(pos);
if actual != &rotated[..] {
return Err(rotated);
}
}
Ok(())
}