clap/tests/builder/possible_values.rs

475 lines
13 KiB
Rust
Raw Normal View History

use clap::{builder::PossibleValue, error::ErrorKind, Arg, ArgAction, Command};
#[cfg(feature = "error-context")]
use super::utils;
#[test]
fn possible_values_of_positional() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2022-05-24 01:16:02 +00:00
.arg(Arg::new("positional").index(1).value_parser(["test123"]))
.try_get_matches_from(vec!["myprog", "test123"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert!(m.contains_id("positional"));
assert_eq!(
m.get_one::<String>("positional").map(|v| v.as_str()),
Some("test123")
);
}
#[test]
fn possible_value_arg_value() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
.arg(
2022-05-24 01:16:02 +00:00
Arg::new("arg_value")
.index(1)
.value_parser([PossibleValue::new("test123")
.hide(false)
2022-05-24 01:16:02 +00:00
.help("It's just a test")]),
)
.try_get_matches_from(vec!["myprog", "test123"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert!(m.contains_id("arg_value"));
assert_eq!(
m.get_one::<String>("arg_value").map(|v| v.as_str()),
Some("test123")
);
}
#[test]
fn possible_values_of_positional_fail() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2022-05-24 01:16:02 +00:00
.arg(Arg::new("positional").index(1).value_parser(["test123"]))
.try_get_matches_from(vec!["myprog", "notest"]);
assert!(m.is_err());
2022-01-25 22:19:28 +00:00
assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
}
#[test]
fn possible_values_of_positional_multiple() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("positional")
2017-11-28 12:30:06 +00:00
.index(1)
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.num_args(1..),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["myprog", "test123", "test321"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert!(m.contains_id("positional"));
2017-11-28 12:30:06 +00:00
assert_eq!(
m.get_many::<String>("positional")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
2017-11-28 12:30:06 +00:00
vec!["test123", "test321"]
);
}
#[test]
fn possible_values_of_positional_multiple_fail() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("positional")
2017-11-28 12:30:06 +00:00
.index(1)
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.num_args(1..),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["myprog", "test123", "notest"]);
assert!(m.is_err());
2022-01-25 22:19:28 +00:00
assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
}
#[test]
fn possible_values_of_option() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123"]),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["myprog", "--option", "test123"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert!(m.contains_id("option"));
assert_eq!(
m.get_one::<String>("option").map(|v| v.as_str()),
Some("test123")
);
}
#[test]
fn possible_values_of_option_fail() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123"]),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["myprog", "--option", "notest"]);
assert!(m.is_err());
2022-01-25 22:19:28 +00:00
assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
}
#[test]
fn possible_values_of_option_multiple() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.action(ArgAction::Append),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["", "--option", "test123", "--option", "test321"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert!(m.contains_id("option"));
2017-11-28 12:30:06 +00:00
assert_eq!(
m.get_many::<String>("option")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
2017-11-28 12:30:06 +00:00
vec!["test123", "test321"]
);
}
#[test]
fn possible_values_of_option_multiple_fail() {
2022-02-12 03:48:29 +00:00
let m = Command::new("possible_values")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.action(ArgAction::Append),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["", "--option", "test123", "--option", "notest"]);
assert!(m.is_err());
2022-01-25 22:19:28 +00:00
assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
}
#[test]
#[cfg(feature = "error-context")]
fn possible_values_output() {
#[cfg(feature = "suggestions")]
static PV_ERROR: &str = "\
error: 'slo' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
note: value 'slow' exists
For more information try '--help'
";
#[cfg(not(feature = "suggestions"))]
static PV_ERROR: &str = "\
error: 'slo' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
For more information try '--help'
";
2022-04-29 20:32:25 +00:00
utils::assert_output(
2022-05-24 01:16:02 +00:00
Command::new("test").arg(
Arg::new("option")
.short('O')
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["slow", "fast", "ludicrous speed"]),
),
2017-11-28 12:30:06 +00:00
"clap-test -O slo",
PV_ERROR,
2022-04-29 20:32:25 +00:00
true,
);
}
2021-09-26 20:46:23 +00:00
#[test]
#[cfg(feature = "error-context")]
2021-09-26 20:46:23 +00:00
fn possible_values_alias_output() {
#[cfg(feature = "suggestions")]
static PV_ERROR: &str = "\
error: 'slo' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
note: value 'slow' exists
For more information try '--help'
";
#[cfg(not(feature = "suggestions"))]
static PV_ERROR: &str = "\
error: 'slo' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
For more information try '--help'
";
2022-04-29 20:32:25 +00:00
utils::assert_output(
2022-02-12 03:48:29 +00:00
Command::new("test").arg(
2021-09-26 20:46:23 +00:00
Arg::new("option")
.short('O')
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser([
"slow".into(),
PossibleValue::new("fast").alias("fost"),
PossibleValue::new("ludicrous speed").aliases(["ls", "lcs"]),
]),
2021-09-26 20:46:23 +00:00
),
"clap-test -O slo",
PV_ERROR,
2022-04-29 20:32:25 +00:00
true,
);
2021-09-26 20:46:23 +00:00
}
#[test]
#[cfg(feature = "error-context")]
fn possible_values_hidden_output() {
#[cfg(feature = "suggestions")]
static PV_ERROR: &str = "\
error: 'slo' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
note: value 'slow' exists
For more information try '--help'
";
#[cfg(not(feature = "suggestions"))]
static PV_ERROR: &str = "\
error: 'slo' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
For more information try '--help'
";
2022-04-29 20:32:25 +00:00
utils::assert_output(
2022-02-12 03:48:29 +00:00
Command::new("test").arg(
Arg::new("option")
.short('O')
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser([
"slow".into(),
"fast".into(),
PossibleValue::new("ludicrous speed"),
PossibleValue::new("forbidden speed").hide(true),
]),
),
"clap-test -O slo",
PV_ERROR,
2022-04-29 20:32:25 +00:00
true,
);
}
2020-09-24 14:02:10 +00:00
#[test]
#[cfg(feature = "error-context")]
2020-09-24 14:02:10 +00:00
fn escaped_possible_values_output() {
#[cfg(feature = "suggestions")]
static PV_ERROR_ESCAPED: &str = "\
error: 'ludicrous' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
note: value 'ludicrous speed' exists
For more information try '--help'
";
#[cfg(not(feature = "suggestions"))]
static PV_ERROR_ESCAPED: &str = "\
error: 'ludicrous' isn't a valid value for '-O <option>'
[possible values: slow, fast, \"ludicrous speed\"]
For more information try '--help'
";
2022-04-29 20:32:25 +00:00
utils::assert_output(
2022-05-24 01:16:02 +00:00
Command::new("test").arg(
Arg::new("option")
.short('O')
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["slow", "fast", "ludicrous speed"]),
),
2020-09-24 14:02:10 +00:00
"clap-test -O ludicrous",
PV_ERROR_ESCAPED,
2022-04-29 20:32:25 +00:00
true,
);
2020-09-24 14:02:10 +00:00
}
#[test]
#[cfg(feature = "error-context")]
fn missing_possible_value_error() {
static MISSING_PV_ERROR: &str = "\
error: the argument '-O <option>' requires a value but none was supplied
[possible values: slow, fast, \"ludicrous speed\"]
For more information try '--help'
";
2022-04-29 20:32:25 +00:00
utils::assert_output(
2022-02-12 03:48:29 +00:00
Command::new("test").arg(
Arg::new("option")
.short('O')
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser([
"slow".into(),
PossibleValue::new("fast").alias("fost"),
PossibleValue::new("ludicrous speed"),
PossibleValue::new("forbidden speed").hide(true),
]),
),
"clap-test -O",
MISSING_PV_ERROR,
2022-04-29 20:32:25 +00:00
true,
);
}
2021-09-26 20:46:23 +00:00
#[test]
fn alias() {
2022-02-12 03:48:29 +00:00
let m = Command::new("pv")
2021-09-26 20:46:23 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser([PossibleValue::new("test123").alias("123"), "test321".into()])
.ignore_case(true),
2021-09-26 20:46:23 +00:00
)
.try_get_matches_from(vec!["pv", "--option", "123"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
assert!(m
.unwrap()
.get_one::<String>("option")
.map(|v| v.as_str())
.unwrap()
.eq("123"));
2021-09-26 20:46:23 +00:00
}
#[test]
fn aliases() {
2022-02-12 03:48:29 +00:00
let m = Command::new("pv")
2021-09-26 20:46:23 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser([
PossibleValue::new("test123").aliases(["1", "2", "3"]),
"test321".into(),
])
.ignore_case(true),
2021-09-26 20:46:23 +00:00
)
.try_get_matches_from(vec!["pv", "--option", "2"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
assert!(m
.unwrap()
.get_one::<String>("option")
.map(|v| v.as_str())
.unwrap()
.eq("2"));
2021-09-26 20:46:23 +00:00
}
#[test]
fn ignore_case() {
2022-02-12 03:48:29 +00:00
let m = Command::new("pv")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.ignore_case(true),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["pv", "--option", "TeSt123"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
2018-11-14 17:05:06 +00:00
assert!(m
.unwrap()
.get_one::<String>("option")
.map(|v| v.as_str())
2018-11-14 17:05:06 +00:00
.unwrap()
.eq_ignore_ascii_case("test123"));
}
#[test]
fn ignore_case_fail() {
2022-02-12 03:48:29 +00:00
let m = Command::new("pv")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"]),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["pv", "--option", "TeSt123"]);
assert!(m.is_err());
2022-01-25 22:19:28 +00:00
assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
}
#[test]
fn ignore_case_multiple() {
2022-02-12 03:48:29 +00:00
let m = Command::new("pv")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.num_args(1..)
.ignore_case(true),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["pv", "--option", "TeSt123", "teST123", "tESt321"]);
2021-12-27 19:57:38 +00:00
assert!(m.is_ok(), "{}", m.unwrap_err());
2017-11-28 12:30:06 +00:00
assert_eq!(
m.unwrap()
.get_many::<String>("option")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
2022-11-24 13:54:25 +00:00
["TeSt123", "teST123", "tESt321"]
2017-11-28 12:30:06 +00:00
);
}
#[test]
fn ignore_case_multiple_fail() {
2022-02-12 03:48:29 +00:00
let m = Command::new("pv")
2017-11-28 12:30:06 +00:00
.arg(
Arg::new("option")
.short('o')
.long("option")
.action(ArgAction::Set)
2022-05-24 01:16:02 +00:00
.value_parser(["test123", "test321"])
.num_args(1..),
2017-11-28 12:30:06 +00:00
)
.try_get_matches_from(vec!["pv", "--option", "test123", "teST123", "test321"]);
assert!(m.is_err());
2022-01-25 22:19:28 +00:00
assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
2017-11-28 12:30:06 +00:00
}