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, 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}