Mercurial > code
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 } |