use std::process::Command;
fn yosh_bin() -> Command {
Command::new(env!("CARGO_BIN_EXE_yosh"))
}
#[test]
fn help_flag_prints_usage_and_exits_zero() {
let output = yosh_bin().arg("--help").output().unwrap();
assert!(output.status.success(), "exit code should be 0");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("yosh - A POSIX-compliant shell"),
"should contain description"
);
assert!(stdout.contains("Usage:"), "should contain Usage section");
assert!(
stdout.contains("Options:"),
"should contain Options section"
);
assert!(stdout.contains("--help"), "should list --help option");
assert!(stdout.contains("--version"), "should list --version option");
assert!(stdout.contains("-c <command>"), "should list -c option");
assert!(stdout.contains("plugin"), "should list plugin subcommand");
}
#[test]
fn short_help_flag_works() {
let output = yosh_bin().arg("-h").output().unwrap();
assert!(output.status.success(), "exit code should be 0");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("yosh - A POSIX-compliant shell"),
"should contain description"
);
assert!(stdout.contains("Usage:"), "should contain Usage section");
}
#[test]
fn version_flag_prints_version_and_exits_zero() {
let output = yosh_bin().arg("--version").output().unwrap();
assert!(output.status.success(), "exit code should be 0");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.starts_with("yosh "), "should start with 'yosh '");
assert!(
stdout.contains(env!("CARGO_PKG_VERSION")),
"should contain package version"
);
assert!(stdout.contains('('), "should contain build info in parens");
}
#[test]
fn help_output_goes_to_stdout() {
let output = yosh_bin().arg("--help").output().unwrap();
assert!(!output.stdout.is_empty(), "stdout should have content");
assert!(output.stderr.is_empty(), "stderr should be empty");
}
#[test]
fn help_no_color_when_env_set() {
let output = yosh_bin()
.arg("--help")
.env("NO_COLOR", "1")
.output()
.unwrap();
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
!stdout.contains('\x1b'),
"should not contain ANSI escapes when NO_COLOR is set"
);
}
#[test]
fn help_color_forced_with_clicolor_force() {
let output = yosh_bin()
.arg("--help")
.env("CLICOLOR_FORCE", "1")
.output()
.unwrap();
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains('\x1b'),
"should contain ANSI escapes when CLICOLOR_FORCE=1"
);
}
#[test]
fn help_clicolor_force_zero_does_not_force() {
let output = yosh_bin()
.arg("--help")
.env("CLICOLOR_FORCE", "0")
.output()
.unwrap();
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
!stdout.contains('\x1b'),
"CLICOLOR_FORCE=0 should not force ANSI escapes"
);
}