119625d8cSopenharmony_ciuse super::utils; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ciuse clap::{arg, error::Error, error::ErrorKind, value_parser, Arg, Command}; 419625d8cSopenharmony_ci 519625d8cSopenharmony_ci#[track_caller] 619625d8cSopenharmony_cifn assert_error<F: clap::error::ErrorFormatter>( 719625d8cSopenharmony_ci err: Error<F>, 819625d8cSopenharmony_ci expected_kind: ErrorKind, 919625d8cSopenharmony_ci expected_output: &str, 1019625d8cSopenharmony_ci stderr: bool, 1119625d8cSopenharmony_ci) { 1219625d8cSopenharmony_ci let actual_output = err.to_string(); 1319625d8cSopenharmony_ci assert_eq!( 1419625d8cSopenharmony_ci stderr, 1519625d8cSopenharmony_ci err.use_stderr(), 1619625d8cSopenharmony_ci "Should Use STDERR failed. Should be {} but is {}", 1719625d8cSopenharmony_ci stderr, 1819625d8cSopenharmony_ci err.use_stderr() 1919625d8cSopenharmony_ci ); 2019625d8cSopenharmony_ci assert_eq!(expected_kind, err.kind()); 2119625d8cSopenharmony_ci utils::assert_eq(expected_output, actual_output) 2219625d8cSopenharmony_ci} 2319625d8cSopenharmony_ci 2419625d8cSopenharmony_ci#[test] 2519625d8cSopenharmony_cifn app_error() { 2619625d8cSopenharmony_ci static MESSAGE: &str = "error: failed for mysterious reasons 2719625d8cSopenharmony_ci 2819625d8cSopenharmony_ciUsage: test [OPTIONS] --all 2919625d8cSopenharmony_ci 3019625d8cSopenharmony_ciFor more information, try '--help'. 3119625d8cSopenharmony_ci"; 3219625d8cSopenharmony_ci let cmd = Command::new("test") 3319625d8cSopenharmony_ci .arg( 3419625d8cSopenharmony_ci Arg::new("all") 3519625d8cSopenharmony_ci .short('a') 3619625d8cSopenharmony_ci .long("all") 3719625d8cSopenharmony_ci .required(true) 3819625d8cSopenharmony_ci .action(clap::ArgAction::SetTrue) 3919625d8cSopenharmony_ci .help("Also do versioning for private crates (will not be published)"), 4019625d8cSopenharmony_ci ) 4119625d8cSopenharmony_ci .arg( 4219625d8cSopenharmony_ci Arg::new("exact") 4319625d8cSopenharmony_ci .long("exact") 4419625d8cSopenharmony_ci .help("Specify inter dependency version numbers exactly with `=`"), 4519625d8cSopenharmony_ci ) 4619625d8cSopenharmony_ci .arg( 4719625d8cSopenharmony_ci Arg::new("no_git_commit") 4819625d8cSopenharmony_ci .long("no-git-commit") 4919625d8cSopenharmony_ci .help("Do not commit version changes"), 5019625d8cSopenharmony_ci ) 5119625d8cSopenharmony_ci .arg( 5219625d8cSopenharmony_ci Arg::new("no_git_push") 5319625d8cSopenharmony_ci .long("no-git-push") 5419625d8cSopenharmony_ci .help("Do not push generated commit and tags to git remote"), 5519625d8cSopenharmony_ci ); 5619625d8cSopenharmony_ci let mut cmd = cmd; 5719625d8cSopenharmony_ci let expected_kind = ErrorKind::InvalidValue; 5819625d8cSopenharmony_ci let err = cmd.error(expected_kind, "failed for mysterious reasons"); 5919625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, true); 6019625d8cSopenharmony_ci} 6119625d8cSopenharmony_ci 6219625d8cSopenharmony_ci#[test] 6319625d8cSopenharmony_cifn value_validation_has_newline() { 6419625d8cSopenharmony_ci let res = Command::new("test") 6519625d8cSopenharmony_ci .arg( 6619625d8cSopenharmony_ci arg!(<PORT>) 6719625d8cSopenharmony_ci .value_parser(value_parser!(usize)) 6819625d8cSopenharmony_ci .help("Network port to use"), 6919625d8cSopenharmony_ci ) 7019625d8cSopenharmony_ci .try_get_matches_from(["test", "foo"]); 7119625d8cSopenharmony_ci 7219625d8cSopenharmony_ci assert!(res.is_err()); 7319625d8cSopenharmony_ci let err = res.unwrap_err(); 7419625d8cSopenharmony_ci assert!( 7519625d8cSopenharmony_ci err.to_string().ends_with('\n'), 7619625d8cSopenharmony_ci "Errors should have a trailing newline, got {:?}", 7719625d8cSopenharmony_ci err.to_string() 7819625d8cSopenharmony_ci ); 7919625d8cSopenharmony_ci} 8019625d8cSopenharmony_ci 8119625d8cSopenharmony_ci#[test] 8219625d8cSopenharmony_cifn kind_prints_help() { 8319625d8cSopenharmony_ci let cmd = Command::new("test"); 8419625d8cSopenharmony_ci let res = cmd 8519625d8cSopenharmony_ci .try_get_matches_from(["test", "--help"]) 8619625d8cSopenharmony_ci .map_err(|e| e.apply::<clap::error::KindFormatter>()); 8719625d8cSopenharmony_ci assert!(res.is_err()); 8819625d8cSopenharmony_ci let err = res.unwrap_err(); 8919625d8cSopenharmony_ci let expected_kind = ErrorKind::DisplayHelp; 9019625d8cSopenharmony_ci static MESSAGE: &str = "\ 9119625d8cSopenharmony_ciUsage: test 9219625d8cSopenharmony_ci 9319625d8cSopenharmony_ciOptions: 9419625d8cSopenharmony_ci -h, --help Print help 9519625d8cSopenharmony_ci"; 9619625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, false); 9719625d8cSopenharmony_ci} 9819625d8cSopenharmony_ci 9919625d8cSopenharmony_ci#[test] 10019625d8cSopenharmony_cifn kind_formats_validation_error() { 10119625d8cSopenharmony_ci let cmd = Command::new("test"); 10219625d8cSopenharmony_ci let res = cmd 10319625d8cSopenharmony_ci .try_get_matches_from(["test", "unused"]) 10419625d8cSopenharmony_ci .map_err(|e| e.apply::<clap::error::KindFormatter>()); 10519625d8cSopenharmony_ci assert!(res.is_err()); 10619625d8cSopenharmony_ci let err = res.unwrap_err(); 10719625d8cSopenharmony_ci let expected_kind = ErrorKind::UnknownArgument; 10819625d8cSopenharmony_ci static MESSAGE: &str = "\ 10919625d8cSopenharmony_cierror: unexpected argument found 11019625d8cSopenharmony_ci"; 11119625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, true); 11219625d8cSopenharmony_ci} 11319625d8cSopenharmony_ci 11419625d8cSopenharmony_ci#[test] 11519625d8cSopenharmony_ci#[cfg(feature = "error-context")] 11619625d8cSopenharmony_cifn rich_formats_validation_error() { 11719625d8cSopenharmony_ci let cmd = Command::new("test"); 11819625d8cSopenharmony_ci let res = cmd.try_get_matches_from(["test", "unused"]); 11919625d8cSopenharmony_ci assert!(res.is_err()); 12019625d8cSopenharmony_ci let err = res.unwrap_err(); 12119625d8cSopenharmony_ci let expected_kind = ErrorKind::UnknownArgument; 12219625d8cSopenharmony_ci static MESSAGE: &str = "\ 12319625d8cSopenharmony_cierror: unexpected argument 'unused' found 12419625d8cSopenharmony_ci 12519625d8cSopenharmony_ciUsage: test 12619625d8cSopenharmony_ci 12719625d8cSopenharmony_ciFor more information, try '--help'. 12819625d8cSopenharmony_ci"; 12919625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, true); 13019625d8cSopenharmony_ci} 13119625d8cSopenharmony_ci 13219625d8cSopenharmony_ci#[test] 13319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 13419625d8cSopenharmony_cifn suggest_trailing() { 13519625d8cSopenharmony_ci let cmd = Command::new("rg").arg(arg!([PATTERN])); 13619625d8cSopenharmony_ci 13719625d8cSopenharmony_ci let res = cmd.try_get_matches_from(["rg", "--foo"]); 13819625d8cSopenharmony_ci assert!(res.is_err()); 13919625d8cSopenharmony_ci let err = res.unwrap_err(); 14019625d8cSopenharmony_ci let expected_kind = ErrorKind::UnknownArgument; 14119625d8cSopenharmony_ci static MESSAGE: &str = "\ 14219625d8cSopenharmony_cierror: unexpected argument '--foo' found 14319625d8cSopenharmony_ci 14419625d8cSopenharmony_ci note: to pass '--foo' as a value, use '-- --foo' 14519625d8cSopenharmony_ci 14619625d8cSopenharmony_ciUsage: rg [PATTERN] 14719625d8cSopenharmony_ci 14819625d8cSopenharmony_ciFor more information, try '--help'. 14919625d8cSopenharmony_ci"; 15019625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, true); 15119625d8cSopenharmony_ci} 15219625d8cSopenharmony_ci 15319625d8cSopenharmony_ci#[test] 15419625d8cSopenharmony_ci#[cfg(feature = "error-context")] 15519625d8cSopenharmony_cifn trailing_already_in_use() { 15619625d8cSopenharmony_ci let cmd = Command::new("rg").arg(arg!([PATTERN])); 15719625d8cSopenharmony_ci 15819625d8cSopenharmony_ci let res = cmd.try_get_matches_from(["rg", "--", "--foo", "--foo"]); 15919625d8cSopenharmony_ci assert!(res.is_err()); 16019625d8cSopenharmony_ci let err = res.unwrap_err(); 16119625d8cSopenharmony_ci let expected_kind = ErrorKind::UnknownArgument; 16219625d8cSopenharmony_ci static MESSAGE: &str = "\ 16319625d8cSopenharmony_cierror: unexpected argument '--foo' found 16419625d8cSopenharmony_ci 16519625d8cSopenharmony_ciUsage: rg [PATTERN] 16619625d8cSopenharmony_ci 16719625d8cSopenharmony_ciFor more information, try '--help'. 16819625d8cSopenharmony_ci"; 16919625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, true); 17019625d8cSopenharmony_ci} 17119625d8cSopenharmony_ci 17219625d8cSopenharmony_ci#[test] 17319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 17419625d8cSopenharmony_cifn cant_use_trailing() { 17519625d8cSopenharmony_ci let cmd = Command::new("test"); 17619625d8cSopenharmony_ci 17719625d8cSopenharmony_ci let res = cmd.try_get_matches_from(["test", "--foo"]); 17819625d8cSopenharmony_ci assert!(res.is_err()); 17919625d8cSopenharmony_ci let err = res.unwrap_err(); 18019625d8cSopenharmony_ci let expected_kind = ErrorKind::UnknownArgument; 18119625d8cSopenharmony_ci static MESSAGE: &str = "\ 18219625d8cSopenharmony_cierror: unexpected argument '--foo' found 18319625d8cSopenharmony_ci 18419625d8cSopenharmony_ciUsage: test 18519625d8cSopenharmony_ci 18619625d8cSopenharmony_ciFor more information, try '--help'. 18719625d8cSopenharmony_ci"; 18819625d8cSopenharmony_ci assert_error(err, expected_kind, MESSAGE, true); 18919625d8cSopenharmony_ci} 190