119625d8cSopenharmony_ciuse clap::{error::ErrorKind, ArgAction, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ciuse crate::utils; 419625d8cSopenharmony_ci 519625d8cSopenharmony_cifn common() -> Command { 619625d8cSopenharmony_ci Command::new("foo").help_template(utils::FULL_TEMPLATE) 719625d8cSopenharmony_ci} 819625d8cSopenharmony_ci 919625d8cSopenharmony_cifn with_version() -> Command { 1019625d8cSopenharmony_ci common().version("3.0") 1119625d8cSopenharmony_ci} 1219625d8cSopenharmony_ci 1319625d8cSopenharmony_cifn with_long_version() -> Command { 1419625d8cSopenharmony_ci common().long_version("3.0 (abcdefg)") 1519625d8cSopenharmony_ci} 1619625d8cSopenharmony_ci 1719625d8cSopenharmony_cifn with_both() -> Command { 1819625d8cSopenharmony_ci common().version("3.0").long_version("3.0 (abcdefg)") 1919625d8cSopenharmony_ci} 2019625d8cSopenharmony_ci 2119625d8cSopenharmony_cifn with_subcommand() -> Command { 2219625d8cSopenharmony_ci with_version().subcommand(Command::new("bar").subcommand(Command::new("baz"))) 2319625d8cSopenharmony_ci} 2419625d8cSopenharmony_ci 2519625d8cSopenharmony_ci#[test] 2619625d8cSopenharmony_cifn version_short_flag_no_version() { 2719625d8cSopenharmony_ci let res = common().try_get_matches_from("foo -V".split(' ')); 2819625d8cSopenharmony_ci 2919625d8cSopenharmony_ci assert!(res.is_err()); 3019625d8cSopenharmony_ci let err = res.unwrap_err(); 3119625d8cSopenharmony_ci assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument); 3219625d8cSopenharmony_ci} 3319625d8cSopenharmony_ci 3419625d8cSopenharmony_ci#[test] 3519625d8cSopenharmony_cifn version_long_flag_no_version() { 3619625d8cSopenharmony_ci let res = common().try_get_matches_from("foo --version".split(' ')); 3719625d8cSopenharmony_ci 3819625d8cSopenharmony_ci assert!(res.is_err()); 3919625d8cSopenharmony_ci let err = res.unwrap_err(); 4019625d8cSopenharmony_ci assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument); 4119625d8cSopenharmony_ci} 4219625d8cSopenharmony_ci 4319625d8cSopenharmony_ci#[test] 4419625d8cSopenharmony_cifn version_short_flag_with_version() { 4519625d8cSopenharmony_ci let res = with_version().try_get_matches_from("foo -V".split(' ')); 4619625d8cSopenharmony_ci 4719625d8cSopenharmony_ci assert!(res.is_err()); 4819625d8cSopenharmony_ci let err = res.unwrap_err(); 4919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 5019625d8cSopenharmony_ci assert_eq!(err.to_string(), "foo 3.0\n"); 5119625d8cSopenharmony_ci} 5219625d8cSopenharmony_ci 5319625d8cSopenharmony_ci#[test] 5419625d8cSopenharmony_cifn version_long_flag_with_version() { 5519625d8cSopenharmony_ci let res = with_version().try_get_matches_from("foo --version".split(' ')); 5619625d8cSopenharmony_ci 5719625d8cSopenharmony_ci assert!(res.is_err()); 5819625d8cSopenharmony_ci let err = res.unwrap_err(); 5919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 6019625d8cSopenharmony_ci assert_eq!(err.to_string(), "foo 3.0\n"); 6119625d8cSopenharmony_ci} 6219625d8cSopenharmony_ci 6319625d8cSopenharmony_ci#[test] 6419625d8cSopenharmony_cifn version_short_flag_with_long_version() { 6519625d8cSopenharmony_ci let res = with_long_version().try_get_matches_from("foo -V".split(' ')); 6619625d8cSopenharmony_ci 6719625d8cSopenharmony_ci assert!(res.is_err()); 6819625d8cSopenharmony_ci let err = res.unwrap_err(); 6919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 7019625d8cSopenharmony_ci assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n"); 7119625d8cSopenharmony_ci} 7219625d8cSopenharmony_ci 7319625d8cSopenharmony_ci#[test] 7419625d8cSopenharmony_cifn version_long_flag_with_long_version() { 7519625d8cSopenharmony_ci let res = with_long_version().try_get_matches_from("foo --version".split(' ')); 7619625d8cSopenharmony_ci 7719625d8cSopenharmony_ci assert!(res.is_err()); 7819625d8cSopenharmony_ci let err = res.unwrap_err(); 7919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 8019625d8cSopenharmony_ci assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n"); 8119625d8cSopenharmony_ci} 8219625d8cSopenharmony_ci 8319625d8cSopenharmony_ci#[test] 8419625d8cSopenharmony_cifn version_short_flag_with_both() { 8519625d8cSopenharmony_ci let res = with_both().try_get_matches_from("foo -V".split(' ')); 8619625d8cSopenharmony_ci 8719625d8cSopenharmony_ci assert!(res.is_err()); 8819625d8cSopenharmony_ci let err = res.unwrap_err(); 8919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 9019625d8cSopenharmony_ci assert_eq!(err.to_string(), "foo 3.0\n"); 9119625d8cSopenharmony_ci} 9219625d8cSopenharmony_ci 9319625d8cSopenharmony_ci#[test] 9419625d8cSopenharmony_cifn version_long_flag_with_both() { 9519625d8cSopenharmony_ci let res = with_both().try_get_matches_from("foo --version".split(' ')); 9619625d8cSopenharmony_ci 9719625d8cSopenharmony_ci assert!(res.is_err()); 9819625d8cSopenharmony_ci let err = res.unwrap_err(); 9919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 10019625d8cSopenharmony_ci assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n"); 10119625d8cSopenharmony_ci} 10219625d8cSopenharmony_ci 10319625d8cSopenharmony_ci#[test] 10419625d8cSopenharmony_cifn help_short_flag_no_version() { 10519625d8cSopenharmony_ci static EXPECTED: &str = "\ 10619625d8cSopenharmony_cifoo 10719625d8cSopenharmony_ci 10819625d8cSopenharmony_ciUsage: foo 10919625d8cSopenharmony_ci 11019625d8cSopenharmony_ciOptions: 11119625d8cSopenharmony_ci -h, --help Print help 11219625d8cSopenharmony_ci"; 11319625d8cSopenharmony_ci let cmd = common(); 11419625d8cSopenharmony_ci utils::assert_output(cmd, "foo -h", EXPECTED, false); 11519625d8cSopenharmony_ci} 11619625d8cSopenharmony_ci 11719625d8cSopenharmony_ci#[test] 11819625d8cSopenharmony_cifn help_long_flag_no_version() { 11919625d8cSopenharmony_ci static EXPECTED: &str = "\ 12019625d8cSopenharmony_cifoo 12119625d8cSopenharmony_ci 12219625d8cSopenharmony_ciUsage: foo 12319625d8cSopenharmony_ci 12419625d8cSopenharmony_ciOptions: 12519625d8cSopenharmony_ci -h, --help Print help 12619625d8cSopenharmony_ci"; 12719625d8cSopenharmony_ci let cmd = common(); 12819625d8cSopenharmony_ci utils::assert_output(cmd, "foo --help", EXPECTED, false); 12919625d8cSopenharmony_ci} 13019625d8cSopenharmony_ci 13119625d8cSopenharmony_ci#[test] 13219625d8cSopenharmony_cifn help_short_flag_with_version() { 13319625d8cSopenharmony_ci static EXPECTED: &str = "\ 13419625d8cSopenharmony_cifoo 3.0 13519625d8cSopenharmony_ci 13619625d8cSopenharmony_ciUsage: foo 13719625d8cSopenharmony_ci 13819625d8cSopenharmony_ciOptions: 13919625d8cSopenharmony_ci -h, --help Print help 14019625d8cSopenharmony_ci -V, --version Print version 14119625d8cSopenharmony_ci"; 14219625d8cSopenharmony_ci let cmd = with_version(); 14319625d8cSopenharmony_ci utils::assert_output(cmd, "foo -h", EXPECTED, false); 14419625d8cSopenharmony_ci} 14519625d8cSopenharmony_ci 14619625d8cSopenharmony_ci#[test] 14719625d8cSopenharmony_cifn help_long_flag_with_version() { 14819625d8cSopenharmony_ci static EXPECTED: &str = "\ 14919625d8cSopenharmony_cifoo 3.0 15019625d8cSopenharmony_ci 15119625d8cSopenharmony_ciUsage: foo 15219625d8cSopenharmony_ci 15319625d8cSopenharmony_ciOptions: 15419625d8cSopenharmony_ci -h, --help Print help 15519625d8cSopenharmony_ci -V, --version Print version 15619625d8cSopenharmony_ci"; 15719625d8cSopenharmony_ci let cmd = with_version(); 15819625d8cSopenharmony_ci utils::assert_output(cmd, "foo --help", EXPECTED, false); 15919625d8cSopenharmony_ci} 16019625d8cSopenharmony_ci 16119625d8cSopenharmony_ci#[test] 16219625d8cSopenharmony_cifn help_short_flag_with_long_version() { 16319625d8cSopenharmony_ci static EXPECTED: &str = "\ 16419625d8cSopenharmony_cifoo 3.0 (abcdefg) 16519625d8cSopenharmony_ci 16619625d8cSopenharmony_ciUsage: foo 16719625d8cSopenharmony_ci 16819625d8cSopenharmony_ciOptions: 16919625d8cSopenharmony_ci -h, --help Print help 17019625d8cSopenharmony_ci -V, --version Print version 17119625d8cSopenharmony_ci"; 17219625d8cSopenharmony_ci let cmd = with_long_version(); 17319625d8cSopenharmony_ci utils::assert_output(cmd, "foo -h", EXPECTED, false); 17419625d8cSopenharmony_ci} 17519625d8cSopenharmony_ci 17619625d8cSopenharmony_ci#[test] 17719625d8cSopenharmony_cifn help_long_flag_with_long_version() { 17819625d8cSopenharmony_ci static EXPECTED: &str = "\ 17919625d8cSopenharmony_cifoo 3.0 (abcdefg) 18019625d8cSopenharmony_ci 18119625d8cSopenharmony_ciUsage: foo 18219625d8cSopenharmony_ci 18319625d8cSopenharmony_ciOptions: 18419625d8cSopenharmony_ci -h, --help Print help 18519625d8cSopenharmony_ci -V, --version Print version 18619625d8cSopenharmony_ci"; 18719625d8cSopenharmony_ci let cmd = with_long_version(); 18819625d8cSopenharmony_ci utils::assert_output(cmd, "foo --help", EXPECTED, false); 18919625d8cSopenharmony_ci} 19019625d8cSopenharmony_ci 19119625d8cSopenharmony_ci#[test] 19219625d8cSopenharmony_cifn help_short_flag_with_both() { 19319625d8cSopenharmony_ci static EXPECTED: &str = "\ 19419625d8cSopenharmony_cifoo 3.0 19519625d8cSopenharmony_ci 19619625d8cSopenharmony_ciUsage: foo 19719625d8cSopenharmony_ci 19819625d8cSopenharmony_ciOptions: 19919625d8cSopenharmony_ci -h, --help Print help 20019625d8cSopenharmony_ci -V, --version Print version 20119625d8cSopenharmony_ci"; 20219625d8cSopenharmony_ci let cmd = with_both(); 20319625d8cSopenharmony_ci utils::assert_output(cmd, "foo -h", EXPECTED, false); 20419625d8cSopenharmony_ci} 20519625d8cSopenharmony_ci 20619625d8cSopenharmony_ci#[test] 20719625d8cSopenharmony_cifn help_long_flag_with_both() { 20819625d8cSopenharmony_ci static EXPECTED: &str = "\ 20919625d8cSopenharmony_cifoo 3.0 21019625d8cSopenharmony_ci 21119625d8cSopenharmony_ciUsage: foo 21219625d8cSopenharmony_ci 21319625d8cSopenharmony_ciOptions: 21419625d8cSopenharmony_ci -h, --help Print help 21519625d8cSopenharmony_ci -V, --version Print version 21619625d8cSopenharmony_ci"; 21719625d8cSopenharmony_ci let cmd = with_both(); 21819625d8cSopenharmony_ci utils::assert_output(cmd, "foo --help", EXPECTED, false); 21919625d8cSopenharmony_ci} 22019625d8cSopenharmony_ci 22119625d8cSopenharmony_ci#[test] 22219625d8cSopenharmony_ci#[cfg(debug_assertions)] 22319625d8cSopenharmony_ci#[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`)"] 22419625d8cSopenharmony_cifn override_version_long_with_user_flag() { 22519625d8cSopenharmony_ci with_version() 22619625d8cSopenharmony_ci .arg( 22719625d8cSopenharmony_ci clap::Arg::new("ver") 22819625d8cSopenharmony_ci .long("version") 22919625d8cSopenharmony_ci .action(ArgAction::SetTrue), 23019625d8cSopenharmony_ci ) 23119625d8cSopenharmony_ci .debug_assert(); 23219625d8cSopenharmony_ci} 23319625d8cSopenharmony_ci 23419625d8cSopenharmony_ci#[test] 23519625d8cSopenharmony_ci#[cfg(debug_assertions)] 23619625d8cSopenharmony_ci#[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`)"] 23719625d8cSopenharmony_cifn override_version_short_with_user_flag() { 23819625d8cSopenharmony_ci with_version() 23919625d8cSopenharmony_ci .arg(clap::Arg::new("ver").short('V').action(ArgAction::SetTrue)) 24019625d8cSopenharmony_ci .debug_assert(); 24119625d8cSopenharmony_ci} 24219625d8cSopenharmony_ci 24319625d8cSopenharmony_ci#[test] 24419625d8cSopenharmony_cifn no_propagation_by_default_long() { 24519625d8cSopenharmony_ci // Version Flag should not be propagated to subcommands 24619625d8cSopenharmony_ci let res = with_subcommand().try_get_matches_from("foo bar --version".split(' ')); 24719625d8cSopenharmony_ci 24819625d8cSopenharmony_ci assert!(res.is_err()); 24919625d8cSopenharmony_ci let err = res.unwrap_err(); 25019625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::UnknownArgument); 25119625d8cSopenharmony_ci} 25219625d8cSopenharmony_ci 25319625d8cSopenharmony_ci#[test] 25419625d8cSopenharmony_cifn no_propagation_by_default_short() { 25519625d8cSopenharmony_ci let res = with_subcommand().try_get_matches_from("foo bar -V".split(' ')); 25619625d8cSopenharmony_ci 25719625d8cSopenharmony_ci assert!(res.is_err()); 25819625d8cSopenharmony_ci let err = res.unwrap_err(); 25919625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::UnknownArgument); 26019625d8cSopenharmony_ci} 26119625d8cSopenharmony_ci 26219625d8cSopenharmony_ci#[test] 26319625d8cSopenharmony_cifn propagate_version_long() { 26419625d8cSopenharmony_ci let res = with_subcommand() 26519625d8cSopenharmony_ci .propagate_version(true) 26619625d8cSopenharmony_ci .try_get_matches_from("foo bar --version".split(' ')); 26719625d8cSopenharmony_ci 26819625d8cSopenharmony_ci assert!(res.is_err()); 26919625d8cSopenharmony_ci let err = res.unwrap_err(); 27019625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 27119625d8cSopenharmony_ci} 27219625d8cSopenharmony_ci 27319625d8cSopenharmony_ci#[test] 27419625d8cSopenharmony_cifn propagate_version_short() { 27519625d8cSopenharmony_ci let res = with_subcommand() 27619625d8cSopenharmony_ci .propagate_version(true) 27719625d8cSopenharmony_ci .try_get_matches_from("foo bar -V".split(' ')); 27819625d8cSopenharmony_ci 27919625d8cSopenharmony_ci assert!(res.is_err()); 28019625d8cSopenharmony_ci let err = res.unwrap_err(); 28119625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 28219625d8cSopenharmony_ci} 28319625d8cSopenharmony_ci 28419625d8cSopenharmony_ci#[cfg(debug_assertions)] 28519625d8cSopenharmony_ci#[test] 28619625d8cSopenharmony_ci#[should_panic = "`ArgAction::Version` used without providing Command::version or Command::long_version"] 28719625d8cSopenharmony_cifn version_required() { 28819625d8cSopenharmony_ci let _res = common() 28919625d8cSopenharmony_ci .arg(clap::arg!(--version).action(ArgAction::Version)) 29019625d8cSopenharmony_ci .try_get_matches_from("foo -z".split(' ')); 29119625d8cSopenharmony_ci} 29219625d8cSopenharmony_ci 29319625d8cSopenharmony_ci#[test] 29419625d8cSopenharmony_ci#[should_panic = "Argument `version` is undefined"] 29519625d8cSopenharmony_cifn mut_arg_version_no_auto_version() { 29619625d8cSopenharmony_ci let _ = common().mut_arg("version", |v| v.short('z').action(ArgAction::SetTrue)); 29719625d8cSopenharmony_ci} 29819625d8cSopenharmony_ci 29919625d8cSopenharmony_ci#[cfg(debug_assertions)] 30019625d8cSopenharmony_ci#[test] 30119625d8cSopenharmony_ci#[should_panic = "No version information via Command::version or Command::long_version to propagate"] 30219625d8cSopenharmony_cifn propagate_version_no_version_info() { 30319625d8cSopenharmony_ci let _res = common() 30419625d8cSopenharmony_ci .propagate_version(true) 30519625d8cSopenharmony_ci .subcommand(Command::new("bar")) 30619625d8cSopenharmony_ci .try_get_matches_from("foo".split(' ')); 30719625d8cSopenharmony_ci} 308