comparison C++/Tests/OptionParser/main.cpp @ 236:ff2db0ed78f1

* Import GoogleTest * Start testing of OptionParser
author David Demelier <markand@malikania.fr>
date Fri, 04 Jul 2014 22:16:04 +0200
parents
children 887d43215b90
comparison
equal deleted inserted replaced
235:0e3ccc204bc2 236:ff2db0ed78f1
1 #include <gtest/gtest.h>
2
3 #include <OptionParser.h>
4
5 #define LENGTH(x) (sizeof (x) / sizeof (x[0]))
6
7 /*
8 * -a hello -a ok -v -c -p test
9 */
10 TEST(OptionParser, simple)
11 {
12 OptionParser parser;
13 const char *argv[] = { "-a", "hello", "-a", "ok", "-v", "-c", "-p", "test" };
14
15 parser.add(Option("a", "attribute", Option::Argument));
16 parser.add(Option("v", "verbose"));
17 parser.add(Option("c", "check"));
18 parser.add(Option("p", "plugin", Option::Argument));
19
20 auto result = parser.parse(LENGTH(argv), argv, OptionParser::Strict);
21 auto begin = result.cbegin();
22
23 ASSERT_EQ(5, result.count());
24 ASSERT_EQ(8, result.total());
25
26 // -a hello
27 ASSERT_EQ("a", begin->name());
28 ASSERT_EQ("hello", begin->value());
29
30 // -a ok
31 std::advance(begin, 1);
32 ASSERT_EQ("a", begin->name());
33 ASSERT_EQ("ok", begin->value());
34
35 // -v
36 std::advance(begin, 1);
37 ASSERT_EQ("v", begin->name());
38 ASSERT_EQ("", begin->value());
39
40 // -c
41 std::advance(begin, 1);
42 ASSERT_EQ("c", begin->name());
43 ASSERT_EQ("", begin->value());
44
45 // -p test
46 std::advance(begin, 1);
47 ASSERT_EQ("p", begin->name());
48 ASSERT_EQ("test", begin->value());
49 }
50
51 /*
52 * -v install -y -x -p package
53 *
54 * Split as two kind of groups,
55 * -v are general options
56 * -y, -x -p are dedicated to install
57 */
58 TEST(OptionParser, group)
59 {
60 OptionParser parser;
61 const char *argv[] = { "-v", "install", "-y", "-x", "-p", "irccd" };
62
63 parser.add(Option("v", "verbose"));
64 parser.add(Option("y", "auto answer yes"));
65 parser.add(Option("x", "use regex"));
66 parser.add(Option("p", "package", Option::Argument));
67
68 /*
69 * First part: -v install
70 */
71
72 auto result = parser.parse(LENGTH(argv), argv, OptionParser::BreakNonOption);
73 auto option = result.cbegin();
74
75 ASSERT_EQ(1, result.count());
76 ASSERT_EQ(1, result.total());
77
78 // "-v"
79 ASSERT_EQ("v", option->name());
80 ASSERT_EQ("", option->value());
81
82 /*
83 * Second part: -y -x package
84 */
85
86 result = parser.parse(LENGTH(argv) - 2, argv + 2, OptionParser::Strict);
87 option = result.cbegin();
88
89 ASSERT_EQ(3, result.count());
90 ASSERT_EQ(4, result.total());
91
92 // -y
93 ASSERT_EQ("y", option->name());
94 ASSERT_EQ("", option->value());
95
96 // -x
97 std::advance(option, 1);
98 ASSERT_EQ("x", option->name());
99 ASSERT_EQ("", option->value());
100
101 // -p irccd
102 std::advance(option, 1);
103 ASSERT_EQ("p", option->name());
104 ASSERT_EQ("irccd", option->value());
105 }
106
107 /*
108 * Compact
109 *
110 * -abc -> -a -b -c
111 */
112 TEST(OptionParser, compact)
113 {
114 OptionParser parser;
115 const char *argv[] = { "-abc" };
116
117 parser.add(Option("a", ""));
118 parser.add(Option("b", ""));
119 parser.add(Option("c", ""));
120
121 auto result = parser.parse(LENGTH(argv), argv);
122 auto option = result.cbegin();
123
124 ASSERT_EQ(3, result.count());
125 ASSERT_EQ(3, result.total());
126
127 // -a
128 ASSERT_EQ("a", option->name());
129 ASSERT_EQ("", option->value());
130
131 // -b
132 std::advance(option, 1);
133 ASSERT_EQ("b", option->name());
134 ASSERT_EQ("", option->value());
135
136 // -c
137 std::advance(option, 1);
138 ASSERT_EQ("c", option->name());
139 ASSERT_EQ("", option->value());
140 }
141
142 /*
143 * -o readonly -o loop -v -v -f true -f false
144 */
145 TEST(OptionParser, numbered)
146 {
147 OptionParser parser;
148 const char *argv[] = { "-o", "readonly", "-o", "loop", "-v", "-v", "-f", "true", "-f", "false" };
149
150 parser.add(Option("o", "option", Option::Argument));
151 parser.add(Option("v", "verbose"));
152 parser.add(Option("f", "fullscreen", Option::Argument, Option::Single));
153
154 auto result = parser.parse(LENGTH(argv), argv, OptionParser::Silent);
155 auto option = result.cbegin();
156
157 ASSERT_EQ(6, result.count());
158 ASSERT_EQ(10, result.total());
159
160 // -o readonly
161 ASSERT_EQ("o", option->name());
162 ASSERT_EQ("readonly", option->value());
163
164 // -o loop
165 std::advance(option, 1);
166 ASSERT_EQ("o", option->name());
167 ASSERT_EQ("loop", option->value());
168
169 // -v
170 std::advance(option, 1);
171 ASSERT_EQ("v", option->name());
172 ASSERT_EQ("", option->value());
173
174 // -v
175 std::advance(option, 1);
176 ASSERT_EQ("v", option->name());
177 ASSERT_EQ("", option->value());
178
179 // -f true
180 std::advance(option, 1);
181 ASSERT_EQ("f", option->name());
182 ASSERT_EQ("true", option->value());
183
184 // -f false
185 std::advance(option, 1);
186 ASSERT_EQ("f", option->name());
187 ASSERT_EQ("false", option->value());
188 }
189
190 int main(int argc, char **argv)
191 {
192 testing::InitGoogleTest(&argc, argv);
193
194 return RUN_ALL_TESTS();
195 }