Line data Source code
1 : // Copyright (c) 2006-2022 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/advgetopt
4 : // contact@m2osw.com
5 : //
6 : // This program is free software; you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation; either version 2 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License along
17 : // with this program; if not, write to the Free Software Foundation, Inc.,
18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 :
20 : // 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 4 : CATCH_TEST_CASE("string_access", "[arguments][valid][getopt]")
55 : {
56 4 : CATCH_START_SECTION("Verify a string in a long argument")
57 1 : advgetopt::option const options[] =
58 : {
59 : advgetopt::define_option(
60 : advgetopt::Name("user-name")
61 : , advgetopt::ShortName('u')
62 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
63 : , advgetopt::Help("check specified user.")
64 : ),
65 : advgetopt::end_options()
66 : };
67 :
68 1 : advgetopt::options_environment environment_options;
69 1 : environment_options.f_project_name = "unittest";
70 1 : environment_options.f_options = options;
71 1 : environment_options.f_help_header = "Usage: user name as a string";
72 :
73 1 : char const * cargv[] =
74 : {
75 : "/usr/bin/arguments",
76 : "--user-name",
77 : "alexis",
78 : nullptr
79 : };
80 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
81 1 : char ** argv = const_cast<char **>(cargv);
82 :
83 2 : advgetopt::getopt opt(environment_options, argc, argv);
84 :
85 : // check that the result is valid
86 :
87 : // an invalid parameter, MUST NOT EXIST
88 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
89 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
90 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
91 1 : CATCH_REQUIRE_FALSE(opt.has_default("invalid-parameter"));
92 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
93 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
94 :
95 : // no default
96 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
97 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
98 1 : CATCH_REQUIRE_FALSE(opt.has_default("--"));
99 1 : CATCH_REQUIRE(opt.get_default("--").empty());
100 1 : CATCH_REQUIRE(opt.size("--") == 0);
101 :
102 : // the valid parameter
103 1 : CATCH_REQUIRE(opt.get_option("user-name") != nullptr);
104 1 : CATCH_REQUIRE(opt.get_option('u') != nullptr);
105 1 : CATCH_REQUIRE(opt.get_string("user-name") == "alexis");
106 1 : CATCH_REQUIRE(opt.get_string("user-name", 0) == "alexis");
107 1 : CATCH_REQUIRE(opt["user-name"] == "alexis");
108 1 : CATCH_REQUIRE(opt.is_defined("user-name"));
109 1 : CATCH_REQUIRE_FALSE(opt.has_default("user-name"));
110 1 : CATCH_REQUIRE(opt.get_default("user-name").empty());
111 1 : CATCH_REQUIRE(opt.size("user-name") == 1);
112 :
113 : // other parameters
114 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
115 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
116 : CATCH_END_SECTION()
117 :
118 4 : CATCH_START_SECTION("Verify a string in a short argument")
119 1 : advgetopt::option const options[] =
120 : {
121 : advgetopt::define_option(
122 : advgetopt::Name("user-name")
123 : , advgetopt::ShortName('u')
124 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
125 : , advgetopt::Help("check specified user.")
126 : ),
127 : advgetopt::end_options()
128 : };
129 :
130 1 : advgetopt::options_environment environment_options;
131 1 : environment_options.f_project_name = "unittest";
132 1 : environment_options.f_options = options;
133 1 : environment_options.f_help_header = "Usage: user name as a string";
134 :
135 1 : char const * cargv[] =
136 : {
137 : "/usr/bin/arguments",
138 : "-u",
139 : "alexis",
140 : nullptr
141 : };
142 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
143 1 : char ** argv = const_cast<char **>(cargv);
144 :
145 2 : advgetopt::getopt opt(environment_options, argc, argv);
146 :
147 : // check that the result is valid
148 :
149 : // an invalid parameter, MUST NOT EXIST
150 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
151 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
152 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
153 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
154 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
155 :
156 : // no default
157 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
158 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
159 1 : CATCH_REQUIRE(opt.get_default("--").empty());
160 1 : CATCH_REQUIRE(opt.size("--") == 0);
161 :
162 : // the valid parameter
163 1 : CATCH_REQUIRE(opt.get_option("user-name") != nullptr);
164 1 : CATCH_REQUIRE(opt.get_option('u') != nullptr);
165 1 : CATCH_REQUIRE(opt.get_string("user-name") == "alexis");
166 1 : CATCH_REQUIRE(opt.get_string("user-name", 0) == "alexis");
167 1 : CATCH_REQUIRE(opt["user-name"] == "alexis");
168 1 : CATCH_REQUIRE(opt.is_defined("user-name"));
169 1 : CATCH_REQUIRE(opt.get_default("user-name").empty());
170 1 : CATCH_REQUIRE(opt.size("user-name") == 1);
171 :
172 : // other parameters
173 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
174 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
175 : CATCH_END_SECTION()
176 2 : }
177 :
178 :
179 5 : CATCH_TEST_CASE("long_access", "[arguments][valid][getopt]")
180 : {
181 6 : CATCH_START_SECTION("Verify an integer (long) value in an argument")
182 1 : long const default_value(rand());
183 2 : std::string const default_value_str(std::to_string(default_value));
184 1 : char const * const default_val(default_value_str.c_str());
185 :
186 1 : advgetopt::option const options[] =
187 : {
188 : advgetopt::define_option(
189 : advgetopt::Name("size")
190 : , advgetopt::ShortName('s')
191 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
192 : , advgetopt::Help("define the size.")
193 : , advgetopt::DefaultValue(default_val)
194 6 : ),
195 : advgetopt::end_options()
196 7 : };
197 :
198 1 : advgetopt::options_environment environment_options;
199 1 : environment_options.f_project_name = "unittest";
200 1 : environment_options.f_options = options;
201 1 : environment_options.f_help_header = "Usage: test get_long() functions";
202 :
203 1 : char const * cargv[] =
204 : {
205 : "/usr/bin/arguments",
206 : "--size",
207 : "9821",
208 : nullptr
209 : };
210 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
211 1 : char ** argv = const_cast<char **>(cargv);
212 :
213 2 : advgetopt::getopt opt(environment_options, argc, argv);
214 :
215 : // check that the result is valid
216 :
217 : // an invalid parameter, MUST NOT EXIST
218 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
219 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
220 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
221 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
222 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
223 :
224 : // no default
225 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
226 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
227 1 : CATCH_REQUIRE(opt.get_default("--").empty());
228 1 : CATCH_REQUIRE(opt.size("--") == 0);
229 :
230 : // the valid parameter
231 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
232 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
233 1 : CATCH_REQUIRE(opt.is_defined("size"));
234 1 : CATCH_REQUIRE(opt.get_string("size") == "9821");
235 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "9821");
236 1 : CATCH_REQUIRE(opt["size"] == "9821");
237 1 : CATCH_REQUIRE(opt.get_long("size") == 9821);
238 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 9821);
239 1 : CATCH_REQUIRE(opt.has_default("size"));
240 1 : CATCH_REQUIRE(opt.get_default("size") == default_value_str);
241 1 : CATCH_REQUIRE(opt.size("size") == 1);
242 :
243 : // other parameters
244 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
245 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
246 : CATCH_END_SECTION()
247 :
248 6 : CATCH_START_SECTION("Verify an integer (long) value in a short argument")
249 1 : advgetopt::option const options[] =
250 : {
251 : advgetopt::define_option(
252 : advgetopt::Name("size")
253 : , advgetopt::ShortName('s')
254 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
255 : , advgetopt::Help("define the size.")
256 : , advgetopt::DefaultValue("")
257 : ),
258 : advgetopt::end_options()
259 : };
260 :
261 1 : advgetopt::options_environment environment_options;
262 1 : environment_options.f_project_name = "unittest";
263 1 : environment_options.f_options = options;
264 1 : environment_options.f_help_header = "Usage: test get_long() functions";
265 :
266 1 : char const * cargv[] =
267 : {
268 : "/usr/bin/arguments",
269 : "-s",
270 : "9821",
271 : nullptr
272 : };
273 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
274 1 : char ** argv = const_cast<char **>(cargv);
275 :
276 2 : advgetopt::getopt opt(environment_options, argc, argv);
277 :
278 : // check that the result is valid
279 :
280 : // an invalid parameter, MUST NOT EXIST
281 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
282 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
283 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
284 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
285 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
286 :
287 : // to reach the constant version `opt` has to be constant
288 2 : std::string const array_syntax_invalid_parameter(static_cast<advgetopt::getopt const &>(opt)["invalid-parameter"]);
289 1 : CATCH_REQUIRE(array_syntax_invalid_parameter == std::string());
290 :
291 : // no default
292 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
293 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
294 1 : CATCH_REQUIRE(opt.get_default("--").empty());
295 1 : CATCH_REQUIRE(opt.size("--") == 0);
296 :
297 : // the valid parameter
298 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
299 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
300 1 : CATCH_REQUIRE(opt.is_defined("size"));
301 1 : CATCH_REQUIRE(opt.get_string("size") == "9821");
302 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "9821");
303 1 : CATCH_REQUIRE(opt["size"] == "9821");
304 1 : CATCH_REQUIRE(opt.get_long("size") == 9821);
305 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 9821);
306 1 : CATCH_REQUIRE(opt.has_default("size"));
307 1 : CATCH_REQUIRE(opt.get_default("size").empty());
308 1 : CATCH_REQUIRE(opt.size("size") == 1);
309 :
310 : // to access the constant reference we need a constant `opt`...
311 2 : std::string const array_syntax1(static_cast<advgetopt::getopt const &>(opt)["size"]);
312 1 : CATCH_REQUIRE(array_syntax1 == "9821");
313 1 : bool const array_syntax2(static_cast<advgetopt::getopt const &>(opt)["size"] == std::string("9821"));
314 1 : CATCH_REQUIRE(array_syntax2);
315 :
316 : // other parameters
317 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
318 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
319 : CATCH_END_SECTION()
320 :
321 6 : CATCH_START_SECTION("Verify an integer (long) value in no arguments")
322 1 : advgetopt::option const options[] =
323 : {
324 : advgetopt::define_option(
325 : advgetopt::Name("size")
326 : , advgetopt::ShortName('s')
327 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
328 : , advgetopt::Help("define the size.")
329 : , advgetopt::DefaultValue("839")
330 : ),
331 : advgetopt::end_options()
332 : };
333 :
334 1 : advgetopt::options_environment environment_options;
335 1 : environment_options.f_project_name = "unittest";
336 1 : environment_options.f_options = options;
337 1 : environment_options.f_help_header = "Usage: test get_long() functions";
338 :
339 1 : char const * cargv[] =
340 : {
341 : "/usr/bin/arguments",
342 : nullptr
343 : };
344 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
345 1 : char ** argv = const_cast<char **>(cargv);
346 :
347 2 : advgetopt::getopt opt(environment_options, argc, argv);
348 :
349 : // check that the result is valid
350 :
351 : // an invalid parameter, MUST NOT EXIST
352 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
353 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
354 1 : CATCH_REQUIRE(opt["invalid-parameter"] == std::string());
355 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
356 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
357 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
358 :
359 : // no default
360 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
361 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
362 1 : CATCH_REQUIRE(opt.get_default("--").empty());
363 1 : CATCH_REQUIRE(opt.size("--") == 0);
364 :
365 : // the valid parameter
366 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
367 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
368 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
369 1 : CATCH_REQUIRE(opt.get_string("size") == "839");
370 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "839");
371 1 : CATCH_REQUIRE(opt.get_long("size") == 839);
372 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 839);
373 1 : CATCH_REQUIRE(opt.has_default("size"));
374 1 : CATCH_REQUIRE(opt.get_default("size") == "839");
375 1 : CATCH_REQUIRE(opt.size("size") == 0);
376 :
377 : // with a constant opt, the array syntax returns the default string
378 1 : CATCH_REQUIRE(static_cast<advgetopt::getopt const &>(opt)["size"] == "839");
379 :
380 : // other parameters
381 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
382 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
383 : CATCH_END_SECTION()
384 3 : }
385 :
386 :
387 :
388 7 : CATCH_TEST_CASE("double_access", "[arguments][valid][getopt]")
389 : {
390 10 : CATCH_START_SECTION("double_access: Verify a double value in an argument")
391 : {
392 1 : long const default_value(rand());
393 2 : 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 : 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 6 : ),
405 : advgetopt::end_options()
406 7 : };
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 2 : 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 : }
464 : CATCH_END_SECTION()
465 :
466 10 : 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 2 : 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 2 : 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 2 : 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 : }
546 : CATCH_END_SECTION()
547 :
548 10 : 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 2 : 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 2 : 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 1 : 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 : }
609 : CATCH_END_SECTION()
610 :
611 10 : 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 2 : 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 2 : 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 1 : 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 : }
674 : CATCH_END_SECTION()
675 :
676 10 : 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 2 : advgetopt::getopt opt(environment_options, argc, argv);
704 :
705 : // check that the result is valid
706 1 : 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 : }
759 : CATCH_END_SECTION()
760 5 : }
761 :
762 :
763 :
764 4 : CATCH_TEST_CASE("system_flags_version", "[arguments][valid][getopt][system_flags]")
765 : {
766 4 : 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 4 : + std::to_string(build_version));
779 :
780 1 : long const default_value(rand());
781 2 : std::string const default_val(std::to_string(default_value));
782 1 : advgetopt::option const options[] =
783 : {
784 : 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 6 : ),
791 : advgetopt::end_options()
792 7 : };
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 2 : 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 2 : 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 : }
861 : CATCH_END_SECTION()
862 :
863 4 : 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 4 : + std::to_string(build_version));
876 :
877 1 : long const default_value(rand());
878 2 : std::string const default_val(std::to_string(default_value));
879 1 : advgetopt::option const options[] =
880 : {
881 : 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 6 : ),
888 : advgetopt::end_options()
889 7 : };
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 2 : 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 2 : 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 : }
956 : CATCH_END_SECTION()
957 2 : }
958 :
959 :
960 :
961 4 : CATCH_TEST_CASE("system_flags_has_sanitizer", "[arguments][valid][getopt][system_flags]")
962 : {
963 4 : CATCH_START_SECTION("Check with the --has-sanitizer system flag")
964 : {
965 1 : long const default_value(rand());
966 2 : std::string const default_val(std::to_string(default_value));
967 1 : advgetopt::option const options[] =
968 : {
969 : 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 6 : ),
976 : advgetopt::end_options()
977 7 : };
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 2 : 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 2 : 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 : }
1061 : CATCH_END_SECTION()
1062 :
1063 4 : 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 2 : std::string const default_val(std::to_string(default_value));
1067 1 : advgetopt::option const options[] =
1068 : {
1069 : 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 6 : ),
1076 : advgetopt::end_options()
1077 7 : };
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 2 : 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 2 : 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 : }
1143 : CATCH_END_SECTION()
1144 2 : }
1145 :
1146 :
1147 :
1148 4 : CATCH_TEST_CASE("system_flags_compiler_version", "[arguments][valid][getopt][system_flags]")
1149 : {
1150 4 : CATCH_START_SECTION("Check with the --compiler-version system flag")
1151 : {
1152 1 : long const default_value(rand());
1153 2 : std::string const default_val(std::to_string(default_value));
1154 1 : advgetopt::option const options[] =
1155 : {
1156 : 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 6 : ),
1163 : advgetopt::end_options()
1164 7 : };
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 2 : 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 2 : 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 : }
1232 : CATCH_END_SECTION()
1233 :
1234 4 : 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 2 : std::string const default_val(std::to_string(default_value));
1238 1 : advgetopt::option const options[] =
1239 : {
1240 : 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 6 : ),
1247 : advgetopt::end_options()
1248 7 : };
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 2 : 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 2 : 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 : }
1314 : CATCH_END_SECTION()
1315 2 : }
1316 :
1317 :
1318 :
1319 7 : CATCH_TEST_CASE("system_flags_help", "[arguments][valid][getopt][system_flags]")
1320 : {
1321 10 : 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 2 : 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 : // 1 -- 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 + 1);
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("help") != list_of_options.end());
1383 1 : CATCH_REQUIRE(list_of_options.find("long-help") != list_of_options.end());
1384 1 : CATCH_REQUIRE(list_of_options.find("version") != list_of_options.end());
1385 1 : CATCH_REQUIRE(list_of_options.find("copyright") != list_of_options.end());
1386 1 : CATCH_REQUIRE(list_of_options.find("license") != list_of_options.end());
1387 1 : CATCH_REQUIRE(list_of_options.find("build-date") != list_of_options.end());
1388 1 : CATCH_REQUIRE(list_of_options.find("environment-variable-name") != list_of_options.end());
1389 1 : CATCH_REQUIRE(list_of_options.find("configuration-filenames") != list_of_options.end());
1390 1 : CATCH_REQUIRE(list_of_options.find("path-to-option-definitions") != list_of_options.end());
1391 :
1392 : // an invalid parameter, MUST NOT EXIST
1393 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1394 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1395 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1396 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1397 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1398 :
1399 : // no default
1400 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1401 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1402 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1403 1 : CATCH_REQUIRE(opt.size("--") == 0);
1404 :
1405 : // valid parameter
1406 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1407 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1408 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1409 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
1410 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
1411 1 : CATCH_REQUIRE(opt["size"] == "33");
1412 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
1413 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
1414 1 : CATCH_REQUIRE(opt.has_default("size"));
1415 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
1416 1 : CATCH_REQUIRE(opt.size("size") == 0);
1417 :
1418 : // help parameter
1419 1 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
1420 1 : CATCH_REQUIRE(opt.get_option('h') == opt.get_option("help"));
1421 1 : CATCH_REQUIRE(opt.is_defined("help"));
1422 1 : CATCH_REQUIRE(opt.get_string("help") == "");
1423 1 : CATCH_REQUIRE(opt.get_string("help", 0) == "");
1424 1 : CATCH_REQUIRE(opt["help"] == "");
1425 1 : CATCH_REQUIRE_FALSE(opt.has_default("help"));
1426 1 : CATCH_REQUIRE(opt.get_default("help").empty());
1427 1 : CATCH_REQUIRE(opt.size("help") == 1);
1428 :
1429 : // other parameters
1430 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1431 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1432 :
1433 : // process system options now
1434 2 : std::stringstream ss;
1435 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1436 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
1437 1 : CATCH_REQUIRE_LONG_STRING(ss.str(),
1438 : advgetopt::breakup_line(
1439 : "Usage: test system commands"
1440 : , 0
1441 : , advgetopt::get_screen_width())
1442 : + advgetopt::format_usage_string(
1443 : "--build-date"
1444 : , "print out the time and date when arguments was built and exit."
1445 : , 30
1446 : , advgetopt::get_screen_width())
1447 : + advgetopt::format_usage_string(
1448 : "--compiler-version"
1449 : , "print the version of the compiler used to compile the advgetopt library."
1450 : , 30
1451 : , advgetopt::get_screen_width())
1452 : + advgetopt::format_usage_string(
1453 : "--configuration-filenames"
1454 : , "print out the list of configuration files checked out by this"
1455 : " tool."
1456 : , 30
1457 : , advgetopt::get_screen_width())
1458 : + advgetopt::format_usage_string(
1459 : "--copyright or -C"
1460 : , "print out the copyright of arguments and exit."
1461 : , 30
1462 : , advgetopt::get_screen_width())
1463 : + advgetopt::format_usage_string(
1464 : "--environment-variable-name"
1465 : , "print out the name of the environment variable supported by"
1466 : " arguments (if any.)"
1467 : , 30
1468 : , advgetopt::get_screen_width())
1469 : + advgetopt::format_usage_string(
1470 : "--has-sanitizer"
1471 : , "print whether the advgetopt was compiled with the sanitizer extension."
1472 : , 30
1473 : , advgetopt::get_screen_width())
1474 : + advgetopt::format_usage_string(
1475 : "--help or -h"
1476 : , "print out this help screen and exit."
1477 : , 30
1478 : , advgetopt::get_screen_width())
1479 : + advgetopt::format_usage_string(
1480 : "--license or -L"
1481 : , "print out the license of arguments and exit."
1482 : , 30
1483 : , advgetopt::get_screen_width())
1484 : + advgetopt::format_usage_string(
1485 : "--long-help or -?"
1486 : , "show all the help from all the available options."
1487 : , 30
1488 : , advgetopt::get_screen_width())
1489 : + advgetopt::format_usage_string(
1490 : "--path-to-option-definitions"
1491 : , "print out the path to the option definitions."
1492 : , 30
1493 : , advgetopt::get_screen_width())
1494 : + advgetopt::format_usage_string(
1495 : "--print-option <arg>"
1496 : , "print the value of the named option after loading all the command line options."
1497 : , 30
1498 : , advgetopt::get_screen_width())
1499 : + advgetopt::format_usage_string(
1500 : "--show-option-sources"
1501 : , "parse all the options and then print out the source of each"
1502 : " value and each override."
1503 : , 30
1504 : , advgetopt::get_screen_width())
1505 : + advgetopt::format_usage_string(
1506 : "--size or -s <arg> (default is \"33\")"
1507 : , "define the size."
1508 : , 30
1509 : , advgetopt::get_screen_width())
1510 : + advgetopt::format_usage_string(
1511 : "--version or -V"
1512 : , "print out the version of arguments and exit."
1513 : , 30
1514 : , advgetopt::get_screen_width())
1515 : + "\n"
1516 : "Copyright matters\n"
1517 : "\n"
1518 : );
1519 : }
1520 : CATCH_END_SECTION()
1521 :
1522 10 : CATCH_START_SECTION("Check with the --long-help system flag")
1523 : {
1524 1 : advgetopt::option const options[] =
1525 : {
1526 : advgetopt::define_option(
1527 : advgetopt::Name("size")
1528 : , advgetopt::ShortName('s')
1529 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1530 : , advgetopt::Help("define the size.")
1531 : , advgetopt::DefaultValue("33")
1532 : ),
1533 : advgetopt::define_option(
1534 : advgetopt::Name("obscure")
1535 : , advgetopt::ShortName('o')
1536 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1537 : , advgetopt::GETOPT_FLAG_SHOW_GROUP1>())
1538 : , advgetopt::Help("obscure command, hidden by default.")
1539 : ),
1540 : advgetopt::define_option(
1541 : advgetopt::Name("secret")
1542 : , advgetopt::ShortName('S')
1543 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1544 : , advgetopt::GETOPT_FLAG_SHOW_GROUP2>())
1545 : , advgetopt::Help("even more secret command, hidden by default.")
1546 : ),
1547 : advgetopt::end_options()
1548 : };
1549 :
1550 1 : advgetopt::options_environment environment_options;
1551 1 : environment_options.f_project_name = "unittest";
1552 1 : environment_options.f_options = options;
1553 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1554 1 : environment_options.f_help_header = "Usage: test system commands";
1555 1 : environment_options.f_help_footer = "Copyright matters";
1556 :
1557 1 : char const * cargv[] =
1558 : {
1559 : "/usr/bin/arguments",
1560 : "--long-help",
1561 : nullptr
1562 : };
1563 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1564 1 : char ** argv = const_cast<char **>(cargv);
1565 :
1566 2 : advgetopt::getopt opt(environment_options, argc, argv);
1567 :
1568 1 : CATCH_REQUIRE(opt.get_group_name() == std::string());
1569 :
1570 : // check that the result is valid
1571 :
1572 : // an invalid parameter, MUST NOT EXIST
1573 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1574 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1575 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1576 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1577 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1578 :
1579 : // no default
1580 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1581 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1582 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1583 1 : CATCH_REQUIRE(opt.size("--") == 0);
1584 :
1585 : // valid parameter
1586 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1587 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1588 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1589 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
1590 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
1591 1 : CATCH_REQUIRE(opt["size"] == "33");
1592 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
1593 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
1594 1 : CATCH_REQUIRE(opt.has_default("size"));
1595 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
1596 1 : CATCH_REQUIRE(opt.size("size") == 0);
1597 :
1598 : // help parameter
1599 1 : CATCH_REQUIRE(opt.get_option("long-help") != nullptr);
1600 1 : CATCH_REQUIRE(opt.get_option('?') == opt.get_option("long-help"));
1601 1 : CATCH_REQUIRE(opt.is_defined("long-help"));
1602 1 : CATCH_REQUIRE(opt.get_string("long-help") == "");
1603 1 : CATCH_REQUIRE(opt.get_string("long-help", 0) == "");
1604 1 : CATCH_REQUIRE(opt["long-help"] == "");
1605 1 : CATCH_REQUIRE_FALSE(opt.has_default("long-help"));
1606 1 : CATCH_REQUIRE(opt.get_default("long-help").empty());
1607 1 : CATCH_REQUIRE(opt.size("long-help") == 1);
1608 :
1609 : // other parameters
1610 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1611 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1612 :
1613 : // process system options now
1614 2 : std::stringstream ss;
1615 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1616 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
1617 1 : CATCH_REQUIRE_LONG_STRING(ss.str(),
1618 : advgetopt::breakup_line(
1619 : "Usage: test system commands"
1620 : , 0
1621 : , advgetopt::get_screen_width())
1622 : + advgetopt::format_usage_string(
1623 : "--build-date"
1624 : , "print out the time and date when arguments was built and exit."
1625 : , 30
1626 : , advgetopt::get_screen_width())
1627 : + advgetopt::format_usage_string(
1628 : "--compiler-version"
1629 : , "print the version of the compiler used to compile the advgetopt library."
1630 : , 30
1631 : , advgetopt::get_screen_width())
1632 : + advgetopt::format_usage_string(
1633 : "--configuration-filenames"
1634 : , "print out the list of configuration files checked out by this"
1635 : " tool."
1636 : , 30
1637 : , advgetopt::get_screen_width())
1638 : + advgetopt::format_usage_string(
1639 : "--copyright or -C"
1640 : , "print out the copyright of arguments and exit."
1641 : , 30
1642 : , advgetopt::get_screen_width())
1643 : + advgetopt::format_usage_string(
1644 : "--environment-variable-name"
1645 : , "print out the name of the environment variable supported by"
1646 : " arguments (if any.)"
1647 : , 30
1648 : , advgetopt::get_screen_width())
1649 : + advgetopt::format_usage_string(
1650 : "--has-sanitizer"
1651 : , "print whether the advgetopt was compiled with the sanitizer extension."
1652 : , 30
1653 : , advgetopt::get_screen_width())
1654 : + advgetopt::format_usage_string(
1655 : "--help or -h"
1656 : , "print out this help screen and exit."
1657 : , 30
1658 : , advgetopt::get_screen_width())
1659 : + advgetopt::format_usage_string(
1660 : "--license or -L"
1661 : , "print out the license of arguments and exit."
1662 : , 30
1663 : , advgetopt::get_screen_width())
1664 : + advgetopt::format_usage_string(
1665 : "--long-help or -?"
1666 : , "show all the help from all the available options."
1667 : , 30
1668 : , advgetopt::get_screen_width())
1669 : + advgetopt::format_usage_string(
1670 : "--obscure or -o <arg>"
1671 : , "obscure command, hidden by default."
1672 : , 30
1673 : , advgetopt::get_screen_width())
1674 : + advgetopt::format_usage_string(
1675 : "--path-to-option-definitions"
1676 : , "print out the path to the option definitions."
1677 : , 30
1678 : , advgetopt::get_screen_width())
1679 : + advgetopt::format_usage_string(
1680 : "--print-option <arg>"
1681 : , "print the value of the named option after loading all the command line options."
1682 : , 30
1683 : , advgetopt::get_screen_width())
1684 : + advgetopt::format_usage_string(
1685 : "--secret or -S <arg>"
1686 : , "even more secret command, hidden by default."
1687 : , 30
1688 : , advgetopt::get_screen_width())
1689 : + advgetopt::format_usage_string(
1690 : "--show-option-sources"
1691 : , "parse all the options and then print out the source of each"
1692 : " value and each override."
1693 : , 30
1694 : , advgetopt::get_screen_width())
1695 : + advgetopt::format_usage_string(
1696 : "--size or -s <arg> (default is \"33\")"
1697 : , "define the size."
1698 : , 30
1699 : , advgetopt::get_screen_width())
1700 : + advgetopt::format_usage_string(
1701 : "--version or -V"
1702 : , "print out the version of arguments and exit."
1703 : , 30
1704 : , advgetopt::get_screen_width())
1705 : + "\n"
1706 : "Copyright matters\n"
1707 : "\n"
1708 : );
1709 : }
1710 : CATCH_END_SECTION()
1711 :
1712 10 : CATCH_START_SECTION("Check with the --help system flag, without a --help on the command line")
1713 1 : advgetopt::option const options[] =
1714 : {
1715 : advgetopt::define_option(
1716 : advgetopt::Name("size")
1717 : , advgetopt::ShortName('s')
1718 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1719 : , advgetopt::Help("define the size.")
1720 : , advgetopt::DefaultValue("33")
1721 : ),
1722 : advgetopt::end_options()
1723 : };
1724 :
1725 1 : advgetopt::options_environment environment_options;
1726 1 : environment_options.f_project_name = "unittest";
1727 1 : environment_options.f_options = options;
1728 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1729 1 : environment_options.f_help_header = "Usage: test system commands";
1730 1 : environment_options.f_help_footer = "Copyright matters";
1731 :
1732 1 : char const * cargv[] =
1733 : {
1734 : "/usr/bin/arguments",
1735 : "--size",
1736 : "1221",
1737 : nullptr
1738 : };
1739 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1740 1 : char ** argv = const_cast<char **>(cargv);
1741 :
1742 2 : advgetopt::getopt opt(environment_options, argc, argv);
1743 :
1744 : // check that the result is valid
1745 :
1746 : // an invalid parameter, MUST NOT EXIST
1747 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1748 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1749 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1750 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1751 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1752 :
1753 : // no default
1754 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1755 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1756 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1757 1 : CATCH_REQUIRE(opt.size("--") == 0);
1758 :
1759 : // valid parameter
1760 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1761 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1762 1 : CATCH_REQUIRE(opt.is_defined("size"));
1763 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
1764 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
1765 1 : CATCH_REQUIRE(opt["size"] == "1221");
1766 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
1767 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
1768 1 : CATCH_REQUIRE(opt.has_default("size"));
1769 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
1770 1 : CATCH_REQUIRE(opt.size("size") == 1);
1771 :
1772 : // help parameter
1773 1 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
1774 1 : CATCH_REQUIRE(opt.get_option('h') == opt.get_option("help"));
1775 1 : CATCH_REQUIRE_FALSE(opt.is_defined("help"));
1776 1 : CATCH_REQUIRE_FALSE(opt.has_default("help"));
1777 1 : CATCH_REQUIRE(opt.get_default("help").empty());
1778 1 : CATCH_REQUIRE(opt.size("help") == 0);
1779 :
1780 : // other parameters
1781 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1782 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1783 :
1784 : // process system options now
1785 2 : std::stringstream ss;
1786 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1787 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
1788 1 : CATCH_REQUIRE(ss.str().empty());
1789 : CATCH_END_SECTION()
1790 :
1791 10 : CATCH_START_SECTION("Check with the --commmands-help system flag")
1792 : {
1793 1 : advgetopt::option const options[] =
1794 : {
1795 : advgetopt::define_option(
1796 : advgetopt::Name("size")
1797 : , advgetopt::ShortName('s')
1798 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1799 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
1800 : , advgetopt::Help("define the size.")
1801 : , advgetopt::DefaultValue("33")
1802 : ),
1803 : advgetopt::define_option(
1804 : advgetopt::Name("obscure")
1805 : , advgetopt::ShortName('o')
1806 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1807 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
1808 : , advgetopt::Help("obscure command, hidden by default.")
1809 : ),
1810 : advgetopt::define_option(
1811 : advgetopt::Name("secret")
1812 : , advgetopt::ShortName('S')
1813 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
1814 : , advgetopt::GETOPT_FLAG_GROUP_OPTIONS>())
1815 : , advgetopt::Help("even more secret command, hidden by default.")
1816 : ),
1817 : advgetopt::end_options()
1818 : };
1819 :
1820 1 : advgetopt::group_description const groups[] =
1821 : {
1822 : advgetopt::define_group(
1823 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_COMMANDS)
1824 : , advgetopt::GroupName("commands")
1825 : , advgetopt::GroupDescription("Commands:")
1826 : ),
1827 : advgetopt::define_group(
1828 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_OPTIONS)
1829 : , advgetopt::GroupName("option")
1830 : , advgetopt::GroupDescription("Options:")
1831 : ),
1832 : advgetopt::end_groups()
1833 : };
1834 :
1835 1 : advgetopt::options_environment environment_options;
1836 1 : environment_options.f_project_name = "unittest";
1837 1 : environment_options.f_options = options;
1838 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1839 1 : environment_options.f_help_header = "Usage: test system commands";
1840 1 : environment_options.f_help_footer = "Copyright matters";
1841 1 : environment_options.f_groups = groups;
1842 :
1843 1 : char const * cargv[] =
1844 : {
1845 : "/usr/bin/arguments",
1846 : "--commands-help",
1847 : nullptr
1848 : };
1849 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1850 1 : char ** argv = const_cast<char **>(cargv);
1851 :
1852 2 : advgetopt::getopt opt(environment_options, argc, argv);
1853 :
1854 : // check that the result is valid
1855 :
1856 : // an invalid parameter, MUST NOT EXIST
1857 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1858 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1859 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1860 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1861 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1862 :
1863 : // no default
1864 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
1865 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
1866 1 : CATCH_REQUIRE(opt.get_default("--").empty());
1867 1 : CATCH_REQUIRE(opt.size("--") == 0);
1868 :
1869 : // valid parameter
1870 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
1871 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
1872 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
1873 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
1874 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
1875 1 : CATCH_REQUIRE(opt["size"] == "33");
1876 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
1877 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
1878 1 : CATCH_REQUIRE(opt.has_default("size"));
1879 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
1880 1 : CATCH_REQUIRE(opt.size("size") == 0);
1881 :
1882 : // help parameter
1883 1 : CATCH_REQUIRE(opt.get_option("commands-help") != nullptr);
1884 1 : CATCH_REQUIRE(opt.is_defined("commands-help"));
1885 1 : CATCH_REQUIRE(opt.get_string("commands-help") == "");
1886 1 : CATCH_REQUIRE(opt.get_string("commands-help", 0) == "");
1887 1 : CATCH_REQUIRE(opt["commands-help"] == "");
1888 1 : CATCH_REQUIRE_FALSE(opt.has_default("commands-help"));
1889 1 : CATCH_REQUIRE(opt.get_default("commands-help").empty());
1890 1 : CATCH_REQUIRE(opt.size("commands-help") == 1);
1891 :
1892 : // other parameters
1893 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1894 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1895 :
1896 : // process system options now
1897 2 : std::stringstream ss;
1898 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
1899 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
1900 1 : CATCH_REQUIRE_LONG_STRING(ss.str(),
1901 : advgetopt::breakup_line(
1902 : "Usage: test system commands"
1903 : , 0
1904 : , advgetopt::get_screen_width())
1905 : + "\n"
1906 : "Commands:\n"
1907 : + advgetopt::format_usage_string(
1908 : "--build-date"
1909 : , "print out the time and date when arguments was built and exit."
1910 : , 30
1911 : , advgetopt::get_screen_width())
1912 : + advgetopt::format_usage_string(
1913 : "--commands-help"
1914 : , "show help from the \"commands\" group of options."
1915 : , 30
1916 : , advgetopt::get_screen_width())
1917 : + advgetopt::format_usage_string(
1918 : "--compiler-version"
1919 : , "print the version of the compiler used to compile the advgetopt library."
1920 : , 30
1921 : , advgetopt::get_screen_width())
1922 : + advgetopt::format_usage_string(
1923 : "--configuration-filenames"
1924 : , "print out the list of configuration files checked out by this"
1925 : " tool."
1926 : , 30
1927 : , advgetopt::get_screen_width())
1928 : + advgetopt::format_usage_string(
1929 : "--copyright or -C"
1930 : , "print out the copyright of arguments and exit."
1931 : , 30
1932 : , advgetopt::get_screen_width())
1933 : + advgetopt::format_usage_string(
1934 : "--environment-variable-name"
1935 : , "print out the name of the environment variable supported by"
1936 : " arguments (if any.)"
1937 : , 30
1938 : , advgetopt::get_screen_width())
1939 : + advgetopt::format_usage_string(
1940 : "--has-sanitizer"
1941 : , "print whether the advgetopt was compiled with the sanitizer extension."
1942 : , 30
1943 : , advgetopt::get_screen_width())
1944 : + advgetopt::format_usage_string(
1945 : "--help or -h"
1946 : , "print out this help screen and exit."
1947 : , 30
1948 : , advgetopt::get_screen_width())
1949 : + advgetopt::format_usage_string(
1950 : "--license or -L"
1951 : , "print out the license of arguments and exit."
1952 : , 30
1953 : , advgetopt::get_screen_width())
1954 : + advgetopt::format_usage_string(
1955 : "--obscure or -o <arg>"
1956 : , "obscure command, hidden by default."
1957 : , 30
1958 : , advgetopt::get_screen_width())
1959 : + advgetopt::format_usage_string(
1960 : "--option-help"
1961 : , "show help from the \"option\" group of options."
1962 : , 30
1963 : , advgetopt::get_screen_width())
1964 : + advgetopt::format_usage_string(
1965 : "--path-to-option-definitions"
1966 : , "print out the path to the option definitions."
1967 : , 30
1968 : , advgetopt::get_screen_width())
1969 : + advgetopt::format_usage_string(
1970 : "--print-option <arg>"
1971 : , "print the value of the named option after loading all the command line options."
1972 : , 30
1973 : , advgetopt::get_screen_width())
1974 : + advgetopt::format_usage_string(
1975 : "--show-option-sources"
1976 : , "parse all the options and then print out the source of each"
1977 : " value and each override."
1978 : , 30
1979 : , advgetopt::get_screen_width())
1980 : + advgetopt::format_usage_string(
1981 : "--size or -s <arg> (default is \"33\")"
1982 : , "define the size."
1983 : , 30
1984 : , advgetopt::get_screen_width())
1985 : + advgetopt::format_usage_string(
1986 : "--version or -V"
1987 : , "print out the version of arguments and exit."
1988 : , 30
1989 : , advgetopt::get_screen_width())
1990 : + "\n"
1991 : "Copyright matters\n"
1992 : "\n"
1993 : );
1994 : }
1995 : CATCH_END_SECTION()
1996 :
1997 10 : CATCH_START_SECTION("Check with the --options-help system flag")
1998 : {
1999 1 : advgetopt::option const options[] =
2000 : {
2001 : advgetopt::define_option(
2002 : advgetopt::Name("size")
2003 : , advgetopt::ShortName('s')
2004 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
2005 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
2006 : , advgetopt::Help("define the size.")
2007 : , advgetopt::DefaultValue("33")
2008 : ),
2009 : advgetopt::define_option(
2010 : advgetopt::Name("obscure")
2011 : , advgetopt::ShortName('o')
2012 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
2013 : , advgetopt::GETOPT_FLAG_GROUP_COMMANDS>())
2014 : , advgetopt::Help("obscure command, hidden by default.")
2015 : ),
2016 : advgetopt::define_option(
2017 : advgetopt::Name("secret")
2018 : , advgetopt::ShortName('S')
2019 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED
2020 : , advgetopt::GETOPT_FLAG_GROUP_OPTIONS>())
2021 : , advgetopt::Help("even more secret command, hidden by default.")
2022 : ),
2023 : advgetopt::end_options()
2024 : };
2025 :
2026 1 : advgetopt::group_description const groups[] =
2027 : {
2028 : advgetopt::define_group(
2029 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_COMMANDS)
2030 : , advgetopt::GroupName("commands")
2031 : , advgetopt::GroupDescription("Commands:")
2032 : ),
2033 : advgetopt::define_group(
2034 : advgetopt::GroupNumber(advgetopt::GETOPT_FLAG_GROUP_OPTIONS)
2035 : , advgetopt::GroupName("options")
2036 : , advgetopt::GroupDescription("Options:")
2037 : ),
2038 : advgetopt::end_groups()
2039 : };
2040 :
2041 1 : advgetopt::options_environment environment_options;
2042 1 : environment_options.f_project_name = "unittest";
2043 1 : environment_options.f_options = options;
2044 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2045 1 : environment_options.f_help_header = "Usage: test system commands";
2046 1 : environment_options.f_help_footer = "Copyright matters";
2047 1 : environment_options.f_groups = groups;
2048 :
2049 1 : char const * cargv[] =
2050 : {
2051 : "/usr/bin/arguments",
2052 : "--options-help",
2053 : nullptr
2054 : };
2055 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2056 1 : char ** argv = const_cast<char **>(cargv);
2057 :
2058 2 : advgetopt::getopt opt(environment_options, argc, argv);
2059 :
2060 : // check that the result is valid
2061 :
2062 : // an invalid parameter, MUST NOT EXIST
2063 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2064 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2065 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2066 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2067 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2068 :
2069 : // no default
2070 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2071 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2072 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2073 1 : CATCH_REQUIRE(opt.size("--") == 0);
2074 :
2075 : // valid parameter
2076 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2077 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2078 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2079 1 : CATCH_REQUIRE(opt.get_string("size") == "33");
2080 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "33");
2081 1 : CATCH_REQUIRE(opt["size"] == "33");
2082 1 : CATCH_REQUIRE(opt.get_long("size") == 33);
2083 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 33);
2084 1 : CATCH_REQUIRE(opt.has_default("size"));
2085 1 : CATCH_REQUIRE(opt.get_default("size") == "33");
2086 1 : CATCH_REQUIRE(opt.size("size") == 0);
2087 :
2088 : // help parameter
2089 1 : CATCH_REQUIRE(opt.get_option("options-help") != nullptr);
2090 1 : CATCH_REQUIRE(opt.is_defined("options-help"));
2091 1 : CATCH_REQUIRE(opt.get_string("options-help") == "");
2092 1 : CATCH_REQUIRE(opt.get_string("options-help", 0) == "");
2093 1 : CATCH_REQUIRE(opt["options-help"] == "");
2094 1 : CATCH_REQUIRE_FALSE(opt.has_default("options-help"));
2095 1 : CATCH_REQUIRE(opt.get_default("options-help").empty());
2096 1 : CATCH_REQUIRE(opt.size("options-help") == 1);
2097 :
2098 : // other parameters
2099 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2100 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2101 :
2102 : // process system options now
2103 2 : std::stringstream ss;
2104 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2105 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_HELP);
2106 1 : CATCH_REQUIRE_LONG_STRING(ss.str(),
2107 : "Usage: test system commands\n"
2108 : "\n"
2109 : "Options:\n"
2110 : " --secret or -S <arg> even more secret command, hidden by default.\n"
2111 : "\n"
2112 : "Copyright matters\n"
2113 : "\n"
2114 : );
2115 : }
2116 : CATCH_END_SECTION()
2117 5 : }
2118 :
2119 :
2120 :
2121 4 : CATCH_TEST_CASE("system_flags_copyright", "[arguments][valid][getopt][system_flags]")
2122 : {
2123 4 : CATCH_START_SECTION("Check with the --copyright system flag")
2124 : {
2125 1 : advgetopt::option const options[] =
2126 : {
2127 : advgetopt::define_option(
2128 : advgetopt::Name("size")
2129 : , advgetopt::ShortName('s')
2130 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2131 : , advgetopt::Help("define the size.")
2132 : , advgetopt::DefaultValue("23")
2133 : ),
2134 : advgetopt::end_options()
2135 : };
2136 :
2137 1 : advgetopt::options_environment environment_options;
2138 1 : environment_options.f_project_name = "unittest";
2139 1 : environment_options.f_options = options;
2140 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2141 1 : environment_options.f_copyright = "Copyright (c) " BOOST_PP_STRINGIZE(UTC_BUILD_YEAR) " Made to Order Software Corporation";
2142 :
2143 1 : char const * cargv[] =
2144 : {
2145 : "/usr/bin/arguments",
2146 : "--copyright",
2147 : nullptr
2148 : };
2149 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2150 1 : char ** argv = const_cast<char **>(cargv);
2151 :
2152 2 : advgetopt::getopt opt(environment_options, argc, argv);
2153 :
2154 : // check that the result is valid
2155 :
2156 : // an invalid parameter, MUST NOT EXIST
2157 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2158 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2159 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2160 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2161 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2162 :
2163 : // no default
2164 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2165 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2166 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2167 1 : CATCH_REQUIRE(opt.size("--") == 0);
2168 :
2169 : // valid parameter
2170 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2171 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2172 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2173 1 : CATCH_REQUIRE(opt.get_string("size") == "23");
2174 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "23");
2175 1 : CATCH_REQUIRE(opt["size"] == "23");
2176 1 : CATCH_REQUIRE(opt.get_long("size") == 23);
2177 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 23);
2178 1 : CATCH_REQUIRE(opt.has_default("size"));
2179 1 : CATCH_REQUIRE(opt.get_default("size") == "23");
2180 1 : CATCH_REQUIRE(opt.size("size") == 0);
2181 :
2182 : // copyright parameter
2183 1 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2184 1 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2185 1 : CATCH_REQUIRE(opt.is_defined("copyright"));
2186 1 : CATCH_REQUIRE(opt.get_string("copyright") == "");
2187 1 : CATCH_REQUIRE(opt.get_string("copyright", 0) == "");
2188 1 : CATCH_REQUIRE(opt["copyright"] == "");
2189 1 : CATCH_REQUIRE_FALSE(opt.has_default("copyright"));
2190 1 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2191 1 : CATCH_REQUIRE(opt.size("copyright") == 1);
2192 :
2193 : // other parameters
2194 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2195 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2196 :
2197 : // process system options now
2198 2 : std::stringstream ss;
2199 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2200 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_COPYRIGHT);
2201 1 : CATCH_REQUIRE(ss.str() == "Copyright (c) " BOOST_PP_STRINGIZE(UTC_BUILD_YEAR) " Made to Order Software Corporation\n");
2202 : }
2203 : CATCH_END_SECTION()
2204 :
2205 4 : CATCH_START_SECTION("Check with the --copyright system flag, without a --copyright on the command line")
2206 1 : advgetopt::option const options[] =
2207 : {
2208 : advgetopt::define_option(
2209 : advgetopt::Name("size")
2210 : , advgetopt::ShortName('s')
2211 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2212 : , advgetopt::Help("define the size.")
2213 : , advgetopt::DefaultValue("53")
2214 : ),
2215 : advgetopt::end_options()
2216 : };
2217 :
2218 1 : advgetopt::options_environment environment_options;
2219 1 : environment_options.f_project_name = "unittest";
2220 1 : environment_options.f_options = options;
2221 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2222 1 : environment_options.f_help_header = "Usage: test system commands";
2223 1 : environment_options.f_help_footer = "Copyright matters";
2224 :
2225 1 : char const * cargv[] =
2226 : {
2227 : "/usr/bin/arguments",
2228 : "--size",
2229 : "1221",
2230 : nullptr
2231 : };
2232 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2233 1 : char ** argv = const_cast<char **>(cargv);
2234 :
2235 2 : advgetopt::getopt opt(environment_options, argc, argv);
2236 :
2237 : // check that the result is valid
2238 :
2239 : // an invalid parameter, MUST NOT EXIST
2240 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2241 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2242 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2243 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2244 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2245 :
2246 : // no default
2247 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2248 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2249 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2250 1 : CATCH_REQUIRE(opt.size("--") == 0);
2251 :
2252 : // valid parameter
2253 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2254 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2255 1 : CATCH_REQUIRE(opt.is_defined("size"));
2256 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
2257 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
2258 1 : CATCH_REQUIRE(opt["size"] == "1221");
2259 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
2260 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
2261 1 : CATCH_REQUIRE(opt.has_default("size"));
2262 1 : CATCH_REQUIRE(opt.get_default("size") == "53");
2263 1 : CATCH_REQUIRE(opt.size("size") == 1);
2264 :
2265 : // copyright parameter
2266 1 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2267 1 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2268 1 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2269 1 : CATCH_REQUIRE_FALSE(opt.has_default("copyright"));
2270 1 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2271 1 : CATCH_REQUIRE(opt.size("copyright") == 0);
2272 :
2273 : // other parameters
2274 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2275 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2276 :
2277 : // process system options now
2278 2 : std::stringstream ss;
2279 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2280 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2281 1 : CATCH_REQUIRE(ss.str().empty());
2282 : CATCH_END_SECTION()
2283 2 : }
2284 :
2285 :
2286 :
2287 4 : CATCH_TEST_CASE("system_flags_license", "[arguments][valid][getopt][system_flags]")
2288 : {
2289 4 : CATCH_START_SECTION("Check with the --license system flag")
2290 : {
2291 1 : advgetopt::option const options[] =
2292 : {
2293 : advgetopt::define_option(
2294 : advgetopt::Name("size")
2295 : , advgetopt::ShortName('s')
2296 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2297 : , advgetopt::Help("define the size.")
2298 : , advgetopt::DefaultValue("73")
2299 : ),
2300 : advgetopt::end_options()
2301 : };
2302 :
2303 1 : advgetopt::options_environment environment_options;
2304 1 : environment_options.f_project_name = "unittest";
2305 1 : environment_options.f_options = options;
2306 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2307 1 : environment_options.f_license = "GPL v2";
2308 :
2309 1 : char const * cargv[] =
2310 : {
2311 : "/usr/bin/arguments",
2312 : "--license",
2313 : nullptr
2314 : };
2315 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2316 1 : char ** argv = const_cast<char **>(cargv);
2317 :
2318 2 : advgetopt::getopt opt(environment_options, argc, argv);
2319 :
2320 : // check that the result is valid
2321 :
2322 : // an invalid parameter, MUST NOT EXIST
2323 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2324 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2325 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2326 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2327 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2328 :
2329 : // no default
2330 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2331 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2332 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2333 1 : CATCH_REQUIRE(opt.size("--") == 0);
2334 :
2335 : // valid parameter
2336 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2337 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2338 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2339 1 : CATCH_REQUIRE(opt.get_string("size") == "73");
2340 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "73");
2341 1 : CATCH_REQUIRE(opt["size"] == "73");
2342 1 : CATCH_REQUIRE(opt.get_long("size") == 73);
2343 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 73);
2344 1 : CATCH_REQUIRE(opt.has_default("size"));
2345 1 : CATCH_REQUIRE(opt.get_default("size") == "73");
2346 1 : CATCH_REQUIRE(opt.size("size") == 0);
2347 :
2348 : // license parameter
2349 1 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2350 1 : CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
2351 1 : CATCH_REQUIRE(opt.is_defined("license"));
2352 1 : CATCH_REQUIRE(opt.get_string("license") == "");
2353 1 : CATCH_REQUIRE(opt.get_string("license", 0) == "");
2354 1 : CATCH_REQUIRE(opt["license"] == "");
2355 1 : CATCH_REQUIRE_FALSE(opt.has_default("license"));
2356 1 : CATCH_REQUIRE(opt.get_default("license").empty());
2357 1 : CATCH_REQUIRE(opt.size("license") == 1);
2358 :
2359 : // other parameters
2360 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2361 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2362 :
2363 : // process system options now
2364 2 : std::stringstream ss;
2365 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2366 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_LICENSE);
2367 1 : CATCH_REQUIRE(ss.str() == "GPL v2\n");
2368 : }
2369 : CATCH_END_SECTION()
2370 :
2371 4 : CATCH_START_SECTION("Check with the --license system flag, without a --license on the command line")
2372 1 : advgetopt::option const options[] =
2373 : {
2374 : advgetopt::define_option(
2375 : advgetopt::Name("size")
2376 : , advgetopt::ShortName('s')
2377 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2378 : , advgetopt::Help("define the size.")
2379 : , advgetopt::DefaultValue("103")
2380 : ),
2381 : advgetopt::end_options()
2382 : };
2383 :
2384 1 : advgetopt::options_environment environment_options;
2385 1 : environment_options.f_project_name = "unittest";
2386 1 : environment_options.f_options = options;
2387 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2388 1 : environment_options.f_help_header = "Usage: test system commands";
2389 1 : environment_options.f_help_footer = "Copyright matters";
2390 :
2391 1 : char const * cargv[] =
2392 : {
2393 : "/usr/bin/arguments",
2394 : "--size",
2395 : "1221",
2396 : nullptr
2397 : };
2398 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2399 1 : char ** argv = const_cast<char **>(cargv);
2400 :
2401 2 : advgetopt::getopt opt(environment_options, argc, argv);
2402 :
2403 : // check that the result is valid
2404 :
2405 : // an invalid parameter, MUST NOT EXIST
2406 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2407 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2408 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2409 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2410 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2411 :
2412 : // no default
2413 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2414 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2415 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2416 1 : CATCH_REQUIRE(opt.size("--") == 0);
2417 :
2418 : // valid parameter
2419 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2420 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2421 1 : CATCH_REQUIRE(opt.is_defined("size"));
2422 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
2423 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
2424 1 : CATCH_REQUIRE(opt["size"] == "1221");
2425 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
2426 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
2427 1 : CATCH_REQUIRE(opt.has_default("size"));
2428 1 : CATCH_REQUIRE(opt.get_default("size") == "103");
2429 1 : CATCH_REQUIRE(opt.size("size") == 1);
2430 :
2431 : // license parameter
2432 1 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2433 1 : CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
2434 1 : CATCH_REQUIRE_FALSE(opt.is_defined("license"));
2435 1 : CATCH_REQUIRE_FALSE(opt.has_default("license"));
2436 1 : CATCH_REQUIRE(opt.get_default("license").empty());
2437 1 : CATCH_REQUIRE(opt.size("license") == 0);
2438 :
2439 : // other parameters
2440 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2441 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2442 :
2443 : // process system options now
2444 2 : std::stringstream ss;
2445 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2446 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2447 1 : CATCH_REQUIRE(ss.str().empty());
2448 : CATCH_END_SECTION()
2449 2 : }
2450 :
2451 :
2452 :
2453 4 : CATCH_TEST_CASE("system_flags_build_date", "[arguments][valid][getopt][system_flags]")
2454 : {
2455 4 : CATCH_START_SECTION("Check with the --build-date system flag")
2456 : {
2457 1 : advgetopt::option const options[] =
2458 : {
2459 : advgetopt::define_option(
2460 : advgetopt::Name("size")
2461 : , advgetopt::ShortName('s')
2462 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2463 : , advgetopt::Help("define the size.")
2464 : , advgetopt::DefaultValue("7301")
2465 : ),
2466 : advgetopt::end_options()
2467 : };
2468 :
2469 1 : advgetopt::options_environment environment_options;
2470 1 : environment_options.f_project_name = "unittest";
2471 1 : environment_options.f_options = options;
2472 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2473 :
2474 1 : char const * cargv[] =
2475 : {
2476 : "/usr/bin/arguments",
2477 : "--build-date",
2478 : nullptr
2479 : };
2480 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2481 1 : char ** argv = const_cast<char **>(cargv);
2482 :
2483 2 : advgetopt::getopt opt(environment_options, argc, argv);
2484 :
2485 : // check that the result is valid
2486 :
2487 : // an invalid parameter, MUST NOT EXIST
2488 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2489 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2490 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2491 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2492 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2493 :
2494 : // no default
2495 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2496 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2497 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2498 1 : CATCH_REQUIRE(opt.size("--") == 0);
2499 :
2500 : // valid parameter
2501 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2502 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2503 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2504 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
2505 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
2506 1 : CATCH_REQUIRE(opt["size"] == "7301");
2507 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
2508 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
2509 1 : CATCH_REQUIRE(opt.has_default("size"));
2510 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
2511 1 : CATCH_REQUIRE(opt.size("size") == 0);
2512 :
2513 : // build-date parameter
2514 1 : CATCH_REQUIRE(opt.get_option("build-date") != nullptr);
2515 1 : CATCH_REQUIRE(opt.is_defined("build-date"));
2516 1 : CATCH_REQUIRE(opt.get_string("build-date") == "");
2517 1 : CATCH_REQUIRE(opt.get_string("build-date", 0) == "");
2518 1 : CATCH_REQUIRE(opt["build-date"] == "");
2519 1 : CATCH_REQUIRE_FALSE(opt.has_default("build-date"));
2520 1 : CATCH_REQUIRE(opt.get_default("build-date").empty());
2521 1 : CATCH_REQUIRE(opt.size("build-date") == 1);
2522 :
2523 : // other parameters
2524 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2525 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2526 :
2527 : // process system options now
2528 2 : std::stringstream ss;
2529 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2530 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_BUILD_DATE);
2531 1 : CATCH_REQUIRE(ss.str() == "Built on "
2532 : + std::string(environment_options.f_build_date)
2533 : + " at "
2534 : + environment_options.f_build_time
2535 : + "\n");
2536 : }
2537 : CATCH_END_SECTION()
2538 :
2539 4 : CATCH_START_SECTION("Check with the --build-date system flag, without a --build-date on the command line")
2540 1 : advgetopt::option const options[] =
2541 : {
2542 : advgetopt::define_option(
2543 : advgetopt::Name("size")
2544 : , advgetopt::ShortName('s')
2545 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2546 : , advgetopt::Help("define the size.")
2547 : , advgetopt::DefaultValue("103")
2548 : ),
2549 : advgetopt::end_options()
2550 : };
2551 :
2552 1 : advgetopt::options_environment environment_options;
2553 1 : environment_options.f_project_name = "unittest";
2554 1 : environment_options.f_options = options;
2555 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2556 1 : environment_options.f_help_header = "Usage: test system commands";
2557 1 : environment_options.f_help_footer = "Copyright matters";
2558 :
2559 1 : char const * cargv[] =
2560 : {
2561 : "/usr/bin/arguments",
2562 : "--size",
2563 : "1221",
2564 : nullptr
2565 : };
2566 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2567 1 : char ** argv = const_cast<char **>(cargv);
2568 :
2569 2 : advgetopt::getopt opt(environment_options, argc, argv);
2570 :
2571 : // check that the result is valid
2572 :
2573 : // an invalid parameter, MUST NOT EXIST
2574 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2575 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2576 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2577 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2578 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2579 :
2580 : // no default
2581 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2582 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2583 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2584 1 : CATCH_REQUIRE(opt.size("--") == 0);
2585 :
2586 : // valid parameter
2587 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2588 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2589 1 : CATCH_REQUIRE(opt.is_defined("size"));
2590 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
2591 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
2592 1 : CATCH_REQUIRE(opt["size"] == "1221");
2593 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
2594 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
2595 1 : CATCH_REQUIRE(opt.has_default("size"));
2596 1 : CATCH_REQUIRE(opt.get_default("size") == "103");
2597 1 : CATCH_REQUIRE(opt.size("size") == 1);
2598 :
2599 : // build-date parameter
2600 1 : CATCH_REQUIRE(opt.get_option("build-date") != nullptr);
2601 1 : CATCH_REQUIRE_FALSE(opt.is_defined("build-date"));
2602 1 : CATCH_REQUIRE_FALSE(opt.has_default("build-date"));
2603 1 : CATCH_REQUIRE(opt.get_default("build-date").empty());
2604 1 : CATCH_REQUIRE(opt.size("build-date") == 0);
2605 :
2606 : // other parameters
2607 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2608 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2609 :
2610 : // process system options now
2611 2 : std::stringstream ss;
2612 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2613 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2614 1 : CATCH_REQUIRE(ss.str().empty());
2615 : CATCH_END_SECTION()
2616 2 : }
2617 :
2618 :
2619 :
2620 6 : CATCH_TEST_CASE("system_flags_environment_variable_name", "[arguments][valid][getopt][system_flags]")
2621 : {
2622 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag")
2623 : {
2624 1 : advgetopt::option const options[] =
2625 : {
2626 : advgetopt::define_option(
2627 : advgetopt::Name("size")
2628 : , advgetopt::ShortName('s')
2629 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2630 : , advgetopt::Help("define the size.")
2631 : , advgetopt::DefaultValue("7301")
2632 : ),
2633 : advgetopt::end_options()
2634 : };
2635 :
2636 1 : advgetopt::options_environment environment_options;
2637 1 : environment_options.f_project_name = "unittest";
2638 1 : environment_options.f_options = options;
2639 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2640 1 : environment_options.f_environment_variable_name = "ADVGETOPT_OPTIONS";
2641 :
2642 1 : char const * cargv[] =
2643 : {
2644 : "/usr/bin/arguments",
2645 : "--environment-variable-name",
2646 : nullptr
2647 : };
2648 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2649 1 : char ** argv = const_cast<char **>(cargv);
2650 :
2651 2 : advgetopt::getopt opt(environment_options, argc, argv);
2652 :
2653 : // check that the result is valid
2654 :
2655 : // an invalid parameter, MUST NOT EXIST
2656 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2657 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2658 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2659 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2660 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2661 :
2662 : // no default
2663 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2664 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2665 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2666 1 : CATCH_REQUIRE(opt.size("--") == 0);
2667 :
2668 : // valid parameter
2669 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2670 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2671 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2672 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
2673 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
2674 1 : CATCH_REQUIRE(opt["size"] == "7301");
2675 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
2676 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
2677 1 : CATCH_REQUIRE(opt.has_default("size"));
2678 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
2679 1 : CATCH_REQUIRE(opt.size("size") == 0);
2680 :
2681 : // environment-variable-name parameter
2682 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
2683 1 : CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
2684 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
2685 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
2686 1 : CATCH_REQUIRE(opt["environment-variable-name"] == "");
2687 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
2688 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
2689 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
2690 :
2691 : // other parameters
2692 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2693 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2694 :
2695 : // process system options now
2696 2 : std::stringstream ss;
2697 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2698 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
2699 1 : CATCH_REQUIRE(ss.str() == "ADVGETOPT_OPTIONS\n");
2700 : }
2701 : CATCH_END_SECTION()
2702 :
2703 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag with nullptr")
2704 : {
2705 1 : advgetopt::option const options[] =
2706 : {
2707 : advgetopt::define_option(
2708 : advgetopt::Name("size")
2709 : , advgetopt::ShortName('s')
2710 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2711 : , advgetopt::Help("define the size.")
2712 : , advgetopt::DefaultValue("7301")
2713 : ),
2714 : advgetopt::end_options()
2715 : };
2716 :
2717 1 : advgetopt::options_environment environment_options;
2718 1 : environment_options.f_project_name = "unittest";
2719 1 : environment_options.f_options = options;
2720 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2721 1 : environment_options.f_environment_variable_name = nullptr;
2722 :
2723 1 : char const * cargv[] =
2724 : {
2725 : "/usr/bin/arguments",
2726 : "--environment-variable-name",
2727 : nullptr
2728 : };
2729 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2730 1 : char ** argv = const_cast<char **>(cargv);
2731 :
2732 2 : advgetopt::getopt opt(environment_options, argc, argv);
2733 :
2734 : // check that the result is valid
2735 :
2736 : // an invalid parameter, MUST NOT EXIST
2737 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2738 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2739 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2740 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2741 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2742 :
2743 : // no default
2744 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2745 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2746 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2747 1 : CATCH_REQUIRE(opt.size("--") == 0);
2748 :
2749 : // valid parameter
2750 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2751 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2752 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2753 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
2754 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
2755 1 : CATCH_REQUIRE(opt["size"] == "7301");
2756 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
2757 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
2758 1 : CATCH_REQUIRE(opt.has_default("size"));
2759 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
2760 1 : CATCH_REQUIRE(opt.size("size") == 0);
2761 :
2762 : // environment-variable-name parameter
2763 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
2764 1 : CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
2765 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
2766 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
2767 1 : CATCH_REQUIRE(opt["environment-variable-name"] == "");
2768 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
2769 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
2770 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
2771 :
2772 : // other parameters
2773 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2774 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2775 :
2776 : // process system options now
2777 2 : std::stringstream ss;
2778 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2779 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
2780 1 : CATCH_REQUIRE(ss.str() == "unittest does not support an environment variable.\n");
2781 : }
2782 : CATCH_END_SECTION()
2783 :
2784 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag with \"\"")
2785 : {
2786 1 : advgetopt::option const options[] =
2787 : {
2788 : advgetopt::define_option(
2789 : advgetopt::Name("size")
2790 : , advgetopt::ShortName('s')
2791 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2792 : , advgetopt::Help("define the size.")
2793 : , advgetopt::DefaultValue("7301")
2794 : ),
2795 : advgetopt::end_options()
2796 : };
2797 :
2798 1 : advgetopt::options_environment environment_options;
2799 1 : environment_options.f_project_name = "unittest";
2800 1 : environment_options.f_options = options;
2801 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2802 1 : environment_options.f_environment_variable_name = "";
2803 :
2804 1 : char const * cargv[] =
2805 : {
2806 : "/usr/bin/arguments",
2807 : "--environment-variable-name",
2808 : nullptr
2809 : };
2810 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2811 1 : char ** argv = const_cast<char **>(cargv);
2812 :
2813 2 : advgetopt::getopt opt(environment_options, argc, argv);
2814 :
2815 : // check that the result is valid
2816 :
2817 : // an invalid parameter, MUST NOT EXIST
2818 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2819 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2820 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2821 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2822 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2823 :
2824 : // no default
2825 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2826 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2827 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2828 1 : CATCH_REQUIRE(opt.size("--") == 0);
2829 :
2830 : // valid parameter
2831 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2832 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2833 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
2834 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
2835 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
2836 1 : CATCH_REQUIRE(opt["size"] == "7301");
2837 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
2838 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
2839 1 : CATCH_REQUIRE(opt.has_default("size"));
2840 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
2841 1 : CATCH_REQUIRE(opt.size("size") == 0);
2842 :
2843 : // environment-variable-name parameter
2844 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
2845 1 : CATCH_REQUIRE(opt.is_defined("environment-variable-name"));
2846 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name") == "");
2847 1 : CATCH_REQUIRE(opt.get_string("environment-variable-name", 0) == "");
2848 1 : CATCH_REQUIRE(opt["environment-variable-name"] == "");
2849 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
2850 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
2851 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 1);
2852 :
2853 : // other parameters
2854 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2855 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2856 :
2857 : // process system options now
2858 2 : std::stringstream ss;
2859 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2860 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_ENVIRONMENT_VARIABLE_NAME);
2861 1 : CATCH_REQUIRE(ss.str() == "unittest does not support an environment variable.\n");
2862 : }
2863 : CATCH_END_SECTION()
2864 :
2865 8 : CATCH_START_SECTION("Check with the --environment-variable-name system flag, without a --environment-variable-name on the command line")
2866 1 : advgetopt::option const options[] =
2867 : {
2868 : advgetopt::define_option(
2869 : advgetopt::Name("size")
2870 : , advgetopt::ShortName('s')
2871 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2872 : , advgetopt::Help("define the size.")
2873 : , advgetopt::DefaultValue("103")
2874 : ),
2875 : advgetopt::end_options()
2876 : };
2877 :
2878 1 : advgetopt::options_environment environment_options;
2879 1 : environment_options.f_project_name = "unittest";
2880 1 : environment_options.f_options = options;
2881 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2882 1 : environment_options.f_help_header = "Usage: test system commands";
2883 1 : environment_options.f_help_footer = "Copyright matters";
2884 :
2885 1 : char const * cargv[] =
2886 : {
2887 : "/usr/bin/arguments",
2888 : "--size",
2889 : "1221",
2890 : nullptr
2891 : };
2892 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2893 1 : char ** argv = const_cast<char **>(cargv);
2894 :
2895 2 : advgetopt::getopt opt(environment_options, argc, argv);
2896 :
2897 : // check that the result is valid
2898 :
2899 : // an invalid parameter, MUST NOT EXIST
2900 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2901 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2902 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2903 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2904 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2905 :
2906 : // no default
2907 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
2908 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2909 1 : CATCH_REQUIRE(opt.get_default("--").empty());
2910 1 : CATCH_REQUIRE(opt.size("--") == 0);
2911 :
2912 : // valid parameter
2913 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
2914 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
2915 1 : CATCH_REQUIRE(opt.is_defined("size"));
2916 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
2917 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
2918 1 : CATCH_REQUIRE(opt["size"] == "1221");
2919 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
2920 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
2921 1 : CATCH_REQUIRE(opt.has_default("size"));
2922 1 : CATCH_REQUIRE(opt.get_default("size") == "103");
2923 1 : CATCH_REQUIRE(opt.size("size") == 1);
2924 :
2925 : // environment-variable-name parameter
2926 1 : CATCH_REQUIRE(opt.get_option("environment-variable-name") != nullptr);
2927 1 : CATCH_REQUIRE_FALSE(opt.is_defined("environment-variable-name"));
2928 1 : CATCH_REQUIRE_FALSE(opt.has_default("environment-variable-name"));
2929 1 : CATCH_REQUIRE(opt.get_default("environment-variable-name").empty());
2930 1 : CATCH_REQUIRE(opt.size("environment-variable-name") == 0);
2931 :
2932 : // other parameters
2933 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2934 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2935 :
2936 : // process system options now
2937 2 : std::stringstream ss;
2938 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
2939 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
2940 1 : CATCH_REQUIRE(ss.str().empty());
2941 : CATCH_END_SECTION()
2942 4 : }
2943 :
2944 :
2945 :
2946 6 : CATCH_TEST_CASE("system_flags_configuration_filenames", "[arguments][valid][getopt][system_flags]")
2947 : {
2948 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag")
2949 : {
2950 2 : snapdev::safe_setenv env("HOME", "/home/advgetopt");
2951 :
2952 1 : advgetopt::option const options[] =
2953 : {
2954 : advgetopt::define_option(
2955 : advgetopt::Name("size")
2956 : , advgetopt::ShortName('s')
2957 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2958 : , advgetopt::Help("define the size.")
2959 : , advgetopt::DefaultValue("3101")
2960 : ),
2961 : advgetopt::end_options()
2962 : };
2963 :
2964 1 : char const * confs[] =
2965 : {
2966 : ".config/file.mdi",
2967 : "/etc/snapwebsites/server.conf",
2968 : "~/.config/advgetopt/snap.conf",
2969 : nullptr
2970 : };
2971 1 : char const * dirs[] =
2972 : {
2973 : ".config",
2974 : "/etc/secret",
2975 : "~/.config/snapwebsites",
2976 : nullptr
2977 : };
2978 :
2979 1 : advgetopt::options_environment environment_options;
2980 1 : environment_options.f_project_name = "unittest";
2981 1 : environment_options.f_options = options;
2982 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2983 1 : environment_options.f_configuration_files = confs;
2984 1 : environment_options.f_configuration_filename = "snapdb.conf";
2985 1 : environment_options.f_configuration_directories = dirs;
2986 :
2987 1 : char const * cargv[] =
2988 : {
2989 : "/usr/bin/arguments",
2990 : "--configuration-filenames",
2991 : nullptr
2992 : };
2993 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2994 1 : char ** argv = const_cast<char **>(cargv);
2995 :
2996 2 : advgetopt::getopt opt(environment_options, argc, argv);
2997 :
2998 : // check that the result is valid
2999 :
3000 : // an invalid parameter, MUST NOT EXIST
3001 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3002 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3003 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3004 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3005 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3006 :
3007 : // no default
3008 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3009 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3010 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3011 1 : CATCH_REQUIRE(opt.size("--") == 0);
3012 :
3013 : // valid parameter
3014 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3015 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3016 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3017 1 : CATCH_REQUIRE(opt.get_string("size") == "3101");
3018 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
3019 1 : CATCH_REQUIRE(opt["size"] == "3101");
3020 1 : CATCH_REQUIRE(opt.get_long("size") == 3101);
3021 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
3022 1 : CATCH_REQUIRE(opt.has_default("size"));
3023 1 : CATCH_REQUIRE(opt.get_default("size") == "3101");
3024 1 : CATCH_REQUIRE(opt.size("size") == 0);
3025 :
3026 : // configuration-filenames parameter
3027 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
3028 1 : CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
3029 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
3030 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
3031 1 : CATCH_REQUIRE(opt["configuration-filenames"] == "");
3032 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
3033 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
3034 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
3035 :
3036 : // other parameters
3037 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3038 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3039 :
3040 : // process system options now
3041 2 : std::stringstream ss;
3042 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3043 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES);
3044 1 : CATCH_REQUIRE(getenv("HOME") != nullptr);
3045 2 : std::string const home(getenv("HOME"));
3046 1 : CATCH_REQUIRE(ss.str() ==
3047 : "Configuration filenames:\n"
3048 : " . .config/file.mdi\n"
3049 : " . .config/unittest.d/50-file.mdi\n"
3050 : " . /etc/snapwebsites/server.conf\n"
3051 : " . /etc/snapwebsites/unittest.d/50-server.conf\n"
3052 : " . " + home + "/.config/advgetopt/snap.conf\n"
3053 : " . .config/snapdb.conf\n"
3054 : " . .config/unittest.d/50-snapdb.conf\n"
3055 : " . /etc/secret/snapdb.conf\n"
3056 : " . /etc/secret/unittest.d/50-snapdb.conf\n"
3057 : " . " + home + "/.config/snapwebsites/snapdb.conf\n"
3058 : );
3059 : }
3060 : CATCH_END_SECTION()
3061 :
3062 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag with --config-dir too")
3063 : {
3064 2 : snapdev::safe_setenv env("HOME", "/home/advgetopt");
3065 :
3066 1 : advgetopt::option const options[] =
3067 : {
3068 : advgetopt::define_option(
3069 : advgetopt::Name("size")
3070 : , advgetopt::ShortName('s')
3071 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3072 : , advgetopt::Help("define the size.")
3073 : , advgetopt::DefaultValue("3101")
3074 : ),
3075 : advgetopt::end_options()
3076 : };
3077 :
3078 1 : char const * confs[] =
3079 : {
3080 : ".config/file.mdi",
3081 : "/etc/snapwebsites/server.conf",
3082 : "~/.config/advgetopt/snap.conf",
3083 : nullptr
3084 : };
3085 1 : char const * dirs[] =
3086 : {
3087 : ".config",
3088 : "/etc/secret",
3089 : "~/.config/snapwebsites",
3090 : nullptr
3091 : };
3092 :
3093 1 : advgetopt::options_environment environment_options;
3094 1 : environment_options.f_project_name = "unittest";
3095 1 : environment_options.f_options = options;
3096 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3097 1 : environment_options.f_configuration_files = confs;
3098 1 : environment_options.f_configuration_filename = "snapdb.conf";
3099 1 : environment_options.f_configuration_directories = dirs;
3100 :
3101 1 : char const * cargv[] =
3102 : {
3103 : "/usr/bin/arguments",
3104 : "--config-dir",
3105 : "/var/lib/advgetopt",
3106 : "--configuration-filenames",
3107 : "--config-dir",
3108 : "/opt/config",
3109 : nullptr
3110 : };
3111 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3112 1 : char ** argv = const_cast<char **>(cargv);
3113 :
3114 2 : advgetopt::getopt opt(environment_options, argc, argv);
3115 :
3116 : // check that the result is valid
3117 :
3118 : // an invalid parameter, MUST NOT EXIST
3119 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3120 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3121 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3122 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3123 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3124 :
3125 : // no default
3126 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3127 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3128 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3129 1 : CATCH_REQUIRE(opt.size("--") == 0);
3130 :
3131 : // valid parameter
3132 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3133 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3134 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3135 1 : CATCH_REQUIRE(opt.get_string("size") == "3101");
3136 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
3137 1 : CATCH_REQUIRE(opt["size"] == "3101");
3138 1 : CATCH_REQUIRE(opt.get_long("size") == 3101);
3139 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
3140 1 : CATCH_REQUIRE(opt.has_default("size"));
3141 1 : CATCH_REQUIRE(opt.get_default("size") == "3101");
3142 1 : CATCH_REQUIRE(opt.size("size") == 0);
3143 :
3144 : // configuration-filenames parameter
3145 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
3146 1 : CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
3147 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
3148 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
3149 1 : CATCH_REQUIRE(opt["configuration-filenames"] == "");
3150 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
3151 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
3152 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
3153 :
3154 : // other parameters
3155 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3156 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3157 :
3158 : // process system options now
3159 2 : std::stringstream ss;
3160 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3161 1 : CATCH_REQUIRE(result == (advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES
3162 : | advgetopt::SYSTEM_OPTION_CONFIG_DIR));
3163 1 : CATCH_REQUIRE(getenv("HOME") != nullptr);
3164 2 : std::string const home(getenv("HOME"));
3165 1 : CATCH_REQUIRE(ss.str() ==
3166 : "Configuration filenames:\n"
3167 : " . .config/file.mdi\n"
3168 : " . .config/unittest.d/50-file.mdi\n"
3169 : " . /etc/snapwebsites/server.conf\n"
3170 : " . /etc/snapwebsites/unittest.d/50-server.conf\n"
3171 : " . " + home + "/.config/advgetopt/snap.conf\n"
3172 : " . /var/lib/advgetopt/snapdb.conf\n"
3173 : " . /var/lib/advgetopt/unittest.d/50-snapdb.conf\n"
3174 : " . /opt/config/snapdb.conf\n"
3175 : " . /opt/config/unittest.d/50-snapdb.conf\n"
3176 : " . .config/snapdb.conf\n"
3177 : " . .config/unittest.d/50-snapdb.conf\n"
3178 : " . /etc/secret/snapdb.conf\n"
3179 : " . /etc/secret/unittest.d/50-snapdb.conf\n"
3180 : " . " + home + "/.config/snapwebsites/snapdb.conf\n"
3181 : );
3182 : }
3183 : CATCH_END_SECTION()
3184 :
3185 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag without any configuration files")
3186 : {
3187 1 : advgetopt::option const options[] =
3188 : {
3189 : advgetopt::define_option(
3190 : advgetopt::Name("size")
3191 : , advgetopt::ShortName('s')
3192 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3193 : , advgetopt::Help("define the size.")
3194 : , advgetopt::DefaultValue("3101")
3195 : ),
3196 : advgetopt::end_options()
3197 : };
3198 :
3199 1 : advgetopt::options_environment environment_options;
3200 1 : environment_options.f_project_name = "unittest";
3201 1 : environment_options.f_options = options;
3202 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3203 :
3204 1 : char const * cargv[] =
3205 : {
3206 : "/usr/bin/arguments",
3207 : "--configuration-filenames",
3208 : nullptr
3209 : };
3210 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3211 1 : char ** argv = const_cast<char **>(cargv);
3212 :
3213 2 : advgetopt::getopt opt(environment_options, argc, argv);
3214 :
3215 : // check that the result is valid
3216 :
3217 : // an invalid parameter, MUST NOT EXIST
3218 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3219 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3220 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3221 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3222 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3223 :
3224 : // no default
3225 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3226 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3227 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3228 1 : CATCH_REQUIRE(opt.size("--") == 0);
3229 :
3230 : // valid parameter
3231 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3232 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3233 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3234 1 : CATCH_REQUIRE(opt.get_string("size") == "3101");
3235 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "3101");
3236 1 : CATCH_REQUIRE(opt["size"] == "3101");
3237 1 : CATCH_REQUIRE(opt.get_long("size") == 3101);
3238 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 3101);
3239 1 : CATCH_REQUIRE(opt.has_default("size"));
3240 1 : CATCH_REQUIRE(opt.get_default("size") == "3101");
3241 1 : CATCH_REQUIRE(opt.size("size") == 0);
3242 :
3243 : // configuration-filenames parameter
3244 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
3245 1 : CATCH_REQUIRE(opt.is_defined("configuration-filenames"));
3246 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames") == "");
3247 1 : CATCH_REQUIRE(opt.get_string("configuration-filenames", 0) == "");
3248 1 : CATCH_REQUIRE(opt["configuration-filenames"] == "");
3249 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
3250 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
3251 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 1);
3252 :
3253 : // other parameters
3254 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3255 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3256 :
3257 : // process system options now
3258 2 : std::stringstream ss;
3259 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3260 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_CONFIGURATION_FILENAMES);
3261 1 : CATCH_REQUIRE(ss.str() == "unittest does not support configuration files.\n");
3262 : }
3263 : CATCH_END_SECTION()
3264 :
3265 8 : CATCH_START_SECTION("Check with the --configuration-filenames system flag, without a --configuration-filenames on the command line")
3266 1 : advgetopt::option const options[] =
3267 : {
3268 : advgetopt::define_option(
3269 : advgetopt::Name("size")
3270 : , advgetopt::ShortName('s')
3271 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3272 : , advgetopt::Help("define the size.")
3273 : , advgetopt::DefaultValue("193")
3274 : ),
3275 : advgetopt::end_options()
3276 : };
3277 :
3278 1 : char const * confs[] =
3279 : {
3280 : ".config/file.mdi",
3281 : "/etc/snapwebsites/server.conf",
3282 : "~/.config/advgetopt/snap.conf",
3283 : nullptr
3284 : };
3285 1 : char const * dirs[] =
3286 : {
3287 : ".config",
3288 : "/etc/secret",
3289 : "~/.config/snapwebsites",
3290 : nullptr
3291 : };
3292 :
3293 1 : advgetopt::options_environment environment_options;
3294 1 : environment_options.f_project_name = "unittest";
3295 1 : environment_options.f_options = options;
3296 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3297 1 : environment_options.f_help_header = "Usage: test system commands";
3298 1 : environment_options.f_help_footer = "Copyright matters";
3299 1 : environment_options.f_configuration_files = confs;
3300 1 : environment_options.f_configuration_filename = "snapdb.conf";
3301 1 : environment_options.f_configuration_directories = dirs;
3302 :
3303 1 : char const * cargv[] =
3304 : {
3305 : "/usr/bin/arguments",
3306 : "--size",
3307 : "1221",
3308 : nullptr
3309 : };
3310 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3311 1 : char ** argv = const_cast<char **>(cargv);
3312 :
3313 2 : advgetopt::getopt opt(environment_options, argc, argv);
3314 :
3315 : // check that the result is valid
3316 :
3317 : // an invalid parameter, MUST NOT EXIST
3318 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3319 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3320 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3321 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3322 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3323 :
3324 : // no default
3325 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3326 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3327 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3328 1 : CATCH_REQUIRE(opt.size("--") == 0);
3329 :
3330 : // valid parameter
3331 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3332 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3333 1 : CATCH_REQUIRE(opt.is_defined("size"));
3334 1 : CATCH_REQUIRE(opt.get_string("size") == "1221");
3335 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1221");
3336 1 : CATCH_REQUIRE(opt["size"] == "1221");
3337 1 : CATCH_REQUIRE(opt.get_long("size") == 1221);
3338 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1221);
3339 1 : CATCH_REQUIRE(opt.has_default("size"));
3340 1 : CATCH_REQUIRE(opt.get_default("size") == "193");
3341 1 : CATCH_REQUIRE(opt.size("size") == 1);
3342 :
3343 : // configuration-filenames parameter
3344 1 : CATCH_REQUIRE(opt.get_option("configuration-filenames") != nullptr);
3345 1 : CATCH_REQUIRE_FALSE(opt.is_defined("configuration-filenames"));
3346 1 : CATCH_REQUIRE_FALSE(opt.has_default("configuration-filenames"));
3347 1 : CATCH_REQUIRE(opt.get_default("configuration-filenames").empty());
3348 1 : CATCH_REQUIRE(opt.size("configuration-filenames") == 0);
3349 :
3350 : // other parameters
3351 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3352 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3353 :
3354 : // process system options now
3355 2 : std::stringstream ss;
3356 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3357 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
3358 1 : CATCH_REQUIRE(ss.str().empty());
3359 : CATCH_END_SECTION()
3360 4 : }
3361 :
3362 :
3363 :
3364 5 : CATCH_TEST_CASE("system_flags_path_to_option_definitions", "[arguments][valid][getopt][system_flags]")
3365 : {
3366 6 : CATCH_START_SECTION("Check with the --path-to-option-definitions system flag (Default)")
3367 : {
3368 1 : advgetopt::option const options[] =
3369 : {
3370 : advgetopt::define_option(
3371 : advgetopt::Name("size")
3372 : , advgetopt::ShortName('s')
3373 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3374 : , advgetopt::Help("define the size.")
3375 : , advgetopt::DefaultValue("7301")
3376 : ),
3377 : advgetopt::end_options()
3378 : };
3379 :
3380 1 : advgetopt::options_environment environment_options;
3381 1 : environment_options.f_project_name = "unittest";
3382 1 : environment_options.f_options = options;
3383 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3384 :
3385 1 : char const * cargv[] =
3386 : {
3387 : "/usr/bin/arguments",
3388 : "--path-to-option-definitions",
3389 : nullptr
3390 : };
3391 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3392 1 : char ** argv = const_cast<char **>(cargv);
3393 :
3394 2 : advgetopt::getopt opt(environment_options, argc, argv);
3395 :
3396 : // check that the result is valid
3397 :
3398 : // an invalid parameter, MUST NOT EXIST
3399 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3400 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3401 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3402 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3403 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3404 :
3405 : // no default
3406 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3407 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3408 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3409 1 : CATCH_REQUIRE(opt.size("--") == 0);
3410 :
3411 : // valid parameter
3412 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3413 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3414 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3415 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
3416 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
3417 1 : CATCH_REQUIRE(opt["size"] == "7301");
3418 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
3419 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
3420 1 : CATCH_REQUIRE(opt.has_default("size"));
3421 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
3422 1 : CATCH_REQUIRE(opt.size("size") == 0);
3423 :
3424 : // path-to-option-definitions parameter
3425 1 : CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
3426 1 : CATCH_REQUIRE(opt.is_defined("path-to-option-definitions"));
3427 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions") == "");
3428 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions", 0) == "");
3429 1 : CATCH_REQUIRE(opt["path-to-option-definitions"] == "");
3430 1 : CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
3431 1 : CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
3432 1 : CATCH_REQUIRE(opt.size("path-to-option-definitions") == 1);
3433 :
3434 : // other parameters
3435 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3436 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3437 :
3438 : // process system options now
3439 2 : std::stringstream ss;
3440 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3441 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_PATH_TO_OPTION_DEFINITIONS);
3442 1 : CATCH_REQUIRE(ss.str() == "/usr/share/advgetopt/options/\n");
3443 : }
3444 : CATCH_END_SECTION()
3445 :
3446 6 : CATCH_START_SECTION("Check with the --path-to-option-definitions system flag (Specified)")
3447 : {
3448 1 : advgetopt::option const options[] =
3449 : {
3450 : advgetopt::define_option(
3451 : advgetopt::Name("size")
3452 : , advgetopt::ShortName('s')
3453 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3454 : , advgetopt::Help("define the size.")
3455 : , advgetopt::DefaultValue("7301")
3456 : ),
3457 : advgetopt::end_options()
3458 : };
3459 :
3460 1 : advgetopt::options_environment environment_options;
3461 1 : environment_options.f_project_name = "unittest";
3462 1 : environment_options.f_options = options;
3463 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3464 1 : environment_options.f_options_files_directory = "/opt/advgetopt/configs";
3465 :
3466 1 : char const * cargv[] =
3467 : {
3468 : "/usr/bin/arguments",
3469 : "--path-to-option-definitions",
3470 : nullptr
3471 : };
3472 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3473 1 : char ** argv = const_cast<char **>(cargv);
3474 :
3475 2 : advgetopt::getopt opt(environment_options, argc, argv);
3476 :
3477 : // check that the result is valid
3478 :
3479 : // an invalid parameter, MUST NOT EXIST
3480 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3481 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3482 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3483 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3484 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3485 :
3486 : // no default
3487 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3488 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3489 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3490 1 : CATCH_REQUIRE(opt.size("--") == 0);
3491 :
3492 : // valid parameter
3493 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3494 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3495 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3496 1 : CATCH_REQUIRE(opt.get_string("size") == "7301");
3497 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "7301");
3498 1 : CATCH_REQUIRE(opt["size"] == "7301");
3499 1 : CATCH_REQUIRE(opt.get_long("size") == 7301);
3500 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 7301);
3501 1 : CATCH_REQUIRE(opt.has_default("size"));
3502 1 : CATCH_REQUIRE(opt.get_default("size") == "7301");
3503 1 : CATCH_REQUIRE(opt.size("size") == 0);
3504 :
3505 : // path-to-option-definitions parameter
3506 1 : CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
3507 1 : CATCH_REQUIRE(opt.is_defined("path-to-option-definitions"));
3508 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions") == "");
3509 1 : CATCH_REQUIRE(opt.get_string("path-to-option-definitions", 0) == "");
3510 1 : CATCH_REQUIRE(opt["path-to-option-definitions"] == "");
3511 1 : CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
3512 1 : CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
3513 1 : CATCH_REQUIRE(opt.size("path-to-option-definitions") == 1);
3514 :
3515 : // other parameters
3516 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3517 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3518 :
3519 : // process system options now
3520 2 : std::stringstream ss;
3521 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3522 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_PATH_TO_OPTION_DEFINITIONS);
3523 1 : CATCH_REQUIRE(ss.str() == "/opt/advgetopt/configs/\n");
3524 : }
3525 : CATCH_END_SECTION()
3526 :
3527 6 : CATCH_START_SECTION("Check with the --path-to-option-definitions system flag, without a --path-to-option-definitions on the command line")
3528 1 : advgetopt::option const options[] =
3529 : {
3530 : advgetopt::define_option(
3531 : advgetopt::Name("size")
3532 : , advgetopt::ShortName('s')
3533 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
3534 : , advgetopt::Help("define the size.")
3535 : , advgetopt::DefaultValue("303")
3536 : ),
3537 : advgetopt::end_options()
3538 : };
3539 :
3540 1 : advgetopt::options_environment environment_options;
3541 1 : environment_options.f_project_name = "unittest";
3542 1 : environment_options.f_options = options;
3543 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3544 1 : environment_options.f_help_header = "Usage: test system commands";
3545 1 : environment_options.f_help_footer = "Copyright matters";
3546 :
3547 1 : char const * cargv[] =
3548 : {
3549 : "/usr/bin/arguments",
3550 : "--size",
3551 : "1919",
3552 : nullptr
3553 : };
3554 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3555 1 : char ** argv = const_cast<char **>(cargv);
3556 :
3557 2 : advgetopt::getopt opt(environment_options, argc, argv);
3558 :
3559 : // check that the result is valid
3560 :
3561 : // an invalid parameter, MUST NOT EXIST
3562 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3563 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3564 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3565 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3566 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3567 :
3568 : // no default
3569 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3570 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3571 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3572 1 : CATCH_REQUIRE(opt.size("--") == 0);
3573 :
3574 : // valid parameter
3575 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3576 1 : CATCH_REQUIRE(opt.get_option('s') == opt.get_option("size"));
3577 1 : CATCH_REQUIRE(opt.is_defined("size"));
3578 1 : CATCH_REQUIRE(opt.get_string("size") == "1919");
3579 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "1919");
3580 1 : CATCH_REQUIRE(opt["size"] == "1919");
3581 1 : CATCH_REQUIRE(opt.get_long("size") == 1919);
3582 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 1919);
3583 1 : CATCH_REQUIRE(opt.has_default("size"));
3584 1 : CATCH_REQUIRE(opt.get_default("size") == "303");
3585 1 : CATCH_REQUIRE(opt.size("size") == 1);
3586 :
3587 : // environment-variable-name parameter
3588 1 : CATCH_REQUIRE(opt.get_option("path-to-option-definitions") != nullptr);
3589 1 : CATCH_REQUIRE_FALSE(opt.is_defined("path-to-option-definitions"));
3590 1 : CATCH_REQUIRE_FALSE(opt.has_default("path-to-option-definitions"));
3591 1 : CATCH_REQUIRE(opt.get_default("path-to-option-definitions").empty());
3592 1 : CATCH_REQUIRE(opt.size("path-to-option-definitions") == 0);
3593 :
3594 : // other parameters
3595 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3596 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3597 :
3598 : // process system options now
3599 2 : std::stringstream ss;
3600 1 : advgetopt::flag_t const result(opt.process_system_options(ss));
3601 1 : CATCH_REQUIRE(result == advgetopt::SYSTEM_OPTION_NONE);
3602 1 : CATCH_REQUIRE(ss.str().empty());
3603 : CATCH_END_SECTION()
3604 3 : }
3605 :
3606 :
3607 :
3608 :
3609 :
3610 :
3611 :
3612 :
3613 6 : CATCH_TEST_CASE("invalid_option_name", "[arguments][invalid][getopt]")
3614 : {
3615 8 : CATCH_START_SECTION("Verify that asking for the string of a non-existant option fails")
3616 1 : advgetopt::options_environment environment_options;
3617 1 : environment_options.f_project_name = "unittest";
3618 1 : environment_options.f_options = nullptr;
3619 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3620 1 : environment_options.f_help_header = "Usage: test get_string() functions";
3621 :
3622 2 : advgetopt::getopt opt(environment_options);
3623 :
3624 1 : char const * cargv[] =
3625 : {
3626 : "tests/options-parser",
3627 : "--license",
3628 : nullptr
3629 : };
3630 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3631 1 : char ** argv = const_cast<char **>(cargv);
3632 :
3633 1 : opt.finish_parsing(argc, argv);
3634 :
3635 1 : CATCH_REQUIRE_THROWS_MATCHES(
3636 : opt.get_string("non-existant")
3637 : , advgetopt::getopt_logic_error
3638 : , Catch::Matchers::ExceptionMessage(
3639 : "getopt_logic_error: there is no --non-existant option defined."));
3640 :
3641 1 : CATCH_REQUIRE_THROWS_MATCHES(
3642 : opt.get_string("non-existant", 0)
3643 : , advgetopt::getopt_logic_error
3644 : , Catch::Matchers::ExceptionMessage(
3645 : "getopt_logic_error: there is no --non-existant option defined."));
3646 :
3647 1 : CATCH_REQUIRE_THROWS_MATCHES(
3648 : opt.get_string("non-existant", 1)
3649 : , advgetopt::getopt_logic_error
3650 : , Catch::Matchers::ExceptionMessage(
3651 : "getopt_logic_error: there is no --non-existant option defined."));
3652 : CATCH_END_SECTION()
3653 :
3654 8 : CATCH_START_SECTION("Verify that asking for the long of a non-existant option fails")
3655 1 : advgetopt::options_environment environment_options;
3656 1 : environment_options.f_project_name = "unittest";
3657 1 : environment_options.f_options = nullptr;
3658 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3659 1 : environment_options.f_help_header = "Usage: test get_string() functions";
3660 :
3661 2 : advgetopt::getopt opt(environment_options);
3662 :
3663 1 : char const * cargv[] =
3664 : {
3665 : "tests/options-parser",
3666 : "--license",
3667 : nullptr
3668 : };
3669 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3670 1 : char ** argv = const_cast<char **>(cargv);
3671 :
3672 1 : opt.finish_parsing(argc, argv);
3673 :
3674 1 : CATCH_REQUIRE_THROWS_MATCHES(
3675 : opt.get_long("non-existant")
3676 : , advgetopt::getopt_logic_error
3677 : , Catch::Matchers::ExceptionMessage(
3678 : "getopt_logic_error: there is no --non-existant option defined."));
3679 :
3680 1 : CATCH_REQUIRE_THROWS_MATCHES(
3681 : opt.get_long("non-existant", 0)
3682 : , advgetopt::getopt_logic_error
3683 : , Catch::Matchers::ExceptionMessage(
3684 : "getopt_logic_error: there is no --non-existant option defined."));
3685 :
3686 1 : CATCH_REQUIRE_THROWS_MATCHES(
3687 : opt.get_long("non-existant", 1)
3688 : , advgetopt::getopt_logic_error
3689 : , Catch::Matchers::ExceptionMessage(
3690 : "getopt_logic_error: there is no --non-existant option defined."));
3691 : CATCH_END_SECTION()
3692 :
3693 8 : CATCH_START_SECTION("Verify that asking for a default with an empty string fails")
3694 1 : advgetopt::options_environment environment_options;
3695 1 : environment_options.f_project_name = "unittest";
3696 1 : environment_options.f_options = nullptr;
3697 1 : environment_options.f_help_header = "Usage: test get_default() functions";
3698 :
3699 2 : advgetopt::getopt opt(environment_options);
3700 :
3701 1 : CATCH_REQUIRE_THROWS_MATCHES(
3702 : opt.has_default("")
3703 : , advgetopt::getopt_invalid_parameter
3704 : , Catch::Matchers::ExceptionMessage(
3705 : "getopt_exception: get_option() `name` argument cannot be empty."));
3706 :
3707 1 : CATCH_REQUIRE_THROWS_MATCHES(
3708 : opt.has_default(std::string())
3709 : , advgetopt::getopt_invalid_parameter
3710 : , Catch::Matchers::ExceptionMessage(
3711 : "getopt_exception: get_option() `name` argument cannot be empty."));
3712 :
3713 1 : CATCH_REQUIRE_THROWS_MATCHES(
3714 : opt.get_default("")
3715 : , advgetopt::getopt_invalid_parameter
3716 : , Catch::Matchers::ExceptionMessage(
3717 : "getopt_exception: get_option() `name` argument cannot be empty."));
3718 :
3719 1 : CATCH_REQUIRE_THROWS_MATCHES(
3720 : opt.get_default(std::string())
3721 : , advgetopt::getopt_invalid_parameter
3722 : , Catch::Matchers::ExceptionMessage(
3723 : "getopt_exception: get_option() `name` argument cannot be empty."));
3724 : CATCH_END_SECTION()
3725 :
3726 8 : CATCH_START_SECTION("[] operators want a valid name")
3727 1 : advgetopt::options_environment environment_options;
3728 1 : environment_options.f_project_name = "unittest";
3729 1 : environment_options.f_options = nullptr;
3730 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
3731 1 : environment_options.f_help_header = "Usage: test get_default() functions";
3732 :
3733 2 : advgetopt::getopt opt(environment_options);
3734 :
3735 1 : char const * cargv[] =
3736 : {
3737 : "tests/options-parser",
3738 : "--license",
3739 : nullptr
3740 : };
3741 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3742 1 : char ** argv = const_cast<char **>(cargv);
3743 :
3744 1 : opt.finish_parsing(argc, argv);
3745 :
3746 1 : CATCH_REQUIRE_THROWS_MATCHES(
3747 : opt[""]
3748 : , advgetopt::getopt_logic_error
3749 : , Catch::Matchers::ExceptionMessage(
3750 : "getopt_logic_error: argument name cannot be empty."));
3751 :
3752 1 : CATCH_REQUIRE_THROWS_MATCHES(
3753 : opt[std::string()]
3754 : , advgetopt::getopt_logic_error
3755 : , Catch::Matchers::ExceptionMessage(
3756 : "getopt_logic_error: argument name cannot be empty."));
3757 :
3758 1 : CATCH_REQUIRE_THROWS_MATCHES(
3759 : opt["g"]
3760 : , advgetopt::getopt_logic_error
3761 : , Catch::Matchers::ExceptionMessage(
3762 : "getopt_logic_error: argument name cannot be one letter if it does not exist in operator []."));
3763 :
3764 1 : CATCH_REQUIRE_THROWS_MATCHES(
3765 : opt[std::string("g")]
3766 : , advgetopt::getopt_logic_error
3767 : , Catch::Matchers::ExceptionMessage(
3768 : "getopt_logic_error: argument name cannot be one letter if it does not exist in operator []."));
3769 :
3770 1 : advgetopt::getopt const & const_opt(opt);
3771 :
3772 1 : CATCH_REQUIRE_THROWS_MATCHES(
3773 : const_opt[""]
3774 : , advgetopt::getopt_logic_error
3775 : , Catch::Matchers::ExceptionMessage(
3776 : "getopt_logic_error: argument name cannot be empty."));
3777 :
3778 1 : CATCH_REQUIRE_THROWS_MATCHES(
3779 : const_opt[std::string()]
3780 : , advgetopt::getopt_logic_error
3781 : , Catch::Matchers::ExceptionMessage(
3782 : "getopt_logic_error: argument name cannot be empty."));
3783 : CATCH_END_SECTION()
3784 4 : }
3785 :
3786 :
3787 :
3788 5 : CATCH_TEST_CASE("missing_default_value", "[arguments][invalid][getopt]")
3789 : {
3790 6 : CATCH_START_SECTION("Verify a string value without arguments and no default")
3791 : {
3792 1 : advgetopt::option const options[] =
3793 : {
3794 : advgetopt::define_option(
3795 : advgetopt::Name("size")
3796 : , advgetopt::ShortName('s')
3797 : , advgetopt::Flags(advgetopt::command_flags<
3798 : advgetopt::GETOPT_FLAG_REQUIRED
3799 : , advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
3800 : , advgetopt::Help("define the size.")
3801 : ),
3802 : advgetopt::end_options()
3803 : };
3804 :
3805 1 : advgetopt::options_environment environment_options;
3806 1 : environment_options.f_project_name = "unittest";
3807 1 : environment_options.f_options = options;
3808 1 : environment_options.f_help_header = "Usage: test get_string() functions";
3809 :
3810 1 : char const * cargv[] =
3811 : {
3812 : "/usr/bin/arguments",
3813 : nullptr
3814 : };
3815 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3816 1 : char ** argv = const_cast<char **>(cargv);
3817 :
3818 2 : advgetopt::getopt opt(environment_options, argc, argv);
3819 :
3820 : // check that the result is valid
3821 :
3822 : // an invalid parameter, MUST NOT EXIST
3823 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3824 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3825 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3826 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3827 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3828 :
3829 : // no default
3830 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3831 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3832 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3833 1 : CATCH_REQUIRE(opt.size("--") == 0);
3834 :
3835 : // the valid parameter
3836 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3837 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
3838 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3839 1 : CATCH_REQUIRE(opt.size("size") == 0);
3840 1 : CATCH_REQUIRE(static_cast<advgetopt::getopt const &>(opt)["size"].empty());
3841 :
3842 1 : CATCH_REQUIRE_THROWS_MATCHES(
3843 : opt.get_string("size")
3844 : , advgetopt::getopt_logic_error
3845 : , Catch::Matchers::ExceptionMessage(
3846 : "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
3847 :
3848 1 : CATCH_REQUIRE_THROWS_MATCHES(
3849 : opt.get_string("size", 0)
3850 : , advgetopt::getopt_logic_error
3851 : , Catch::Matchers::ExceptionMessage(
3852 : "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
3853 :
3854 1 : CATCH_REQUIRE_THROWS_MATCHES(
3855 : opt.get_string("size", 1)
3856 : , advgetopt::getopt_logic_error
3857 : , Catch::Matchers::ExceptionMessage(
3858 : "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
3859 :
3860 : // these do not create an entry (even though it looks like it,
3861 : // i.e. it would for an std::map)
3862 : //
3863 1 : CATCH_REQUIRE(opt["size"].empty());
3864 1 : CATCH_REQUIRE(opt["size"].length() == 0);
3865 1 : CATCH_REQUIRE(opt["size"].size() == 0);
3866 :
3867 1 : CATCH_REQUIRE(opt.size("size") == 0);
3868 :
3869 1 : CATCH_REQUIRE_THROWS_MATCHES(
3870 : opt.get_string("size", 0)
3871 : , advgetopt::getopt_logic_error
3872 : , Catch::Matchers::ExceptionMessage(
3873 : "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
3874 :
3875 1 : CATCH_REQUIRE_THROWS_MATCHES(
3876 : opt.get_string("size", 1)
3877 : , advgetopt::getopt_logic_error
3878 : , Catch::Matchers::ExceptionMessage(
3879 : "getopt_logic_error: the --size option was not defined on the command line and it has no default."));
3880 :
3881 : // now this one does create a value
3882 : //
3883 1 : opt["size"] = "45.3";
3884 :
3885 1 : CATCH_REQUIRE(opt.get_string("size") == "45.3");
3886 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "45.3");
3887 :
3888 1 : CATCH_REQUIRE_THROWS_MATCHES(
3889 : opt.get_string("size", 1)
3890 : , advgetopt::getopt_undefined
3891 : , Catch::Matchers::ExceptionMessage(
3892 : "getopt_exception: option_info::get_value(): no value at index 1 (idx >= 1) for --size so you can't get this value."));
3893 :
3894 : // other parameters
3895 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3896 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3897 : }
3898 : CATCH_END_SECTION()
3899 :
3900 6 : CATCH_START_SECTION("Verify an integer (long) value without arguments and no default")
3901 : {
3902 1 : advgetopt::option const options[] =
3903 : {
3904 : advgetopt::define_option(
3905 : advgetopt::Name("size")
3906 : , advgetopt::ShortName('s')
3907 : , advgetopt::Flags(advgetopt::command_flags<
3908 : advgetopt::GETOPT_FLAG_REQUIRED
3909 : , advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
3910 : , advgetopt::Help("define the size.")
3911 : ),
3912 : advgetopt::end_options()
3913 : };
3914 :
3915 1 : advgetopt::options_environment environment_options;
3916 1 : environment_options.f_project_name = "unittest";
3917 1 : environment_options.f_options = options;
3918 1 : environment_options.f_help_header = "Usage: test get_long() functions";
3919 :
3920 1 : char const * cargv[] =
3921 : {
3922 : "/usr/bin/arguments",
3923 : nullptr
3924 : };
3925 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3926 1 : char ** argv = const_cast<char **>(cargv);
3927 :
3928 2 : advgetopt::getopt opt(environment_options, argc, argv);
3929 :
3930 : // check that the result is valid
3931 :
3932 : // an invalid parameter, MUST NOT EXIST
3933 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3934 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3935 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3936 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3937 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3938 :
3939 : // no default
3940 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3941 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3942 1 : CATCH_REQUIRE(opt.get_default("--").empty());
3943 1 : CATCH_REQUIRE(opt.size("--") == 0);
3944 :
3945 : // the valid parameter
3946 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
3947 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
3948 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
3949 1 : CATCH_REQUIRE_FALSE(opt.has_default("size"));
3950 1 : CATCH_REQUIRE(opt.size("size") == 0);
3951 :
3952 1 : CATCH_REQUIRE_THROWS_MATCHES(
3953 : opt.get_long("size")
3954 : , advgetopt::getopt_logic_error
3955 : , Catch::Matchers::ExceptionMessage(
3956 : "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
3957 :
3958 1 : CATCH_REQUIRE_THROWS_MATCHES(
3959 : opt.get_long("size", 0)
3960 : , advgetopt::getopt_logic_error
3961 : , Catch::Matchers::ExceptionMessage(
3962 : "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
3963 :
3964 1 : CATCH_REQUIRE_THROWS_MATCHES(
3965 : opt.get_long("size", 1)
3966 : , advgetopt::getopt_logic_error
3967 : , Catch::Matchers::ExceptionMessage(
3968 : "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
3969 :
3970 : // other parameters
3971 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3972 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3973 : }
3974 : CATCH_END_SECTION()
3975 :
3976 6 : CATCH_START_SECTION("Verify an integer (long) value without arguments and an empty string as default")
3977 : {
3978 1 : advgetopt::option const options[] =
3979 : {
3980 : advgetopt::define_option(
3981 : advgetopt::Name("size")
3982 : , advgetopt::ShortName('s')
3983 : , advgetopt::Flags(advgetopt::command_flags<
3984 : advgetopt::GETOPT_FLAG_REQUIRED
3985 : , advgetopt::GETOPT_FLAG_DYNAMIC_CONFIGURATION>())
3986 : , advgetopt::Help("define the size.")
3987 : , advgetopt::DefaultValue("")
3988 : ),
3989 : advgetopt::end_options()
3990 : };
3991 :
3992 1 : advgetopt::options_environment environment_options;
3993 1 : environment_options.f_project_name = "unittest";
3994 1 : environment_options.f_options = options;
3995 1 : environment_options.f_help_header = "Usage: test get_long() functions";
3996 :
3997 1 : char const * cargv[] =
3998 : {
3999 : "/usr/bin/arguments",
4000 : nullptr
4001 : };
4002 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4003 1 : char ** argv = const_cast<char **>(cargv);
4004 :
4005 2 : advgetopt::getopt opt(environment_options, argc, argv);
4006 :
4007 : // check that the result is valid
4008 :
4009 : // an invalid parameter, MUST NOT EXIST
4010 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4011 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4012 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4013 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4014 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4015 :
4016 : // no default
4017 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4018 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
4019 1 : CATCH_REQUIRE(opt.get_default("--").empty());
4020 1 : CATCH_REQUIRE(opt.size("--") == 0);
4021 :
4022 : // the valid parameter
4023 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4024 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4025 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
4026 1 : CATCH_REQUIRE(opt.has_default("size"));
4027 1 : CATCH_REQUIRE(opt.size("size") == 0);
4028 :
4029 1 : CATCH_REQUIRE_THROWS_MATCHES(
4030 : opt.get_long("size")
4031 : , advgetopt::getopt_logic_error
4032 : , Catch::Matchers::ExceptionMessage(
4033 : "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
4034 :
4035 1 : CATCH_REQUIRE_THROWS_MATCHES(
4036 : opt.get_long("size", 0)
4037 : , advgetopt::getopt_logic_error
4038 : , Catch::Matchers::ExceptionMessage(
4039 : "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
4040 :
4041 1 : CATCH_REQUIRE_THROWS_MATCHES(
4042 : opt.get_long("size", 1)
4043 : , advgetopt::getopt_logic_error
4044 : , Catch::Matchers::ExceptionMessage(
4045 : "getopt_logic_error: the --size option was not defined on the command line and it has no or an empty default."));
4046 :
4047 : // other parameters
4048 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4049 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4050 : }
4051 : CATCH_END_SECTION()
4052 3 : }
4053 :
4054 :
4055 :
4056 3 : CATCH_TEST_CASE("incompatible_default_value", "[arguments][invalid][getopt]")
4057 : {
4058 2 : CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
4059 1 : advgetopt::option const options[] =
4060 : {
4061 : advgetopt::define_option(
4062 : advgetopt::Name("size")
4063 : , advgetopt::ShortName('s')
4064 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4065 : , advgetopt::Help("define the size.")
4066 : , advgetopt::DefaultValue("undefined")
4067 : ),
4068 : advgetopt::end_options()
4069 : };
4070 :
4071 1 : advgetopt::options_environment environment_options;
4072 1 : environment_options.f_project_name = "unittest";
4073 1 : environment_options.f_options = options;
4074 1 : environment_options.f_help_header = "Usage: test get_long() functions";
4075 :
4076 1 : char const * cargv[] =
4077 : {
4078 : "/usr/bin/arguments",
4079 : nullptr
4080 : };
4081 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4082 1 : char ** argv = const_cast<char **>(cargv);
4083 :
4084 2 : advgetopt::getopt opt(environment_options, argc, argv);
4085 :
4086 : // check that the result is valid
4087 :
4088 : // an invalid parameter, MUST NOT EXIST
4089 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4090 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4091 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4092 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4093 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4094 :
4095 : // no default
4096 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4097 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
4098 1 : CATCH_REQUIRE(opt.get_default("--").empty());
4099 1 : CATCH_REQUIRE(opt.size("--") == 0);
4100 :
4101 : // the valid parameter
4102 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4103 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4104 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
4105 1 : CATCH_REQUIRE(opt.has_default("size"));
4106 1 : CATCH_REQUIRE(opt.get_default("size") == "undefined"); // this works, it fails with get_long() though
4107 1 : CATCH_REQUIRE(opt.size("size") == 0);
4108 :
4109 1 : CATCH_REQUIRE_THROWS_MATCHES(
4110 : opt.get_long("size")
4111 : , advgetopt::getopt_logic_error
4112 : , Catch::Matchers::ExceptionMessage(
4113 : "getopt_logic_error: invalid default number \"undefined\" for option --size"));
4114 :
4115 1 : CATCH_REQUIRE_THROWS_MATCHES(
4116 : opt.get_long("size", 0)
4117 : , advgetopt::getopt_logic_error
4118 : , Catch::Matchers::ExceptionMessage(
4119 : "getopt_logic_error: invalid default number \"undefined\" for option --size"));
4120 :
4121 1 : CATCH_REQUIRE_THROWS_MATCHES(
4122 : opt.get_long("size", 1)
4123 : , advgetopt::getopt_logic_error
4124 : , Catch::Matchers::ExceptionMessage(
4125 : "getopt_logic_error: invalid default number \"undefined\" for option --size"));
4126 :
4127 : // other parameters
4128 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4129 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4130 : CATCH_END_SECTION()
4131 1 : }
4132 :
4133 :
4134 :
4135 4 : CATCH_TEST_CASE("out_of_range_value", "[arguments][invalid][getopt]")
4136 : {
4137 4 : CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
4138 1 : advgetopt::option const options[] =
4139 : {
4140 : advgetopt::define_option(
4141 : advgetopt::Name("size")
4142 : , advgetopt::ShortName('s')
4143 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4144 : , advgetopt::Help("define the size.")
4145 : , advgetopt::DefaultValue("-300")
4146 : ),
4147 : advgetopt::end_options()
4148 : };
4149 :
4150 1 : advgetopt::options_environment environment_options;
4151 1 : environment_options.f_project_name = "unittest";
4152 1 : environment_options.f_options = options;
4153 1 : environment_options.f_help_header = "Usage: test get_long() functions";
4154 :
4155 1 : char const * cargv[] =
4156 : {
4157 : "/usr/bin/arguments",
4158 : "--size",
4159 : "312",
4160 : nullptr
4161 : };
4162 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4163 1 : char ** argv = const_cast<char **>(cargv);
4164 :
4165 2 : advgetopt::getopt opt(environment_options, argc, argv);
4166 :
4167 : // check that the result is valid
4168 :
4169 : // an invalid parameter, MUST NOT EXIST
4170 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4171 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4172 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4173 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4174 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4175 :
4176 : // no default
4177 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4178 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
4179 1 : CATCH_REQUIRE(opt.get_default("--").empty());
4180 1 : CATCH_REQUIRE(opt.size("--") == 0);
4181 :
4182 : // the valid parameter
4183 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4184 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4185 1 : CATCH_REQUIRE(opt.is_defined("size"));
4186 1 : CATCH_REQUIRE(opt.get_string("size") == "312");
4187 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "312");
4188 1 : CATCH_REQUIRE(opt["size"] == "312");
4189 1 : CATCH_REQUIRE(opt.get_long("size") == 312);
4190 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 312);
4191 1 : CATCH_REQUIRE(opt.get_default("size") == "-300");
4192 1 : CATCH_REQUIRE(opt.size("size") == 1);
4193 :
4194 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: 312 is out of bounds (-100..100 inclusive) in parameter --size.");
4195 1 : CATCH_REQUIRE(opt.get_long("size", 0, -100, 100) == -1);
4196 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
4197 :
4198 : // other parameters
4199 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4200 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4201 : CATCH_END_SECTION()
4202 :
4203 4 : CATCH_START_SECTION("Verify an integer (long) value without arguments and a non-numeric default")
4204 1 : advgetopt::option const options[] =
4205 : {
4206 : advgetopt::define_option(
4207 : advgetopt::Name("size")
4208 : , advgetopt::ShortName('s')
4209 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4210 : , advgetopt::Help("define the size.")
4211 : , advgetopt::DefaultValue("-300")
4212 : ),
4213 : advgetopt::end_options()
4214 : };
4215 :
4216 1 : advgetopt::options_environment environment_options;
4217 1 : environment_options.f_project_name = "unittest";
4218 1 : environment_options.f_options = options;
4219 1 : environment_options.f_help_header = "Usage: test get_long() functions";
4220 :
4221 1 : char const * cargv[] =
4222 : {
4223 : "/usr/bin/arguments",
4224 : nullptr
4225 : };
4226 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4227 1 : char ** argv = const_cast<char **>(cargv);
4228 :
4229 2 : advgetopt::getopt opt(environment_options, argc, argv);
4230 :
4231 : // check that the result is valid
4232 :
4233 : // an invalid parameter, MUST NOT EXIST
4234 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4235 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4236 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4237 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4238 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4239 :
4240 : // no default
4241 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4242 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
4243 1 : CATCH_REQUIRE(opt.get_default("--").empty());
4244 1 : CATCH_REQUIRE(opt.size("--") == 0);
4245 :
4246 : // the valid parameter
4247 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4248 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4249 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
4250 1 : CATCH_REQUIRE(opt.get_default("size") == "-300");
4251 1 : CATCH_REQUIRE(opt.size("size") == 0);
4252 :
4253 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: -300 is out of bounds (-100..100 inclusive) in parameter --size.");
4254 1 : CATCH_REQUIRE(opt.get_long("size", 0, -100, 100) == -1);
4255 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
4256 :
4257 : // other parameters
4258 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4259 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4260 : CATCH_END_SECTION()
4261 2 : }
4262 :
4263 :
4264 3 : CATCH_TEST_CASE("check_sanitizer", "[arguments][valid][getopt]")
4265 : {
4266 2 : CATCH_START_SECTION("Check that the sanitizer is detected")
4267 : {
4268 : // when compiling the tests with coverage we turn on the sanitizer
4269 : // so here we should get output that show the sanitizer as being
4270 : // turned on; unfortunately, we can't test all cases in our current
4271 : // situation
4272 : //
4273 : #if defined(__SANITIZE_ADDRESS__) || defined(__SANITIZE_THREAD__)
4274 : // when running coverage or in the Sanitize version
4275 : //
4276 1 : std::string const expected(
4277 : #ifdef __SANITIZE_ADDRESS__
4278 : "The address sanitizer is compiled in.\n"
4279 : #endif
4280 : #ifdef __SANITIZE_THREAD__
4281 : "The thread sanitizer is compiled in.\n"
4282 : #endif
4283 2 : );
4284 1 : CATCH_REQUIRE(advgetopt::sanitizer_details() == expected);
4285 : #else
4286 : // when running in Debug or Release
4287 : //
4288 : CATCH_REQUIRE(advgetopt::sanitizer_details() == "The address and thread sanitizers are not compiled in.\n");
4289 : #endif
4290 : }
4291 : CATCH_END_SECTION()
4292 7 : }
4293 :
4294 :
4295 : // vim: ts=4 sw=4 et
|