#[macro_export]
macro_rules! assert_status_success_false_as_result {
($a:expr $(,)?) => {
match ($a.status()) {
Ok(a1) => {
if !a1.success() {
Ok(true)
} else {
Err(format!(
concat!(
"assertion failed: `assert_status_success_false!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_status_success_false.html\n",
" a label: `{}`,\n",
" a debug: `{:?}`",
),
stringify!($a),
$a,
))
}
}
a_status => Err(format!(
concat!(
"assertion failed: `assert_status_success_false!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_status_success_false.html\n",
" a label: `{}`,\n",
" a debug: `{:?}`,\n",
" a status: `{:?}`",
),
stringify!($a),
$a,
a_status
)),
}
};
}
#[cfg(test)]
mod test_assert_status_success_false_as_result {
use std::process::Command;
use std::sync::Once;
#[test]
fn success() {
let mut a = Command::new("bin/exit-with-arg");
a.arg("1");
for _ in 0..1 {
let actual = assert_status_success_false_as_result!(a);
assert_eq!(actual.unwrap(), true);
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> Command {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
let mut a = Command::new("bin/exit-with-arg");
a.arg("1");
a
}
assert_eq!(A.is_completed(), false);
let result = assert_status_success_false_as_result!(a());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
}
#[test]
fn failure() {
let mut a = Command::new("bin/exit-with-arg");
a.arg("0");
let actual = assert_status_success_false_as_result!(a);
let message = concat!(
"assertion failed: `assert_status_success_false!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_status_success_false.html\n",
" a label: `a`,\n",
" a debug: `\"bin/exit-with-arg\" \"0\"`",
);
assert_eq!(actual.unwrap_err(), message);
}
}
#[macro_export]
macro_rules! assert_status_success_false {
($a:expr $(,)?) => {
match $crate::assert_status_success_false_as_result!($a) {
Ok(x) => x,
Err(err) => panic!("{}", err),
}
};
($a:expr, $($message:tt)+) => {
match $crate::assert_status_success_false_as_result!($a) {
Ok(x) => x,
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_status_success_false {
use std::panic;
use std::process::Command;
#[test]
fn success() {
let mut a = Command::new("bin/exit-with-arg");
a.arg("1");
for _ in 0..1 {
let actual = assert_status_success_false!(a);
assert_eq!(actual, true);
}
}
#[test]
fn failure() {
let result = panic::catch_unwind(|| {
let mut a = Command::new("bin/exit-with-arg");
a.arg("0");
let _actual = assert_status_success_false!(a);
});
let message = concat!(
"assertion failed: `assert_status_success_false!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_status_success_false.html\n",
" a label: `a`,\n",
" a debug: `\"bin/exit-with-arg\" \"0\"`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
#[macro_export]
macro_rules! debug_assert_status_success_false {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_status_success_false!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_status_success_false {
use std::panic;
use std::process::Command;
#[test]
fn success() {
let mut a = Command::new("bin/exit-with-arg");
a.arg("1");
for _ in 0..1 {
let _actual = debug_assert_status_success_false!(a);
}
}
#[test]
fn failure() {
let result = panic::catch_unwind(|| {
let mut a = Command::new("bin/exit-with-arg");
a.arg("0");
let _actual = debug_assert_status_success_false!(a);
});
let message = concat!(
"assertion failed: `assert_status_success_false!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_status_success_false.html\n",
" a label: `a`,\n",
" a debug: `\"bin/exit-with-arg\" \"0\"`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}