1#[macro_export]
43macro_rules! assert_program_args_stderr_lt_as_result {
44 ($a_program:expr, $a_args:expr, $b_program:expr, $b_args:expr $(,)?) => {
45 match (&$a_program, &$a_args, &$b_program, &$b_args) {
46 (a_program, a_args, b_program, b_args) => {
47 match (
48 assert_program_args_impl_prep!(a_program, a_args),
49 assert_program_args_impl_prep!(b_program, b_args)
50 ) {
51 (Ok(a_output), Ok(b_output)) => {
52 let a = a_output.stderr;
53 let b = b_output.stderr;
54 if a.lt(&b) {
55 Ok((a, b))
56 } else {
57 Err(
58 format!(
59 concat!(
60 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
61 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
62 " a_program label: `{}`,\n",
63 " a_program debug: `{:?}`,\n",
64 " a_args label: `{}`,\n",
65 " a_args debug: `{:?}`,\n",
66 " b_program label: `{}`,\n",
67 " b_program debug: `{:?}`,\n",
68 " b_args label: `{}`,\n",
69 " b_args debug: `{:?}`,\n",
70 " a: `{:?}`,\n",
71 " b: `{:?}`"
72 ),
73 stringify!($a_program),
74 a_program,
75 stringify!($a_args),
76 a_args,
77 stringify!($b_program),
78 b_program,
79 stringify!($b_args),
80 b_args,
81 a,
82 b
83 )
84 )
85 }
86 },
87 (a, b) => {
88 Err(
89 format!(
90 concat!(
91 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
92 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
93 " a_program label: `{}`,\n",
94 " a_program debug: `{:?}`,\n",
95 " a_args label: `{}`,\n",
96 " a_args debug: `{:?}`,\n",
97 " b_program label: `{}`,\n",
98 " b_program debug: `{:?}`,\n",
99 " b_args label: `{}`,\n",
100 " b_args debug: `{:?}`,\n",
101 " a: `{:?}`,\n",
102 " b: `{:?}`"
103 ),
104 stringify!($a_program),
105 a_program,
106 stringify!($a_args),
107 a_args,
108 stringify!($b_program),
109 b_program,
110 stringify!($b_args),
111 b_args,
112 a,
113 b
114 )
115 )
116 }
117 }
118 }
119 }
120 };
121}
122
123#[cfg(test)]
124mod test_assert_program_args_stderr_lt_as_result {
125 use std::sync::Once;
126
127 #[test]
128 fn lt() {
129 let a_program = "bin/printf-stderr";
130 let a_args = ["%s", "alfa"];
131 let b_program = "bin/printf-stderr";
132 let b_args = ["%s", "zz"];
133 let actual = assert_program_args_stderr_lt_as_result!(a_program, a_args, b_program, b_args);
134 assert_eq!(
135 actual.unwrap(),
136 (vec![b'a', b'l', b'f', b'a'], vec![b'z', b'z'])
137 );
138 }
139
140 #[test]
141 fn lt_once() {
142 static A: Once = Once::new();
143 fn a() -> &'static str {
144 if A.is_completed() {
145 panic!("A.is_completed()")
146 } else {
147 A.call_once(|| {})
148 }
149 "bin/printf-stderr"
150 }
151
152 static A_ARGS: Once = Once::new();
153 fn a_args() -> [&'static str; 2] {
154 if A_ARGS.is_completed() {
155 panic!("A_ARGS.is_completed()")
156 } else {
157 A_ARGS.call_once(|| {})
158 }
159 ["%s", "alfa"]
160 }
161
162 static B: Once = Once::new();
163 fn b() -> &'static str {
164 if B.is_completed() {
165 panic!("B.is_completed()")
166 } else {
167 B.call_once(|| {})
168 }
169 "bin/printf-stderr"
170 }
171
172 static B_ARGS: Once = Once::new();
173 fn b_args() -> [&'static str; 2] {
174 if B_ARGS.is_completed() {
175 panic!("B_ARGS.is_completed()")
176 } else {
177 B_ARGS.call_once(|| {})
178 }
179 ["%s", "zz"]
180 }
181
182 assert_eq!(A.is_completed(), false);
183 assert_eq!(A_ARGS.is_completed(), false);
184 assert_eq!(B.is_completed(), false);
185 assert_eq!(B_ARGS.is_completed(), false);
186 let result = assert_program_args_stderr_lt_as_result!(a(), a_args(), b(), b_args());
187 assert!(result.is_ok());
188 assert_eq!(A.is_completed(), true);
189 assert_eq!(A_ARGS.is_completed(), true);
190 assert_eq!(B.is_completed(), true);
191 assert_eq!(B_ARGS.is_completed(), true);
192 }
193
194 #[test]
195 fn eq() {
196 let a_program = "bin/printf-stderr";
197 let a_args = ["%s", "alfa"];
198 let b_program = "bin/printf-stderr";
199 let b_args = ["%s", "alfa"];
200 let actual = assert_program_args_stderr_lt_as_result!(a_program, a_args, b_program, b_args);
201 let message = concat!(
202 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
203 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
204 " a_program label: `a_program`,\n",
205 " a_program debug: `\"bin/printf-stderr\"`,\n",
206 " a_args label: `a_args`,\n",
207 " a_args debug: `[\"%s\", \"alfa\"]`,\n",
208 " b_program label: `b_program`,\n",
209 " b_program debug: `\"bin/printf-stderr\"`,\n",
210 " b_args label: `b_args`,\n",
211 " b_args debug: `[\"%s\", \"alfa\"]`,\n",
212 " a: `[97, 108, 102, 97]`,\n",
213 " b: `[97, 108, 102, 97]`"
214 );
215 assert_eq!(actual.unwrap_err(), message);
216 }
217
218 #[test]
219 fn gt() {
220 let a_program = "bin/printf-stderr";
221 let a_args = ["%s", "alfa"];
222 let b_program = "bin/printf-stderr";
223 let b_args = ["%s", "aa"];
224 let actual = assert_program_args_stderr_lt_as_result!(a_program, a_args, b_program, b_args);
225 let message = concat!(
226 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
227 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
228 " a_program label: `a_program`,\n",
229 " a_program debug: `\"bin/printf-stderr\"`,\n",
230 " a_args label: `a_args`,\n",
231 " a_args debug: `[\"%s\", \"alfa\"]`,\n",
232 " b_program label: `b_program`,\n",
233 " b_program debug: `\"bin/printf-stderr\"`,\n",
234 " b_args label: `b_args`,\n",
235 " b_args debug: `[\"%s\", \"aa\"]`,\n",
236 " a: `[97, 108, 102, 97]`,\n",
237 " b: `[97, 97]`"
238 );
239 assert_eq!(actual.unwrap_err(), message);
240 }
241}
242
243#[macro_export]
312macro_rules! assert_program_args_stderr_lt {
313 ($a_program:expr, $a_args:expr, $b_program:expr, $b_args:expr $(,)?) => {
314 match $crate::assert_program_args_stderr_lt_as_result!($a_program, $a_args, $b_program, $b_args) {
315 Ok(x) => x,
316 Err(err) => panic!("{}", err),
317 }
318 };
319 ($a_program:expr, $a_args:expr, $b_program:expr, $($message:tt)+) => {
320 match $crate::assert_program_args_stderr_lt_as_result!($a_program, $a_args, $b_program, $b_args) {
321 Ok(x) => x,
322 Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
323 }
324 };
325}
326
327#[cfg(test)]
328mod test_assert_program_args_stderr_lt {
329 use std::panic;
330
331 #[test]
332 fn lt() {
333 let a_program = "bin/printf-stderr";
334 let a_args = ["%s", "alfa"];
335 let b_program = "bin/printf-stderr";
336 let b_args = ["%s", "zz"];
337 for _ in 0..1 {
338 let actual = assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args);
339 assert_eq!(actual, (vec![b'a', b'l', b'f', b'a'], vec![b'z', b'z']));
340 }
341 }
342
343 #[test]
344 fn eq() {
345 let a_program = "bin/printf-stderr";
346 let a_args = ["%s", "alfa"];
347 let b_program = "bin/printf-stderr";
348 let b_args = ["%s", "alfa"];
349 let result = panic::catch_unwind(|| {
350 let _actual = assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args);
351 });
352 let message = concat!(
353 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
354 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
355 " a_program label: `a_program`,\n",
356 " a_program debug: `\"bin/printf-stderr\"`,\n",
357 " a_args label: `a_args`,\n",
358 " a_args debug: `[\"%s\", \"alfa\"]`,\n",
359 " b_program label: `b_program`,\n",
360 " b_program debug: `\"bin/printf-stderr\"`,\n",
361 " b_args label: `b_args`,\n",
362 " b_args debug: `[\"%s\", \"alfa\"]`,\n",
363 " a: `[97, 108, 102, 97]`,\n",
364 " b: `[97, 108, 102, 97]`"
365 );
366 assert_eq!(
367 result
368 .unwrap_err()
369 .downcast::<String>()
370 .unwrap()
371 .to_string(),
372 message
373 );
374 }
375
376 #[test]
377 fn gt() {
378 let a_program = "bin/printf-stderr";
379 let a_args = ["%s", "alfa"];
380 let b_program = "bin/printf-stderr";
381 let b_args = ["%s", "aa"];
382 let result = panic::catch_unwind(|| {
383 let _actual = assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args);
384 });
385 let message = concat!(
386 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
387 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
388 " a_program label: `a_program`,\n",
389 " a_program debug: `\"bin/printf-stderr\"`,\n",
390 " a_args label: `a_args`,\n",
391 " a_args debug: `[\"%s\", \"alfa\"]`,\n",
392 " b_program label: `b_program`,\n",
393 " b_program debug: `\"bin/printf-stderr\"`,\n",
394 " b_args label: `b_args`,\n",
395 " b_args debug: `[\"%s\", \"aa\"]`,\n",
396 " a: `[97, 108, 102, 97]`,\n",
397 " b: `[97, 97]`"
398 );
399 assert_eq!(
400 result
401 .unwrap_err()
402 .downcast::<String>()
403 .unwrap()
404 .to_string(),
405 message
406 );
407 }
408}
409
410#[macro_export]
442macro_rules! debug_assert_program_args_stderr_lt {
443 ($($arg:tt)*) => {
444 if cfg!(debug_assertions) {
445 $crate::assert_program_args_stderr_lt!($($arg)*);
446 }
447 };
448}
449
450#[cfg(test)]
451mod test_debug_assert_program_args_stderr_lt {
452 use std::panic;
453
454 #[test]
455 fn lt() {
456 let a_program = "bin/printf-stderr";
457 let a_args = ["%s", "alfa"];
458 let b_program = "bin/printf-stderr";
459 let b_args = ["%s", "zz"];
460 for _ in 0..1 {
461 let _actual =
462 debug_assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args);
463 }
465 }
466
467 #[test]
468 fn eq() {
469 let a_program = "bin/printf-stderr";
470 let a_args = ["%s", "alfa"];
471 let b_program = "bin/printf-stderr";
472 let b_args = ["%s", "alfa"];
473 let result = panic::catch_unwind(|| {
474 let _actual =
475 debug_assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args);
476 });
477 let message = concat!(
478 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
479 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
480 " a_program label: `a_program`,\n",
481 " a_program debug: `\"bin/printf-stderr\"`,\n",
482 " a_args label: `a_args`,\n",
483 " a_args debug: `[\"%s\", \"alfa\"]`,\n",
484 " b_program label: `b_program`,\n",
485 " b_program debug: `\"bin/printf-stderr\"`,\n",
486 " b_args label: `b_args`,\n",
487 " b_args debug: `[\"%s\", \"alfa\"]`,\n",
488 " a: `[97, 108, 102, 97]`,\n",
489 " b: `[97, 108, 102, 97]`"
490 );
491 assert_eq!(
492 result
493 .unwrap_err()
494 .downcast::<String>()
495 .unwrap()
496 .to_string(),
497 message
498 );
499 }
500
501 #[test]
502 fn gt() {
503 let a_program = "bin/printf-stderr";
504 let a_args = ["%s", "alfa"];
505 let b_program = "bin/printf-stderr";
506 let b_args = ["%s", "aa"];
507 let result = panic::catch_unwind(|| {
508 let _actual =
509 debug_assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args);
510 });
511 let message = concat!(
512 "assertion failed: `assert_program_args_stderr_lt!(a_program, a_args, b_program, b_args)`\n",
513 "https://docs.rs/assertables/9.8.6/assertables/macro.assert_program_args_stderr_lt.html\n",
514 " a_program label: `a_program`,\n",
515 " a_program debug: `\"bin/printf-stderr\"`,\n",
516 " a_args label: `a_args`,\n",
517 " a_args debug: `[\"%s\", \"alfa\"]`,\n",
518 " b_program label: `b_program`,\n",
519 " b_program debug: `\"bin/printf-stderr\"`,\n",
520 " b_args label: `b_args`,\n",
521 " b_args debug: `[\"%s\", \"aa\"]`,\n",
522 " a: `[97, 108, 102, 97]`,\n",
523 " b: `[97, 97]`"
524 );
525 assert_eq!(
526 result
527 .unwrap_err()
528 .downcast::<String>()
529 .unwrap()
530 .to_string(),
531 message
532 );
533 }
534}