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