119625d8cSopenharmony_ciuse clap::{Arg, ArgAction, ArgMatches, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_cifn occurrences_as_vec_vec<'a>(m: &'a ArgMatches, name: &str) -> Vec<Vec<&'a String>> { 419625d8cSopenharmony_ci m.get_occurrences(name) 519625d8cSopenharmony_ci .unwrap() 619625d8cSopenharmony_ci .map(Iterator::collect) 719625d8cSopenharmony_ci .collect() 819625d8cSopenharmony_ci} 919625d8cSopenharmony_ci 1019625d8cSopenharmony_ci#[test] 1119625d8cSopenharmony_cifn grouped_value_works() { 1219625d8cSopenharmony_ci let m = Command::new("cli") 1319625d8cSopenharmony_ci .arg( 1419625d8cSopenharmony_ci Arg::new("option") 1519625d8cSopenharmony_ci .long("option") 1619625d8cSopenharmony_ci .action(ArgAction::Set) 1719625d8cSopenharmony_ci .num_args(1..) 1819625d8cSopenharmony_ci .action(ArgAction::Append), 1919625d8cSopenharmony_ci ) 2019625d8cSopenharmony_ci .try_get_matches_from([ 2119625d8cSopenharmony_ci "cli", 2219625d8cSopenharmony_ci "--option", 2319625d8cSopenharmony_ci "fr_FR:mon option 1", 2419625d8cSopenharmony_ci "en_US:my option 1", 2519625d8cSopenharmony_ci "--option", 2619625d8cSopenharmony_ci "fr_FR:mon option 2", 2719625d8cSopenharmony_ci "en_US:my option 2", 2819625d8cSopenharmony_ci ]) 2919625d8cSopenharmony_ci .unwrap(); 3019625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "option"); 3119625d8cSopenharmony_ci assert_eq!( 3219625d8cSopenharmony_ci grouped_vals, 3319625d8cSopenharmony_ci vec![ 3419625d8cSopenharmony_ci vec!["fr_FR:mon option 1", "en_US:my option 1",], 3519625d8cSopenharmony_ci vec!["fr_FR:mon option 2", "en_US:my option 2",], 3619625d8cSopenharmony_ci ] 3719625d8cSopenharmony_ci ); 3819625d8cSopenharmony_ci} 3919625d8cSopenharmony_ci 4019625d8cSopenharmony_ci#[test] 4119625d8cSopenharmony_cifn issue_1026() { 4219625d8cSopenharmony_ci let m = Command::new("cli") 4319625d8cSopenharmony_ci .arg(Arg::new("server").short('s').action(ArgAction::Set)) 4419625d8cSopenharmony_ci .arg(Arg::new("user").short('u').action(ArgAction::Set)) 4519625d8cSopenharmony_ci .arg( 4619625d8cSopenharmony_ci Arg::new("target") 4719625d8cSopenharmony_ci .long("target") 4819625d8cSopenharmony_ci .action(ArgAction::Set) 4919625d8cSopenharmony_ci .num_args(1..) 5019625d8cSopenharmony_ci .action(ArgAction::Append), 5119625d8cSopenharmony_ci ) 5219625d8cSopenharmony_ci .try_get_matches_from([ 5319625d8cSopenharmony_ci "backup", "-s", "server", "-u", "user", "--target", "target1", "file1", "file2", 5419625d8cSopenharmony_ci "file3", "--target", "target2", "file4", "file5", "file6", "file7", "--target", 5519625d8cSopenharmony_ci "target3", "file8", 5619625d8cSopenharmony_ci ]) 5719625d8cSopenharmony_ci .unwrap(); 5819625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "target"); 5919625d8cSopenharmony_ci assert_eq!( 6019625d8cSopenharmony_ci grouped_vals, 6119625d8cSopenharmony_ci vec![ 6219625d8cSopenharmony_ci vec!["target1", "file1", "file2", "file3"], 6319625d8cSopenharmony_ci vec!["target2", "file4", "file5", "file6", "file7",], 6419625d8cSopenharmony_ci vec!["target3", "file8"] 6519625d8cSopenharmony_ci ] 6619625d8cSopenharmony_ci ); 6719625d8cSopenharmony_ci} 6819625d8cSopenharmony_ci 6919625d8cSopenharmony_ci#[test] 7019625d8cSopenharmony_cifn grouped_value_long_flag_delimiter() { 7119625d8cSopenharmony_ci let m = Command::new("myapp") 7219625d8cSopenharmony_ci .arg( 7319625d8cSopenharmony_ci Arg::new("option") 7419625d8cSopenharmony_ci .long("option") 7519625d8cSopenharmony_ci .action(ArgAction::Set) 7619625d8cSopenharmony_ci .value_delimiter(',') 7719625d8cSopenharmony_ci .num_args(1..) 7819625d8cSopenharmony_ci .action(ArgAction::Append), 7919625d8cSopenharmony_ci ) 8019625d8cSopenharmony_ci .try_get_matches_from(vec![ 8119625d8cSopenharmony_ci "myapp", 8219625d8cSopenharmony_ci "--option=hmm", 8319625d8cSopenharmony_ci "--option=val1,val2,val3", 8419625d8cSopenharmony_ci "--option", 8519625d8cSopenharmony_ci "alice,bob", 8619625d8cSopenharmony_ci ]) 8719625d8cSopenharmony_ci .unwrap(); 8819625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "option"); 8919625d8cSopenharmony_ci assert_eq!( 9019625d8cSopenharmony_ci grouped_vals, 9119625d8cSopenharmony_ci vec![ 9219625d8cSopenharmony_ci vec!["hmm"], 9319625d8cSopenharmony_ci vec!["val1", "val2", "val3"], 9419625d8cSopenharmony_ci vec!["alice", "bob"] 9519625d8cSopenharmony_ci ] 9619625d8cSopenharmony_ci ); 9719625d8cSopenharmony_ci} 9819625d8cSopenharmony_ci 9919625d8cSopenharmony_ci#[test] 10019625d8cSopenharmony_cifn grouped_value_short_flag_delimiter() { 10119625d8cSopenharmony_ci let m = Command::new("myapp") 10219625d8cSopenharmony_ci .arg( 10319625d8cSopenharmony_ci Arg::new("option") 10419625d8cSopenharmony_ci .short('o') 10519625d8cSopenharmony_ci .action(ArgAction::Set) 10619625d8cSopenharmony_ci .value_delimiter(',') 10719625d8cSopenharmony_ci .num_args(1..) 10819625d8cSopenharmony_ci .action(ArgAction::Append), 10919625d8cSopenharmony_ci ) 11019625d8cSopenharmony_ci .try_get_matches_from(vec!["myapp", "-o=foo", "-o=val1,val2,val3", "-o=bar"]) 11119625d8cSopenharmony_ci .unwrap(); 11219625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "option"); 11319625d8cSopenharmony_ci assert_eq!( 11419625d8cSopenharmony_ci grouped_vals, 11519625d8cSopenharmony_ci vec![vec!["foo"], vec!["val1", "val2", "val3"], vec!["bar"]] 11619625d8cSopenharmony_ci ); 11719625d8cSopenharmony_ci} 11819625d8cSopenharmony_ci 11919625d8cSopenharmony_ci#[test] 12019625d8cSopenharmony_cifn grouped_value_positional_arg() { 12119625d8cSopenharmony_ci let m = Command::new("multiple_values") 12219625d8cSopenharmony_ci .arg( 12319625d8cSopenharmony_ci Arg::new("pos") 12419625d8cSopenharmony_ci .help("multiple positionals") 12519625d8cSopenharmony_ci .action(ArgAction::Set) 12619625d8cSopenharmony_ci .num_args(1..), 12719625d8cSopenharmony_ci ) 12819625d8cSopenharmony_ci .try_get_matches_from(vec![ 12919625d8cSopenharmony_ci "myprog", "val1", "val2", "val3", "val4", "val5", "val6", 13019625d8cSopenharmony_ci ]) 13119625d8cSopenharmony_ci .unwrap(); 13219625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "pos"); 13319625d8cSopenharmony_ci assert_eq!( 13419625d8cSopenharmony_ci grouped_vals, 13519625d8cSopenharmony_ci vec![vec!["val1", "val2", "val3", "val4", "val5", "val6"]] 13619625d8cSopenharmony_ci ); 13719625d8cSopenharmony_ci} 13819625d8cSopenharmony_ci 13919625d8cSopenharmony_ci#[test] 14019625d8cSopenharmony_cifn grouped_value_multiple_positional_arg() { 14119625d8cSopenharmony_ci let m = Command::new("multiple_values") 14219625d8cSopenharmony_ci .arg(Arg::new("pos1").help("multiple positionals")) 14319625d8cSopenharmony_ci .arg( 14419625d8cSopenharmony_ci Arg::new("pos2") 14519625d8cSopenharmony_ci .help("multiple positionals") 14619625d8cSopenharmony_ci .action(ArgAction::Set) 14719625d8cSopenharmony_ci .num_args(1..), 14819625d8cSopenharmony_ci ) 14919625d8cSopenharmony_ci .try_get_matches_from(vec![ 15019625d8cSopenharmony_ci "myprog", "val1", "val2", "val3", "val4", "val5", "val6", 15119625d8cSopenharmony_ci ]) 15219625d8cSopenharmony_ci .unwrap(); 15319625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "pos2"); 15419625d8cSopenharmony_ci assert_eq!( 15519625d8cSopenharmony_ci grouped_vals, 15619625d8cSopenharmony_ci vec![vec!["val2", "val3", "val4", "val5", "val6"]] 15719625d8cSopenharmony_ci ); 15819625d8cSopenharmony_ci} 15919625d8cSopenharmony_ci 16019625d8cSopenharmony_ci#[test] 16119625d8cSopenharmony_cifn grouped_value_multiple_positional_arg_last_multiple() { 16219625d8cSopenharmony_ci let m = Command::new("multiple_values") 16319625d8cSopenharmony_ci .arg(Arg::new("pos1").help("multiple positionals")) 16419625d8cSopenharmony_ci .arg( 16519625d8cSopenharmony_ci Arg::new("pos2") 16619625d8cSopenharmony_ci .help("multiple positionals") 16719625d8cSopenharmony_ci .action(ArgAction::Set) 16819625d8cSopenharmony_ci .num_args(1..) 16919625d8cSopenharmony_ci .last(true), 17019625d8cSopenharmony_ci ) 17119625d8cSopenharmony_ci .try_get_matches_from(vec![ 17219625d8cSopenharmony_ci "myprog", "val1", "--", "val2", "val3", "val4", "val5", "val6", 17319625d8cSopenharmony_ci ]) 17419625d8cSopenharmony_ci .unwrap(); 17519625d8cSopenharmony_ci let grouped_vals = occurrences_as_vec_vec(&m, "pos2"); 17619625d8cSopenharmony_ci assert_eq!( 17719625d8cSopenharmony_ci grouped_vals, 17819625d8cSopenharmony_ci vec![vec!["val2", "val3", "val4", "val5", "val6"]] 17919625d8cSopenharmony_ci ); 18019625d8cSopenharmony_ci} 18119625d8cSopenharmony_ci 18219625d8cSopenharmony_ci#[test] 18319625d8cSopenharmony_cifn grouped_interleaved_positional_values() { 18419625d8cSopenharmony_ci let cmd = clap::Command::new("foo") 18519625d8cSopenharmony_ci .arg(clap::Arg::new("pos").num_args(1..)) 18619625d8cSopenharmony_ci .arg( 18719625d8cSopenharmony_ci clap::Arg::new("flag") 18819625d8cSopenharmony_ci .short('f') 18919625d8cSopenharmony_ci .long("flag") 19019625d8cSopenharmony_ci .action(ArgAction::Set) 19119625d8cSopenharmony_ci .action(ArgAction::Append), 19219625d8cSopenharmony_ci ); 19319625d8cSopenharmony_ci 19419625d8cSopenharmony_ci let m = cmd 19519625d8cSopenharmony_ci .try_get_matches_from(["foo", "1", "2", "-f", "a", "3", "-f", "b", "4"]) 19619625d8cSopenharmony_ci .unwrap(); 19719625d8cSopenharmony_ci 19819625d8cSopenharmony_ci let pos = occurrences_as_vec_vec(&m, "pos"); 19919625d8cSopenharmony_ci assert_eq!(pos, vec![vec!["1", "2"], vec!["3"], vec!["4"]]); 20019625d8cSopenharmony_ci 20119625d8cSopenharmony_ci let flag = occurrences_as_vec_vec(&m, "flag"); 20219625d8cSopenharmony_ci assert_eq!(flag, vec![vec!["a"], vec!["b"]]); 20319625d8cSopenharmony_ci} 20419625d8cSopenharmony_ci 20519625d8cSopenharmony_ci#[test] 20619625d8cSopenharmony_cifn grouped_interleaved_positional_occurrences() { 20719625d8cSopenharmony_ci let cmd = clap::Command::new("foo") 20819625d8cSopenharmony_ci .arg(clap::Arg::new("pos").num_args(1..)) 20919625d8cSopenharmony_ci .arg( 21019625d8cSopenharmony_ci clap::Arg::new("flag") 21119625d8cSopenharmony_ci .short('f') 21219625d8cSopenharmony_ci .long("flag") 21319625d8cSopenharmony_ci .action(ArgAction::Set) 21419625d8cSopenharmony_ci .action(ArgAction::Append), 21519625d8cSopenharmony_ci ); 21619625d8cSopenharmony_ci 21719625d8cSopenharmony_ci let m = cmd 21819625d8cSopenharmony_ci .try_get_matches_from(["foo", "1", "2", "-f", "a", "3", "-f", "b", "4"]) 21919625d8cSopenharmony_ci .unwrap(); 22019625d8cSopenharmony_ci 22119625d8cSopenharmony_ci let pos = occurrences_as_vec_vec(&m, "pos"); 22219625d8cSopenharmony_ci assert_eq!(pos, vec![vec!["1", "2"], vec!["3"], vec!["4"]]); 22319625d8cSopenharmony_ci 22419625d8cSopenharmony_ci let flag = occurrences_as_vec_vec(&m, "flag"); 22519625d8cSopenharmony_ci assert_eq!(flag, vec![vec!["a"], vec!["b"]]); 22619625d8cSopenharmony_ci} 22719625d8cSopenharmony_ci 22819625d8cSopenharmony_ci#[test] 22919625d8cSopenharmony_cifn issue_2171() { 23019625d8cSopenharmony_ci let schema = Command::new("ripgrep#1701 reproducer") 23119625d8cSopenharmony_ci .args_override_self(true) 23219625d8cSopenharmony_ci .arg( 23319625d8cSopenharmony_ci Arg::new("pretty") 23419625d8cSopenharmony_ci .short('p') 23519625d8cSopenharmony_ci .long("pretty") 23619625d8cSopenharmony_ci .action(ArgAction::SetTrue), 23719625d8cSopenharmony_ci ) 23819625d8cSopenharmony_ci .arg( 23919625d8cSopenharmony_ci Arg::new("search_zip") 24019625d8cSopenharmony_ci .short('z') 24119625d8cSopenharmony_ci .long("search-zip") 24219625d8cSopenharmony_ci .action(ArgAction::SetTrue), 24319625d8cSopenharmony_ci ); 24419625d8cSopenharmony_ci 24519625d8cSopenharmony_ci let test_args = [ 24619625d8cSopenharmony_ci vec!["reproducer", "-pz", "-p"], 24719625d8cSopenharmony_ci vec!["reproducer", "-pzp"], 24819625d8cSopenharmony_ci vec!["reproducer", "-zpp"], 24919625d8cSopenharmony_ci vec!["reproducer", "-pp", "-z"], 25019625d8cSopenharmony_ci vec!["reproducer", "-p", "-p", "-z"], 25119625d8cSopenharmony_ci vec!["reproducer", "-p", "-pz"], 25219625d8cSopenharmony_ci vec!["reproducer", "-ppz"], 25319625d8cSopenharmony_ci ]; 25419625d8cSopenharmony_ci 25519625d8cSopenharmony_ci for argv in test_args { 25619625d8cSopenharmony_ci let _ = schema.clone().try_get_matches_from(argv).unwrap(); 25719625d8cSopenharmony_ci } 25819625d8cSopenharmony_ci} 259