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