use assert_cmd::Command;
use predicates::prelude::*;
fn hedl_bin() -> String {
std::env::var("CARGO_BIN_EXE_hedl").unwrap_or_else(|_| env!("CARGO_BIN_EXE_hedl").to_string())
}
#[test]
fn test_completion_bash() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("bash");
cmd.assert()
.success()
.stdout(predicate::str::contains("_hedl()"))
.stdout(predicate::str::contains("COMPREPLY"));
}
#[test]
fn test_completion_zsh() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("zsh");
cmd.assert()
.success()
.stdout(predicate::str::contains("#compdef hedl"))
.stdout(predicate::str::contains("_hedl()"));
}
#[test]
fn test_completion_fish() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("fish");
cmd.assert()
.success()
.stdout(predicate::str::contains("complete -c hedl"));
}
#[test]
fn test_completion_powershell() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("powershell");
cmd.assert()
.success()
.stdout(predicate::str::contains("Register-ArgumentCompleter"))
.stdout(predicate::str::contains("'hedl'"));
}
#[test]
fn test_completion_elvish() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("elvish");
cmd.assert()
.success()
.stdout(predicate::str::contains("edit:completion:arg-completer"));
}
#[test]
fn test_completion_case_insensitive() {
let mut cmd1 = Command::new(hedl_bin());
cmd1.arg("completion").arg("BASH");
cmd1.assert().success();
let mut cmd2 = Command::new(hedl_bin());
cmd2.arg("completion").arg("Zsh");
cmd2.assert().success();
let mut cmd3 = Command::new(hedl_bin());
cmd3.arg("completion").arg("FiSh");
cmd3.assert().success();
}
#[test]
fn test_completion_invalid_shell() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("invalid");
cmd.assert()
.failure()
.stderr(predicate::str::contains("Unsupported shell"))
.stderr(predicate::str::contains(
"bash, zsh, fish, powershell, elvish",
));
}
#[test]
fn test_completion_install_bash() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("bash").arg("--install");
cmd.assert()
.success()
.stdout(predicate::str::contains("Bash completion installation"))
.stdout(predicate::str::contains("~/.bashrc"))
.stdout(predicate::str::contains("eval"));
}
#[test]
fn test_completion_install_zsh() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("zsh").arg("--install");
cmd.assert()
.success()
.stdout(predicate::str::contains("Zsh completion installation"))
.stdout(predicate::str::contains("~/.zshrc"));
}
#[test]
fn test_completion_install_fish() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("fish").arg("--install");
cmd.assert()
.success()
.stdout(predicate::str::contains("Fish completion installation"))
.stdout(predicate::str::contains(".config/fish/completions"));
}
#[test]
fn test_completion_install_powershell() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("powershell").arg("--install");
cmd.assert()
.success()
.stdout(predicate::str::contains(
"PowerShell completion installation",
))
.stdout(predicate::str::contains("$PROFILE"));
}
#[test]
fn test_completion_install_elvish() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("elvish").arg("--install");
cmd.assert()
.success()
.stdout(predicate::str::contains("Elvish completion installation"))
.stdout(predicate::str::contains("~/.elvish/rc.elv"));
}
#[test]
fn test_completion_help() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains(
"Generate shell completion scripts",
))
.stdout(predicate::str::contains(
"bash, zsh, fish, powershell, elvish",
));
}
#[test]
fn test_completion_validates_all_commands() {
let mut cmd = Command::new(hedl_bin());
cmd.arg("completion").arg("bash");
let output = cmd.assert().success();
let stdout = String::from_utf8_lossy(&output.get_output().stdout);
assert!(stdout.contains("validate"));
assert!(stdout.contains("format"));
assert!(stdout.contains("lint"));
assert!(stdout.contains("to-json"));
assert!(stdout.contains("from-json"));
assert!(stdout.contains("inspect"));
assert!(stdout.contains("stats"));
assert!(stdout.contains("completion"));
}