From a360fd8ac0a749c317aa3cf6bca917ddd9d70c3f Mon Sep 17 00:00:00 2001 From: Ed Page Date: Fri, 19 May 2023 11:04:48 -0500 Subject: [PATCH] test(parser): Verify value terminator precedence --- tests/builder/multiple_values.rs | 90 ++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/tests/builder/multiple_values.rs b/tests/builder/multiple_values.rs index 5f3333c211d..421d61924ee 100644 --- a/tests/builder/multiple_values.rs +++ b/tests/builder/multiple_values.rs @@ -1456,6 +1456,96 @@ fn multiple_positional_multiple_values() { assert_eq!(&cmd2, &["/home/clap", "foo"]); } +#[test] +fn value_terminator_has_higher_precedence_than_allow_hyphen_values() { + let res = Command::new("do") + .arg( + Arg::new("cmd1") + .action(ArgAction::Set) + .num_args(1..) + .allow_hyphen_values(true) + .value_terminator("--foo"), + ) + .arg( + Arg::new("cmd2") + .action(ArgAction::Set) + .num_args(1..) + .allow_hyphen_values(true) + .value_terminator(";"), + ) + .try_get_matches_from(vec![ + "do", + "find", + "-type", + "f", + "-name", + "special", + "--foo", + "/home/clap", + "foo", + ]); + assert!(res.is_ok(), "{:?}", res.unwrap_err().kind()); + + let m = res.unwrap(); + let cmd1: Vec<_> = m + .get_many::("cmd1") + .unwrap() + .map(|v| v.as_str()) + .collect(); + assert_eq!(&cmd1, &["find", "-type", "f", "-name", "special"]); + let cmd2: Vec<_> = m + .get_many::("cmd2") + .unwrap() + .map(|v| v.as_str()) + .collect(); + assert_eq!(&cmd2, &["/home/clap", "foo"]); +} + +#[test] +fn value_terminator_restores_escaping_disabled_by_allow_hyphen_values() { + let res = Command::new("do") + .arg( + Arg::new("cmd1") + .action(ArgAction::Set) + .num_args(1..) + .allow_hyphen_values(true) + .value_terminator("--"), + ) + .arg( + Arg::new("cmd2") + .action(ArgAction::Set) + .num_args(1..) + .allow_hyphen_values(true) + .value_terminator(";"), + ) + .try_get_matches_from(vec![ + "do", + "find", + "-type", + "f", + "-name", + "special", + "--", + "/home/clap", + "foo", + ]); + assert!(res.is_ok(), "{:?}", res.unwrap_err().kind()); + + let m = res.unwrap(); + let cmd1: Vec<_> = m + .get_many::("cmd1") + .unwrap() + .map(|v| v.as_str()) + .collect(); + assert_eq!(&cmd1, &["find", "-type", "f", "-name", "special"]); + let cmd2: Vec<_> = m + .get_many::("cmd2") + .unwrap() + .map(|v| v.as_str()) + .collect(); + assert_eq!(&cmd2, &["/home/clap", "foo"]); +} + #[test] fn issue_1480_max_values_consumes_extra_arg_1() { let res = Command::new("prog")