mirror of
https://github.com/clap-rs/clap
synced 2024-12-13 14:22:34 +00:00
c90a4eabae
In looking at other help output, I noticed that they use two spaces, in place of clap's 4, and it doesn't suffer from legibility. If it doesn't make the output worse, let's go ahead and make it as dense so we fit more content on the screen. This is a part of #4132
311 lines
7.7 KiB
Rust
311 lines
7.7 KiB
Rust
use clap::{error::ErrorKind, ArgAction, Command};
|
|
|
|
use crate::utils;
|
|
|
|
fn common() -> Command {
|
|
Command::new("foo").help_template(utils::FULL_TEMPLATE)
|
|
}
|
|
|
|
fn with_version() -> Command {
|
|
common().version("3.0")
|
|
}
|
|
|
|
fn with_long_version() -> Command {
|
|
common().long_version("3.0 (abcdefg)")
|
|
}
|
|
|
|
fn with_both() -> Command {
|
|
common().version("3.0").long_version("3.0 (abcdefg)")
|
|
}
|
|
|
|
fn with_subcommand() -> Command {
|
|
with_version().subcommand(Command::new("bar").subcommand(Command::new("baz")))
|
|
}
|
|
|
|
#[test]
|
|
fn version_short_flag_no_version() {
|
|
let res = common().try_get_matches_from("foo -V".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument);
|
|
}
|
|
|
|
#[test]
|
|
fn version_long_flag_no_version() {
|
|
let res = common().try_get_matches_from("foo --version".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument);
|
|
}
|
|
|
|
#[test]
|
|
fn version_short_flag_with_version() {
|
|
let res = with_version().try_get_matches_from("foo -V".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
assert_eq!(err.to_string(), "foo 3.0\n");
|
|
}
|
|
|
|
#[test]
|
|
fn version_long_flag_with_version() {
|
|
let res = with_version().try_get_matches_from("foo --version".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
assert_eq!(err.to_string(), "foo 3.0\n");
|
|
}
|
|
|
|
#[test]
|
|
fn version_short_flag_with_long_version() {
|
|
let res = with_long_version().try_get_matches_from("foo -V".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n");
|
|
}
|
|
|
|
#[test]
|
|
fn version_long_flag_with_long_version() {
|
|
let res = with_long_version().try_get_matches_from("foo --version".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n");
|
|
}
|
|
|
|
#[test]
|
|
fn version_short_flag_with_both() {
|
|
let res = with_both().try_get_matches_from("foo -V".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
assert_eq!(err.to_string(), "foo 3.0\n");
|
|
}
|
|
|
|
#[test]
|
|
fn version_long_flag_with_both() {
|
|
let res = with_both().try_get_matches_from("foo --version".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n");
|
|
}
|
|
|
|
#[test]
|
|
fn help_short_flag_no_version() {
|
|
static EXPECTED: &str = "\
|
|
foo
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
";
|
|
let cmd = common();
|
|
utils::assert_output(cmd, "foo -h", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_long_flag_no_version() {
|
|
static EXPECTED: &str = "\
|
|
foo
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
";
|
|
let cmd = common();
|
|
utils::assert_output(cmd, "foo --help", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_short_flag_with_version() {
|
|
static EXPECTED: &str = "\
|
|
foo 3.0
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
let cmd = with_version();
|
|
utils::assert_output(cmd, "foo -h", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_long_flag_with_version() {
|
|
static EXPECTED: &str = "\
|
|
foo 3.0
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
let cmd = with_version();
|
|
utils::assert_output(cmd, "foo --help", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_short_flag_with_long_version() {
|
|
static EXPECTED: &str = "\
|
|
foo 3.0 (abcdefg)
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
let cmd = with_long_version();
|
|
utils::assert_output(cmd, "foo -h", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_long_flag_with_long_version() {
|
|
static EXPECTED: &str = "\
|
|
foo 3.0 (abcdefg)
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
let cmd = with_long_version();
|
|
utils::assert_output(cmd, "foo --help", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_short_flag_with_both() {
|
|
static EXPECTED: &str = "\
|
|
foo 3.0
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
let cmd = with_both();
|
|
utils::assert_output(cmd, "foo -h", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
fn help_long_flag_with_both() {
|
|
static EXPECTED: &str = "\
|
|
foo 3.0
|
|
|
|
Usage: foo
|
|
|
|
Options:
|
|
-h, --help Print help information
|
|
-V, --version Print version information
|
|
";
|
|
let cmd = with_both();
|
|
utils::assert_output(cmd, "foo --help", EXPECTED, false);
|
|
}
|
|
|
|
#[test]
|
|
#[cfg(debug_assertions)]
|
|
#[should_panic = "Command foo: Long option names must be unique for each argument, but '--version' is in use by both 'ver' and 'version' (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)"]
|
|
fn override_version_long_with_user_flag() {
|
|
with_version()
|
|
.arg(
|
|
clap::Arg::new("ver")
|
|
.long("version")
|
|
.action(ArgAction::SetTrue),
|
|
)
|
|
.debug_assert();
|
|
}
|
|
|
|
#[test]
|
|
#[cfg(debug_assertions)]
|
|
#[should_panic = "Command foo: Short option names must be unique for each argument, but '-V' is in use by both 'ver' and 'version' (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)"]
|
|
fn override_version_short_with_user_flag() {
|
|
with_version()
|
|
.arg(clap::Arg::new("ver").short('V').action(ArgAction::SetTrue))
|
|
.debug_assert();
|
|
}
|
|
|
|
#[test]
|
|
fn no_propagation_by_default_long() {
|
|
// Version Flag should not be propagated to subcommands
|
|
let res = with_subcommand().try_get_matches_from("foo bar --version".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::UnknownArgument);
|
|
}
|
|
|
|
#[test]
|
|
fn no_propagation_by_default_short() {
|
|
let res = with_subcommand().try_get_matches_from("foo bar -V".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::UnknownArgument);
|
|
}
|
|
|
|
#[test]
|
|
fn propagate_version_long() {
|
|
let res = with_subcommand()
|
|
.propagate_version(true)
|
|
.try_get_matches_from("foo bar --version".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
}
|
|
|
|
#[test]
|
|
fn propagate_version_short() {
|
|
let res = with_subcommand()
|
|
.propagate_version(true)
|
|
.try_get_matches_from("foo bar -V".split(' '));
|
|
|
|
assert!(res.is_err());
|
|
let err = res.unwrap_err();
|
|
assert_eq!(err.kind(), ErrorKind::DisplayVersion);
|
|
}
|
|
|
|
#[cfg(debug_assertions)]
|
|
#[test]
|
|
#[should_panic = "`ArgAction::Version` used without providing Command::version or Command::long_version"]
|
|
fn version_required() {
|
|
let _res = common()
|
|
.arg(clap::arg!(--version).action(ArgAction::Version))
|
|
.try_get_matches_from("foo -z".split(' '));
|
|
}
|
|
|
|
#[test]
|
|
fn mut_arg_version_no_auto_version() {
|
|
let res = common()
|
|
.mut_arg("version", |v| v.short('z').action(ArgAction::SetTrue))
|
|
.try_get_matches_from("foo -z".split(' '));
|
|
|
|
assert!(res.is_ok(), "{}", res.unwrap_err());
|
|
assert_eq!(res.unwrap().get_one::<bool>("version").copied(), Some(true));
|
|
}
|
|
|
|
#[cfg(debug_assertions)]
|
|
#[test]
|
|
#[should_panic = "No version information via Command::version or Command::long_version to propagate"]
|
|
fn propagate_version_no_version_info() {
|
|
let _res = common()
|
|
.propagate_version(true)
|
|
.subcommand(Command::new("bar"))
|
|
.try_get_matches_from("foo".split(' '));
|
|
}
|