• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use clap::{error::ErrorKind, Arg, ArgAction, Command};
2 
3 static HELP: &str = "\
4 Usage: prog [OPTIONS]
5 
6 Options:
7   -a
8   -b
9   -c
10   -h, --help  Print help
11 ";
12 
cmd() -> Command13 fn cmd() -> Command {
14     Command::new("prog")
15         .arg(
16             Arg::new("a")
17                 .short('a')
18                 .action(ArgAction::SetTrue)
19                 .required_unless_present_any(["b", "c"])
20                 .conflicts_with_all(["b", "c"]),
21         )
22         .arg(
23             Arg::new("b")
24                 .short('b')
25                 .action(ArgAction::SetTrue)
26                 .required_unless_present("a")
27                 .requires("c"),
28         )
29         .arg(
30             Arg::new("c")
31                 .short('c')
32                 .action(ArgAction::SetTrue)
33                 .required_unless_present("a")
34                 .requires("b"),
35         )
36 }
37 
38 #[test]
valid_cases()39 fn valid_cases() {
40     let res = cmd().try_get_matches_from(vec!["", "-a"]);
41     assert!(res.is_ok(), "{}", res.unwrap_err());
42     let res = cmd().clone().try_get_matches_from(vec!["", "-b", "-c"]);
43     assert!(res.is_ok(), "{}", res.unwrap_err());
44     let res = cmd().try_get_matches_from(vec!["", "-c", "-b"]);
45     assert!(res.is_ok(), "{}", res.unwrap_err());
46 }
47 
48 #[test]
help_text()49 fn help_text() {
50     let res = cmd().try_get_matches_from(vec!["prog", "--help"]);
51     assert!(res.is_err());
52     let err = res.unwrap_err();
53     assert_eq!(err.kind(), ErrorKind::DisplayHelp);
54     println!("{}", err);
55     assert_eq!(err.to_string(), HELP);
56 }
57 
58 #[test]
59 #[cfg(feature = "error-context")]
no_duplicate_error()60 fn no_duplicate_error() {
61     static ONLY_B_ERROR: &str = "\
62 error: the following required arguments were not provided:
63   -c
64 
65 Usage: prog -b -c
66 
67 For more information, try '--help'.
68 ";
69 
70     let res = cmd().try_get_matches_from(vec!["", "-b"]);
71     assert!(res.is_err());
72     let err = res.unwrap_err();
73     assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
74     assert_eq!(err.to_string(), ONLY_B_ERROR);
75 
76     static ONLY_C_ERROR: &str = "\
77 error: the following required arguments were not provided:
78   -b
79 
80 Usage: prog -c -b
81 
82 For more information, try '--help'.
83 ";
84 
85     let res = cmd().try_get_matches_from(vec!["", "-c"]);
86     assert!(res.is_err());
87     let err = res.unwrap_err();
88     assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
89     assert_eq!(err.to_string(), ONLY_C_ERROR);
90 }
91