1 // Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
11 use structopt
::StructOpt
;
14 #[derive(StructOpt, PartialEq, Debug)]
16 /// Fetch stuff from GitHub
20 #[structopt(short, long)]
21 /// Overwrite local branches.
27 #[structopt(short, long)]
29 #[structopt(short, long)]
40 repo
: "origin".to_string()
42 Opt
::from_clap(&Opt
::clap().get_matches_from(&["test", "fetch", "--all", "origin"]))
48 repo
: "origin".to_string()
50 Opt
::from_clap(&Opt
::clap().get_matches_from(&["test", "fetch", "-f", "origin"]))
61 Opt
::from_clap(&Opt
::clap().get_matches_from(&["test", "add"]))
68 Opt
::from_clap(&Opt
::clap().get_matches_from(&["test", "add", "-i", "-v"]))
74 let result
= Opt
::clap().get_matches_from_safe(&["test", "badcmd", "-i", "-v"]);
75 assert
!(result
.is_err());
77 let result
= Opt
::clap().get_matches_from_safe(&["test", "add", "--badoption"]);
78 assert
!(result
.is_err());
80 let result
= Opt
::clap().get_matches_from_safe(&["test"]);
81 assert
!(result
.is_err());
84 #[derive(StructOpt, PartialEq, Debug)]
86 DoSomething { arg: String }
,
90 /// This test is specifically to make sure that hyphenated subcommands get
91 /// processed correctly.
92 fn test_hyphenated_subcommands() {
95 arg
: "blah".to_string()
97 Opt2
::from_clap(&Opt2
::clap().get_matches_from(&["test", "do-something", "blah"]))
101 #[derive(StructOpt, PartialEq, Debug)]
109 fn test_null_commands() {
112 Opt3
::from_clap(&Opt3
::clap().get_matches_from(&["test", "add"]))
116 Opt3
::from_clap(&Opt3
::clap().get_matches_from(&["test", "init"]))
120 Opt3
::from_clap(&Opt3
::clap().get_matches_from(&["test", "fetch"]))
124 #[derive(StructOpt, PartialEq, Debug)]
125 #[structopt(about = "Not shown")]
130 #[derive(StructOpt, PartialEq, Debug)]
134 #[derive(StructOpt, PartialEq, Debug)]
140 /// download history from remote
145 fn test_tuple_commands() {
148 file
: "f".to_string()
150 Opt4
::from_clap(&Opt4
::clap().get_matches_from(&["test", "add", "f"]))
154 Opt4
::from_clap(&Opt4
::clap().get_matches_from(&["test", "init"]))
158 remote
: "origin".to_string()
160 Opt4
::from_clap(&Opt4
::clap().get_matches_from(&["test", "fetch", "origin"]))
163 let output
= get_long_help
::<Opt4
>();
165 assert
!(output
.contains("download history from remote"));
166 assert
!(output
.contains("Add a file"));
167 assert
!(!output
.contains("Not shown"));
171 fn enum_in_enum_subsubcommand() {
172 #[derive(StructOpt, Debug, PartialEq)]
174 Daemon(DaemonCommand
),
177 #[derive(StructOpt, Debug, PartialEq)]
178 pub enum DaemonCommand
{
183 let result
= Opt
::clap().get_matches_from_safe(&["test"]);
184 assert
!(result
.is_err());
186 let result
= Opt
::clap().get_matches_from_safe(&["test", "daemon"]);
187 assert
!(result
.is_err());
189 let result
= Opt
::from_iter(&["test", "daemon", "start"]);
190 assert_eq
!(Opt
::Daemon(DaemonCommand
::Start
), result
);
195 #[derive(StructOpt, Debug, PartialEq)]
197 #[structopt(flatten)]
200 #[derive(StructOpt, Debug, PartialEq)]
206 assert
!(Opt
::from_iter_safe(&["test"]).is_err());
208 Opt
::from_iter(&["test", "foo"]),
216 fn external_subcommand() {
217 #[derive(Debug, PartialEq, StructOpt)]
219 #[structopt(subcommand)]
223 #[derive(Debug, PartialEq, StructOpt)]
227 #[structopt(external_subcommand)]
232 Opt
::from_iter(&["test", "add"]),
234 sub
: Subcommands
::Add
239 Opt
::from_iter(&["test", "remove"]),
241 sub
: Subcommands
::Remove
246 Opt
::from_iter(&["test", "git", "status"]),
248 sub
: Subcommands
::Other(vec
!["git".into(), "status".into()])
252 assert
!(Opt
::from_iter_safe(&["test"]).is_err());
256 fn external_subcommand_os_string() {
257 use std
::ffi
::OsString
;
259 #[derive(Debug, PartialEq, StructOpt)]
261 #[structopt(subcommand)]
265 #[derive(Debug, PartialEq, StructOpt)]
267 #[structopt(external_subcommand)]
268 Other(Vec
<OsString
>),
272 Opt
::from_iter(&["test", "git", "status"]),
274 sub
: Subcommands
::Other(vec
!["git".into(), "status".into()])
278 assert
!(Opt
::from_iter_safe(&["test"]).is_err());
282 fn external_subcommand_optional() {
283 #[derive(Debug, PartialEq, StructOpt)]
285 #[structopt(subcommand)]
286 sub
: Option
<Subcommands
>,
289 #[derive(Debug, PartialEq, StructOpt)]
291 #[structopt(external_subcommand)]
296 Opt
::from_iter(&["test", "git", "status"]),
298 sub
: Some(Subcommands
::Other(vec
!["git".into(), "status".into()]))
302 assert_eq
!(Opt
::from_iter(&["test"]), Opt { sub: None }
);
306 fn skip_subcommand() {
307 #[derive(Debug, PartialEq, StructOpt)]
309 #[structopt(subcommand)]
313 #[derive(Debug, PartialEq, StructOpt)]
324 Opt
::from_iter(&["test", "add"]),
326 sub
: Subcommands
::Add
331 Opt
::from_iter(&["test", "remove"]),
333 sub
: Subcommands
::Remove
337 let res
= Opt
::from_iter_safe(&["test", "skip"]);
342 kind
: clap
::ErrorKind
::UnknownArgument
,
346 "Unexpected result: {:?}",