use std::fmt::Debug;
use std::panic::{catch_unwind, UnwindSafe};
pub(crate) fn assert_unwind_or_eq<T, F>(run: F, expected: T, message: &str)
where
T: Debug + PartialEq,
F: FnOnce() -> T + UnwindSafe,
{
if let Ok(actual) = catch_unwind(run) {
assert_eq!(actual, expected, "{message}");
}
}
macro_rules! adversarial_unary_vec_cases {
($($name:ident: $input:expr => $expected:expr, $message:literal;)*) => {
$(
#[test]
fn $name() {
let input: Vec<u32> = $input;
$crate::common::assert_unwind_or_eq(|| cpu_ref(&input), $expected, $message);
}
)*
};
}
macro_rules! adversarial_binary_vec_cases {
($($name:ident: $lhs:expr, $rhs:expr => $expected:expr, $message:literal;)*) => {
$(
#[test]
fn $name() {
let lhs: Vec<u32> = $lhs;
let rhs: Vec<u32> = $rhs;
$crate::common::assert_unwind_or_eq(|| cpu_ref(&lhs, &rhs), $expected, $message);
}
)*
};
}
macro_rules! adversarial_vec_u32_cases {
($($name:ident: $input:expr, $arg:expr => $expected:expr, $message:literal;)*) => {
$(
#[test]
fn $name() {
let input: Vec<u32> = $input;
let arg: u32 = $arg;
$crate::common::assert_unwind_or_eq(|| cpu_ref(&input, arg), $expected, $message);
}
)*
};
}
macro_rules! adversarial_binary_vec_usize_cases {
($($name:ident: $lhs:expr, $rhs:expr, $arg:expr => $expected:expr, $message:literal;)*) => {
$(
#[test]
fn $name() {
let lhs: Vec<u32> = $lhs;
let rhs: Vec<u32> = $rhs;
let arg: usize = $arg;
$crate::common::assert_unwind_or_eq(|| cpu_ref(&lhs, &rhs, arg), $expected, $message);
}
)*
};
}