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