use super::*;
fn a(args: &[&str]) -> Vec<String> {
args.iter().map(|s| s.to_string()).collect()
}
const OPTS: [Opt; 3] = [val("name"), val("tag"), flag("all")];
#[test]
fn reads_values_flags_and_positionals_in_any_order() {
let p = parse(
&a(&["orders", "--name", "x", "--all", "-o", "table", "extra"]),
&OPTS,
)
.unwrap();
assert_eq!(p.positional, ["orders", "extra"]);
assert_eq!(p.value("name"), Some("x"));
assert!(p.flag("all"));
assert_eq!(p.value("output"), Some("table"));
}
#[test]
fn accepts_equals_attached_short_values_and_a_dash_value() {
let p = parse(&a(&["--name=a=b", "-otable", "--tag", "-x", "-q"]), &OPTS).unwrap();
assert_eq!(p.value("name"), Some("a=b"));
assert_eq!(p.value("output"), Some("table"));
assert_eq!(p.value("tag"), Some("-x"));
assert!(p.flag("quiet"));
}
#[test]
fn repeated_options_keep_every_value_and_the_last_wins_for_single_reads() {
let p = parse(&a(&["--tag", "a=1", "--tag", "b=2"]), &OPTS).unwrap();
assert_eq!(p.values("tag"), ["a=1", "b=2"]);
assert_eq!(p.value("tag"), Some("b=2"));
assert!(p.values("name").is_empty());
}
#[test]
fn double_dash_ends_options_and_a_lone_dash_is_positional() {
let p = parse(&a(&["--all", "--", "--name", "-"]), &OPTS).unwrap();
assert_eq!(p.positional, ["--name", "-"]);
assert!(p.flag("all"));
assert_eq!(parse(&a(&["-"]), &OPTS).unwrap().positional, ["-"]);
}
#[test]
fn rejects_unknown_options_missing_values_and_values_on_flags() {
assert!(parse(&a(&["--nope"]), &OPTS)
.unwrap_err()
.contains("--nope"));
assert!(parse(&a(&["-z"]), &OPTS).unwrap_err().contains("-z"));
assert!(parse(&a(&["--name"]), &OPTS)
.unwrap_err()
.contains("needs a value"));
assert!(parse(&a(&["--all=1"]), &OPTS)
.unwrap_err()
.contains("takes no value"));
assert!(parse(&a(&["-qx"]), &OPTS).is_err());
}
#[test]
fn numbers_are_checked_without_calling_the_server() {
let p = parse(&a(&["--name", "12", "--tag", "x"]), &OPTS).unwrap();
assert_eq!(p.number("name"), Ok(Some(12)));
assert_eq!(p.number("all"), Ok(None));
assert!(p.number("tag").unwrap_err().contains("--tag"));
}