2023-07-20 18:34:09 +00:00
|
|
|
use crate::common;
|
2022-03-07 20:03:46 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn basic() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::basic_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/basic.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn feature_sample() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::feature_sample_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/feature_sample.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn special_commands() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::special_commands_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/special_commands.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn quoting() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::quoting_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/quoting.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn aliases() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::aliases_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/aliases.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn sub_subcommands() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::sub_subcommands_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/sub_subcommands.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn value_hint() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::value_hint_command(name);
|
|
|
|
common::assert_matches_path(
|
2022-04-22 21:20:57 +00:00
|
|
|
"tests/snapshots/value_hint.bash",
|
2022-03-07 20:03:46 +00:00
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
2022-04-15 21:08:11 +00:00
|
|
|
|
2023-01-09 10:50:58 +00:00
|
|
|
#[test]
|
|
|
|
fn value_terminator() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::value_terminator_command(name);
|
|
|
|
common::assert_matches_path(
|
|
|
|
"tests/snapshots/value_terminator.bash",
|
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-04-15 21:08:11 +00:00
|
|
|
#[cfg(feature = "unstable-dynamic")]
|
|
|
|
#[test]
|
|
|
|
fn register_minimal() {
|
|
|
|
let name = "my-app";
|
|
|
|
let executables = [name];
|
|
|
|
let completer = name;
|
|
|
|
let behavior = clap_complete::dynamic::bash::Behavior::Minimal;
|
|
|
|
|
|
|
|
let mut buf = Vec::new();
|
|
|
|
clap_complete::dynamic::bash::register(name, executables, completer, &behavior, &mut buf)
|
|
|
|
.unwrap();
|
|
|
|
snapbox::Assert::new()
|
|
|
|
.action_env("SNAPSHOTS")
|
|
|
|
.matches_path("tests/snapshots/register_minimal.bash", buf);
|
|
|
|
}
|
2023-01-10 08:14:52 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn two_multi_valued_arguments() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::two_multi_valued_arguments_command(name);
|
|
|
|
common::assert_matches_path(
|
|
|
|
"tests/snapshots/two_multi_valued_arguments.bash",
|
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
2023-05-10 18:21:01 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn subcommand_last() {
|
|
|
|
let name = "my-app";
|
|
|
|
let cmd = common::subcommand_last(name);
|
|
|
|
common::assert_matches_path(
|
|
|
|
"tests/snapshots/subcommand_last.bash",
|
|
|
|
clap_complete::shells::Bash,
|
|
|
|
cmd,
|
|
|
|
name,
|
|
|
|
);
|
|
|
|
}
|
2023-07-20 02:54:00 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[cfg(unix)]
|
2023-07-20 19:28:09 +00:00
|
|
|
fn register_completion() {
|
2023-07-20 02:54:00 +00:00
|
|
|
if !has_command("bash") {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let shell = "bash";
|
2023-07-20 19:28:09 +00:00
|
|
|
let home = std::path::Path::new("tests/snapshots/home/test/bash").to_owned();
|
2023-07-20 02:54:00 +00:00
|
|
|
let bin_path = snapbox::cmd::compile_example("test", []).unwrap();
|
|
|
|
let bin_root = bin_path.parent().unwrap().to_owned();
|
|
|
|
|
|
|
|
let registration = std::process::Command::new(&bin_path)
|
|
|
|
.arg(format!("--generate={shell}"))
|
|
|
|
.output()
|
|
|
|
.unwrap();
|
|
|
|
assert!(
|
|
|
|
registration.status.success(),
|
|
|
|
"{}",
|
|
|
|
String::from_utf8_lossy(®istration.stderr)
|
|
|
|
);
|
|
|
|
let registration = std::str::from_utf8(®istration.stdout).unwrap();
|
|
|
|
assert!(!registration.is_empty());
|
|
|
|
|
|
|
|
let runtime = completest::BashRuntime::new(bin_root, home).unwrap();
|
|
|
|
|
|
|
|
runtime.register("test", registration).unwrap();
|
2023-07-20 19:28:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[cfg(unix)]
|
|
|
|
fn complete() {
|
|
|
|
if !has_command("bash") {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let shell = "bash";
|
|
|
|
let home = std::path::PathBuf::from(format!("tests/snapshots/home/test/{shell}"));
|
|
|
|
let bin_path = snapbox::cmd::compile_example("test", []).unwrap();
|
|
|
|
let bin_root = bin_path.parent().unwrap().to_owned();
|
|
|
|
|
|
|
|
let term = completest::Term::new();
|
|
|
|
let runtime = completest::BashRuntime::with_home(bin_root, home);
|
2023-07-20 02:54:00 +00:00
|
|
|
|
2023-07-20 19:28:09 +00:00
|
|
|
let input = "test \t\t";
|
2023-07-20 02:54:00 +00:00
|
|
|
let expected = r#"%
|
|
|
|
-h --global --help action value last hint
|
|
|
|
-V --generate --version quote pacman alias help "#;
|
2023-07-20 19:28:09 +00:00
|
|
|
let actual = runtime.complete(input, &term).unwrap();
|
2023-07-20 02:54:00 +00:00
|
|
|
snapbox::assert_eq(expected, actual);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn has_command(command: &str) -> bool {
|
|
|
|
let output = match std::process::Command::new(command)
|
|
|
|
.arg("--version")
|
|
|
|
.output()
|
|
|
|
{
|
|
|
|
Ok(output) => output,
|
|
|
|
Err(e) => {
|
|
|
|
// CI is expected to support all of the commands
|
|
|
|
if is_ci() && cfg!(linux) {
|
|
|
|
panic!(
|
|
|
|
"expected command `{}` to be somewhere in PATH: {}",
|
|
|
|
command, e
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
if !output.status.success() {
|
|
|
|
panic!(
|
|
|
|
"expected command `{}` to be runnable, got error {}:\n\
|
|
|
|
stderr:{}\n\
|
|
|
|
stdout:{}\n",
|
|
|
|
command,
|
|
|
|
output.status,
|
|
|
|
String::from_utf8_lossy(&output.stderr),
|
|
|
|
String::from_utf8_lossy(&output.stdout)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
|
|
println!(
|
|
|
|
"$ bash --version
|
|
|
|
{}",
|
|
|
|
stdout
|
|
|
|
);
|
|
|
|
if cfg!(target_os = "macos") && stdout.starts_with("GNU bash, version 3") {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Whether or not this running in a Continuous Integration environment.
|
|
|
|
fn is_ci() -> bool {
|
|
|
|
// Consider using `tracked_env` instead of option_env! when it is stabilized.
|
|
|
|
// `tracked_env` will handle changes, but not require rebuilding the macro
|
|
|
|
// itself like option_env does.
|
|
|
|
option_env!("CI").is_some() || option_env!("TF_BUILD").is_some()
|
|
|
|
}
|