1 // Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>
2 //
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.
8
9 use structopt::StructOpt;
10
11 #[test]
unique_flag()12 fn unique_flag() {
13 #[derive(StructOpt, PartialEq, Debug)]
14 struct Opt {
15 #[structopt(short, long)]
16 alice: bool,
17 }
18
19 assert_eq!(
20 Opt { alice: false },
21 Opt::from_clap(&Opt::clap().get_matches_from(&["test"]))
22 );
23 assert_eq!(
24 Opt { alice: true },
25 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a"]))
26 );
27 assert_eq!(
28 Opt { alice: true },
29 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "--alice"]))
30 );
31 assert!(Opt::clap().get_matches_from_safe(&["test", "-i"]).is_err());
32 assert!(Opt::clap()
33 .get_matches_from_safe(&["test", "-a", "foo"])
34 .is_err());
35 assert!(Opt::clap()
36 .get_matches_from_safe(&["test", "-a", "-a"])
37 .is_err());
38 assert!(Opt::clap()
39 .get_matches_from_safe(&["test", "-a", "--alice"])
40 .is_err());
41 }
42
43 #[test]
multiple_flag()44 fn multiple_flag() {
45 #[derive(StructOpt, PartialEq, Debug)]
46 struct Opt {
47 #[structopt(short, long, parse(from_occurrences))]
48 alice: u64,
49 #[structopt(short, long, parse(from_occurrences))]
50 bob: u8,
51 }
52
53 assert_eq!(
54 Opt { alice: 0, bob: 0 },
55 Opt::from_clap(&Opt::clap().get_matches_from(&["test"]))
56 );
57 assert_eq!(
58 Opt { alice: 1, bob: 0 },
59 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a"]))
60 );
61 assert_eq!(
62 Opt { alice: 2, bob: 0 },
63 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a", "-a"]))
64 );
65 assert_eq!(
66 Opt { alice: 2, bob: 2 },
67 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a", "--alice", "-bb"]))
68 );
69 assert_eq!(
70 Opt { alice: 3, bob: 1 },
71 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-aaa", "--bob"]))
72 );
73 assert!(Opt::clap().get_matches_from_safe(&["test", "-i"]).is_err());
74 assert!(Opt::clap()
75 .get_matches_from_safe(&["test", "-a", "foo"])
76 .is_err());
77 }
78
parse_from_flag(b: bool) -> std::sync::atomic::AtomicBool79 fn parse_from_flag(b: bool) -> std::sync::atomic::AtomicBool {
80 std::sync::atomic::AtomicBool::new(b)
81 }
82
83 #[test]
non_bool_flags()84 fn non_bool_flags() {
85 #[derive(StructOpt, Debug)]
86 struct Opt {
87 #[structopt(short, long, parse(from_flag = parse_from_flag))]
88 alice: std::sync::atomic::AtomicBool,
89 #[structopt(short, long, parse(from_flag))]
90 bob: std::sync::atomic::AtomicBool,
91 }
92
93 let falsey = Opt::from_clap(&Opt::clap().get_matches_from(&["test"]));
94 assert!(!falsey.alice.load(std::sync::atomic::Ordering::Relaxed));
95 assert!(!falsey.bob.load(std::sync::atomic::Ordering::Relaxed));
96
97 let alice = Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a"]));
98 assert!(alice.alice.load(std::sync::atomic::Ordering::Relaxed));
99 assert!(!alice.bob.load(std::sync::atomic::Ordering::Relaxed));
100
101 let bob = Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-b"]));
102 assert!(!bob.alice.load(std::sync::atomic::Ordering::Relaxed));
103 assert!(bob.bob.load(std::sync::atomic::Ordering::Relaxed));
104
105 let both = Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-b", "-a"]));
106 assert!(both.alice.load(std::sync::atomic::Ordering::Relaxed));
107 assert!(both.bob.load(std::sync::atomic::Ordering::Relaxed));
108 }
109
110 #[test]
combined_flags()111 fn combined_flags() {
112 #[derive(StructOpt, PartialEq, Debug)]
113 struct Opt {
114 #[structopt(short, long)]
115 alice: bool,
116 #[structopt(short, long, parse(from_occurrences))]
117 bob: u64,
118 }
119
120 assert_eq!(
121 Opt {
122 alice: false,
123 bob: 0
124 },
125 Opt::from_clap(&Opt::clap().get_matches_from(&["test"]))
126 );
127 assert_eq!(
128 Opt {
129 alice: true,
130 bob: 0
131 },
132 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a"]))
133 );
134 assert_eq!(
135 Opt {
136 alice: true,
137 bob: 0
138 },
139 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-a"]))
140 );
141 assert_eq!(
142 Opt {
143 alice: false,
144 bob: 1
145 },
146 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-b"]))
147 );
148 assert_eq!(
149 Opt {
150 alice: true,
151 bob: 1
152 },
153 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "--alice", "--bob"]))
154 );
155 assert_eq!(
156 Opt {
157 alice: true,
158 bob: 4
159 },
160 Opt::from_clap(&Opt::clap().get_matches_from(&["test", "-bb", "-a", "-bb"]))
161 );
162 }
163