godot_core/builtin/math/
approx_eq.rs1pub trait ApproxEq: PartialEq {
18 fn approx_eq(&self, other: &Self) -> bool;
19}
20
21#[macro_export]
25macro_rules! assert_eq_approx {
26 ($actual:expr_2021, $expected:expr_2021, fn = $func:expr_2021 $(,)?) => {
27 match ($actual, $expected) {
28 (a, b) => assert!(($func)(&a, &b), "\n left: {:?},\n right: {:?}", $actual, $expected)
29 }
30 };
31 ($actual:expr_2021, $expected:expr_2021, fn = $func:expr_2021, $($t:tt)+) => {
32 match ($actual, $expected) {
33 (a, b) => assert!(($func)(&a, &b), "\n left: {:?},\n right: {:?}{}", $actual, $expected, format_args!($($t)+) )
34 }
35 };
36 ($actual:expr_2021, $expected:expr_2021 $(,)?) => {
37 match ($actual, $expected) {
38 (a, b) => assert!($crate::builtin::math::ApproxEq::approx_eq(&a, &b), "\n left: {:?},\n right: {:?}", $actual, $expected),
39 }
41 };
42 ($actual:expr_2021, $expected:expr_2021, $($t:tt)+) => {
43 match ($actual, $expected) {
44 (a, b) => assert!($crate::builtin::math::ApproxEq::approx_eq(&a, &b), "\n left: {:?},\n right: {:?},\n{}", $actual, $expected, format_args!($($t)+)),
45 }
47 };
48}
49
50#[macro_export]
53macro_rules! assert_ne_approx {
54 ($actual:expr_2021, $expected:expr_2021, fn = $func:expr_2021 $(, $($t:tt)* )?) => {
55 #[allow(clippy::redundant_closure_call)]
56 {
57 $crate::assert_eq_approx!($actual, $expected, fn = |a,b| !($func)(a, b) $(, $($t)* )?)
58 }
59 };
60
61 ($actual:expr_2021, $expected:expr_2021 $(, $($t:tt)* )?) => {
62 #[allow(clippy::redundant_closure_call)]
63 {
64 $crate::assert_eq_approx!($actual, $expected, fn = |a, b| !$crate::builtin::math::ApproxEq::approx_eq(a, b) $(, $($t)* )?)
65 }
66 };
67}