1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis // without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis
29*b0d29bc4SBrooks Davis #include "utils/cmdline/options.hpp"
30*b0d29bc4SBrooks Davis
31*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
32*b0d29bc4SBrooks Davis
33*b0d29bc4SBrooks Davis #include "utils/cmdline/exceptions.hpp"
34*b0d29bc4SBrooks Davis #include "utils/defs.hpp"
35*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
36*b0d29bc4SBrooks Davis
37*b0d29bc4SBrooks Davis namespace cmdline = utils::cmdline;
38*b0d29bc4SBrooks Davis
39*b0d29bc4SBrooks Davis namespace {
40*b0d29bc4SBrooks Davis
41*b0d29bc4SBrooks Davis
42*b0d29bc4SBrooks Davis /// Simple string-based option type for testing purposes.
43*b0d29bc4SBrooks Davis class mock_option : public cmdline::base_option {
44*b0d29bc4SBrooks Davis public:
45*b0d29bc4SBrooks Davis /// Constructs a mock option with a short name and a long name.
46*b0d29bc4SBrooks Davis ///
47*b0d29bc4SBrooks Davis ///
48*b0d29bc4SBrooks Davis /// \param short_name_ The short name for the option.
49*b0d29bc4SBrooks Davis /// \param long_name_ The long name for the option.
50*b0d29bc4SBrooks Davis /// \param description_ A user-friendly description for the option.
51*b0d29bc4SBrooks Davis /// \param arg_name_ If not NULL, specifies that the option must receive an
52*b0d29bc4SBrooks Davis /// argument and specifies the name of such argument for documentation
53*b0d29bc4SBrooks Davis /// purposes.
54*b0d29bc4SBrooks Davis /// \param default_value_ If not NULL, specifies that the option has a
55*b0d29bc4SBrooks Davis /// default value for the mandatory argument.
mock_option(const char short_name_,const char * long_name_,const char * description_,const char * arg_name_=NULL,const char * default_value_=NULL)56*b0d29bc4SBrooks Davis mock_option(const char short_name_, const char* long_name_,
57*b0d29bc4SBrooks Davis const char* description_, const char* arg_name_ = NULL,
58*b0d29bc4SBrooks Davis const char* default_value_ = NULL) :
59*b0d29bc4SBrooks Davis base_option(short_name_, long_name_, description_, arg_name_,
60*b0d29bc4SBrooks Davis default_value_) {}
61*b0d29bc4SBrooks Davis
62*b0d29bc4SBrooks Davis /// Constructs a mock option with a long name only.
63*b0d29bc4SBrooks Davis ///
64*b0d29bc4SBrooks Davis /// \param long_name_ The long name for the option.
65*b0d29bc4SBrooks Davis /// \param description_ A user-friendly description for the option.
66*b0d29bc4SBrooks Davis /// \param arg_name_ If not NULL, specifies that the option must receive an
67*b0d29bc4SBrooks Davis /// argument and specifies the name of such argument for documentation
68*b0d29bc4SBrooks Davis /// purposes.
69*b0d29bc4SBrooks Davis /// \param default_value_ If not NULL, specifies that the option has a
70*b0d29bc4SBrooks Davis /// default value for the mandatory argument.
mock_option(const char * long_name_,const char * description_,const char * arg_name_=NULL,const char * default_value_=NULL)71*b0d29bc4SBrooks Davis mock_option(const char* long_name_,
72*b0d29bc4SBrooks Davis const char* description_, const char* arg_name_ = NULL,
73*b0d29bc4SBrooks Davis const char* default_value_ = NULL) :
74*b0d29bc4SBrooks Davis base_option(long_name_, description_, arg_name_, default_value_) {}
75*b0d29bc4SBrooks Davis
76*b0d29bc4SBrooks Davis /// The data type of this option.
77*b0d29bc4SBrooks Davis typedef std::string option_type;
78*b0d29bc4SBrooks Davis
79*b0d29bc4SBrooks Davis /// Ensures that the argument passed to the option is valid.
80*b0d29bc4SBrooks Davis ///
81*b0d29bc4SBrooks Davis /// In this particular mock option, this does not perform any validation.
82*b0d29bc4SBrooks Davis void
validate(const std::string &) const83*b0d29bc4SBrooks Davis validate(const std::string& /* str */) const
84*b0d29bc4SBrooks Davis {
85*b0d29bc4SBrooks Davis // Do nothing.
86*b0d29bc4SBrooks Davis }
87*b0d29bc4SBrooks Davis
88*b0d29bc4SBrooks Davis /// Returns the input parameter without any conversion.
89*b0d29bc4SBrooks Davis ///
90*b0d29bc4SBrooks Davis /// \param str The user-provided argument to the option.
91*b0d29bc4SBrooks Davis ///
92*b0d29bc4SBrooks Davis /// \return The same value as provided by the user without conversion.
93*b0d29bc4SBrooks Davis static std::string
convert(const std::string & str)94*b0d29bc4SBrooks Davis convert(const std::string& str)
95*b0d29bc4SBrooks Davis {
96*b0d29bc4SBrooks Davis return str;
97*b0d29bc4SBrooks Davis }
98*b0d29bc4SBrooks Davis };
99*b0d29bc4SBrooks Davis
100*b0d29bc4SBrooks Davis
101*b0d29bc4SBrooks Davis } // anonymous namespace
102*b0d29bc4SBrooks Davis
103*b0d29bc4SBrooks Davis
104*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(base_option__short_name__no_arg);
ATF_TEST_CASE_BODY(base_option__short_name__no_arg)105*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(base_option__short_name__no_arg)
106*b0d29bc4SBrooks Davis {
107*b0d29bc4SBrooks Davis const mock_option o('f', "force", "Force execution");
108*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
109*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('f', o.short_name());
110*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("force", o.long_name());
111*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Force execution", o.description());
112*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.needs_arg());
113*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("-f", o.format_short_name());
114*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("--force", o.format_long_name());
115*b0d29bc4SBrooks Davis }
116*b0d29bc4SBrooks Davis
117*b0d29bc4SBrooks Davis
118*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(base_option__short_name__with_arg__no_default);
ATF_TEST_CASE_BODY(base_option__short_name__with_arg__no_default)119*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(base_option__short_name__with_arg__no_default)
120*b0d29bc4SBrooks Davis {
121*b0d29bc4SBrooks Davis const mock_option o('c', "conf_file", "Configuration file", "path");
122*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
123*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('c', o.short_name());
124*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("conf_file", o.long_name());
125*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Configuration file", o.description());
126*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
127*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("path", o.arg_name());
128*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_default_value());
129*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("-c path", o.format_short_name());
130*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("--conf_file=path", o.format_long_name());
131*b0d29bc4SBrooks Davis }
132*b0d29bc4SBrooks Davis
133*b0d29bc4SBrooks Davis
134*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(base_option__short_name__with_arg__with_default);
ATF_TEST_CASE_BODY(base_option__short_name__with_arg__with_default)135*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(base_option__short_name__with_arg__with_default)
136*b0d29bc4SBrooks Davis {
137*b0d29bc4SBrooks Davis const mock_option o('c', "conf_file", "Configuration file", "path",
138*b0d29bc4SBrooks Davis "defpath");
139*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
140*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('c', o.short_name());
141*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("conf_file", o.long_name());
142*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Configuration file", o.description());
143*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
144*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("path", o.arg_name());
145*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
146*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("defpath", o.default_value());
147*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("-c path", o.format_short_name());
148*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("--conf_file=path", o.format_long_name());
149*b0d29bc4SBrooks Davis }
150*b0d29bc4SBrooks Davis
151*b0d29bc4SBrooks Davis
152*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(base_option__long_name__no_arg);
ATF_TEST_CASE_BODY(base_option__long_name__no_arg)153*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(base_option__long_name__no_arg)
154*b0d29bc4SBrooks Davis {
155*b0d29bc4SBrooks Davis const mock_option o("dryrun", "Dry run mode");
156*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
157*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("dryrun", o.long_name());
158*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Dry run mode", o.description());
159*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.needs_arg());
160*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("--dryrun", o.format_long_name());
161*b0d29bc4SBrooks Davis }
162*b0d29bc4SBrooks Davis
163*b0d29bc4SBrooks Davis
164*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(base_option__long_name__with_arg__no_default);
ATF_TEST_CASE_BODY(base_option__long_name__with_arg__no_default)165*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(base_option__long_name__with_arg__no_default)
166*b0d29bc4SBrooks Davis {
167*b0d29bc4SBrooks Davis const mock_option o("helper", "Path to helper", "path");
168*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
169*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("helper", o.long_name());
170*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Path to helper", o.description());
171*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
172*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("path", o.arg_name());
173*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_default_value());
174*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("--helper=path", o.format_long_name());
175*b0d29bc4SBrooks Davis }
176*b0d29bc4SBrooks Davis
177*b0d29bc4SBrooks Davis
178*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(base_option__long_name__with_arg__with_default);
ATF_TEST_CASE_BODY(base_option__long_name__with_arg__with_default)179*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(base_option__long_name__with_arg__with_default)
180*b0d29bc4SBrooks Davis {
181*b0d29bc4SBrooks Davis const mock_option o("executable", "Executable name", "file", "foo");
182*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
183*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("executable", o.long_name());
184*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Executable name", o.description());
185*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
186*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("file", o.arg_name());
187*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
188*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", o.default_value());
189*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("--executable=file", o.format_long_name());
190*b0d29bc4SBrooks Davis }
191*b0d29bc4SBrooks Davis
192*b0d29bc4SBrooks Davis
193*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bool_option__short_name);
ATF_TEST_CASE_BODY(bool_option__short_name)194*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bool_option__short_name)
195*b0d29bc4SBrooks Davis {
196*b0d29bc4SBrooks Davis const cmdline::bool_option o('f', "force", "Force execution");
197*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
198*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('f', o.short_name());
199*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("force", o.long_name());
200*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Force execution", o.description());
201*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.needs_arg());
202*b0d29bc4SBrooks Davis }
203*b0d29bc4SBrooks Davis
204*b0d29bc4SBrooks Davis
205*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(bool_option__long_name);
ATF_TEST_CASE_BODY(bool_option__long_name)206*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(bool_option__long_name)
207*b0d29bc4SBrooks Davis {
208*b0d29bc4SBrooks Davis const cmdline::bool_option o("force", "Force execution");
209*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
210*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("force", o.long_name());
211*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("Force execution", o.description());
212*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.needs_arg());
213*b0d29bc4SBrooks Davis }
214*b0d29bc4SBrooks Davis
215*b0d29bc4SBrooks Davis
216*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(int_option__short_name);
ATF_TEST_CASE_BODY(int_option__short_name)217*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(int_option__short_name)
218*b0d29bc4SBrooks Davis {
219*b0d29bc4SBrooks Davis const cmdline::int_option o('p', "int", "The int", "arg", "value");
220*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
221*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('p', o.short_name());
222*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("int", o.long_name());
223*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The int", o.description());
224*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
225*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
226*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
227*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
228*b0d29bc4SBrooks Davis }
229*b0d29bc4SBrooks Davis
230*b0d29bc4SBrooks Davis
231*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(int_option__long_name);
ATF_TEST_CASE_BODY(int_option__long_name)232*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(int_option__long_name)
233*b0d29bc4SBrooks Davis {
234*b0d29bc4SBrooks Davis const cmdline::int_option o("int", "The int", "arg", "value");
235*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
236*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("int", o.long_name());
237*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The int", o.description());
238*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
239*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
240*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
241*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
242*b0d29bc4SBrooks Davis }
243*b0d29bc4SBrooks Davis
244*b0d29bc4SBrooks Davis
245*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(int_option__type);
ATF_TEST_CASE_BODY(int_option__type)246*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(int_option__type)
247*b0d29bc4SBrooks Davis {
248*b0d29bc4SBrooks Davis const cmdline::int_option o("int", "The int", "arg");
249*b0d29bc4SBrooks Davis
250*b0d29bc4SBrooks Davis o.validate("123");
251*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(123, cmdline::int_option::convert("123"));
252*b0d29bc4SBrooks Davis
253*b0d29bc4SBrooks Davis o.validate("-567");
254*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(-567, cmdline::int_option::convert("-567"));
255*b0d29bc4SBrooks Davis
256*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate(""));
257*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("5a"));
258*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("a5"));
259*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("5 a"));
260*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("5.0"));
261*b0d29bc4SBrooks Davis }
262*b0d29bc4SBrooks Davis
263*b0d29bc4SBrooks Davis
264*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list_option__short_name);
ATF_TEST_CASE_BODY(list_option__short_name)265*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list_option__short_name)
266*b0d29bc4SBrooks Davis {
267*b0d29bc4SBrooks Davis const cmdline::list_option o('p', "list", "The list", "arg", "value");
268*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
269*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('p', o.short_name());
270*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("list", o.long_name());
271*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The list", o.description());
272*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
273*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
274*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
275*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
276*b0d29bc4SBrooks Davis }
277*b0d29bc4SBrooks Davis
278*b0d29bc4SBrooks Davis
279*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list_option__long_name);
ATF_TEST_CASE_BODY(list_option__long_name)280*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list_option__long_name)
281*b0d29bc4SBrooks Davis {
282*b0d29bc4SBrooks Davis const cmdline::list_option o("list", "The list", "arg", "value");
283*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
284*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("list", o.long_name());
285*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The list", o.description());
286*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
287*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
288*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
289*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
290*b0d29bc4SBrooks Davis }
291*b0d29bc4SBrooks Davis
292*b0d29bc4SBrooks Davis
293*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(list_option__type);
ATF_TEST_CASE_BODY(list_option__type)294*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(list_option__type)
295*b0d29bc4SBrooks Davis {
296*b0d29bc4SBrooks Davis const cmdline::list_option o("list", "The list", "arg");
297*b0d29bc4SBrooks Davis
298*b0d29bc4SBrooks Davis o.validate("");
299*b0d29bc4SBrooks Davis {
300*b0d29bc4SBrooks Davis const cmdline::list_option::option_type words =
301*b0d29bc4SBrooks Davis cmdline::list_option::convert("");
302*b0d29bc4SBrooks Davis ATF_REQUIRE(words.empty());
303*b0d29bc4SBrooks Davis }
304*b0d29bc4SBrooks Davis
305*b0d29bc4SBrooks Davis o.validate("foo");
306*b0d29bc4SBrooks Davis {
307*b0d29bc4SBrooks Davis const cmdline::list_option::option_type words =
308*b0d29bc4SBrooks Davis cmdline::list_option::convert("foo");
309*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(1, words.size());
310*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", words[0]);
311*b0d29bc4SBrooks Davis }
312*b0d29bc4SBrooks Davis
313*b0d29bc4SBrooks Davis o.validate("foo,bar,baz");
314*b0d29bc4SBrooks Davis {
315*b0d29bc4SBrooks Davis const cmdline::list_option::option_type words =
316*b0d29bc4SBrooks Davis cmdline::list_option::convert("foo,bar,baz");
317*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(3, words.size());
318*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", words[0]);
319*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bar", words[1]);
320*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("baz", words[2]);
321*b0d29bc4SBrooks Davis }
322*b0d29bc4SBrooks Davis
323*b0d29bc4SBrooks Davis o.validate("foo,bar,");
324*b0d29bc4SBrooks Davis {
325*b0d29bc4SBrooks Davis const cmdline::list_option::option_type words =
326*b0d29bc4SBrooks Davis cmdline::list_option::convert("foo,bar,");
327*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(3, words.size());
328*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", words[0]);
329*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bar", words[1]);
330*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("", words[2]);
331*b0d29bc4SBrooks Davis }
332*b0d29bc4SBrooks Davis
333*b0d29bc4SBrooks Davis o.validate(",foo,bar");
334*b0d29bc4SBrooks Davis {
335*b0d29bc4SBrooks Davis const cmdline::list_option::option_type words =
336*b0d29bc4SBrooks Davis cmdline::list_option::convert(",foo,bar");
337*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(3, words.size());
338*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("", words[0]);
339*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", words[1]);
340*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bar", words[2]);
341*b0d29bc4SBrooks Davis }
342*b0d29bc4SBrooks Davis
343*b0d29bc4SBrooks Davis o.validate("foo,,bar");
344*b0d29bc4SBrooks Davis {
345*b0d29bc4SBrooks Davis const cmdline::list_option::option_type words =
346*b0d29bc4SBrooks Davis cmdline::list_option::convert("foo,,bar");
347*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(3, words.size());
348*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", words[0]);
349*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("", words[1]);
350*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bar", words[2]);
351*b0d29bc4SBrooks Davis }
352*b0d29bc4SBrooks Davis }
353*b0d29bc4SBrooks Davis
354*b0d29bc4SBrooks Davis
355*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(path_option__short_name);
ATF_TEST_CASE_BODY(path_option__short_name)356*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(path_option__short_name)
357*b0d29bc4SBrooks Davis {
358*b0d29bc4SBrooks Davis const cmdline::path_option o('p', "path", "The path", "arg", "value");
359*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
360*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('p', o.short_name());
361*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("path", o.long_name());
362*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The path", o.description());
363*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
364*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
365*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
366*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
367*b0d29bc4SBrooks Davis }
368*b0d29bc4SBrooks Davis
369*b0d29bc4SBrooks Davis
370*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(path_option__long_name);
ATF_TEST_CASE_BODY(path_option__long_name)371*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(path_option__long_name)
372*b0d29bc4SBrooks Davis {
373*b0d29bc4SBrooks Davis const cmdline::path_option o("path", "The path", "arg", "value");
374*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
375*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("path", o.long_name());
376*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The path", o.description());
377*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
378*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
379*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
380*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
381*b0d29bc4SBrooks Davis }
382*b0d29bc4SBrooks Davis
383*b0d29bc4SBrooks Davis
384*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(path_option__type);
ATF_TEST_CASE_BODY(path_option__type)385*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(path_option__type)
386*b0d29bc4SBrooks Davis {
387*b0d29bc4SBrooks Davis const cmdline::path_option o("path", "The path", "arg");
388*b0d29bc4SBrooks Davis
389*b0d29bc4SBrooks Davis o.validate("/some/path");
390*b0d29bc4SBrooks Davis
391*b0d29bc4SBrooks Davis try {
392*b0d29bc4SBrooks Davis o.validate("");
393*b0d29bc4SBrooks Davis fail("option_argument_value_error not raised");
394*b0d29bc4SBrooks Davis } catch (const cmdline::option_argument_value_error& e) {
395*b0d29bc4SBrooks Davis // Expected; ignore.
396*b0d29bc4SBrooks Davis }
397*b0d29bc4SBrooks Davis
398*b0d29bc4SBrooks Davis const cmdline::path_option::option_type path =
399*b0d29bc4SBrooks Davis cmdline::path_option::convert("/foo/bar");
400*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bar", path.leaf_name()); // Ensure valid type.
401*b0d29bc4SBrooks Davis }
402*b0d29bc4SBrooks Davis
403*b0d29bc4SBrooks Davis
404*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(property_option__short_name);
ATF_TEST_CASE_BODY(property_option__short_name)405*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(property_option__short_name)
406*b0d29bc4SBrooks Davis {
407*b0d29bc4SBrooks Davis const cmdline::property_option o('p', "property", "The property", "a=b");
408*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
409*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('p', o.short_name());
410*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("property", o.long_name());
411*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The property", o.description());
412*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
413*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("a=b", o.arg_name());
414*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_default_value());
415*b0d29bc4SBrooks Davis }
416*b0d29bc4SBrooks Davis
417*b0d29bc4SBrooks Davis
418*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(property_option__long_name);
ATF_TEST_CASE_BODY(property_option__long_name)419*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(property_option__long_name)
420*b0d29bc4SBrooks Davis {
421*b0d29bc4SBrooks Davis const cmdline::property_option o("property", "The property", "a=b");
422*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
423*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("property", o.long_name());
424*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The property", o.description());
425*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
426*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("a=b", o.arg_name());
427*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_default_value());
428*b0d29bc4SBrooks Davis }
429*b0d29bc4SBrooks Davis
430*b0d29bc4SBrooks Davis
431*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(property_option__type);
ATF_TEST_CASE_BODY(property_option__type)432*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(property_option__type)
433*b0d29bc4SBrooks Davis {
434*b0d29bc4SBrooks Davis typedef std::pair< std::string, std::string > string_pair;
435*b0d29bc4SBrooks Davis const cmdline::property_option o("property", "The property", "a=b");
436*b0d29bc4SBrooks Davis
437*b0d29bc4SBrooks Davis o.validate("foo=bar");
438*b0d29bc4SBrooks Davis ATF_REQUIRE(string_pair("foo", "bar") ==
439*b0d29bc4SBrooks Davis cmdline::property_option::convert("foo=bar"));
440*b0d29bc4SBrooks Davis
441*b0d29bc4SBrooks Davis o.validate(" foo = bar baz");
442*b0d29bc4SBrooks Davis ATF_REQUIRE(string_pair(" foo ", " bar baz") ==
443*b0d29bc4SBrooks Davis cmdline::property_option::convert(" foo = bar baz"));
444*b0d29bc4SBrooks Davis
445*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate(""));
446*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("="));
447*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("a="));
448*b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(cmdline::option_argument_value_error, o.validate("=b"));
449*b0d29bc4SBrooks Davis }
450*b0d29bc4SBrooks Davis
451*b0d29bc4SBrooks Davis
452*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(string_option__short_name);
ATF_TEST_CASE_BODY(string_option__short_name)453*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(string_option__short_name)
454*b0d29bc4SBrooks Davis {
455*b0d29bc4SBrooks Davis const cmdline::string_option o('p', "string", "The string", "arg", "value");
456*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_short_name());
457*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ('p', o.short_name());
458*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("string", o.long_name());
459*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The string", o.description());
460*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
461*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
462*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
463*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
464*b0d29bc4SBrooks Davis }
465*b0d29bc4SBrooks Davis
466*b0d29bc4SBrooks Davis
467*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(string_option__long_name);
ATF_TEST_CASE_BODY(string_option__long_name)468*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(string_option__long_name)
469*b0d29bc4SBrooks Davis {
470*b0d29bc4SBrooks Davis const cmdline::string_option o("string", "The string", "arg", "value");
471*b0d29bc4SBrooks Davis ATF_REQUIRE(!o.has_short_name());
472*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("string", o.long_name());
473*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("The string", o.description());
474*b0d29bc4SBrooks Davis ATF_REQUIRE(o.needs_arg());
475*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("arg", o.arg_name());
476*b0d29bc4SBrooks Davis ATF_REQUIRE(o.has_default_value());
477*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("value", o.default_value());
478*b0d29bc4SBrooks Davis }
479*b0d29bc4SBrooks Davis
480*b0d29bc4SBrooks Davis
481*b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(string_option__type);
ATF_TEST_CASE_BODY(string_option__type)482*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(string_option__type)
483*b0d29bc4SBrooks Davis {
484*b0d29bc4SBrooks Davis const cmdline::string_option o("string", "The string", "foo");
485*b0d29bc4SBrooks Davis
486*b0d29bc4SBrooks Davis o.validate("");
487*b0d29bc4SBrooks Davis o.validate("some string");
488*b0d29bc4SBrooks Davis
489*b0d29bc4SBrooks Davis const cmdline::string_option::option_type string =
490*b0d29bc4SBrooks Davis cmdline::string_option::convert("foo");
491*b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(3, string.length()); // Ensure valid type.
492*b0d29bc4SBrooks Davis }
493*b0d29bc4SBrooks Davis
494*b0d29bc4SBrooks Davis
ATF_INIT_TEST_CASES(tcs)495*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
496*b0d29bc4SBrooks Davis {
497*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, base_option__short_name__no_arg);
498*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, base_option__short_name__with_arg__no_default);
499*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, base_option__short_name__with_arg__with_default);
500*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, base_option__long_name__no_arg);
501*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, base_option__long_name__with_arg__no_default);
502*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, base_option__long_name__with_arg__with_default);
503*b0d29bc4SBrooks Davis
504*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, bool_option__short_name);
505*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, bool_option__long_name);
506*b0d29bc4SBrooks Davis
507*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, int_option__short_name);
508*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, int_option__long_name);
509*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, int_option__type);
510*b0d29bc4SBrooks Davis
511*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, list_option__short_name);
512*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, list_option__long_name);
513*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, list_option__type);
514*b0d29bc4SBrooks Davis
515*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, path_option__short_name);
516*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, path_option__long_name);
517*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, path_option__type);
518*b0d29bc4SBrooks Davis
519*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, property_option__short_name);
520*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, property_option__long_name);
521*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, property_option__type);
522*b0d29bc4SBrooks Davis
523*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, string_option__short_name);
524*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, string_option__long_name);
525*b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, string_option__type);
526*b0d29bc4SBrooks Davis }
527