iceoryx2_bb_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, mod $rhs:expr, is $result:expr) => {
76        {
77            let lval = &$lhs;
78            let rval = &$rhs;
79            let act_result = lval % rval;
80
81            if !(act_result == $result) {
82                assert_that!(message $lhs, $rhs, lval, rval, "%", $result, act_result);
83            }
84        }
85    };
86    ($lhs:expr, is_ok) => {
87        {
88            let lval = $lhs.is_ok();
89
90            if !lval {
91                assert_that!(message_result $lhs, "is_ok()");
92            }
93        }
94    };
95    ($lhs:expr, is_err) => {
96        {
97            let lval = $lhs.is_err();
98
99            if !lval {
100                assert_that!(message_result $lhs, "is_err()");
101            }
102        }
103    };
104    ($lhs:expr, is_some) => {
105        {
106            let lval = $lhs.is_some();
107
108            if !lval {
109                assert_that!(message_result $lhs, "is_some()");
110            }
111        }
112    };
113    ($lhs:expr, is_none) => {
114        {
115            let lval = $lhs.is_none();
116
117            if !lval {
118                assert_that!(message_result $lhs, "is_none()");
119            }
120        }
121    };
122    ($lhs:expr, is_empty) => {
123        {
124            let lval = $lhs.is_empty();
125
126            if !lval {
127                assert_that!(message_result $lhs, "is_empty()");
128            }
129        }
130    };
131    ($lhs:expr, is_not_empty) => {
132        {
133            let lval = !$lhs.is_empty();
134
135            if !lval {
136                assert_that!(message_result $lhs, "is_empty() (not)");
137            }
138        }
139    };
140    ($lhs:expr, len $rhs:expr) => {
141        {
142            let lval = $lhs.len();
143            if !(lval == $rhs) {
144                assert_that!(message_property $lhs, lval, "len()", $rhs);
145            }
146        }
147    };
148    ($lhs:expr, any_of $rhs:expr) => {
149        {
150            let mut found = false;
151            for value in &$rhs {
152                if *value == $lhs {
153                    found = true;
154                    break;
155                }
156            }
157            if !found {
158                assert_that!(message_any_of $lhs, $rhs);
159            }
160        }
161    };
162    ($lhs:expr, contains $rhs:expr) => {
163        {
164            let mut does_contain = false;
165            for value in &$lhs {
166                if *value == $rhs {
167                    does_contain = true;
168                    break;
169                }
170            }
171            if !does_contain {
172                assert_that!(message_contains $lhs, $rhs);
173            }
174        }
175    };
176    ($lhs:expr, contains_match |$element:ident| $predicate:expr) => {
177        {
178            let mut does_contain = false;
179            for $element in &$lhs {
180                if $predicate {
181                    does_contain = true;
182                    break;
183                }
184            }
185            if !does_contain {
186                assert_that!(message_contains_match $lhs, core::stringify!($predicate));
187            }
188        }
189    };
190    ($lhs:expr, not_contains_match |$element:ident| $predicate:expr) => {
191        {
192            let mut does_contain = false;
193            for $element in &$lhs {
194                if $predicate {
195                    does_contain = true;
196                    break;
197                }
198            }
199            if does_contain {
200                assert_that!(message_not_contains_match $lhs, core::stringify!($predicate));
201            }
202        }
203    };
204    ($lhs:expr, time_at_least $rhs:expr) => {
205        {
206            let lval = $lhs.as_secs_f32();
207            let rval = $rhs.as_secs_f32();
208            let rval_adjusted = rval * (1.0 - iceoryx2_bb_testing::AT_LEAST_TIMING_VARIANCE).clamp(0.0, 1.0);
209
210            if !(lval >= rval_adjusted) {
211                assert_that!(message_time_at_least $lhs, $rhs, lval, rval, rval_adjusted);
212            }
213        }
214    };
215    ($call:expr, block_until $rhs:expr) => {
216        {
217            let watchdog = iceoryx2_bb_testing::watchdog::Watchdog::new();
218
219            while $call() != $rhs {
220                std::thread::yield_now();
221                std::thread::sleep(core::time::Duration::from_millis(10));
222                std::thread::yield_now();
223            }
224        }
225    };
226    [color_start] => {
227        {
228            use std::io::IsTerminal;
229            if std::io::stdout().is_terminal() {
230                "\x1b[1;4;33m"
231            } else {
232                ""
233            }
234        }
235   };
236    [color_end] => {
237        {
238            use std::io::IsTerminal;
239            if std::io::stdout().is_terminal() {
240                "\x1b[0m"
241            } else {
242                ""
243            }
244        }
245    };
246    [message_any_of $lhs:expr, $rhs:expr] => {
247        core::panic!(
248            "assertion failed: {}expr: {} any_of {} ({:?});  contents: {:?}{}",
249                     assert_that![color_start],
250                     core::stringify!($lhs),
251                     core::stringify!($rhs),
252                     $rhs,
253                     $lhs,
254                     assert_that![color_end]
255        );
256    };
257    [message_contains $lhs:expr, $rhs:expr] => {
258        core::panic!(
259            "assertion failed: {}expr: {} contains {} ({:?});  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_match $lhs:expr, $predicate:expr] => {
269        core::panic!(
270            "assertion failed: {}expr: {} contains no element matching predicate: {}{}",
271            assert_that![color_start],
272            core::stringify!($lhs),
273            $predicate,
274            assert_that![color_end]
275        );
276    };
277    [message_not_contains_match $lhs:expr, $predicate:expr] => {
278        core::panic!(
279            "assertion failed: {}expr: {} contains element matching predicate: {}{}",
280            assert_that![color_start],
281            core::stringify!($lhs),
282            $predicate,
283            assert_that![color_end]
284        );
285    };
286    [message_property $lhs:expr, $lval:expr, $property:expr, $rhs:expr] => {
287        core::panic!(
288            "assertion failed: {}expr: {}.{} == {};  value: {} == {}{}",
289            assert_that![color_start],
290            core::stringify!($lhs),
291            $property,
292            $rhs,
293            $lval,
294            $rhs,
295            assert_that![color_end]
296        );
297    };
298    [message_result $lhs:expr, $state:expr] => {
299        core::panic!(
300            "assertion failed: {}{}.{}{}",
301            assert_that![color_start],
302            core::stringify!($lhs),
303            $state,
304            assert_that![color_end]
305        );
306    };
307    [message_time_at_least $lhs:expr, $rhs:expr, $lval:expr, $rval:expr, $rval_adjusted:expr] => {
308        core::panic!(
309            "assertion failed: [ time test ] {}expr: {} at least {};  value: {:?} at least {:?} (jitter adjusted: {:?}){}",
310            assert_that![color_start],
311            core::stringify!($lhs),
312            core::stringify!($rhs),
313            $lval,
314            $rval,
315            $rval_adjusted,
316            assert_that![color_end]
317        );
318    };
319    [message $lhs:expr, $rhs:expr, $lval:expr, $rval:expr, $symbol:expr] => {
320        core::panic!(
321            "assertion failed: {}expr: {} {} {};  value: {:?} {} {:?}{}",
322            assert_that![color_start],
323            core::stringify!($lhs),
324            $symbol,
325            core::stringify!($rhs),
326            $lval,
327            $symbol,
328            $rval,
329            assert_that![color_end]
330        );
331    };
332    [message $lhs:expr, $rhs:expr, $lval:expr, $rval:expr, $symbol:expr, $exp_result:expr, $act_result:expr] => {
333        core::panic!(
334            "assertion failed: {}expr: {} {} {} == {:?};  value: {:?} {} {:?} == {:?}{}",
335            assert_that![color_start],
336            core::stringify!($lhs),
337            $symbol,
338            core::stringify!($rhs),
339            $exp_result,
340            $lval,
341            $symbol,
342            $rval,
343            $act_result,
344            assert_that![color_end]
345        );
346    }
347}