use std::error::Error;
use mapped_command::{Command, ExecResult, MapStdoutAndErrStrings, MapStdoutString};
use proptest::{prelude::*, test_runner::FileFailurePersistence};
fn create_foobar_command(magic: bool) -> Command<u32, Box<dyn Error>> {
if magic {
Command::new("foobar1", MapStdoutString(|stdout| Ok(stdout.parse()?)))
.with_argument("--auto-sum")
} else {
Command::new(
"foobar.legacy",
MapStdoutAndErrStrings(|captured| {
let a: u32 = captured.stdout.parse()?;
let b: u32 = captured.stderr.parse()?;
Ok(a + b)
}),
)
}
}
proptest! {
#![proptest_config(ProptestConfig {
failure_persistence: Some(Box::new(FileFailurePersistence::Off)),
..ProptestConfig::default()
})]
fn test_mocked_foobar(
magic in any::<bool>(),
stdout_num in any::<u32>(),
stderr_num in any::<u32>()
) {
prop_assume!(stdout_num as u64 + stderr_num as u64 <= u32::MAX as u64);
let num = create_foobar_command(magic)
.with_exec_replacement_callback(move |_cmd, ret_set| {
let stdout = if ret_set.capture_stdout() {
Some(stdout_num.to_string().into())
} else {
None
};
let stderr = if ret_set.capture_stderr() {
Some(stderr_num.to_string().into())
} else {
None
};
Ok(ExecResult {
exit_status: 0.into(),
stdout,
stderr,
})
})
.run()
.unwrap();
if magic {
assert_eq!(num, stdout_num);
} else {
assert_eq!(num, stdout_num+stderr_num);
}
}
}
fn main() {
test_mocked_foobar()
}