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