1#[macro_export(local_inner_macros)]
14macro_rules! assert_that {
15 ($lhs:expr, eq $rhs:expr) => {
16 {
17 let lval = &$lhs;
18 let rval = &$rhs;
19
20 if !(lval == rval) {
21 assert_that!(message $lhs, $rhs, lval, rval, "==");
22 }
23 }
24 };
25 ($lhs:expr, ne $rhs:expr) => {
26 {
27 let lval = &$lhs;
28 let rval = &$rhs;
29
30 if !(lval != rval) {
31 assert_that!(message $lhs, $rhs, lval, rval, "!=");
32 }
33 }
34 };
35 ($lhs:expr, lt $rhs:expr) => {
36 {
37 let lval = &$lhs;
38 let rval = &$rhs;
39
40 if !(lval < rval) {
41 assert_that!(message $lhs, $rhs, lval, rval, "<");
42 }
43 }
44 };
45 ($lhs:expr, le $rhs:expr) => {
46 {
47 let lval = &$lhs;
48 let rval = &$rhs;
49
50 if !(lval <= rval) {
51 assert_that!(message $lhs, $rhs, lval, rval, "<=");
52 }
53 }
54 };
55 ($lhs:expr, gt $rhs:expr) => {
56 {
57 let lval = &$lhs;
58 let rval = &$rhs;
59
60 if !(lval > rval) {
61 assert_that!(message $lhs, $rhs, lval, rval, ">");
62 }
63 }
64 };
65 ($lhs:expr, ge $rhs:expr) => {
66 {
67 let lval = &$lhs;
68 let rval = &$rhs;
69
70 if !(lval >= rval) {
71 assert_that!(message $lhs, $rhs, lval, rval, ">=");
72 }
73 }
74 };
75 ($lhs:expr, aligned_to $rhs:expr) => {
76 {
77 let lval = $lhs as usize;
78 let rval = $rhs as usize;
79 let act_result = lval % rval;
80
81 if !(act_result == 0) {
82 assert_that!(message $lhs, $rhs, lval, rval, "aligned to");
83 }
84 }
85 };
86 ($lhs:expr, mod $rhs:expr, is $result:expr) => {
87 {
88 let lval = &$lhs;
89 let rval = &$rhs;
90 let act_result = lval % rval;
91
92 if !(act_result == $result) {
93 assert_that!(message $lhs, $rhs, lval, rval, "%", $result, act_result);
94 }
95 }
96 };
97 ($lhs:expr, is_ok) => {
98 {
99 let lval = $lhs.is_ok();
100
101 if !lval {
102 assert_that!(message_result $lhs, "is_ok()");
103 }
104 }
105 };
106 ($lhs:expr, is_err) => {
107 {
108 let lval = $lhs.is_err();
109
110 if !lval {
111 assert_that!(message_result $lhs, "is_err()");
112 }
113 }
114 };
115 ($lhs:expr, is_some) => {
116 {
117 let lval = $lhs.is_some();
118
119 if !lval {
120 assert_that!(message_result $lhs, "is_some()");
121 }
122 }
123 };
124 ($lhs:expr, is_none) => {
125 {
126 let lval = $lhs.is_none();
127
128 if !lval {
129 assert_that!(message_result $lhs, "is_none()");
130 }
131 }
132 };
133 ($lhs:expr, is_empty) => {
134 {
135 let lval = $lhs.is_empty();
136
137 if !lval {
138 assert_that!(message_result $lhs, "is_empty()");
139 }
140 }
141 };
142 ($lhs:expr, is_not_empty) => {
143 {
144 let lval = !$lhs.is_empty();
145
146 if !lval {
147 assert_that!(message_result $lhs, "is_empty() (not)");
148 }
149 }
150 };
151 ($lhs:expr, len $rhs:expr) => {
152 {
153 let lval = $lhs.len();
154 if !(lval == $rhs) {
155 assert_that!(message_property $lhs, lval, "len()", $rhs);
156 }
157 }
158 };
159 ($lhs:expr, any_of $rhs:expr) => {
160 {
161 let mut found = false;
162 for value in &$rhs {
163 if *value == $lhs {
164 found = true;
165 break;
166 }
167 }
168 if !found {
169 assert_that!(message_any_of $lhs, $rhs);
170 }
171 }
172 };
173 ($lhs:expr, contains $rhs:expr) => {
174 {
175 let mut does_contain = false;
176 for value in &$lhs {
177 if *value == $rhs {
178 does_contain = true;
179 break;
180 }
181 }
182 if !does_contain {
183 assert_that!(message_contains $lhs, $rhs);
184 }
185 }
186 };
187 ($lhs:expr, contains_match |$element:ident| $predicate:expr) => {
188 {
189 let mut does_contain = false;
190 for $element in &$lhs {
191 if $predicate {
192 does_contain = true;
193 break;
194 }
195 }
196 if !does_contain {
197 assert_that!(message_contains_match $lhs, core::stringify!($predicate));
198 }
199 }
200 };
201 ($lhs:expr, not_contains_match |$element:ident| $predicate:expr) => {
202 {
203 let mut does_contain = false;
204 for $element in &$lhs {
205 if $predicate {
206 does_contain = true;
207 break;
208 }
209 }
210 if does_contain {
211 assert_that!(message_not_contains_match $lhs, core::stringify!($predicate));
212 }
213 }
214 };
215 ($lhs:expr, time_at_least $rhs:expr) => {
216 {
217 let lval = $lhs.as_secs_f32();
218 let rval = $rhs.as_secs_f32();
219 let rval_adjusted = rval * (1.0 - iceoryx2_pal_testing::AT_LEAST_TIMING_VARIANCE).clamp(0.0, 1.0);
220
221 if !(lval >= rval_adjusted) {
222 assert_that!(message_time_at_least $lhs, $rhs, lval, rval, rval_adjusted);
223 }
224 }
225 };
226 ($call:expr, block_until $rhs:expr) => {
227 {
228 let watchdog = iceoryx2_pal_testing::watchdog::Watchdog::new();
229
230 while $call() != $rhs {
231 std::thread::yield_now();
232 std::thread::sleep(core::time::Duration::from_millis(10));
233 std::thread::yield_now();
234 }
235 }
236 };
237 [color_start] => {
238 {
239 use std::io::IsTerminal;
240 if std::io::stderr().is_terminal() {
241 "\x1b[1;4;33m"
242 } else {
243 ""
244 }
245 }
246 };
247 [color_end] => {
248 {
249 use std::io::IsTerminal;
250 if std::io::stderr().is_terminal() {
251 "\x1b[0m"
252 } else {
253 ""
254 }
255 }
256 };
257 [message_any_of $lhs:expr, $rhs:expr] => {
258 core::panic!(
259 "assertion failed: {}expr: {} any_of {} ({:?}); contents: {:?}{}",
260 assert_that![color_start],
261 core::stringify!($lhs),
262 core::stringify!($rhs),
263 $rhs,
264 $lhs,
265 assert_that![color_end]
266 );
267 };
268 [message_contains $lhs:expr, $rhs:expr] => {
269 core::panic!(
270 "assertion failed: {}expr: {} contains {} ({:?}); contents: {:?}{}",
271 assert_that![color_start],
272 core::stringify!($lhs),
273 core::stringify!($rhs),
274 $rhs,
275 $lhs,
276 assert_that![color_end]
277 );
278 };
279 [message_contains_match $lhs:expr, $predicate:expr] => {
280 core::panic!(
281 "assertion failed: {}expr: {} contains no element matching predicate: {}{}",
282 assert_that![color_start],
283 core::stringify!($lhs),
284 $predicate,
285 assert_that![color_end]
286 );
287 };
288 [message_not_contains_match $lhs:expr, $predicate:expr] => {
289 core::panic!(
290 "assertion failed: {}expr: {} contains element matching predicate: {}{}",
291 assert_that![color_start],
292 core::stringify!($lhs),
293 $predicate,
294 assert_that![color_end]
295 );
296 };
297 [message_property $lhs:expr, $lval:expr, $property:expr, $rhs:expr] => {
298 core::panic!(
299 "assertion failed: {}expr: {}.{} == {}; value: {} == {}{}",
300 assert_that![color_start],
301 core::stringify!($lhs),
302 $property,
303 $rhs,
304 $lval,
305 $rhs,
306 assert_that![color_end]
307 );
308 };
309 [message_result $lhs:expr, $state:expr] => {
310 core::panic!(
311 "assertion failed: {}{}.{}{}",
312 assert_that![color_start],
313 core::stringify!($lhs),
314 $state,
315 assert_that![color_end]
316 );
317 };
318 [message_time_at_least $lhs:expr, $rhs:expr, $lval:expr, $rval:expr, $rval_adjusted:expr] => {
319 core::panic!(
320 "assertion failed: [ time test ] {}expr: {} at least {}; value: {:?} at least {:?} (jitter adjusted: {:?}){}",
321 assert_that![color_start],
322 core::stringify!($lhs),
323 core::stringify!($rhs),
324 $lval,
325 $rval,
326 $rval_adjusted,
327 assert_that![color_end]
328 );
329 };
330 [message $lhs:expr, $rhs:expr, $lval:expr, $rval:expr, $symbol:expr] => {
331 core::panic!(
332 "assertion failed: {}expr: {} {} {}; value: {:?} {} {:?}{}",
333 assert_that![color_start],
334 core::stringify!($lhs),
335 $symbol,
336 core::stringify!($rhs),
337 $lval,
338 $symbol,
339 $rval,
340 assert_that![color_end]
341 );
342 };
343 [message $lhs:expr, $rhs:expr, $lval:expr, $rval:expr, $symbol:expr, $exp_result:expr, $act_result:expr] => {
344 core::panic!(
345 "assertion failed: {}expr: {} {} {} == {:?}; value: {:?} {} {:?} == {:?}{}",
346 assert_that![color_start],
347 core::stringify!($lhs),
348 $symbol,
349 core::stringify!($rhs),
350 $exp_result,
351 $lval,
352 $symbol,
353 $rval,
354 $act_result,
355 assert_that![color_end]
356 );
357 }
358}