iceoryx2_pal_testing/
assert.rs

1// Copyright (c) 2023 Contributors to the Eclipse Foundation
2//
3// See the NOTICE file(s) distributed with this work for additional
4// information regarding copyright ownership.
5//
6// This program and the accompanying materials are made available under the
7// terms of the Apache Software License 2.0 which is available at
8// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license
9// which is available at https://opensource.org/licenses/MIT.
10//
11// SPDX-License-Identifier: Apache-2.0 OR MIT
12
13#[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}