#![doc(html_root_url = "https://docs.rs/assert-panic/1.0.1")]
#![doc(test(no_crate_inject))]
#![warn(
clippy::as_conversions,
clippy::cargo,
clippy::clone_on_ref_ptr,
clippy::missing_docs_in_private_items,
clippy::pedantic
)]
#![forbid(
clippy::dbg_macro,
clippy::print_stdout,
clippy::todo,
clippy::unimplemented
)]
#[macro_export]
macro_rules! assert_panic {
($stmt:stmt$(,)?) => {
::std::panic::catch_unwind(|| -> () { $stmt })
.expect_err("assert_panic! argument did not panic")
};
($stmt:stmt, $ty:ty$(,)?) => {{
let panic = $crate::assert_panic!($stmt);
panic.downcast_ref::<$ty>().unwrap_or_else(|| {
panic!(
"Expected a `{}` panic but found one with {:?}",
stringify!($ty),
panic.type_id()
)
});
}};
($stmt:stmt, $ty:ty, contains $expr:expr$(,)?) => {{
let panic = $crate::assert_panic!($stmt);
let expr = $expr;
let panic = panic.downcast_ref::<$ty>().unwrap_or_else(|| {
panic!(
"Expected a `{}` panic containing {:?} but found one with {:?}",
stringify!($ty),
expr,
panic.type_id()
)
});
assert!(
panic.contains(expr),
"Expected a panic containing {:?} but found {:?}",
expr,
panic
);
}};
($stmt:stmt, $ty:ty, starts with $expr:expr$(,)?) => {{
let panic = $crate::assert_panic!($stmt);
let expr = $expr;
let panic = panic.downcast_ref::<$ty>().unwrap_or_else(|| {
panic!(
"Expected a `{}` panic starting with {:?} but found one with {:?}",
stringify!($ty),
expr,
panic.type_id()
)
});
assert!(
panic.starts_with(expr),
"Expected a panic starting with {:?} but found {:?}",
expr,
panic
);
}};
($stmt:stmt, $ty:ty, $expr:expr$(,)?) => {{
let panic = $crate::assert_panic!($stmt);
let expr = $expr;
let panic = panic.downcast_ref::<$ty>().unwrap_or_else(|| {
panic!(
"Expected a `{}` panic equal to {:?} but found one with {:?}",
stringify!($ty),
expr,
panic.type_id()
)
});
assert!(
*panic == expr,
"Expected a panic equal to {:?} but found {:?}",
expr,
panic
);
}};
}