irox_tools/
assert.rs

1// SPDX-License-Identifier: MIT
2// Copyright 2025 IROX Contributors
3//
4
5//!
6//! Additional assert macros for tests
7//!
8
9///
10/// Assert Equal with floating point epsilon/delta values.  `|left-right| <= eps`
11#[macro_export]
12macro_rules! assert_eq_eps {
13    ($left:expr, $right:expr, $eps:expr) => {
14        match (&$left, &$right) {
15            (left_val, right_val) => {
16                let delta = (*left_val - *right_val).abs();
17                if !(delta <= $eps) {
18                    panic!(
19                        "Assertion failed, {} - {} = {} > {} (error: {})",
20                        &*left_val,
21                        &*right_val,
22                        delta,
23                        $eps,
24                        delta - $eps
25                    )
26                }
27            }
28        }
29    };
30    ($left:expr, $right:expr, $eps:expr, $($arg:expr)?) => {
31        match (&$left, &$right) {
32            (left_val, right_val) => {
33                let delta = (*left_val - *right_val).abs();
34                if !(delta <= $eps) {
35                    panic!(
36                        "{}: Assertion failed, {} - {} = {} > {} (error: {})",
37                        &*left_val,
38                        &*right_val,
39                        delta,
40                        $eps,
41                        delta - $eps,
42                        $($arg)?
43                    )
44                }
45            }
46        }
47    };
48}
49#[macro_export]
50macro_rules! debug_assert_eq_eps {
51    ($left:expr, $right:expr, $eps:expr) => {
52        if cfg!(debug_assertions) {
53            $crate::assert_eq_eps!($left, $right, $eps)
54        }
55    };
56}
57///
58/// Assert equal w/ hex value slices, for slices of floating-point elements
59#[macro_export]
60macro_rules! assert_eq_eps_slice {
61    ($left:expr, $right:expr, $eps:expr) => {
62        match (&$left, &$right) {
63            (left_val, right_val) => {
64                let left_len = left_val.len();
65                let right_len = right_val.len();
66                if left_len != right_len {
67                    panic!("Assertion failed, left len ({left_len}) != right len ({right_len})");
68                }
69                for idx in 0..left_len {
70                    let lv = left_val[idx];
71                    let rv = right_val[idx];
72                    let delta = (lv - rv).abs();
73                    if !(delta <= $eps) {
74                        panic!(
75                            "Assertion failed, {} - {} = {} > {} at index {idx}",
76                            &lv, &rv, delta, $eps
77                        )
78                    }
79                }
80            }
81        }
82    };
83    ($left:expr, $right:expr, $eps:expr, $($arg:expr)?) => {
84        match (&$left, &$right) {
85            (left_val, right_val) => {
86                let left_len = left_val.len();
87                let right_len = right_val.len();
88                if left_len != right_len {
89                    panic!("{}: Assertion failed, left len ({left_len}) != right len ({right_len})", $($arg)?);
90                }
91                for idx in 0..left_len {
92                    let lv = left_val[idx];
93                    let rv = right_val[idx];
94                    let delta = (lv - rv).abs();
95                    if !(delta <= $eps) {
96                        panic!(
97                            "{}: Assertion failed, {} - {} = {} > {} at index {idx}",
98                            &lv, &rv, delta, $eps, $($arg)?
99                        )
100                    }
101                }
102            }
103        }
104    };
105}
106
107///
108/// Assert equal w/ hex value, for elements that implement [`core::fmt::UpperHex`]
109#[macro_export]
110macro_rules! assert_eq_hex {
111    ($left:expr, $right:expr) => {
112        match (&$left, &$right) {
113            (left_val, right_val) => {
114                if *left_val != *right_val {
115                    panic!(
116                        "Assertion failed, 0x{:0X} != 0x{:0X}",
117                        &*left_val, &*right_val
118                    )
119                }
120            }
121        }
122    };
123    ($left:expr, $right:expr, $($arg:expr)?) => {
124        match (&$left, &$right) {
125            (left_val, right_val) => {
126                if *left_val != *right_val {
127                    panic!(
128                        "{}: Assertion failed, 0x{:0X} != 0x{:0X}",
129                        &*left_val, &*right_val, $($arg)?
130                    )
131                }
132            }
133        }
134    };
135}
136
137///
138/// Assert equal w/ hex value slices, for slices of elements that implement [`core::fmt::UpperHex`]
139#[macro_export]
140macro_rules! assert_eq_hex_slice {
141    ($left:expr, $right:expr) => {
142        match (&$left, &$right) {
143            (left_val, right_val) => {
144                let left_len = left_val.len();
145                let right_len = right_val.len();
146                if left_len != right_len {
147                    panic!("Assertion failed, left len (0x{left_len:0X}) != right len (0x{right_len:0X})");
148                }
149                for idx in 0..left_len {
150                    let lv = left_val[idx];
151                    let rv = right_val[idx];
152                    if lv != rv {
153                        panic!(
154                            "Assertion failed, 0x{lv:0X} != 0x{rv:0X} at idx {idx}"
155                        )
156                    }
157                }
158            }
159        }
160    };
161    ($left:expr, $right:expr, $($arg:expr)?) => {
162        match (&$left, &$right) {
163            (left_val, right_val) => {
164                let left_len = left_val.len();
165                let right_len = right_val.len();
166                if left_len != right_len {
167                    panic!("{}: Assertion failed, left len (0x{left_len:0X}) != right len (0x{right_len:0X})", $($arg)+);
168                }
169                for idx in 0..left_len {
170                    let lv = left_val[idx];
171                    let rv = right_val[idx];
172                    if lv != rv {
173                        panic!(
174                            "{}: Assertion failed, 0x{lv:0X} != 0x{rv:0X} at idx {idx}", $($arg)+
175                        )
176                    }
177                }
178            }
179        }
180    }
181    ;
182}