#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#![cfg_attr(coverage_nightly, coverage(off))]
#![cfg(not(miri))]
use std::process::{Command, Output};
use cargo_gamma_lib::internals::commands::{EXIT_OK, EXIT_USAGE};
use cargo_gamma_lib::testing::{workdir, write_project};
fn gamma(arguments: &[&str]) -> Output {
let directory = workdir("gamma-binary-");
write_project(directory.path(), &[("src/lib.rs", "")]);
Command::new(env!("CARGO_BIN_EXE_cargo-gamma"))
.current_dir(directory.path())
.args(arguments)
.output()
.expect("the built cargo-gamma binary runs")
}
fn wrapper(arguments: &[&str]) -> Output {
let directory = workdir("gamma-wrapper-");
write_project(directory.path(), &[("src/lib.rs", "")]);
Command::new(env!("CARGO_BIN_EXE_cargo-gamma"))
.current_dir(directory.path())
.env("CARGO_GAMMA_RUSTC_CAPTURE_DIR", directory.path())
.args(arguments)
.output()
.expect("the built cargo-gamma binary runs as a rustc wrapper")
}
#[track_caller]
fn code(output: &Output) -> i32 {
output.status.code().unwrap_or_else(|| {
panic!(
"the process was killed rather than exiting: {}",
String::from_utf8_lossy(&output.stderr)
)
})
}
#[test]
fn the_installed_binary_reports_its_version_and_succeeds() {
let output = gamma(&["--version"]);
let printed = String::from_utf8_lossy(&output.stdout);
let errors = String::from_utf8_lossy(&output.stderr);
let expected = format!("cargo-gamma {}", env!("CARGO_PKG_VERSION"));
assert_eq!(code(&output), EXIT_OK, "{errors}");
assert_eq!(printed.trim(), expected);
assert!(output.stderr.is_empty(), "version output reached standard error: {errors}");
}
#[test]
fn the_installed_binary_accepts_the_argument_shape_cargo_passes_it() {
let output = gamma(&["gamma", "--version"]);
let printed = String::from_utf8_lossy(&output.stdout);
let errors = String::from_utf8_lossy(&output.stderr);
let expected = format!("cargo-gamma {}", env!("CARGO_PKG_VERSION"));
assert_eq!(code(&output), EXIT_OK, "{errors}");
assert_eq!(printed.trim(), expected);
assert!(output.stderr.is_empty(), "version output reached standard error: {errors}");
}
#[test]
fn an_unknown_command_exits_with_the_usage_code_and_explains_itself_on_standard_error() {
let output = gamma(&["definitely-not-a-command"]);
let complaint = String::from_utf8_lossy(&output.stderr);
assert_eq!(code(&output), EXIT_USAGE, "an unknown command must not be reported as success");
assert!(!complaint.trim().is_empty(), "an unknown command was refused without saying why");
assert!(
String::from_utf8_lossy(&output.stdout).trim().is_empty(),
"a diagnostic reached standard output, where it would corrupt piped report output"
);
}
#[test]
fn the_installed_binary_preserves_rustc_wrapper_status() {
#[cfg(windows)]
let (success, failure) = (wrapper(&["cmd", "/c", "exit 0"]), wrapper(&["cmd", "/c", "exit 7"]));
#[cfg(not(windows))]
let (success, failure) = (wrapper(&["sh", "-c", "exit 0"]), wrapper(&["sh", "-c", "exit 7"]));
assert_eq!(code(&success), 0);
assert_eq!(code(&failure), 7);
}