#[macro_export]
macro_rules! assert_program_args_stderr_string_contains_as_result {
($a_program:expr, $a_args:expr, $containee:expr $(,)?) => {
match (&$a_program, &$a_args, &$containee) {
(a_program, a_args, containee) => {
match assert_program_args_impl_prep!(a_program, a_args) {
Ok(a_output) => {
let a_string = String::from_utf8(a_output.stderr).unwrap();
if a_string.contains(*containee) {
Ok(a_string)
} else {
Err(
format!(
concat!(
"assertion failed: `assert_program_args_stderr_string_contains!(a_program, a_args, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_program_args_stderr_string_contains.html\n",
" a_program label: `{}`,\n",
" a_program debug: `{:?}`,\n",
" a_args label: `{}`,\n",
" a_args debug: `{:?}`,\n",
" containee label: `{}`,\n",
" containee debug: `{:?}`,\n",
" a: `{:?}`,\n",
" containee: `{:?}`"
),
stringify!($a_program),
a_program,
stringify!($a_args),
a_args,
stringify!($containee),
containee,
a_string,
$containee
)
)
}
},
Err(err) => {
Err(
format!(
concat!(
"assertion failed: `assert_program_args_stderr_string_contains!(a_program, a_args, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_program_args_stderr_string_contains.html\n",
" a_program label: `{}`,\n",
" a_program debug: `{:?}`,\n",
" a_args label: `{}`,\n",
" a_args debug: `{:?}`,\n",
" containee label: `{}`,\n",
" containee debug: `{:?}`,\n",
" err: `{:?}`"
),
stringify!($a_program),
a_program,
stringify!($a_args),
a_args,
stringify!($containee),
containee,
err
)
)
}
}
}
}
};
}
#[cfg(test)]
mod test_assert_program_args_stderr_string_contains_as_result {
use std::sync::Once;
#[test]
fn success() {
let a_program = "bin/printf-stderr";
let a_args = ["%s", "alfa"];
let b = "lf";
for _ in 0..1 {
let actual =
assert_program_args_stderr_string_contains_as_result!(a_program, a_args, b);
assert_eq!(actual.unwrap(), "alfa");
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> &'static str {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
"bin/printf-stderr"
}
static A_ARGS: Once = Once::new();
fn a_args() -> [&'static str; 2] {
if A_ARGS.is_completed() {
panic!("A_ARGS.is_completed()")
} else {
A_ARGS.call_once(|| {})
}
["%s", "alfa"]
}
static B: Once = Once::new();
fn b() -> &'static str {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
"lf"
}
assert_eq!(A.is_completed(), false);
assert_eq!(A_ARGS.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_program_args_stderr_string_contains_as_result!(&a(), &a_args(), &b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(A_ARGS.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a_program = "bin/printf-stderr";
let a_args = ["%s", "alfa"];
let b = "zz";
let actual = assert_program_args_stderr_string_contains_as_result!(a_program, a_args, b);
let message = concat!(
"assertion failed: `assert_program_args_stderr_string_contains!(a_program, a_args, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_program_args_stderr_string_contains.html\n",
" a_program label: `a_program`,\n",
" a_program debug: `\"bin/printf-stderr\"`,\n",
" a_args label: `a_args`,\n",
" a_args debug: `[\"%s\", \"alfa\"]`,\n",
" containee label: `b`,\n",
" containee debug: `\"zz\"`,\n",
" a: `\"alfa\"`,\n",
" containee: `\"zz\"`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
#[macro_export]
macro_rules! assert_program_args_stderr_string_contains {
($a_program:expr, $a_args:expr, $containee:expr $(,)?) => {
match $crate::assert_program_args_stderr_string_contains_as_result!($a_program, $a_args, $containee) {
Ok(x) => x,
Err(err) => panic!("{}", err),
}
};
($a_program:expr, $a_args:expr, $containee:expr, $($message:tt)+) => {
match $crate::assert_program_args_stderr_string_contains_as_result!($a_program, $a_args, $containee) {
Ok(x) => x,
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_program_args_stderr_string_contains {
use std::panic;
#[test]
fn success() {
let a_program = "bin/printf-stderr";
let a_args = ["%s", "alfa"];
let b = "lf";
for _ in 0..1 {
let actual = assert_program_args_stderr_string_contains!(a_program, a_args, b);
assert_eq!(actual, "alfa");
}
}
#[test]
fn failure() {
let a_program = "bin/printf-stderr";
let a_args = ["%s", "alfa"];
let b = "zz";
let result = panic::catch_unwind(|| {
let _actual = assert_program_args_stderr_string_contains!(a_program, a_args, b);
});
let message = concat!(
"assertion failed: `assert_program_args_stderr_string_contains!(a_program, a_args, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_program_args_stderr_string_contains.html\n",
" a_program label: `a_program`,\n",
" a_program debug: `\"bin/printf-stderr\"`,\n",
" a_args label: `a_args`,\n",
" a_args debug: `[\"%s\", \"alfa\"]`,\n",
" containee label: `b`,\n",
" containee debug: `\"zz\"`,\n",
" a: `\"alfa\"`,\n",
" containee: `\"zz\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
#[macro_export]
macro_rules! debug_assert_program_args_stderr_string_contains {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_program_args_stderr_string_contains!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_program_args_stderr_string_contains {
use std::panic;
#[test]
fn success() {
let a_program = "bin/printf-stderr";
let a_args = ["%s", "alfa"];
let b = "lf";
for _ in 0..1 {
let _actual = debug_assert_program_args_stderr_string_contains!(a_program, a_args, b);
}
}
#[test]
fn failure() {
let a_program = "bin/printf-stderr";
let a_args = ["%s", "alfa"];
let b = "zz";
let result = panic::catch_unwind(|| {
let _actual = debug_assert_program_args_stderr_string_contains!(a_program, a_args, b);
});
let message = concat!(
"assertion failed: `assert_program_args_stderr_string_contains!(a_program, a_args, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_program_args_stderr_string_contains.html\n",
" a_program label: `a_program`,\n",
" a_program debug: `\"bin/printf-stderr\"`,\n",
" a_args label: `a_args`,\n",
" a_args debug: `[\"%s\", \"alfa\"]`,\n",
" containee label: `b`,\n",
" containee debug: `\"zz\"`,\n",
" a: `\"alfa\"`,\n",
" containee: `\"zz\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}