Line data Source code
1 : /*
2 : * License:
3 : * Copyright (c) 2006-2019 Made to Order Software Corp. All Rights Reserved
4 : *
5 : * https://snapwebsites.org/
6 : * contact@m2osw.com
7 : *
8 : * This program is free software; you can redistribute it and/or modify
9 : * it under the terms of the GNU General Public License as published by
10 : * the Free Software Foundation; either version 2 of the License, or
11 : * (at your option) any later version.
12 : *
13 : * This program is distributed in the hope that it will be useful,
14 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : * GNU General Public License for more details.
17 : *
18 : * You should have received a copy of the GNU General Public License along
19 : * with this program; if not, write to the Free Software Foundation, Inc.,
20 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 : *
22 : * Authors:
23 : * Alexis Wilke alexis@m2osw.com
24 : */
25 :
26 : // self
27 : //
28 : #include "main.h"
29 :
30 :
31 : // advgetopt lib
32 : //
33 : #include <advgetopt/exception.h>
34 :
35 :
36 : // snapdev lib
37 : //
38 : #include <snapdev/safe_setenv.h>
39 :
40 :
41 : // booost lib
42 : //
43 : #include <boost/preprocessor/stringize.hpp>
44 :
45 :
46 : // C++ lib
47 : //
48 : #include <fstream>
49 :
50 :
51 :
52 :
53 :
54 :
55 4 : CATCH_TEST_CASE("string_access", "[arguments][valid][getopt]")
56 : {
57 4 : CATCH_START_SECTION("Verify a string in a long argument")
58 : advgetopt::option const options[] =
59 : {
60 : advgetopt::define_option(
61 : advgetopt::Name("user-name")
62 : , advgetopt::ShortName('u')
63 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
64 : , advgetopt::Help("check specified user.")
65 : ),
66 : advgetopt::end_options()
67 1 : };
68 :
69 1 : advgetopt::options_environment environment_options;
70 1 : environment_options.f_project_name = "unittest";
71 1 : environment_options.f_options = options;
72 1 : environment_options.f_help_header = "Usage: user name as a string";
73 :
74 : char const * cargv[] =
75 : {
76 : "/usr/bin/arguments",
77 : "--user-name",
78 : "alexis",
79 : nullptr
80 1 : };
81 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
82 1 : char ** argv = const_cast<char **>(cargv);
83 :
84 2 : advgetopt::getopt opt(environment_options, argc, argv);
85 :
86 : // check that the result is valid
87 :
88 : // an invalid parameter, MUST NOT EXIST
89 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
90 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
91 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
92 1 : CATCH_REQUIRE_FALSE(opt.has_default("invalid-parameter"));
93 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
94 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
95 :
96 : // no default
97 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
98 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
99 1 : CATCH_REQUIRE_FALSE(opt.has_default("--"));
100 1 : CATCH_REQUIRE(opt.get_default("--").empty());
101 1 : CATCH_REQUIRE(opt.size("--") == 0);
102 :
103 : // the valid parameter
104 1 : CATCH_REQUIRE(opt.get_option("user-name") != nullptr);
105 1 : CATCH_REQUIRE(opt.get_option('u') != nullptr);
106 1 : CATCH_REQUIRE(opt.get_string("user-name") == "alexis");
107 1 : CATCH_REQUIRE(opt.get_string("user-name", 0) == "alexis");
108 1 : CATCH_REQUIRE(opt["user-name"] == "alexis");
109 1 : CATCH_REQUIRE(opt.is_defined("user-name"));
110 1 : CATCH_REQUIRE_FALSE(opt.has_default("user-name"));
111 1 : CATCH_REQUIRE(opt.get_default("user-name").empty());
112 1 : CATCH_REQUIRE(opt.size("user-name") == 1);
113 :
114 : // other parameters
115 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
116 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
117 : CATCH_END_SECTION()
118 :
119 4 : CATCH_START_SECTION("Verify a string in a short argument")
120 : advgetopt::option const options[] =
121 : {
122 : advgetopt::define_option(
123 : advgetopt::Name("user-name")
124 : , advgetopt::ShortName('u')
125 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
126 : , advgetopt::Help("check specified user.")
127 : ),
128 : advgetopt::end_options()
129 1 : };
130 :
131 1 : advgetopt::options_environment environment_options;
132 1 : environment_options.f_project_name = "unittest";
133 1 : environment_options.f_options = options;
134 1 : environment_options.f_help_header = "Usage: user name as a string";
135 :
136 : char const * cargv[] =
137 : {
138 : "/usr/bin/arguments",
139 : "-u",
140 : "alexis",
141 : nullptr
142 1 : };
143 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
144 1 : char ** argv = const_cast<char **>(cargv);
145 :
146 2 : advgetopt::getopt opt(environment_options, argc, argv);
147 :
148 : // check that the result is valid
149 :
150 : // an invalid parameter, MUST NOT EXIST
151 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
152 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
153 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
154 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
155 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
156 :
157 : // no default
158 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
159 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
160 1 : CATCH_REQUIRE(opt.get_default("--").empty());
161 1 : CATCH_REQUIRE(opt.size("--") == 0);
162 :
163 : // the valid parameter
164 1 : CATCH_REQUIRE(opt.get_option("user-name") != nullptr);
165 1 : CATCH_REQUIRE(opt.get_option('u') != nullptr);
166 1 : CATCH_REQUIRE(opt.get_string("user-name") == "alexis");
167 1 : CATCH_REQUIRE(opt.get_string("user-name", 0) == "alexis");
168 1 : CATCH_REQUIRE(opt["user-name"] == "alexis");
169 1 : CATCH_REQUIRE(opt.is_defined("user-name"));
170 1 : CATCH_REQUIRE(opt.get_default("user-name").empty());
171 1 : CATCH_REQUIRE(opt.size("user-name") == 1);
172 :
173 : // other parameters
174 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
175 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
176 : CATCH_END_SECTION()
177 2 : }
178 :
179 :
180 5 : CATCH_TEST_CASE("long_access", "[arguments][valid][getopt]")
181 : {
182 6 : CATCH_START_SECTION("Verify an integer (long) value in a long argument")
183 1 : long const default_value(rand());
184 2 : std::string const default_value_str(std::to_string(default_value));
185 1 : char const * const default_val(default_value_str.c_str());
186 :
187 : advgetopt::option const options[] =
188 : {
189 : advgetopt::define_option(
190 : advgetopt::Name("size")
191 : , advgetopt::ShortName('s')
192 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
193 : , advgetopt::Help("define the size.")
194 : , advgetopt::DefaultValue(default_val)
195 2 : ),
196 : advgetopt::end_options()
197 3 : };
198 :
199 1 : advgetopt::options_environment environment_options;
200 1 : environment_options.f_project_name = "unittest";
201 1 : environment_options.f_options = options;
202 1 : environment_options.f_help_header = "Usage: test get_long() functions";
203 :
204 : char const * cargv[] =
205 : {
206 : "/usr/bin/arguments",
207 : "--size",
208 : "9821",
209 : nullptr
210 1 : };
211 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
212 1 : char ** argv = const_cast<char **>(cargv);
213 :
214 2 : advgetopt::getopt opt(environment_options, argc, argv);
215 :
216 : // check that the result is valid
217 :
218 : // an invalid parameter, MUST NOT EXIST
219 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
220 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
221 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
222 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
223 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
224 :
225 : // no default
226 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
227 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
228 1 : CATCH_REQUIRE(opt.get_default("--").empty());
229 1 : CATCH_REQUIRE(opt.size("--") == 0);
230 :
231 : // the valid parameter
232 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
233 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
234 1 : CATCH_REQUIRE(opt.is_defined("size"));
235 1 : CATCH_REQUIRE(opt.get_string("size") == "9821");
236 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "9821");
237 1 : CATCH_REQUIRE(opt["size"] == "9821");
238 1 : CATCH_REQUIRE(opt.get_long("size") == 9821);
239 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 9821);
240 1 : CATCH_REQUIRE(opt.has_default("size"));
241 1 : CATCH_REQUIRE(opt.get_default("size") == default_value_str);
242 1 : CATCH_REQUIRE(opt.size("size") == 1);
243 :
244 : // other parameters
245 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
246 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
247 : CATCH_END_SECTION()
248 :
249 6 : CATCH_START_SECTION("Verify an integer (long) value in a short argument")
250 : advgetopt::option const options[] =
251 : {
252 : advgetopt::define_option(
253 : advgetopt::Name("size")
254 : , advgetopt::ShortName('s')
255 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
256 : , advgetopt::Help("define the size.")
257 : , advgetopt::DefaultValue("")
258 : ),
259 : advgetopt::end_options()
260 1 : };
261 :
262 1 : advgetopt::options_environment environment_options;
263 1 : environment_options.f_project_name = "unittest";
264 1 : environment_options.f_options = options;
265 1 : environment_options.f_help_header = "Usage: test get_long() functions";
266 :
267 : char const * cargv[] =
268 : {
269 : "/usr/bin/arguments",
270 : "-s",
271 : "9821",
272 : nullptr
273 1 : };
274 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
275 1 : char ** argv = const_cast<char **>(cargv);
276 :
277 2 : advgetopt::getopt opt(environment_options, argc, argv);
278 :
279 : // check that the result is valid
280 :
281 : // an invalid parameter, MUST NOT EXIST
282 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
283 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
284 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
285 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
286 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
287 :
288 : // to reach the constant version `opt` has to be constant
289 2 : std::string const array_syntax_invalid_parameter(static_cast<advgetopt::getopt const &>(opt)["invalid-parameter"]);
290 1 : CATCH_REQUIRE(array_syntax_invalid_parameter == std::string());
291 :
292 : // no default
293 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
294 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
295 1 : CATCH_REQUIRE(opt.get_default("--").empty());
296 1 : CATCH_REQUIRE(opt.size("--") == 0);
297 :
298 : // the valid parameter
299 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
300 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
301 1 : CATCH_REQUIRE(opt.is_defined("size"));
302 1 : CATCH_REQUIRE(opt.get_string("size") == "9821");
303 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "9821");
304 1 : CATCH_REQUIRE(opt["size"] == "9821");
305 1 : CATCH_REQUIRE(opt.get_long("size") == 9821);
306 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 9821);
307 1 : CATCH_REQUIRE(opt.has_default("size"));
308 1 : CATCH_REQUIRE(opt.get_default("size").empty());
309 1 : CATCH_REQUIRE(opt.size("size") == 1);
310 :
311 : // to access the constant reference we need a constant `opt`...
312 2 : std::string const array_syntax1(static_cast<advgetopt::getopt const &>(opt)["size"]);
313 1 : CATCH_REQUIRE(array_syntax1 == "9821");
314 1 : bool const array_syntax2(static_cast<advgetopt::getopt const &>(opt)["size"] == std::string("9821"));
315 1 : CATCH_REQUIRE(array_syntax2);
316 :
317 : // other parameters
318 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
319 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
320 : CATCH_END_SECTION()
321 :
322 6 : CATCH_START_SECTION("Verify an integer (long) value in no arguments")
323 : advgetopt::option const options[] =
324 : {
325 : advgetopt::define_option(
326 : advgetopt::Name("size")
327 : , advgetopt::ShortName('s')
328 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
329 : , advgetopt::Help("define the size.")
330 : , advgetopt::DefaultValue("839")
331 : ),
332 : advgetopt::end_options()
333 1 : };
334 :
335 1 : advgetopt::options_environment environment_options;
336 1 : environment_options.f_project_name = "unittest";
337 1 : environment_options.f_options = options;
338 1 : environment_options.f_help_header = "Usage: test get_long() functions";
339 :
340 : char const * cargv[] =
341 : {
342 : "/usr/bin/arguments",
343 : nullptr
344 1 : };
345 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
346 1 : char ** argv = const_cast<char **>(cargv);
347 :
348 2 : advgetopt::getopt opt(environment_options, argc, argv);
349 :
350 : // check that the result is valid
351 :
352 : // an invalid parameter, MUST NOT EXIST
353 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
354 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
355 1 : CATCH_REQUIRE(opt["invalid-parameter"] == std::string());
356 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
357 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
358 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
359 :
360 : // no default
361 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
362 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
363 1 : CATCH_REQUIRE(opt.get_default("--").empty());
364 1 : CATCH_REQUIRE(opt.size("--") == 0);
365 :
366 : // the valid parameter
367 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
368 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
369 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
370 1 : CATCH_REQUIRE(opt.get_string("size") == "839");
371 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "839");
372 1 : CATCH_REQUIRE(opt.get_long("size") == 839);
373 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 839);
374 1 : CATCH_REQUIRE(opt.has_default("size"));
375 1 : CATCH_REQUIRE(opt.get_default("size") == "839");
376 1 : CATCH_REQUIRE(opt.size("size") == 0);
377 :
378 : // with a constant opt, the array syntax returns the default string
379 1 : CATCH_REQUIRE(static_cast<advgetopt::getopt const &>(opt)["size"] == "839");
380 :
381 : // other parameters
382 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
383 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
384 : CATCH_END_SECTION()
385 3 : }
386 :
387 :
388 :
389 4 : CATCH_TEST_CASE("system_flags_version", "[arguments][valid][getopt][system_flags]")
390 : {
391 4 : CATCH_START_SECTION("Check with the --version system flag")
392 1 : long const major_version(rand());
393 1 : long const minor_version(rand());
394 1 : long const patch_version(rand());
395 1 : long const build_version(rand());
396 2 : std::string const version(std::to_string(major_version)
397 2 : + "."
398 4 : + std::to_string(minor_version)
399 2 : + "."
400 4 : + std::to_string(patch_version)
401 2 : + "."
402 4 : + std::to_string(build_version));
403 :
404 1 : long const default_value(rand());
405 2 : std::string const default_val(std::to_string(default_value));
406 : advgetopt::option const options[] =
407 : {
408 : advgetopt::define_option(
409 : advgetopt::Name("size")
410 : , advgetopt::ShortName('s')
411 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
412 : , advgetopt::Help("define the size.")
413 : , advgetopt::DefaultValue(default_val.c_str())
414 2 : ),
415 : advgetopt::end_options()
416 3 : };
417 :
418 1 : advgetopt::options_environment environment_options;
419 1 : environment_options.f_project_name = "unittest";
420 1 : environment_options.f_options = options;
421 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
422 1 : environment_options.f_help_header = "Usage: test system commands";
423 1 : environment_options.f_version = version.c_str();
424 :
425 : char const * cargv[] =
426 : {
427 : "/usr/bin/arguments",
428 : "--version",
429 : nullptr
430 1 : };
431 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
432 1 : char ** argv = const_cast<char **>(cargv);
433 :
434 2 : advgetopt::getopt opt(environment_options, argc, argv);
435 :
436 : // check that the result is valid
437 :
438 : // an invalid parameter, MUST NOT EXIST
439 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
440 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
441 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
442 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
443 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
444 :
445 : // no default
446 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
447 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
448 1 : CATCH_REQUIRE(opt.get_default("--").empty());
449 1 : CATCH_REQUIRE(opt.size("--") == 0);
450 :
451 : // valid parameter
452 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
453 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
454 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
455 1 : CATCH_REQUIRE(opt.get_string("size") == default_val);
456 1 : CATCH_REQUIRE(opt.get_string("size", 0) == default_val);
457 1 : CATCH_REQUIRE(opt["size"] == default_val);
458 1 : CATCH_REQUIRE(opt.get_long("size") == default_value);
459 1 : CATCH_REQUIRE(opt.get_long("size", 0) == default_value);
460 1 : CATCH_REQUIRE(opt.has_default("size"));
461 1 : CATCH_REQUIRE(opt.get_default("size") == default_val);
462 1 : CATCH_REQUIRE(opt.size("size") == 0);
463 :
464 : // version parameter
465 1 : CATCH_REQUIRE(opt.get_option("version") != nullptr);
466 1 : CATCH_REQUIRE(opt.get_option('V') == opt.get_option("version"));
467 1 : CATCH_REQUIRE(opt.is_defined("version"));
468 1 : CATCH_REQUIRE(opt.get_string("version") == "");
469 1 : CATCH_REQUIRE(opt.get_string("version", 0) == "");
470 1 : CATCH_REQUIRE(opt["version"] == "");
471 1 : CATCH_REQUIRE_FALSE(opt.has_default("version"));
472 1 : CATCH_REQUIRE(opt.get_default("version").empty());
473 1 : CATCH_REQUIRE(opt.size("version") == 1);
474 :
475 : // other parameters
476 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
477 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
478 :
479 : // process system options now
480 2 : std::stringstream ss;
481 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
482 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_VERSION);
483 1 : CATCH_REQUIRE(ss.str() == version + '\n');
484 : CATCH_END_SECTION()
485 :
486 4 : CATCH_START_SECTION("Check with the --version system flag, without a --version on the command line")
487 1 : long const major_version(rand());
488 1 : long const minor_version(rand());
489 1 : long const patch_version(rand());
490 1 : long const build_version(rand());
491 2 : std::string const version(std::to_string(major_version)
492 2 : + "."
493 4 : + std::to_string(minor_version)
494 2 : + "."
495 4 : + std::to_string(patch_version)
496 2 : + "."
497 4 : + std::to_string(build_version));
498 :
499 1 : long const default_value(rand());
500 2 : std::string const default_val(std::to_string(default_value));
501 : advgetopt::option const options[] =
502 : {
503 : advgetopt::define_option(
504 : advgetopt::Name("size")
505 : , advgetopt::ShortName('s')
506 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
507 : , advgetopt::Help("define the size.")
508 : , advgetopt::DefaultValue(default_val.c_str())
509 2 : ),
510 : advgetopt::end_options()
511 3 : };
512 :
513 1 : advgetopt::options_environment environment_options;
514 1 : environment_options.f_project_name = "unittest";
515 1 : environment_options.f_options = options;
516 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
517 1 : environment_options.f_help_header = "Usage: test system commands";
518 1 : environment_options.f_version = version.c_str();
519 :
520 : char const * cargv[] =
521 : {
522 : "/usr/bin/arguments",
523 : "--size",
524 : "1221",
525 : nullptr
526 1 : };
527 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
528 1 : char ** argv = const_cast<char **>(cargv);
529 :
530 2 : advgetopt::getopt opt(environment_options, argc, argv);
531 :
532 : // check that the result is valid
533 :
534 : // an invalid parameter, MUST NOT EXIST
535 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
536 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
537 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
538 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
539 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
540 :
541 : // no default
542 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
543 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
544 1 : CATCH_REQUIRE(opt.get_default("--").empty());
545 1 : CATCH_REQUIRE(opt.size("--") == 0);
546 :
547 : // valid parameter
548 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
549 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
550 1 : CATCH_REQUIRE(opt.is_defined("size"));
551 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
552 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
553 1 : CATCH_REQUIRE(opt["size"] == "1221");
554 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
555 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
556 1 : CATCH_REQUIRE(opt.has_default("size"));
557 1 : CATCH_REQUIRE(opt.get_default("size") == default_val);
558 1 : CATCH_REQUIRE(opt.size("size") == 1);
559 :
560 : // version parameter
561 1 : CATCH_REQUIRE(opt.get_option("version") != nullptr);
562 1 : CATCH_REQUIRE(opt.get_option('V') == opt.get_option("version"));
563 1 : CATCH_REQUIRE_FALSE(opt.is_defined("version"));
564 1 : CATCH_REQUIRE_FALSE(opt.has_default("version"));
565 1 : CATCH_REQUIRE(opt.get_default("version").empty());
566 1 : CATCH_REQUIRE(opt.size("version") == 0);
567 :
568 : // other parameters
569 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
570 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
571 :
572 : // process system options now
573 2 : std::stringstream ss;
574 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
575 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
576 1 : CATCH_REQUIRE(ss.str().empty());
577 : CATCH_END_SECTION()
578 2 : }
579 :
580 :
581 :
582 7 : CATCH_TEST_CASE("system_flags_help", "[arguments][valid][getopt][system_flags]")
583 : {
584 10 : CATCH_START_SECTION("Check with the --help system flag")
585 : {
586 : advgetopt::option const options[] =
587 : {
588 : advgetopt::define_option(
589 : advgetopt::Name("size")
590 : , advgetopt::ShortName('s')
591 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
592 : , advgetopt::Help("define the size.")
593 : , advgetopt::DefaultValue("33")
594 : ),
595 : advgetopt::define_option(
596 : advgetopt::Name("obscure")
597 : , advgetopt::ShortName('o')
598 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
599 : , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
600 : , advgetopt::Help("obscure command, hidden by default.")
601 : ),
602 : advgetopt::define_option(
603 : advgetopt::Name("secret")
604 : , advgetopt::ShortName('S')
605 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
606 : , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
607 : , advgetopt::Help("even more secret command, hidden by default.")
608 : ),
609 : advgetopt::end_options()
610 1 : };
611 :
612 1 : advgetopt::options_environment environment_options;
613 1 : environment_options.f_project_name = "unittest";
614 1 : environment_options.f_options = options;
615 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
616 1 : environment_options.f_help_header = "Usage: test system commands";
617 1 : environment_options.f_help_footer = "Copyright matters";
618 :
619 : char const * cargv[] =
620 : {
621 : "/usr/bin/arguments",
622 : "--help",
623 : nullptr
624 1 : };
625 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
626 1 : char ** argv = const_cast<char **>(cargv);
627 :
628 2 : advgetopt::getopt opt(environment_options, argc, argv);
629 :
630 : // check that the result is valid
631 :
632 : // check the list of options
633 1 : advgetopt::option_info::map_by_name_t const & list_of_options(opt.get_options());
634 1 : CATCH_REQUIRE(list_of_options.size() == 3 + 8 + 1);
635 :
636 : // user options
637 1 : CATCH_REQUIRE(list_of_options.find("size") != list_of_options.end());
638 1 : CATCH_REQUIRE(list_of_options.find("obscure") != list_of_options.end());
639 1 : CATCH_REQUIRE(list_of_options.find("secret") != list_of_options.end());
640 :
641 : // system options
642 1 : CATCH_REQUIRE(list_of_options.find("help") != list_of_options.end());
643 1 : CATCH_REQUIRE(list_of_options.find("long-help") != list_of_options.end());
644 1 : CATCH_REQUIRE(list_of_options.find("version") != list_of_options.end());
645 1 : CATCH_REQUIRE(list_of_options.find("copyright") != list_of_options.end());
646 1 : CATCH_REQUIRE(list_of_options.find("license") != list_of_options.end());
647 1 : CATCH_REQUIRE(list_of_options.find("build-date") != list_of_options.end());
648 1 : CATCH_REQUIRE(list_of_options.find("environment-variable-name") != list_of_options.end());
649 1 : CATCH_REQUIRE(list_of_options.find("configuration-filenames") != list_of_options.end());
650 1 : CATCH_REQUIRE(list_of_options.find("path-to-option-definitions") != list_of_options.end());
651 :
652 : // an invalid parameter, MUST NOT EXIST
653 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
654 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
655 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
656 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
657 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
658 :
659 : // no default
660 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
661 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
662 1 : CATCH_REQUIRE(opt.get_default("--").empty());
663 1 : CATCH_REQUIRE(opt.size("--") == 0);
664 :
665 : // valid parameter
666 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
667 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
668 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
669 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
670 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
671 1 : CATCH_REQUIRE(opt["size"] == "33");
672 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
673 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
674 1 : CATCH_REQUIRE(opt.has_default("size"));
675 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
676 1 : CATCH_REQUIRE(opt.size("size") == 0);
677 :
678 : // help parameter
679 1 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
680 1 : CATCH_REQUIRE(opt.get_option('h') == opt.get_option("help"));
681 1 : CATCH_REQUIRE(opt.is_defined("help"));
682 1 : CATCH_REQUIRE(opt.get_string("help") == "");
683 1 : CATCH_REQUIRE(opt.get_string("help", 0) == "");
684 1 : CATCH_REQUIRE(opt["help"] == "");
685 1 : CATCH_REQUIRE_FALSE(opt.has_default("help"));
686 1 : CATCH_REQUIRE(opt.get_default("help").empty());
687 1 : CATCH_REQUIRE(opt.size("help") == 1);
688 :
689 : // other parameters
690 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
691 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
692 :
693 : // process system options now
694 2 : std::stringstream ss;
695 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
696 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
697 2 : CATCH_REQUIRE_LONG_STRING(ss.str(),
698 : "Usage: test system commands\n"
699 : " --build-date print out the time and date when arguments was\n"
700 : " built and exit.\n"
701 : " --configuration-filenames print out the list of configuration files checked\n"
702 : " out by this tool.\n"
703 : " --copyright or -C print out the copyright of arguments and exit.\n"
704 : " --environment-variable-name\n"
705 : " print out the name of the environment variable\n"
706 : " supported by arguments (if any.)\n"
707 : " --help or -h print out this help screen and exit.\n"
708 : " --license or -L print out the license of arguments and exit.\n"
709 : " --long-help show all the help from all the available options.\n"
710 : " --path-to-option-definitions\n"
711 : " print out the path to the option definitons.\n"
712 : " --size or -s <arg> (default is \"33\")\n"
713 : " define the size.\n"
714 : " --version or -V print out the version of arguments and exit.\n"
715 : "\n"
716 : "Copyright matters\n"
717 : "\n"
718 1 : );
719 : }
720 : CATCH_END_SECTION()
721 :
722 10 : CATCH_START_SECTION("Check with the --long-help system flag")
723 : {
724 : advgetopt::option const options[] =
725 : {
726 : advgetopt::define_option(
727 : advgetopt::Name("size")
728 : , advgetopt::ShortName('s')
729 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
730 : , advgetopt::Help("define the size.")
731 : , advgetopt::DefaultValue("33")
732 : ),
733 : advgetopt::define_option(
734 : advgetopt::Name("obscure")
735 : , advgetopt::ShortName('o')
736 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
737 : , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
738 : , advgetopt::Help("obscure command, hidden by default.")
739 : ),
740 : advgetopt::define_option(
741 : advgetopt::Name("secret")
742 : , advgetopt::ShortName('S')
743 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
744 : , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
745 : , advgetopt::Help("even more secret command, hidden by default.")
746 : ),
747 : advgetopt::end_options()
748 1 : };
749 :
750 1 : advgetopt::options_environment environment_options;
751 1 : environment_options.f_project_name = "unittest";
752 1 : environment_options.f_options = options;
753 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
754 1 : environment_options.f_help_header = "Usage: test system commands";
755 1 : environment_options.f_help_footer = "Copyright matters";
756 :
757 : char const * cargv[] =
758 : {
759 : "/usr/bin/arguments",
760 : "--long-help",
761 : nullptr
762 1 : };
763 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
764 1 : char ** argv = const_cast<char **>(cargv);
765 :
766 2 : advgetopt::getopt opt(environment_options, argc, argv);
767 :
768 : // check that the result is valid
769 :
770 : // an invalid parameter, MUST NOT EXIST
771 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
772 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
773 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
774 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
775 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
776 :
777 : // no default
778 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
779 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
780 1 : CATCH_REQUIRE(opt.get_default("--").empty());
781 1 : CATCH_REQUIRE(opt.size("--") == 0);
782 :
783 : // valid parameter
784 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
785 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
786 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
787 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
788 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
789 1 : CATCH_REQUIRE(opt["size"] == "33");
790 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
791 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
792 1 : CATCH_REQUIRE(opt.has_default("size"));
793 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
794 1 : CATCH_REQUIRE(opt.size("size") == 0);
795 :
796 : // help parameter
797 1 : CATCH_REQUIRE(opt.get_option("long-help") != nullptr);
798 1 : CATCH_REQUIRE(opt.is_defined("long-help"));
799 1 : CATCH_REQUIRE(opt.get_string("long-help") == "");
800 1 : CATCH_REQUIRE(opt.get_string("long-help", 0) == "");
801 1 : CATCH_REQUIRE(opt["long-help"] == "");
802 1 : CATCH_REQUIRE_FALSE(opt.has_default("long-help"));
803 1 : CATCH_REQUIRE(opt.get_default("long-help").empty());
804 1 : CATCH_REQUIRE(opt.size("long-help") == 1);
805 :
806 : // other parameters
807 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
808 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
809 :
810 : // process system options now
811 2 : std::stringstream ss;
812 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
813 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
814 2 : CATCH_REQUIRE_LONG_STRING(ss.str(),
815 : "Usage: test system commands\n"
816 : " --build-date print out the time and date when arguments was\n"
817 : " built and exit.\n"
818 : " --configuration-filenames print out the list of configuration files checked\n"
819 : " out by this tool.\n"
820 : " --copyright or -C print out the copyright of arguments and exit.\n"
821 : " --environment-variable-name\n"
822 : " print out the name of the environment variable\n"
823 : " supported by arguments (if any.)\n"
824 : " --help or -h print out this help screen and exit.\n"
825 : " --license or -L print out the license of arguments and exit.\n"
826 : " --long-help show all the help from all the available options.\n"
827 : " --obscure or -o <arg> obscure command, hidden by default.\n"
828 : " --path-to-option-definitions\n"
829 : " print out the path to the option definitons.\n"
830 : " --secret or -S <arg> even more secret command, hidden by default.\n"
831 : " --size or -s <arg> (default is \"33\")\n"
832 : " define the size.\n"
833 : " --version or -V print out the version of arguments and exit.\n"
834 : "\n"
835 : "Copyright matters\n"
836 : "\n"
837 1 : );
838 : }
839 : CATCH_END_SECTION()
840 :
841 10 : CATCH_START_SECTION("Check with the --help system flag, without a --help on the command line")
842 : advgetopt::option const options[] =
843 : {
844 : advgetopt::define_option(
845 : advgetopt::Name("size")
846 : , advgetopt::ShortName('s')
847 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
848 : , advgetopt::Help("define the size.")
849 : , advgetopt::DefaultValue("33")
850 : ),
851 : advgetopt::end_options()
852 1 : };
853 :
854 1 : advgetopt::options_environment environment_options;
855 1 : environment_options.f_project_name = "unittest";
856 1 : environment_options.f_options = options;
857 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
858 1 : environment_options.f_help_header = "Usage: test system commands";
859 1 : environment_options.f_help_footer = "Copyright matters";
860 :
861 : char const * cargv[] =
862 : {
863 : "/usr/bin/arguments",
864 : "--size",
865 : "1221",
866 : nullptr
867 1 : };
868 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
869 1 : char ** argv = const_cast<char **>(cargv);
870 :
871 2 : advgetopt::getopt opt(environment_options, argc, argv);
872 :
873 : // check that the result is valid
874 :
875 : // an invalid parameter, MUST NOT EXIST
876 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
877 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
878 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
879 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
880 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
881 :
882 : // no default
883 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
884 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
885 1 : CATCH_REQUIRE(opt.get_default("--").empty());
886 1 : CATCH_REQUIRE(opt.size("--") == 0);
887 :
888 : // valid parameter
889 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
890 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
891 1 : CATCH_REQUIRE(opt.is_defined("size"));
892 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
893 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
894 1 : CATCH_REQUIRE(opt["size"] == "1221");
895 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
896 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
897 1 : CATCH_REQUIRE(opt.has_default("size"));
898 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
899 1 : CATCH_REQUIRE(opt.size("size") == 1);
900 :
901 : // help parameter
902 1 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
903 1 : CATCH_REQUIRE(opt.get_option('h') == opt.get_option("help"));
904 1 : CATCH_REQUIRE_FALSE(opt.is_defined("help"));
905 1 : CATCH_REQUIRE_FALSE(opt.has_default("help"));
906 1 : CATCH_REQUIRE(opt.get_default("help").empty());
907 1 : CATCH_REQUIRE(opt.size("help") == 0);
908 :
909 : // other parameters
910 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
911 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
912 :
913 : // process system options now
914 2 : std::stringstream ss;
915 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
916 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
917 1 : CATCH_REQUIRE(ss.str().empty());
918 : CATCH_END_SECTION()
919 :
920 10 : CATCH_START_SECTION("Check with the --commmands-help system flag")
921 : {
922 : advgetopt::option const options[] =
923 : {
924 : advgetopt::define_option(
925 : advgetopt::Name("size")
926 : , advgetopt::ShortName('s')
927 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
928 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
929 : , advgetopt::Help("define the size.")
930 : , advgetopt::DefaultValue("33")
931 : ),
932 : advgetopt::define_option(
933 : advgetopt::Name("obscure")
934 : , advgetopt::ShortName('o')
935 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
936 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
937 : , advgetopt::Help("obscure command, hidden by default.")
938 : ),
939 : advgetopt::define_option(
940 : advgetopt::Name("secret")
941 : , advgetopt::ShortName('S')
942 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
943 : , advgetopt::GETOPT_FLAG_GROUP_OPTIONS>())
944 : , advgetopt::Help("even more secret command, hidden by default.")
945 : ),
946 : advgetopt::end_options()
947 1 : };
948 :
949 : advgetopt::group_description const groups[] =
950 : {
951 : advgetopt::define_group(
952 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_COMMANDS)
953 : , advgetopt::GroupName("commands")
954 : , advgetopt::GroupDescription("Commands:")
955 : ),
956 : advgetopt::define_group(
957 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_OPTIONS)
958 : , advgetopt::GroupName("option")
959 : , advgetopt::GroupDescription("Options:")
960 : ),
961 : advgetopt::end_groups()
962 1 : };
963 :
964 1 : advgetopt::options_environment environment_options;
965 1 : environment_options.f_project_name = "unittest";
966 1 : environment_options.f_options = options;
967 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
968 1 : environment_options.f_help_header = "Usage: test system commands";
969 1 : environment_options.f_help_footer = "Copyright matters";
970 1 : environment_options.f_groups = groups;
971 :
972 : char const * cargv[] =
973 : {
974 : "/usr/bin/arguments",
975 : "--commands-help",
976 : nullptr
977 1 : };
978 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
979 1 : char ** argv = const_cast<char **>(cargv);
980 :
981 2 : advgetopt::getopt opt(environment_options, argc, argv);
982 :
983 : // check that the result is valid
984 :
985 : // an invalid parameter, MUST NOT EXIST
986 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
987 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
988 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
989 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
990 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
991 :
992 : // no default
993 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
994 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
995 1 : CATCH_REQUIRE(opt.get_default("--").empty());
996 1 : CATCH_REQUIRE(opt.size("--") == 0);
997 :
998 : // valid parameter
999 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1000 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1001 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1002 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
1003 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
1004 1 : CATCH_REQUIRE(opt["size"] == "33");
1005 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
1006 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
1007 1 : CATCH_REQUIRE(opt.has_default("size"));
1008 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
1009 1 : CATCH_REQUIRE(opt.size("size") == 0);
1010 :
1011 : // help parameter
1012 1 : CATCH_REQUIRE(opt.get_option("commands-help") != nullptr);
1013 1 : CATCH_REQUIRE(opt.is_defined("commands-help"));
1014 1 : CATCH_REQUIRE(opt.get_string("commands-help") == "");
1015 1 : CATCH_REQUIRE(opt.get_string("commands-help", 0) == "");
1016 1 : CATCH_REQUIRE(opt["commands-help"] == "");
1017 1 : CATCH_REQUIRE_FALSE(opt.has_default("commands-help"));
1018 1 : CATCH_REQUIRE(opt.get_default("commands-help").empty());
1019 1 : CATCH_REQUIRE(opt.size("commands-help") == 1);
1020 :
1021 : // other parameters
1022 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1023 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1024 :
1025 : // process system options now
1026 2 : std::stringstream ss;
1027 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1028 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
1029 2 : CATCH_REQUIRE_LONG_STRING(ss.str(),
1030 : "Usage: test system commands\n"
1031 : "\n"
1032 : "Commands:\n"
1033 : " --build-date print out the time and date when arguments was\n"
1034 : " built and exit.\n"
1035 : " --commands-help show help from the \"commands\" group of options.\n"
1036 : " --configuration-filenames print out the list of configuration files checked\n"
1037 : " out by this tool.\n"
1038 : " --copyright or -C print out the copyright of arguments and exit.\n"
1039 : " --environment-variable-name\n"
1040 : " print out the name of the environment variable\n"
1041 : " supported by arguments (if any.)\n"
1042 : " --help or -h print out this help screen and exit.\n"
1043 : " --license or -L print out the license of arguments and exit.\n"
1044 : " --obscure or -o <arg> obscure command, hidden by default.\n"
1045 : " --option-help show help from the \"option\" group of options.\n"
1046 : " --path-to-option-definitions\n"
1047 : " print out the path to the option definitons.\n"
1048 : " --size or -s <arg> (default is \"33\")\n"
1049 : " define the size.\n"
1050 : " --version or -V print out the version of arguments and exit.\n"
1051 : "\n"
1052 : "Copyright matters\n"
1053 : "\n"
1054 1 : );
1055 : }
1056 : CATCH_END_SECTION()
1057 :
1058 10 : CATCH_START_SECTION("Check with the --options-help system flag")
1059 : {
1060 : advgetopt::option const options[] =
1061 : {
1062 : advgetopt::define_option(
1063 : advgetopt::Name("size")
1064 : , advgetopt::ShortName('s')
1065 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1066 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
1067 : , advgetopt::Help("define the size.")
1068 : , advgetopt::DefaultValue("33")
1069 : ),
1070 : advgetopt::define_option(
1071 : advgetopt::Name("obscure")
1072 : , advgetopt::ShortName('o')
1073 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1074 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
1075 : , advgetopt::Help("obscure command, hidden by default.")
1076 : ),
1077 : advgetopt::define_option(
1078 : advgetopt::Name("secret")
1079 : , advgetopt::ShortName('S')
1080 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1081 : , advgetopt::GETOPT_FLAG_GROUP_OPTIONS>())
1082 : , advgetopt::Help("even more secret command, hidden by default.")
1083 : ),
1084 : advgetopt::end_options()
1085 1 : };
1086 :
1087 : advgetopt::group_description const groups[] =
1088 : {
1089 : advgetopt::define_group(
1090 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_COMMANDS)
1091 : , advgetopt::GroupName("commands")
1092 : , advgetopt::GroupDescription("Commands:")
1093 : ),
1094 : advgetopt::define_group(
1095 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_OPTIONS)
1096 : , advgetopt::GroupName("options")
1097 : , advgetopt::GroupDescription("Options:")
1098 : ),
1099 : advgetopt::end_groups()
1100 1 : };
1101 :
1102 1 : advgetopt::options_environment environment_options;
1103 1 : environment_options.f_project_name = "unittest";
1104 1 : environment_options.f_options = options;
1105 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1106 1 : environment_options.f_help_header = "Usage: test system commands";
1107 1 : environment_options.f_help_footer = "Copyright matters";
1108 1 : environment_options.f_groups = groups;
1109 :
1110 : char const * cargv[] =
1111 : {
1112 : "/usr/bin/arguments",
1113 : "--options-help",
1114 : nullptr
1115 1 : };
1116 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1117 1 : char ** argv = const_cast<char **>(cargv);
1118 :
1119 2 : advgetopt::getopt opt(environment_options, argc, argv);
1120 :
1121 : // check that the result is valid
1122 :
1123 : // an invalid parameter, MUST NOT EXIST
1124 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1125 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1126 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1127 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1128 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1129 :
1130 : // no default
1131 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1132 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1133 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1134 1 : CATCH_REQUIRE(opt.size("--") == 0);
1135 :
1136 : // valid parameter
1137 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1138 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1139 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1140 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
1141 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
1142 1 : CATCH_REQUIRE(opt["size"] == "33");
1143 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
1144 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
1145 1 : CATCH_REQUIRE(opt.has_default("size"));
1146 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
1147 1 : CATCH_REQUIRE(opt.size("size") == 0);
1148 :
1149 : // help parameter
1150 1 : CATCH_REQUIRE(opt.get_option("options-help") != nullptr);
1151 1 : CATCH_REQUIRE(opt.is_defined("options-help"));
1152 1 : CATCH_REQUIRE(opt.get_string("options-help") == "");
1153 1 : CATCH_REQUIRE(opt.get_string("options-help", 0) == "");
1154 1 : CATCH_REQUIRE(opt["options-help"] == "");
1155 1 : CATCH_REQUIRE_FALSE(opt.has_default("options-help"));
1156 1 : CATCH_REQUIRE(opt.get_default("options-help").empty());
1157 1 : CATCH_REQUIRE(opt.size("options-help") == 1);
1158 :
1159 : // other parameters
1160 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1161 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1162 :
1163 : // process system options now
1164 2 : std::stringstream ss;
1165 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1166 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
1167 2 : CATCH_REQUIRE_LONG_STRING(ss.str(),
1168 : "Usage: test system commands\n"
1169 : "\n"
1170 : "Options:\n"
1171 : " --secret or -S <arg> even more secret command, hidden by default.\n"
1172 : "\n"
1173 : "Copyright matters\n"
1174 : "\n"
1175 1 : );
1176 : }
1177 : CATCH_END_SECTION()
1178 5 : }
1179 :
1180 :
1181 :
1182 4 : CATCH_TEST_CASE("system_flags_copyright", "[arguments][valid][getopt][system_flags]")
1183 : {
1184 4 : CATCH_START_SECTION("Check with the --copyright system flag")
1185 : {
1186 : advgetopt::option const options[] =
1187 : {
1188 : advgetopt::define_option(
1189 : advgetopt::Name("size")
1190 : , advgetopt::ShortName('s')
1191 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1192 : , advgetopt::Help("define the size.")
1193 : , advgetopt::DefaultValue("23")
1194 : ),
1195 : advgetopt::end_options()
1196 1 : };
1197 :
1198 1 : advgetopt::options_environment environment_options;
1199 1 : environment_options.f_project_name = "unittest";
1200 1 : environment_options.f_options = options;
1201 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1202 1 : environment_options.f_copyright = "Copyright (c) " BOOST_PP_STRINGIZE(UTC_BUILD_YEAR) " Made to Order Software Corporation";
1203 :
1204 : char const * cargv[] =
1205 : {
1206 : "/usr/bin/arguments",
1207 : "--copyright",
1208 : nullptr
1209 1 : };
1210 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1211 1 : char ** argv = const_cast<char **>(cargv);
1212 :
1213 2 : advgetopt::getopt opt(environment_options, argc, argv);
1214 :
1215 : // check that the result is valid
1216 :
1217 : // an invalid parameter, MUST NOT EXIST
1218 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1219 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1220 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1221 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1222 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1223 :
1224 : // no default
1225 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1226 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1227 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1228 1 : CATCH_REQUIRE(opt.size("--") == 0);
1229 :
1230 : // valid parameter
1231 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1232 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1233 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1234 1 : CATCH_REQUIRE(opt.get_string("size") == "23");
1235 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "23");
1236 1 : CATCH_REQUIRE(opt["size"] == "23");
1237 1 : CATCH_REQUIRE(opt.get_long("size") == 23);
1238 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 23);
1239 1 : CATCH_REQUIRE(opt.has_default("size"));
1240 1 : CATCH_REQUIRE(opt.get_default("size") == "23");
1241 1 : CATCH_REQUIRE(opt.size("size") == 0);
1242 :
1243 : // copyright parameter
1244 1 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
1245 1 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
1246 1 : CATCH_REQUIRE(opt.is_defined("copyright"));
1247 1 : CATCH_REQUIRE(opt.get_string("copyright") == "");
1248 1 : CATCH_REQUIRE(opt.get_string("copyright", 0) == "");
1249 1 : CATCH_REQUIRE(opt["copyright"] == "");
1250 1 : CATCH_REQUIRE_FALSE(opt.has_default("copyright"));
1251 1 : CATCH_REQUIRE(opt.get_default("copyright").empty());
1252 1 : CATCH_REQUIRE(opt.size("copyright") == 1);
1253 :
1254 : // other parameters
1255 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1256 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1257 :
1258 : // process system options now
1259 2 : std::stringstream ss;
1260 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1261 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_COPYRIGHT);
1262 1 : CATCH_REQUIRE(ss.str() == "Copyright (c) " BOOST_PP_STRINGIZE(UTC_BUILD_YEAR) " Made to Order Software Corporation\n");
1263 : }
1264 : CATCH_END_SECTION()
1265 :
1266 4 : CATCH_START_SECTION("Check with the --copyright system flag, without a --copyright on the command line")
1267 : advgetopt::option const options[] =
1268 : {
1269 : advgetopt::define_option(
1270 : advgetopt::Name("size")
1271 : , advgetopt::ShortName('s')
1272 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1273 : , advgetopt::Help("define the size.")
1274 : , advgetopt::DefaultValue("53")
1275 : ),
1276 : advgetopt::end_options()
1277 1 : };
1278 :
1279 1 : advgetopt::options_environment environment_options;
1280 1 : environment_options.f_project_name = "unittest";
1281 1 : environment_options.f_options = options;
1282 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1283 1 : environment_options.f_help_header = "Usage: test system commands";
1284 1 : environment_options.f_help_footer = "Copyright matters";
1285 :
1286 : char const * cargv[] =
1287 : {
1288 : "/usr/bin/arguments",
1289 : "--size",
1290 : "1221",
1291 : nullptr
1292 1 : };
1293 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1294 1 : char ** argv = const_cast<char **>(cargv);
1295 :
1296 2 : advgetopt::getopt opt(environment_options, argc, argv);
1297 :
1298 : // check that the result is valid
1299 :
1300 : // an invalid parameter, MUST NOT EXIST
1301 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1302 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1303 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1304 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1305 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1306 :
1307 : // no default
1308 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1309 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1310 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1311 1 : CATCH_REQUIRE(opt.size("--") == 0);
1312 :
1313 : // valid parameter
1314 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1315 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1316 1 : CATCH_REQUIRE(opt.is_defined("size"));
1317 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
1318 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
1319 1 : CATCH_REQUIRE(opt["size"] == "1221");
1320 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
1321 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
1322 1 : CATCH_REQUIRE(opt.has_default("size"));
1323 1 : CATCH_REQUIRE(opt.get_default("size") == "53");
1324 1 : CATCH_REQUIRE(opt.size("size") == 1);
1325 :
1326 : // copyright parameter
1327 1 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
1328 1 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
1329 1 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
1330 1 : CATCH_REQUIRE_FALSE(opt.has_default("copyright"));
1331 1 : CATCH_REQUIRE(opt.get_default("copyright").empty());
1332 1 : CATCH_REQUIRE(opt.size("copyright") == 0);
1333 :
1334 : // other parameters
1335 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1336 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1337 :
1338 : // process system options now
1339 2 : std::stringstream ss;
1340 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1341 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
1342 1 : CATCH_REQUIRE(ss.str().empty());
1343 : CATCH_END_SECTION()
1344 2 : }
1345 :
1346 :
1347 :
1348 4 : CATCH_TEST_CASE("system_flags_license", "[arguments][valid][getopt][system_flags]")
1349 : {
1350 4 : CATCH_START_SECTION("Check with the --license system flag")
1351 : {
1352 : advgetopt::option const options[] =
1353 : {
1354 : advgetopt::define_option(
1355 : advgetopt::Name("size")
1356 : , advgetopt::ShortName('s')
1357 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1358 : , advgetopt::Help("define the size.")
1359 : , advgetopt::DefaultValue("73")
1360 : ),
1361 : advgetopt::end_options()
1362 1 : };
1363 :
1364 1 : advgetopt::options_environment environment_options;
1365 1 : environment_options.f_project_name = "unittest";
1366 1 : environment_options.f_options = options;
1367 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1368 1 : environment_options.f_license = "GPL v2";
1369 :
1370 : char const * cargv[] =
1371 : {
1372 : "/usr/bin/arguments",
1373 : "--license",
1374 : nullptr
1375 1 : };
1376 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1377 1 : char ** argv = const_cast<char **>(cargv);
1378 :
1379 2 : advgetopt::getopt opt(environment_options, argc, argv);
1380 :
1381 : // check that the result is valid
1382 :
1383 : // an invalid parameter, MUST NOT EXIST
1384 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1385 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1386 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1387 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1388 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1389 :
1390 : // no default
1391 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1392 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1393 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1394 1 : CATCH_REQUIRE(opt.size("--") == 0);
1395 :
1396 : // valid parameter
1397 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1398 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1399 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1400 1 : CATCH_REQUIRE(opt.get_string("size") == "73");
1401 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "73");
1402 1 : CATCH_REQUIRE(opt["size"] == "73");
1403 1 : CATCH_REQUIRE(opt.get_long("size") == 73);
1404 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 73);
1405 1 : CATCH_REQUIRE(opt.has_default("size"));
1406 1 : CATCH_REQUIRE(opt.get_default("size") == "73");
1407 1 : CATCH_REQUIRE(opt.size("size") == 0);
1408 :
1409 : // license parameter
1410 1 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
1411 1 : CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
1412 1 : CATCH_REQUIRE(opt.is_defined("license"));
1413 1 : CATCH_REQUIRE(opt.get_string("license") == "");
1414 1 : CATCH_REQUIRE(opt.get_string("license", 0) == "");
1415 1 : CATCH_REQUIRE(opt["license"] == "");
1416 1 : CATCH_REQUIRE_FALSE(opt.has_default("license"));
1417 1 : CATCH_REQUIRE(opt.get_default("license").empty());
1418 1 : CATCH_REQUIRE(opt.size("license") == 1);
1419 :
1420 : // other parameters
1421 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1422 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1423 :
1424 : // process system options now
1425 2 : std::stringstream ss;
1426 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1427 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_LICENSE);
1428 1 : CATCH_REQUIRE(ss.str() == "GPL v2\n");
1429 : }
1430 : CATCH_END_SECTION()
1431 :
1432 4 : CATCH_START_SECTION("Check with the --license system flag, without a --license on the command line")
1433 : advgetopt::option const options[] =
1434 : {
1435 : advgetopt::define_option(
1436 : advgetopt::Name("size")
1437 : , advgetopt::ShortName('s')
1438 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1439 : , advgetopt::Help("define the size.")
1440 : , advgetopt::DefaultValue("103")
1441 : ),
1442 : advgetopt::end_options()
1443 1 : };
1444 :
1445 1 : advgetopt::options_environment environment_options;
1446 1 : environment_options.f_project_name = "unittest";
1447 1 : environment_options.f_options = options;
1448 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1449 1 : environment_options.f_help_header = "Usage: test system commands";
1450 1 : environment_options.f_help_footer = "Copyright matters";
1451 :
1452 : char const * cargv[] =
1453 : {
1454 : "/usr/bin/arguments",
1455 : "--size",
1456 : "1221",
1457 : nullptr
1458 1 : };
1459 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1460 1 : char ** argv = const_cast<char **>(cargv);
1461 :
1462 2 : advgetopt::getopt opt(environment_options, argc, argv);
1463 :
1464 : // check that the result is valid
1465 :
1466 : // an invalid parameter, MUST NOT EXIST
1467 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1468 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1469 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1470 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1471 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1472 :
1473 : // no default
1474 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1475 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1476 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1477 1 : CATCH_REQUIRE(opt.size("--") == 0);
1478 :
1479 : // valid parameter
1480 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1481 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1482 1 : CATCH_REQUIRE(opt.is_defined("size"));
1483 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
1484 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
1485 1 : CATCH_REQUIRE(opt["size"] == "1221");
1486 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
1487 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
1488 1 : CATCH_REQUIRE(opt.has_default("size"));
1489 1 : CATCH_REQUIRE(opt.get_default("size") == "103");
1490 1 : CATCH_REQUIRE(opt.size("size") == 1);
1491 :
1492 : // license parameter
1493 1 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
1494 1 : CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
1495 1 : CATCH_REQUIRE_FALSE(opt.is_defined("license"));
1496 1 : CATCH_REQUIRE_FALSE(opt.has_default("license"));
1497 1 : CATCH_REQUIRE(opt.get_default("license").empty());
1498 1 : CATCH_REQUIRE(opt.size("license") == 0);
1499 :
1500 : // other parameters
1501 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1502 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1503 :
1504 : // process system options now
1505 2 : std::stringstream ss;
1506 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1507 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
1508 1 : CATCH_REQUIRE(ss.str().empty());
1509 : CATCH_END_SECTION()
1510 2 : }
1511 :
1512 :
1513 :
1514 4 : CATCH_TEST_CASE("system_flags_build_date", "[arguments][valid][getopt][system_flags]")
1515 : {
1516 4 : CATCH_START_SECTION("Check with the --build-date system flag")
1517 : {
1518 : advgetopt::option const options[] =
1519 : {
1520 : advgetopt::define_option(
1521 : advgetopt::Name("size")
1522 : , advgetopt::ShortName('s')
1523 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1524 : , advgetopt::Help("define the size.")
1525 : , advgetopt::DefaultValue("7301")
1526 : ),
1527 : advgetopt::end_options()
1528 1 : };
1529 :
1530 1 : advgetopt::options_environment environment_options;
1531 1 : environment_options.f_project_name = "unittest";
1532 1 : environment_options.f_options = options;
1533 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1534 :
1535 : char const * cargv[] =
1536 : {
1537 : "/usr/bin/arguments",
1538 : "--build-date",
1539 : nullptr
1540 1 : };
1541 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1542 1 : char ** argv = const_cast<char **>(cargv);
1543 :
1544 2 : advgetopt::getopt opt(environment_options, argc, argv);
1545 :
1546 : // check that the result is valid
1547 :
1548 : // an invalid parameter, MUST NOT EXIST
1549 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1550 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1551 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1552 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1553 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1554 :
1555 : // no default
1556 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1557 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1558 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1559 1 : CATCH_REQUIRE(opt.size("--") == 0);
1560 :
1561 : // valid parameter
1562 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1563 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1564 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1565 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
1566 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
1567 1 : CATCH_REQUIRE(opt["size"] == "7301");
1568 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
1569 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
1570 1 : CATCH_REQUIRE(opt.has_default("size"));
1571 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
1572 1 : CATCH_REQUIRE(opt.size("size") == 0);
1573 :
1574 : // build-date parameter
1575 1 : CATCH_REQUIRE(opt.get_option("build-date") != nullptr);
1576 1 : CATCH_REQUIRE(opt.is_defined("build-date"));
1577 1 : CATCH_REQUIRE(opt.get_string("build-date") == "");
1578 1 : CATCH_REQUIRE(opt.get_string("build-date", 0) == "");
1579 1 : CATCH_REQUIRE(opt["build-date"] == "");
1580 1 : CATCH_REQUIRE_FALSE(opt.has_default("build-date"));
1581 1 : CATCH_REQUIRE(opt.get_default("build-date").empty());
1582 1 : CATCH_REQUIRE(opt.size("build-date") == 1);
1583 :
1584 : // other parameters
1585 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1586 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1587 :
1588 : // process system options now
1589 2 : std::stringstream ss;
1590 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1591 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_BUILD_DATE);
1592 1 : CATCH_REQUIRE(ss.str() == "Built on "
1593 : + std::string(environment_options.f_build_date)
1594 : + " at "
1595 : + environment_options.f_build_time
1596 : + "\n");
1597 : }
1598 : CATCH_END_SECTION()
1599 :
1600 4 : CATCH_START_SECTION("Check with the --build-date system flag, without a --build-date on the command line")
1601 : advgetopt::option const options[] =
1602 : {
1603 : advgetopt::define_option(
1604 : advgetopt::Name("size")
1605 : , advgetopt::ShortName('s')
1606 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1607 : , advgetopt::Help("define the size.")
1608 : , advgetopt::DefaultValue("103")
1609 : ),
1610 : advgetopt::end_options()
1611 1 : };
1612 :
1613 1 : advgetopt::options_environment environment_options;
1614 1 : environment_options.f_project_name = "unittest";
1615 1 : environment_options.f_options = options;
1616 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1617 1 : environment_options.f_help_header = "Usage: test system commands";
1618 1 : environment_options.f_help_footer = "Copyright matters";
1619 :
1620 : char const * cargv[] =
1621 : {
1622 : "/usr/bin/arguments",
1623 : "--size",
1624 : "1221",
1625 : nullptr
1626 1 : };
1627 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1628 1 : char ** argv = const_cast<char **>(cargv);
1629 :
1630 2 : advgetopt::getopt opt(environment_options, argc, argv);
1631 :
1632 : // check that the result is valid
1633 :
1634 : // an invalid parameter, MUST NOT EXIST
1635 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1636 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1637 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1638 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1639 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1640 :
1641 : // no default
1642 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1643 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1644 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1645 1 : CATCH_REQUIRE(opt.size("--") == 0);
1646 :
1647 : // valid parameter
1648 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1649 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1650 1 : CATCH_REQUIRE(opt.is_defined("size"));
1651 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
1652 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
1653 1 : CATCH_REQUIRE(opt["size"] == "1221");
1654 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
1655 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
1656 1 : CATCH_REQUIRE(opt.has_default("size"));
1657 1 : CATCH_REQUIRE(opt.get_default("size") == "103");
1658 1 : CATCH_REQUIRE(opt.size("size") == 1);
1659 :
1660 : // build-date parameter
1661 1 : CATCH_REQUIRE(opt.get_option("build-date") != nullptr);
1662 1 : CATCH_REQUIRE_FALSE(opt.is_defined("build-date"));
1663 1 : CATCH_REQUIRE_FALSE(opt.has_default("build-date"));
1664 1 : CATCH_REQUIRE(opt.get_default("build-date").empty());
1665 1 : CATCH_REQUIRE(opt.size("build-date") == 0);
1666 :
1667 : // other parameters
1668 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1669 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1670 :
1671 : // process system options now
1672 2 : std::stringstream ss;
1673 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1674 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
1675 1 : CATCH_REQUIRE(ss.str().empty());
1676 : CATCH_END_SECTION()
1677 2 : }
1678 :
1679 :
1680 :
1681 6 : CATCH_TEST_CASE("system_flags_environment_variable_name", "[arguments][valid][getopt][system_flags]")
1682 : {
1683 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag")
1684 : {
1685 : advgetopt::option const options[] =
1686 : {
1687 : advgetopt::define_option(
1688 : advgetopt::Name("size")
1689 : , advgetopt::ShortName('s')
1690 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1691 : , advgetopt::Help("define the size.")
1692 : , advgetopt::DefaultValue("7301")
1693 : ),
1694 : advgetopt::end_options()
1695 1 : };
1696 :
1697 1 : advgetopt::options_environment environment_options;
1698 1 : environment_options.f_project_name = "unittest";
1699 1 : environment_options.f_options = options;
1700 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1701 1 : environment_options.f_environment_variable_name = "ADVGETOPT_OPTIONS";
1702 :
1703 : char const * cargv[] =
1704 : {
1705 : "/usr/bin/arguments",
1706 : "--environment-variable-name",
1707 : nullptr
1708 1 : };
1709 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1710 1 : char ** argv = const_cast<char **>(cargv);
1711 :
1712 2 : advgetopt::getopt opt(environment_options, argc, argv);
1713 :
1714 : // check that the result is valid
1715 :
1716 : // an invalid parameter, MUST NOT EXIST
1717 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1718 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1719 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1720 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1721 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1722 :
1723 : // no default
1724 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1725 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1726 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1727 1 : CATCH_REQUIRE(opt.size("--") == 0);
1728 :
1729 : // valid parameter
1730 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1731 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1732 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1733 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
1734 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
1735 1 : CATCH_REQUIRE(opt["size"] == "7301");
1736 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
1737 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
1738 1 : CATCH_REQUIRE(opt.has_default("size"));
1739 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
1740 1 : CATCH_REQUIRE(opt.size("size") == 0);
1741 :
1742 : // environment-variable-name parameter
1743 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
1744 1 : CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
1745 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
1746 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
1747 1 : CATCH_REQUIRE(opt["environment-variable-name"] == "");
1748 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
1749 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
1750 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
1751 :
1752 : // other parameters
1753 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1754 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1755 :
1756 : // process system options now
1757 2 : std::stringstream ss;
1758 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1759 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
1760 1 : CATCH_REQUIRE(ss.str() == "ADVGETOPT_OPTIONS\n");
1761 : }
1762 : CATCH_END_SECTION()
1763 :
1764 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag with nullptr")
1765 : {
1766 : advgetopt::option const options[] =
1767 : {
1768 : advgetopt::define_option(
1769 : advgetopt::Name("size")
1770 : , advgetopt::ShortName('s')
1771 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1772 : , advgetopt::Help("define the size.")
1773 : , advgetopt::DefaultValue("7301")
1774 : ),
1775 : advgetopt::end_options()
1776 1 : };
1777 :
1778 1 : advgetopt::options_environment environment_options;
1779 1 : environment_options.f_project_name = "unittest";
1780 1 : environment_options.f_options = options;
1781 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1782 1 : environment_options.f_environment_variable_name = nullptr;
1783 :
1784 : char const * cargv[] =
1785 : {
1786 : "/usr/bin/arguments",
1787 : "--environment-variable-name",
1788 : nullptr
1789 1 : };
1790 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1791 1 : char ** argv = const_cast<char **>(cargv);
1792 :
1793 2 : advgetopt::getopt opt(environment_options, argc, argv);
1794 :
1795 : // check that the result is valid
1796 :
1797 : // an invalid parameter, MUST NOT EXIST
1798 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1799 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1800 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1801 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1802 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1803 :
1804 : // no default
1805 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1806 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1807 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1808 1 : CATCH_REQUIRE(opt.size("--") == 0);
1809 :
1810 : // valid parameter
1811 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1812 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1813 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1814 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
1815 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
1816 1 : CATCH_REQUIRE(opt["size"] == "7301");
1817 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
1818 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
1819 1 : CATCH_REQUIRE(opt.has_default("size"));
1820 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
1821 1 : CATCH_REQUIRE(opt.size("size") == 0);
1822 :
1823 : // environment-variable-name parameter
1824 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
1825 1 : CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
1826 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
1827 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
1828 1 : CATCH_REQUIRE(opt["environment-variable-name"] == "");
1829 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
1830 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
1831 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
1832 :
1833 : // other parameters
1834 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1835 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1836 :
1837 : // process system options now
1838 2 : std::stringstream ss;
1839 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1840 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
1841 1 : CATCH_REQUIRE(ss.str() == "unittest does not support an environment variable.\n");
1842 : }
1843 : CATCH_END_SECTION()
1844 :
1845 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag with \"\"")
1846 : {
1847 : advgetopt::option const options[] =
1848 : {
1849 : advgetopt::define_option(
1850 : advgetopt::Name("size")
1851 : , advgetopt::ShortName('s')
1852 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1853 : , advgetopt::Help("define the size.")
1854 : , advgetopt::DefaultValue("7301")
1855 : ),
1856 : advgetopt::end_options()
1857 1 : };
1858 :
1859 1 : advgetopt::options_environment environment_options;
1860 1 : environment_options.f_project_name = "unittest";
1861 1 : environment_options.f_options = options;
1862 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1863 1 : environment_options.f_environment_variable_name = "";
1864 :
1865 : char const * cargv[] =
1866 : {
1867 : "/usr/bin/arguments",
1868 : "--environment-variable-name",
1869 : nullptr
1870 1 : };
1871 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1872 1 : char ** argv = const_cast<char **>(cargv);
1873 :
1874 2 : advgetopt::getopt opt(environment_options, argc, argv);
1875 :
1876 : // check that the result is valid
1877 :
1878 : // an invalid parameter, MUST NOT EXIST
1879 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1880 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1881 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1882 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1883 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1884 :
1885 : // no default
1886 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1887 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1888 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1889 1 : CATCH_REQUIRE(opt.size("--") == 0);
1890 :
1891 : // valid parameter
1892 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1893 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1894 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1895 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
1896 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
1897 1 : CATCH_REQUIRE(opt["size"] == "7301");
1898 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
1899 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
1900 1 : CATCH_REQUIRE(opt.has_default("size"));
1901 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
1902 1 : CATCH_REQUIRE(opt.size("size") == 0);
1903 :
1904 : // environment-variable-name parameter
1905 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
1906 1 : CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
1907 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
1908 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
1909 1 : CATCH_REQUIRE(opt["environment-variable-name"] == "");
1910 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
1911 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
1912 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
1913 :
1914 : // other parameters
1915 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1916 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1917 :
1918 : // process system options now
1919 2 : std::stringstream ss;
1920 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1921 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
1922 1 : CATCH_REQUIRE(ss.str() == "unittest does not support an environment variable.\n");
1923 : }
1924 : CATCH_END_SECTION()
1925 :
1926 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag, without a --environment-variable-name on the command line")
1927 : advgetopt::option const options[] =
1928 : {
1929 : advgetopt::define_option(
1930 : advgetopt::Name("size")
1931 : , advgetopt::ShortName('s')
1932 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1933 : , advgetopt::Help("define the size.")
1934 : , advgetopt::DefaultValue("103")
1935 : ),
1936 : advgetopt::end_options()
1937 1 : };
1938 :
1939 1 : advgetopt::options_environment environment_options;
1940 1 : environment_options.f_project_name = "unittest";
1941 1 : environment_options.f_options = options;
1942 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1943 1 : environment_options.f_help_header = "Usage: test system commands";
1944 1 : environment_options.f_help_footer = "Copyright matters";
1945 :
1946 : char const * cargv[] =
1947 : {
1948 : "/usr/bin/arguments",
1949 : "--size",
1950 : "1221",
1951 : nullptr
1952 1 : };
1953 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1954 1 : char ** argv = const_cast<char **>(cargv);
1955 :
1956 2 : advgetopt::getopt opt(environment_options, argc, argv);
1957 :
1958 : // check that the result is valid
1959 :
1960 : // an invalid parameter, MUST NOT EXIST
1961 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1962 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1963 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1964 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1965 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1966 :
1967 : // no default
1968 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1969 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1970 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1971 1 : CATCH_REQUIRE(opt.size("--") == 0);
1972 :
1973 : // valid parameter
1974 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1975 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1976 1 : CATCH_REQUIRE(opt.is_defined("size"));
1977 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
1978 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
1979 1 : CATCH_REQUIRE(opt["size"] == "1221");
1980 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
1981 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
1982 1 : CATCH_REQUIRE(opt.has_default("size"));
1983 1 : CATCH_REQUIRE(opt.get_default("size") == "103");
1984 1 : CATCH_REQUIRE(opt.size("size") == 1);
1985 :
1986 : // environment-variable-name parameter
1987 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
1988 1 : CATCH_REQUIRE_FALSE(opt.is_defined("environment-variable-name"));
1989 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
1990 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
1991 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 0);
1992 :
1993 : // other parameters
1994 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1995 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1996 :
1997 : // process system options now
1998 2 : std::stringstream ss;
1999 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2000 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2001 1 : CATCH_REQUIRE(ss.str().empty());
2002 : CATCH_END_SECTION()
2003 4 : }
2004 :
2005 :
2006 :
2007 6 : CATCH_TEST_CASE("system_flags_configuration_filenames", "[arguments][valid][getopt][system_flags]")
2008 : {
2009 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag")
2010 : {
2011 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
2012 :
2013 : advgetopt::option const options[] =
2014 : {
2015 : advgetopt::define_option(
2016 : advgetopt::Name("size")
2017 : , advgetopt::ShortName('s')
2018 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2019 : , advgetopt::Help("define the size.")
2020 : , advgetopt::DefaultValue("3101")
2021 : ),
2022 : advgetopt::end_options()
2023 1 : };
2024 :
2025 : char const * confs[] =
2026 : {
2027 : ".config/file.mdi",
2028 : "/etc/snapwebsites/server.conf",
2029 : "~/.config/advgetopt/snap.conf",
2030 : nullptr
2031 1 : };
2032 : char const * dirs[] =
2033 : {
2034 : ".config",
2035 : "/etc/secret",
2036 : "~/.config/snapwebsites",
2037 : nullptr
2038 1 : };
2039 :
2040 1 : advgetopt::options_environment environment_options;
2041 1 : environment_options.f_project_name = "unittest";
2042 1 : environment_options.f_options = options;
2043 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2044 1 : environment_options.f_configuration_files = confs;
2045 1 : environment_options.f_configuration_filename = "snapdb.conf";
2046 1 : environment_options.f_configuration_directories = dirs;
2047 :
2048 : char const * cargv[] =
2049 : {
2050 : "/usr/bin/arguments",
2051 : "--configuration-filenames",
2052 : nullptr
2053 1 : };
2054 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2055 1 : char ** argv = const_cast<char **>(cargv);
2056 :
2057 2 : advgetopt::getopt opt(environment_options, argc, argv);
2058 :
2059 : // check that the result is valid
2060 :
2061 : // an invalid parameter, MUST NOT EXIST
2062 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2063 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2064 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2065 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2066 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2067 :
2068 : // no default
2069 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2070 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2071 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2072 1 : CATCH_REQUIRE(opt.size("--") == 0);
2073 :
2074 : // valid parameter
2075 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2076 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2077 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2078 1 : CATCH_REQUIRE(opt.get_string("size") == "3101");
2079 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
2080 1 : CATCH_REQUIRE(opt["size"] == "3101");
2081 1 : CATCH_REQUIRE(opt.get_long("size") == 3101);
2082 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
2083 1 : CATCH_REQUIRE(opt.has_default("size"));
2084 1 : CATCH_REQUIRE(opt.get_default("size") == "3101");
2085 1 : CATCH_REQUIRE(opt.size("size") == 0);
2086 :
2087 : // configuration-filenames parameter
2088 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
2089 1 : CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
2090 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
2091 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
2092 1 : CATCH_REQUIRE(opt["configuration-filenames"] == "");
2093 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
2094 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
2095 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
2096 :
2097 : // other parameters
2098 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2099 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2100 :
2101 : // process system options now
2102 2 : std::stringstream ss;
2103 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2104 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES);
2105 1 : CATCH_REQUIRE(getenv("HOME") != nullptr);
2106 2 : std::string const home(getenv("HOME"));
2107 1 : CATCH_REQUIRE(ss.str() ==
2108 : "Configuration filenames:\n"
2109 : " . .config/file.mdi\n"
2110 : " . .config/unittest.d/50-file.mdi\n"
2111 : " . /etc/snapwebsites/server.conf\n"
2112 : " . /etc/snapwebsites/unittest.d/50-server.conf\n"
2113 : " . " + home + "/.config/advgetopt/snap.conf\n"
2114 : " . .config/snapdb.conf\n"
2115 : " . .config/unittest.d/50-snapdb.conf\n"
2116 : " . /etc/secret/snapdb.conf\n"
2117 : " . /etc/secret/unittest.d/50-snapdb.conf\n"
2118 : " . " + home + "/.config/snapwebsites/snapdb.conf\n"
2119 : );
2120 : }
2121 : CATCH_END_SECTION()
2122 :
2123 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag with --config-dir too")
2124 : {
2125 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
2126 :
2127 : advgetopt::option const options[] =
2128 : {
2129 : advgetopt::define_option(
2130 : advgetopt::Name("size")
2131 : , advgetopt::ShortName('s')
2132 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2133 : , advgetopt::Help("define the size.")
2134 : , advgetopt::DefaultValue("3101")
2135 : ),
2136 : advgetopt::end_options()
2137 1 : };
2138 :
2139 : char const * confs[] =
2140 : {
2141 : ".config/file.mdi",
2142 : "/etc/snapwebsites/server.conf",
2143 : "~/.config/advgetopt/snap.conf",
2144 : nullptr
2145 1 : };
2146 : char const * dirs[] =
2147 : {
2148 : ".config",
2149 : "/etc/secret",
2150 : "~/.config/snapwebsites",
2151 : nullptr
2152 1 : };
2153 :
2154 1 : advgetopt::options_environment environment_options;
2155 1 : environment_options.f_project_name = "unittest";
2156 1 : environment_options.f_options = options;
2157 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2158 1 : environment_options.f_configuration_files = confs;
2159 1 : environment_options.f_configuration_filename = "snapdb.conf";
2160 1 : environment_options.f_configuration_directories = dirs;
2161 :
2162 : char const * cargv[] =
2163 : {
2164 : "/usr/bin/arguments",
2165 : "--config-dir",
2166 : "/var/lib/advgetopt",
2167 : "--configuration-filenames",
2168 : "--config-dir",
2169 : "/opt/config",
2170 : nullptr
2171 1 : };
2172 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2173 1 : char ** argv = const_cast<char **>(cargv);
2174 :
2175 2 : advgetopt::getopt opt(environment_options, argc, argv);
2176 :
2177 : // check that the result is valid
2178 :
2179 : // an invalid parameter, MUST NOT EXIST
2180 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2181 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2182 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2183 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2184 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2185 :
2186 : // no default
2187 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2188 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2189 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2190 1 : CATCH_REQUIRE(opt.size("--") == 0);
2191 :
2192 : // valid parameter
2193 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2194 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2195 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2196 1 : CATCH_REQUIRE(opt.get_string("size") == "3101");
2197 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
2198 1 : CATCH_REQUIRE(opt["size"] == "3101");
2199 1 : CATCH_REQUIRE(opt.get_long("size") == 3101);
2200 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
2201 1 : CATCH_REQUIRE(opt.has_default("size"));
2202 1 : CATCH_REQUIRE(opt.get_default("size") == "3101");
2203 1 : CATCH_REQUIRE(opt.size("size") == 0);
2204 :
2205 : // configuration-filenames parameter
2206 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
2207 1 : CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
2208 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
2209 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
2210 1 : CATCH_REQUIRE(opt["configuration-filenames"] == "");
2211 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
2212 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
2213 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
2214 :
2215 : // other parameters
2216 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2217 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2218 :
2219 : // process system options now
2220 2 : std::stringstream ss;
2221 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2222 1 : CATCH_REQUIRE(result == (advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES
2223 : | advgetopt::SYSTEM_OPTION_CONFIG_DIR));
2224 1 : CATCH_REQUIRE(getenv("HOME") != nullptr);
2225 2 : std::string const home(getenv("HOME"));
2226 1 : CATCH_REQUIRE(ss.str() ==
2227 : "Configuration filenames:\n"
2228 : " . .config/file.mdi\n"
2229 : " . .config/unittest.d/50-file.mdi\n"
2230 : " . /etc/snapwebsites/server.conf\n"
2231 : " . /etc/snapwebsites/unittest.d/50-server.conf\n"
2232 : " . " + home + "/.config/advgetopt/snap.conf\n"
2233 : " . /var/lib/advgetopt/snapdb.conf\n"
2234 : " . /var/lib/advgetopt/unittest.d/50-snapdb.conf\n"
2235 : " . /opt/config/snapdb.conf\n"
2236 : " . /opt/config/unittest.d/50-snapdb.conf\n"
2237 : " . .config/snapdb.conf\n"
2238 : " . .config/unittest.d/50-snapdb.conf\n"
2239 : " . /etc/secret/snapdb.conf\n"
2240 : " . /etc/secret/unittest.d/50-snapdb.conf\n"
2241 : " . " + home + "/.config/snapwebsites/snapdb.conf\n"
2242 : );
2243 : }
2244 : CATCH_END_SECTION()
2245 :
2246 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag without any configuration files")
2247 : {
2248 : advgetopt::option const options[] =
2249 : {
2250 : advgetopt::define_option(
2251 : advgetopt::Name("size")
2252 : , advgetopt::ShortName('s')
2253 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2254 : , advgetopt::Help("define the size.")
2255 : , advgetopt::DefaultValue("3101")
2256 : ),
2257 : advgetopt::end_options()
2258 1 : };
2259 :
2260 1 : advgetopt::options_environment environment_options;
2261 1 : environment_options.f_project_name = "unittest";
2262 1 : environment_options.f_options = options;
2263 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2264 :
2265 : char const * cargv[] =
2266 : {
2267 : "/usr/bin/arguments",
2268 : "--configuration-filenames",
2269 : nullptr
2270 1 : };
2271 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2272 1 : char ** argv = const_cast<char **>(cargv);
2273 :
2274 2 : advgetopt::getopt opt(environment_options, argc, argv);
2275 :
2276 : // check that the result is valid
2277 :
2278 : // an invalid parameter, MUST NOT EXIST
2279 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2280 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2281 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2282 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2283 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2284 :
2285 : // no default
2286 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2287 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2288 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2289 1 : CATCH_REQUIRE(opt.size("--") == 0);
2290 :
2291 : // valid parameter
2292 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2293 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2294 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2295 1 : CATCH_REQUIRE(opt.get_string("size") == "3101");
2296 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
2297 1 : CATCH_REQUIRE(opt["size"] == "3101");
2298 1 : CATCH_REQUIRE(opt.get_long("size") == 3101);
2299 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
2300 1 : CATCH_REQUIRE(opt.has_default("size"));
2301 1 : CATCH_REQUIRE(opt.get_default("size") == "3101");
2302 1 : CATCH_REQUIRE(opt.size("size") == 0);
2303 :
2304 : // configuration-filenames parameter
2305 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
2306 1 : CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
2307 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
2308 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
2309 1 : CATCH_REQUIRE(opt["configuration-filenames"] == "");
2310 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
2311 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
2312 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
2313 :
2314 : // other parameters
2315 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2316 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2317 :
2318 : // process system options now
2319 2 : std::stringstream ss;
2320 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2321 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES);
2322 1 : CATCH_REQUIRE(ss.str() == "unittest does not support configuration files.\n");
2323 : }
2324 : CATCH_END_SECTION()
2325 :
2326 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag, without a --configuration-filenames on the command line")
2327 : advgetopt::option const options[] =
2328 : {
2329 : advgetopt::define_option(
2330 : advgetopt::Name("size")
2331 : , advgetopt::ShortName('s')
2332 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2333 : , advgetopt::Help("define the size.")
2334 : , advgetopt::DefaultValue("193")
2335 : ),
2336 : advgetopt::end_options()
2337 1 : };
2338 :
2339 : char const * confs[] =
2340 : {
2341 : ".config/file.mdi",
2342 : "/etc/snapwebsites/server.conf",
2343 : "~/.config/advgetopt/snap.conf",
2344 : nullptr
2345 1 : };
2346 : char const * dirs[] =
2347 : {
2348 : ".config",
2349 : "/etc/secret",
2350 : "~/.config/snapwebsites",
2351 : nullptr
2352 1 : };
2353 :
2354 1 : advgetopt::options_environment environment_options;
2355 1 : environment_options.f_project_name = "unittest";
2356 1 : environment_options.f_options = options;
2357 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2358 1 : environment_options.f_help_header = "Usage: test system commands";
2359 1 : environment_options.f_help_footer = "Copyright matters";
2360 1 : environment_options.f_configuration_files = confs;
2361 1 : environment_options.f_configuration_filename = "snapdb.conf";
2362 1 : environment_options.f_configuration_directories = dirs;
2363 :
2364 : char const * cargv[] =
2365 : {
2366 : "/usr/bin/arguments",
2367 : "--size",
2368 : "1221",
2369 : nullptr
2370 1 : };
2371 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2372 1 : char ** argv = const_cast<char **>(cargv);
2373 :
2374 2 : advgetopt::getopt opt(environment_options, argc, argv);
2375 :
2376 : // check that the result is valid
2377 :
2378 : // an invalid parameter, MUST NOT EXIST
2379 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2380 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2381 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2382 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2383 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2384 :
2385 : // no default
2386 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2387 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2388 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2389 1 : CATCH_REQUIRE(opt.size("--") == 0);
2390 :
2391 : // valid parameter
2392 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2393 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2394 1 : CATCH_REQUIRE(opt.is_defined("size"));
2395 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
2396 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
2397 1 : CATCH_REQUIRE(opt["size"] == "1221");
2398 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
2399 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
2400 1 : CATCH_REQUIRE(opt.has_default("size"));
2401 1 : CATCH_REQUIRE(opt.get_default("size") == "193");
2402 1 : CATCH_REQUIRE(opt.size("size") == 1);
2403 :
2404 : // configuration-filenames parameter
2405 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
2406 1 : CATCH_REQUIRE_FALSE(opt.is_defined("configuration-filenames"));
2407 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
2408 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
2409 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 0);
2410 :
2411 : // other parameters
2412 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2413 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2414 :
2415 : // process system options now
2416 2 : std::stringstream ss;
2417 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2418 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2419 1 : CATCH_REQUIRE(ss.str().empty());
2420 : CATCH_END_SECTION()
2421 4 : }
2422 :
2423 :
2424 :
2425 5 : CATCH_TEST_CASE("system_flags_path_to_option_definitions", "[arguments][valid][getopt][system_flags]")
2426 : {
2427 6 : CATCH_START_SECTION("Check with the --path-to-option-definitions system flag (Default)")
2428 : {
2429 : advgetopt::option const options[] =
2430 : {
2431 : advgetopt::define_option(
2432 : advgetopt::Name("size")
2433 : , advgetopt::ShortName('s')
2434 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2435 : , advgetopt::Help("define the size.")
2436 : , advgetopt::DefaultValue("7301")
2437 : ),
2438 : advgetopt::end_options()
2439 1 : };
2440 :
2441 1 : advgetopt::options_environment environment_options;
2442 1 : environment_options.f_project_name = "unittest";
2443 1 : environment_options.f_options = options;
2444 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2445 :
2446 : char const * cargv[] =
2447 : {
2448 : "/usr/bin/arguments",
2449 : "--path-to-option-definitions",
2450 : nullptr
2451 1 : };
2452 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2453 1 : char ** argv = const_cast<char **>(cargv);
2454 :
2455 2 : advgetopt::getopt opt(environment_options, argc, argv);
2456 :
2457 : // check that the result is valid
2458 :
2459 : // an invalid parameter, MUST NOT EXIST
2460 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2461 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2462 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2463 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2464 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2465 :
2466 : // no default
2467 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2468 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2469 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2470 1 : CATCH_REQUIRE(opt.size("--") == 0);
2471 :
2472 : // valid parameter
2473 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2474 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2475 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2476 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
2477 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
2478 1 : CATCH_REQUIRE(opt["size"] == "7301");
2479 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
2480 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
2481 1 : CATCH_REQUIRE(opt.has_default("size"));
2482 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
2483 1 : CATCH_REQUIRE(opt.size("size") == 0);
2484 :
2485 : // path-to-option-definitions parameter
2486 1 : CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
2487 1 : CATCH_REQUIRE(opt.is_defined("path-to-option-definitions"));
2488 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions") == "");
2489 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions", 0) == "");
2490 1 : CATCH_REQUIRE(opt["path-to-option-definitions"] == "");
2491 1 : CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
2492 1 : CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
2493 1 : CATCH_REQUIRE(opt.size("path-to-option-definitions") == 1);
2494 :
2495 : // other parameters
2496 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2497 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2498 :
2499 : // process system options now
2500 2 : std::stringstream ss;
2501 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2502 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_PATH_TO_OPTION_DEFINITIONS);
2503 1 : CATCH_REQUIRE(ss.str() == "/usr/share/advgetopt/options\n");
2504 : }
2505 : CATCH_END_SECTION()
2506 :
2507 6 : CATCH_START_SECTION("Check with the --path-to-option-definitions system flag (Specified)")
2508 : {
2509 : advgetopt::option const options[] =
2510 : {
2511 : advgetopt::define_option(
2512 : advgetopt::Name("size")
2513 : , advgetopt::ShortName('s')
2514 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2515 : , advgetopt::Help("define the size.")
2516 : , advgetopt::DefaultValue("7301")
2517 : ),
2518 : advgetopt::end_options()
2519 1 : };
2520 :
2521 1 : advgetopt::options_environment environment_options;
2522 1 : environment_options.f_project_name = "unittest";
2523 1 : environment_options.f_options = options;
2524 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2525 1 : environment_options.f_options_files_directory = "/opt/advgetopt/configs";
2526 :
2527 : char const * cargv[] =
2528 : {
2529 : "/usr/bin/arguments",
2530 : "--path-to-option-definitions",
2531 : nullptr
2532 1 : };
2533 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2534 1 : char ** argv = const_cast<char **>(cargv);
2535 :
2536 2 : advgetopt::getopt opt(environment_options, argc, argv);
2537 :
2538 : // check that the result is valid
2539 :
2540 : // an invalid parameter, MUST NOT EXIST
2541 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2542 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2543 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2544 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2545 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2546 :
2547 : // no default
2548 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2549 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2550 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2551 1 : CATCH_REQUIRE(opt.size("--") == 0);
2552 :
2553 : // valid parameter
2554 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2555 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2556 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2557 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
2558 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
2559 1 : CATCH_REQUIRE(opt["size"] == "7301");
2560 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
2561 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
2562 1 : CATCH_REQUIRE(opt.has_default("size"));
2563 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
2564 1 : CATCH_REQUIRE(opt.size("size") == 0);
2565 :
2566 : // path-to-option-definitions parameter
2567 1 : CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
2568 1 : CATCH_REQUIRE(opt.is_defined("path-to-option-definitions"));
2569 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions") == "");
2570 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions", 0) == "");
2571 1 : CATCH_REQUIRE(opt["path-to-option-definitions"] == "");
2572 1 : CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
2573 1 : CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
2574 1 : CATCH_REQUIRE(opt.size("path-to-option-definitions") == 1);
2575 :
2576 : // other parameters
2577 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2578 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2579 :
2580 : // process system options now
2581 2 : std::stringstream ss;
2582 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2583 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_PATH_TO_OPTION_DEFINITIONS);
2584 1 : CATCH_REQUIRE(ss.str() == "/opt/advgetopt/configs\n");
2585 : }
2586 : CATCH_END_SECTION()
2587 :
2588 6 : CATCH_START_SECTION("Check with the --path-to-option-definitions system flag, without a --path-to-option-definitions on the command line")
2589 : advgetopt::option const options[] =
2590 : {
2591 : advgetopt::define_option(
2592 : advgetopt::Name("size")
2593 : , advgetopt::ShortName('s')
2594 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2595 : , advgetopt::Help("define the size.")
2596 : , advgetopt::DefaultValue("303")
2597 : ),
2598 : advgetopt::end_options()
2599 1 : };
2600 :
2601 1 : advgetopt::options_environment environment_options;
2602 1 : environment_options.f_project_name = "unittest";
2603 1 : environment_options.f_options = options;
2604 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2605 1 : environment_options.f_help_header = "Usage: test system commands";
2606 1 : environment_options.f_help_footer = "Copyright matters";
2607 :
2608 : char const * cargv[] =
2609 : {
2610 : "/usr/bin/arguments",
2611 : "--size",
2612 : "1919",
2613 : nullptr
2614 1 : };
2615 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2616 1 : char ** argv = const_cast<char **>(cargv);
2617 :
2618 2 : advgetopt::getopt opt(environment_options, argc, argv);
2619 :
2620 : // check that the result is valid
2621 :
2622 : // an invalid parameter, MUST NOT EXIST
2623 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2624 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2625 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2626 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2627 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2628 :
2629 : // no default
2630 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2631 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2632 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2633 1 : CATCH_REQUIRE(opt.size("--") == 0);
2634 :
2635 : // valid parameter
2636 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2637 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2638 1 : CATCH_REQUIRE(opt.is_defined("size"));
2639 1 : CATCH_REQUIRE(opt.get_string("size") == "1919");
2640 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1919");
2641 1 : CATCH_REQUIRE(opt["size"] == "1919");
2642 1 : CATCH_REQUIRE(opt.get_long("size") == 1919);
2643 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1919);
2644 1 : CATCH_REQUIRE(opt.has_default("size"));
2645 1 : CATCH_REQUIRE(opt.get_default("size") == "303");
2646 1 : CATCH_REQUIRE(opt.size("size") == 1);
2647 :
2648 : // environment-variable-name parameter
2649 1 : CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
2650 1 : CATCH_REQUIRE_FALSE(opt.is_defined("path-to-option-definitions"));
2651 1 : CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
2652 1 : CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
2653 1 : CATCH_REQUIRE(opt.size("path-to-option-definitions") == 0);
2654 :
2655 : // other parameters
2656 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2657 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2658 :
2659 : // process system options now
2660 2 : std::stringstream ss;
2661 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2662 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2663 1 : CATCH_REQUIRE(ss.str().empty());
2664 : CATCH_END_SECTION()
2665 3 : }
2666 :
2667 :
2668 :
2669 :
2670 :
2671 :
2672 :
2673 :
2674 6 : CATCH_TEST_CASE("invalid_option_name", "[arguments][invalid][getopt]")
2675 : {
2676 8 : CATCH_START_SECTION("Verify that asking for the string of a non-existant option fails")
2677 1 : advgetopt::options_environment environment_options;
2678 1 : environment_options.f_project_name = "unittest";
2679 1 : environment_options.f_options = nullptr;
2680 1 : environment_options.f_help_header = "Usage: test get_string() functions";
2681 :
2682 2 : advgetopt::getopt opt(environment_options);
2683 :
2684 1 : CATCH_REQUIRE_THROWS_MATCHES(
2685 : opt.get_string("non-existant")
2686 : , advgetopt::getopt_exception_logic
2687 : , Catch::Matchers::ExceptionMessage(
2688 : "there is no --non-existant option defined."));
2689 :
2690 1 : CATCH_REQUIRE_THROWS_MATCHES(
2691 : opt.get_string("non-existant", 0)
2692 : , advgetopt::getopt_exception_logic
2693 : , Catch::Matchers::ExceptionMessage(
2694 : "there is no --non-existant option defined."));
2695 :
2696 1 : CATCH_REQUIRE_THROWS_MATCHES(
2697 : opt.get_string("non-existant", 1)
2698 : , advgetopt::getopt_exception_logic
2699 : , Catch::Matchers::ExceptionMessage(
2700 : "there is no --non-existant option defined."));
2701 : CATCH_END_SECTION()
2702 :
2703 8 : CATCH_START_SECTION("Verify that asking for the long of a non-existant option fails")
2704 1 : advgetopt::options_environment environment_options;
2705 1 : environment_options.f_project_name = "unittest";
2706 1 : environment_options.f_options = nullptr;
2707 1 : environment_options.f_help_header = "Usage: test get_string() functions";
2708 :
2709 2 : advgetopt::getopt opt(environment_options);
2710 :
2711 1 : CATCH_REQUIRE_THROWS_MATCHES(
2712 : opt.get_long("non-existant")
2713 : , advgetopt::getopt_exception_logic
2714 : , Catch::Matchers::ExceptionMessage(
2715 : "there is no --non-existant option defined."));
2716 :
2717 1 : CATCH_REQUIRE_THROWS_MATCHES(
2718 : opt.get_long("non-existant", 0)
2719 : , advgetopt::getopt_exception_logic
2720 : , Catch::Matchers::ExceptionMessage(
2721 : "there is no --non-existant option defined."));
2722 :
2723 1 : CATCH_REQUIRE_THROWS_MATCHES(
2724 : opt.get_long("non-existant", 1)
2725 : , advgetopt::getopt_exception_logic
2726 : , Catch::Matchers::ExceptionMessage(
2727 : "there is no --non-existant option defined."));
2728 : CATCH_END_SECTION()
2729 :
2730 8 : CATCH_START_SECTION("Verify that asking for a default with an empty string fails")
2731 1 : advgetopt::options_environment environment_options;
2732 1 : environment_options.f_project_name = "unittest";
2733 1 : environment_options.f_options = nullptr;
2734 1 : environment_options.f_help_header = "Usage: test get_default() functions";
2735 :
2736 2 : advgetopt::getopt opt(environment_options);
2737 :
2738 1 : CATCH_REQUIRE_THROWS_MATCHES(
2739 : opt.has_default("")
2740 : , advgetopt::getopt_exception_logic
2741 : , Catch::Matchers::ExceptionMessage(
2742 : "argument name cannot be empty."));
2743 :
2744 1 : CATCH_REQUIRE_THROWS_MATCHES(
2745 : opt.has_default(std::string())
2746 : , advgetopt::getopt_exception_logic
2747 : , Catch::Matchers::ExceptionMessage(
2748 : "argument name cannot be empty."));
2749 :
2750 1 : CATCH_REQUIRE_THROWS_MATCHES(
2751 : opt.get_default("")
2752 : , advgetopt::getopt_exception_logic
2753 : , Catch::Matchers::ExceptionMessage(
2754 : "argument name cannot be empty."));
2755 :
2756 1 : CATCH_REQUIRE_THROWS_MATCHES(
2757 : opt.get_default(std::string())
2758 : , advgetopt::getopt_exception_logic
2759 : , Catch::Matchers::ExceptionMessage(
2760 : "argument name cannot be empty."));
2761 : CATCH_END_SECTION()
2762 :
2763 8 : CATCH_START_SECTION("[] operators want a valid name")
2764 1 : advgetopt::options_environment environment_options;
2765 1 : environment_options.f_project_name = "unittest";
2766 1 : environment_options.f_options = nullptr;
2767 1 : environment_options.f_help_header = "Usage: test get_default() functions";
2768 :
2769 2 : advgetopt::getopt opt(environment_options);
2770 :
2771 1 : CATCH_REQUIRE_THROWS_MATCHES(
2772 : opt[""]
2773 : , advgetopt::getopt_exception_logic
2774 : , Catch::Matchers::ExceptionMessage(
2775 : "argument name cannot be empty."));
2776 :
2777 1 : CATCH_REQUIRE_THROWS_MATCHES(
2778 : opt[std::string()]
2779 : , advgetopt::getopt_exception_logic
2780 : , Catch::Matchers::ExceptionMessage(
2781 : "argument name cannot be empty."));
2782 :
2783 1 : CATCH_REQUIRE_THROWS_MATCHES(
2784 : opt["g"]
2785 : , advgetopt::getopt_exception_logic
2786 : , Catch::Matchers::ExceptionMessage(
2787 : "argument name cannot be one letter if it does not exist in operator []."));
2788 :
2789 1 : CATCH_REQUIRE_THROWS_MATCHES(
2790 : opt[std::string("g")]
2791 : , advgetopt::getopt_exception_logic
2792 : , Catch::Matchers::ExceptionMessage(
2793 : "argument name cannot be one letter if it does not exist in operator []."));
2794 :
2795 1 : advgetopt::getopt const & const_opt(opt);
2796 :
2797 1 : CATCH_REQUIRE_THROWS_MATCHES(
2798 : const_opt[""]
2799 : , advgetopt::getopt_exception_logic
2800 : , Catch::Matchers::ExceptionMessage(
2801 : "argument name cannot be empty."));
2802 :
2803 1 : CATCH_REQUIRE_THROWS_MATCHES(
2804 : const_opt[std::string()]
2805 : , advgetopt::getopt_exception_logic
2806 : , Catch::Matchers::ExceptionMessage(
2807 : "argument name cannot be empty."));
2808 : CATCH_END_SECTION()
2809 4 : }
2810 :
2811 :
2812 :
2813 5 : CATCH_TEST_CASE("missing_default_value", "[arguments][invalid][getopt]")
2814 : {
2815 6 : CATCH_START_SECTION("Verify a string value without arguments and no default")
2816 : advgetopt::option const options[] =
2817 : {
2818 : advgetopt::define_option(
2819 : advgetopt::Name("size")
2820 : , advgetopt::ShortName('s')
2821 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2822 : , advgetopt::Help("define the size.")
2823 : ),
2824 : advgetopt::end_options()
2825 1 : };
2826 :
2827 1 : advgetopt::options_environment environment_options;
2828 1 : environment_options.f_project_name = "unittest";
2829 1 : environment_options.f_options = options;
2830 1 : environment_options.f_help_header = "Usage: test get_string() functions";
2831 :
2832 : char const * cargv[] =
2833 : {
2834 : "/usr/bin/arguments",
2835 : nullptr
2836 1 : };
2837 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2838 1 : char ** argv = const_cast<char **>(cargv);
2839 :
2840 2 : advgetopt::getopt opt(environment_options, argc, argv);
2841 :
2842 : // check that the result is valid
2843 :
2844 : // an invalid parameter, MUST NOT EXIST
2845 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2846 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2847 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2848 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2849 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2850 :
2851 : // no default
2852 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2853 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2854 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2855 1 : CATCH_REQUIRE(opt.size("--") == 0);
2856 :
2857 : // the valid parameter
2858 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2859 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
2860 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2861 1 : CATCH_REQUIRE(opt.size("size") == 0);
2862 1 : CATCH_REQUIRE(static_cast<advgetopt::getopt const &>(opt)["size"].empty());
2863 :
2864 1 : CATCH_REQUIRE_THROWS_MATCHES(
2865 : opt.get_string("size")
2866 : , advgetopt::getopt_exception_logic
2867 : , Catch::Matchers::ExceptionMessage(
2868 : "the --size option was not defined on the command line and it has no default."));
2869 :
2870 1 : CATCH_REQUIRE_THROWS_MATCHES(
2871 : opt.get_string("size", 0)
2872 : , advgetopt::getopt_exception_logic
2873 : , Catch::Matchers::ExceptionMessage(
2874 : "the --size option was not defined on the command line and it has no default."));
2875 :
2876 1 : CATCH_REQUIRE_THROWS_MATCHES(
2877 : opt.get_string("size", 1)
2878 : , advgetopt::getopt_exception_logic
2879 : , Catch::Matchers::ExceptionMessage(
2880 : "the --size option was not defined on the command line and it has no default."));
2881 :
2882 : // these do not create an entry (even though it looks like it,
2883 : // i.e. it would for an std::map)
2884 : //
2885 1 : CATCH_REQUIRE(opt["size"].empty());
2886 1 : CATCH_REQUIRE(opt["size"].length() == 0);
2887 1 : CATCH_REQUIRE(opt["size"].size() == 0);
2888 :
2889 1 : CATCH_REQUIRE(opt.size("size") == 0);
2890 :
2891 1 : CATCH_REQUIRE_THROWS_MATCHES(
2892 : opt.get_string("size", 0)
2893 : , advgetopt::getopt_exception_logic
2894 : , Catch::Matchers::ExceptionMessage(
2895 : "the --size option was not defined on the command line and it has no default."));
2896 :
2897 1 : CATCH_REQUIRE_THROWS_MATCHES(
2898 : opt.get_string("size", 1)
2899 : , advgetopt::getopt_exception_logic
2900 : , Catch::Matchers::ExceptionMessage(
2901 : "the --size option was not defined on the command line and it has no default."));
2902 :
2903 : // now this one does create a value
2904 : //
2905 1 : opt["size"] = "45.3";
2906 :
2907 1 : CATCH_REQUIRE(opt.get_string("size") == "45.3");
2908 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "45.3");
2909 :
2910 1 : CATCH_REQUIRE_THROWS_MATCHES(
2911 : opt.get_string("size", 1)
2912 : , advgetopt::getopt_exception_undefined
2913 : , Catch::Matchers::ExceptionMessage(
2914 : "option_info::get_value(): no value at index 1 (idx >= 1) for --size so you can't get this value."));
2915 :
2916 : // other parameters
2917 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2918 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2919 : CATCH_END_SECTION()
2920 :
2921 6 : CATCH_START_SECTION("Verify an integer (long) value without arguments and no default")
2922 : advgetopt::option const options[] =
2923 : {
2924 : advgetopt::define_option(
2925 : advgetopt::Name("size")
2926 : , advgetopt::ShortName('s')
2927 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2928 : , advgetopt::Help("define the size.")
2929 : ),
2930 : advgetopt::end_options()
2931 1 : };
2932 :
2933 1 : advgetopt::options_environment environment_options;
2934 1 : environment_options.f_project_name = "unittest";
2935 1 : environment_options.f_options = options;
2936 1 : environment_options.f_help_header = "Usage: test get_long() functions";
2937 :
2938 : char const * cargv[] =
2939 : {
2940 : "/usr/bin/arguments",
2941 : nullptr
2942 1 : };
2943 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2944 1 : char ** argv = const_cast<char **>(cargv);
2945 :
2946 2 : advgetopt::getopt opt(environment_options, argc, argv);
2947 :
2948 : // check that the result is valid
2949 :
2950 : // an invalid parameter, MUST NOT EXIST
2951 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2952 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2953 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2954 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2955 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2956 :
2957 : // no default
2958 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2959 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2960 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2961 1 : CATCH_REQUIRE(opt.size("--") == 0);
2962 :
2963 : // the valid parameter
2964 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2965 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
2966 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2967 1 : CATCH_REQUIRE_FALSE(opt.has_default("size"));
2968 1 : CATCH_REQUIRE(opt.size("size") == 0);
2969 :
2970 1 : CATCH_REQUIRE_THROWS_MATCHES(
2971 : opt.get_long("size")
2972 : , advgetopt::getopt_exception_logic
2973 : , Catch::Matchers::ExceptionMessage(
2974 : "the --size option was not defined on the command line and it has no or an empty default."));
2975 :
2976 1 : CATCH_REQUIRE_THROWS_MATCHES(
2977 : opt.get_long("size", 0)
2978 : , advgetopt::getopt_exception_logic
2979 : , Catch::Matchers::ExceptionMessage(
2980 : "the --size option was not defined on the command line and it has no or an empty default."));
2981 :
2982 1 : CATCH_REQUIRE_THROWS_MATCHES(
2983 : opt.get_long("size", 1)
2984 : , advgetopt::getopt_exception_logic
2985 : , Catch::Matchers::ExceptionMessage(
2986 : "the --size option was not defined on the command line and it has no or an empty default."));
2987 :
2988 : // other parameters
2989 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2990 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2991 : CATCH_END_SECTION()
2992 :
2993 6 : CATCH_START_SECTION("Verify an integer (long) value without arguments and an empty string as default")
2994 : advgetopt::option const options[] =
2995 : {
2996 : advgetopt::define_option(
2997 : advgetopt::Name("size")
2998 : , advgetopt::ShortName('s')
2999 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3000 : , advgetopt::Help("define the size.")
3001 : , advgetopt::DefaultValue("")
3002 : ),
3003 : advgetopt::end_options()
3004 1 : };
3005 :
3006 1 : advgetopt::options_environment environment_options;
3007 1 : environment_options.f_project_name = "unittest";
3008 1 : environment_options.f_options = options;
3009 1 : environment_options.f_help_header = "Usage: test get_long() functions";
3010 :
3011 : char const * cargv[] =
3012 : {
3013 : "/usr/bin/arguments",
3014 : nullptr
3015 1 : };
3016 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3017 1 : char ** argv = const_cast<char **>(cargv);
3018 :
3019 2 : advgetopt::getopt opt(environment_options, argc, argv);
3020 :
3021 : // check that the result is valid
3022 :
3023 : // an invalid parameter, MUST NOT EXIST
3024 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3025 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3026 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3027 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3028 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3029 :
3030 : // no default
3031 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3032 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3033 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3034 1 : CATCH_REQUIRE(opt.size("--") == 0);
3035 :
3036 : // the valid parameter
3037 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3038 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
3039 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3040 1 : CATCH_REQUIRE(opt.has_default("size"));
3041 1 : CATCH_REQUIRE(opt.size("size") == 0);
3042 :
3043 1 : CATCH_REQUIRE_THROWS_MATCHES(
3044 : opt.get_long("size")
3045 : , advgetopt::getopt_exception_logic
3046 : , Catch::Matchers::ExceptionMessage(
3047 : "the --size option was not defined on the command line and it has no or an empty default."));
3048 :
3049 1 : CATCH_REQUIRE_THROWS_MATCHES(
3050 : opt.get_long("size", 0)
3051 : , advgetopt::getopt_exception_logic
3052 : , Catch::Matchers::ExceptionMessage(
3053 : "the --size option was not defined on the command line and it has no or an empty default."));
3054 :
3055 1 : CATCH_REQUIRE_THROWS_MATCHES(
3056 : opt.get_long("size", 1)
3057 : , advgetopt::getopt_exception_logic
3058 : , Catch::Matchers::ExceptionMessage(
3059 : "the --size option was not defined on the command line and it has no or an empty default."));
3060 :
3061 : // other parameters
3062 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3063 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3064 : CATCH_END_SECTION()
3065 3 : }
3066 :
3067 :
3068 :
3069 3 : CATCH_TEST_CASE("incompatible_default_value", "[arguments][invalid][getopt]")
3070 : {
3071 2 : CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
3072 : advgetopt::option const options[] =
3073 : {
3074 : advgetopt::define_option(
3075 : advgetopt::Name("size")
3076 : , advgetopt::ShortName('s')
3077 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3078 : , advgetopt::Help("define the size.")
3079 : , advgetopt::DefaultValue("undefined")
3080 : ),
3081 : advgetopt::end_options()
3082 1 : };
3083 :
3084 1 : advgetopt::options_environment environment_options;
3085 1 : environment_options.f_project_name = "unittest";
3086 1 : environment_options.f_options = options;
3087 1 : environment_options.f_help_header = "Usage: test get_long() functions";
3088 :
3089 : char const * cargv[] =
3090 : {
3091 : "/usr/bin/arguments",
3092 : nullptr
3093 1 : };
3094 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3095 1 : char ** argv = const_cast<char **>(cargv);
3096 :
3097 2 : advgetopt::getopt opt(environment_options, argc, argv);
3098 :
3099 : // check that the result is valid
3100 :
3101 : // an invalid parameter, MUST NOT EXIST
3102 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3103 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3104 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3105 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3106 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3107 :
3108 : // no default
3109 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3110 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3111 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3112 1 : CATCH_REQUIRE(opt.size("--") == 0);
3113 :
3114 : // the valid parameter
3115 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3116 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
3117 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3118 1 : CATCH_REQUIRE(opt.has_default("size"));
3119 1 : CATCH_REQUIRE(opt.get_default("size") == "undefined"); // this works, it fails with get_long() though
3120 1 : CATCH_REQUIRE(opt.size("size") == 0);
3121 :
3122 1 : CATCH_REQUIRE_THROWS_MATCHES(
3123 : opt.get_long("size")
3124 : , advgetopt::getopt_exception_logic
3125 : , Catch::Matchers::ExceptionMessage(
3126 : "invalid default number \"undefined\" for option --size"));
3127 :
3128 1 : CATCH_REQUIRE_THROWS_MATCHES(
3129 : opt.get_long("size", 0)
3130 : , advgetopt::getopt_exception_logic
3131 : , Catch::Matchers::ExceptionMessage(
3132 : "invalid default number \"undefined\" for option --size"));
3133 :
3134 1 : CATCH_REQUIRE_THROWS_MATCHES(
3135 : opt.get_long("size", 1)
3136 : , advgetopt::getopt_exception_logic
3137 : , Catch::Matchers::ExceptionMessage(
3138 : "invalid default number \"undefined\" for option --size"));
3139 :
3140 : // other parameters
3141 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3142 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3143 : CATCH_END_SECTION()
3144 1 : }
3145 :
3146 :
3147 :
3148 4 : CATCH_TEST_CASE("out_of_range_value", "[arguments][invalid][getopt]")
3149 : {
3150 4 : CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
3151 : advgetopt::option const options[] =
3152 : {
3153 : advgetopt::define_option(
3154 : advgetopt::Name("size")
3155 : , advgetopt::ShortName('s')
3156 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3157 : , advgetopt::Help("define the size.")
3158 : , advgetopt::DefaultValue("-300")
3159 : ),
3160 : advgetopt::end_options()
3161 1 : };
3162 :
3163 1 : advgetopt::options_environment environment_options;
3164 1 : environment_options.f_project_name = "unittest";
3165 1 : environment_options.f_options = options;
3166 1 : environment_options.f_help_header = "Usage: test get_long() functions";
3167 :
3168 : char const * cargv[] =
3169 : {
3170 : "/usr/bin/arguments",
3171 : "--size",
3172 : "312",
3173 : nullptr
3174 1 : };
3175 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3176 1 : char ** argv = const_cast<char **>(cargv);
3177 :
3178 2 : advgetopt::getopt opt(environment_options, argc, argv);
3179 :
3180 : // check that the result is valid
3181 :
3182 : // an invalid parameter, MUST NOT EXIST
3183 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3184 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3185 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3186 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3187 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3188 :
3189 : // no default
3190 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3191 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3192 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3193 1 : CATCH_REQUIRE(opt.size("--") == 0);
3194 :
3195 : // the valid parameter
3196 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3197 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
3198 1 : CATCH_REQUIRE(opt.is_defined("size"));
3199 1 : CATCH_REQUIRE(opt.get_string("size") == "312");
3200 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "312");
3201 1 : CATCH_REQUIRE(opt["size"] == "312");
3202 1 : CATCH_REQUIRE(opt.get_long("size") == 312);
3203 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 312);
3204 1 : CATCH_REQUIRE(opt.get_default("size") == "-300");
3205 1 : CATCH_REQUIRE(opt.size("size") == 1);
3206 :
3207 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: 312 is out of bounds (-100..100 inclusive) in parameter --size.");
3208 1 : CATCH_REQUIRE(opt.get_long("size", 0, -100, 100) == -1);
3209 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
3210 :
3211 : // other parameters
3212 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3213 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3214 : CATCH_END_SECTION()
3215 :
3216 4 : CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
3217 : advgetopt::option const options[] =
3218 : {
3219 : advgetopt::define_option(
3220 : advgetopt::Name("size")
3221 : , advgetopt::ShortName('s')
3222 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3223 : , advgetopt::Help("define the size.")
3224 : , advgetopt::DefaultValue("-300")
3225 : ),
3226 : advgetopt::end_options()
3227 1 : };
3228 :
3229 1 : advgetopt::options_environment environment_options;
3230 1 : environment_options.f_project_name = "unittest";
3231 1 : environment_options.f_options = options;
3232 1 : environment_options.f_help_header = "Usage: test get_long() functions";
3233 :
3234 : char const * cargv[] =
3235 : {
3236 : "/usr/bin/arguments",
3237 : nullptr
3238 1 : };
3239 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3240 1 : char ** argv = const_cast<char **>(cargv);
3241 :
3242 2 : advgetopt::getopt opt(environment_options, argc, argv);
3243 :
3244 : // check that the result is valid
3245 :
3246 : // an invalid parameter, MUST NOT EXIST
3247 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3248 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3249 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3250 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3251 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3252 :
3253 : // no default
3254 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3255 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3256 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3257 1 : CATCH_REQUIRE(opt.size("--") == 0);
3258 :
3259 : // the valid parameter
3260 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3261 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
3262 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3263 1 : CATCH_REQUIRE(opt.get_default("size") == "-300");
3264 1 : CATCH_REQUIRE(opt.size("size") == 0);
3265 :
3266 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: -300 is out of bounds (-100..100 inclusive) in parameter --size.");
3267 1 : CATCH_REQUIRE(opt.get_long("size", 0, -100, 100) == -1);
3268 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
3269 :
3270 : // other parameters
3271 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3272 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3273 : CATCH_END_SECTION()
3274 8 : }
3275 :
3276 :
3277 : // vim: ts=4 sw=4 et
|