pub trait ApproxEq: PartialEq {
fn approx_eq(&self, other: &Self) -> bool;
}
#[macro_export]
macro_rules! assert_eq_approx {
($actual:expr_2021, $expected:expr_2021, fn = $func:expr_2021 $(,)?) => {
match ($actual, $expected) {
(a, b) => assert!(($func)(&a, &b), "\n left: {:?},\n right: {:?}", $actual, $expected)
}
};
($actual:expr_2021, $expected:expr_2021, fn = $func:expr_2021, $($t:tt)+) => {
match ($actual, $expected) {
(a, b) => assert!(($func)(&a, &b), "\n left: {:?},\n right: {:?}{}", $actual, $expected, format_args!($($t)+) )
}
};
($actual:expr_2021, $expected:expr_2021 $(,)?) => {
match ($actual, $expected) {
(a, b) => assert!($crate::builtin::math::ApproxEq::approx_eq(&a, &b), "\n left: {:?},\n right: {:?}", $actual, $expected),
}
};
($actual:expr_2021, $expected:expr_2021, $($t:tt)+) => {
match ($actual, $expected) {
(a, b) => assert!($crate::builtin::math::ApproxEq::approx_eq(&a, &b), "\n left: {:?},\n right: {:?},\n{}", $actual, $expected, format_args!($($t)+)),
}
};
}
#[macro_export]
macro_rules! assert_ne_approx {
($actual:expr_2021, $expected:expr_2021, fn = $func:expr_2021 $(, $($t:tt)* )?) => {
#[allow(clippy::redundant_closure_call)]
{
$crate::assert_eq_approx!($actual, $expected, fn = |a,b| !($func)(a, b) $(, $($t)* )?)
}
};
($actual:expr_2021, $expected:expr_2021 $(, $($t:tt)* )?) => {
#[allow(clippy::redundant_closure_call)]
{
$crate::assert_eq_approx!($actual, $expected, fn = |a, b| !$crate::builtin::math::ApproxEq::approx_eq(a, b) $(, $($t)* )?)
}
};
}