Line data Source code
1 : // Copyright (c) 2006-2025 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 :
24 :
25 : // self
26 : //
27 : #include "catch_main.h"
28 :
29 :
30 : // snapdev
31 : //
32 : #include <snapdev/ostream_to_buf.h>
33 : #include <snapdev/safe_setenv.h>
34 :
35 :
36 : // C++
37 : //
38 : #include <fstream>
39 : #include <sstream>
40 :
41 :
42 : // last include
43 : //
44 : #include <snapdev/poison.h>
45 :
46 :
47 :
48 8 : CATCH_TEST_CASE("flag_argument", "[arguments][valid][getopt]")
49 : {
50 8 : CATCH_START_SECTION("flag_argument: verify a simple --verbose argument")
51 : {
52 2 : advgetopt::option const options[] =
53 : {
54 : advgetopt::define_option(
55 : advgetopt::Name("verbose")
56 : , advgetopt::ShortName('v')
57 : , advgetopt::Flags(advgetopt::standalone_command_flags())
58 : , advgetopt::Help("print info as we work.")
59 : ),
60 : advgetopt::end_options()
61 : };
62 :
63 2 : advgetopt::options_environment environment_options;
64 2 : environment_options.f_project_name = "unittest";
65 2 : environment_options.f_options = options;
66 2 : environment_options.f_environment_flags = 0;
67 2 : environment_options.f_help_header = "Usage: test simple --verbose option";
68 2 : environment_options.f_environment_variable_name = "ADVGETOPT_UNDEFINED_VARIABLE_TO_TEST_THE_NULL";
69 :
70 2 : CATCH_WHEN("using long form")
71 : {
72 1 : char const * cargv[] =
73 : {
74 : "/usr/bin/arguments",
75 : "--verbose",
76 : nullptr
77 : };
78 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
79 1 : char ** argv = const_cast<char **>(cargv);
80 :
81 1 : advgetopt::getopt opt(environment_options, argc, argv);
82 :
83 : // check that the result is valid
84 :
85 : // an invalid parameter, MUST NOT EXIST
86 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
87 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
88 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
89 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
90 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
91 :
92 : // no default
93 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
94 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
95 3 : CATCH_REQUIRE(opt.get_default("--").empty());
96 3 : CATCH_REQUIRE(opt.size("--") == 0);
97 :
98 : // the valid parameter
99 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
100 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
101 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
102 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
103 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
104 :
105 : // other parameters
106 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
107 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
108 3 : }
109 :
110 2 : CATCH_WHEN("using short form")
111 : {
112 1 : char const * cargv[] =
113 : {
114 : "/usr/bin/arguments",
115 : "-v",
116 : nullptr
117 : };
118 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
119 1 : char ** argv = const_cast<char **>(cargv);
120 :
121 1 : advgetopt::getopt opt(environment_options, argc, argv);
122 :
123 : // check that the result is valid
124 :
125 : // an invalid parameter, MUST NOT EXIST
126 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
127 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
128 1 : CATCH_REQUIRE(opt.get_option('Z', true) == nullptr);
129 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
130 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
131 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
132 :
133 : // no default
134 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
135 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
136 3 : CATCH_REQUIRE(opt.get_default("--").empty());
137 3 : CATCH_REQUIRE(opt.size("--") == 0);
138 :
139 : // the valid parameter
140 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
141 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
142 1 : CATCH_REQUIRE(opt.get_option('v', true) == opt.get_option('v'));
143 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
144 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
145 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
146 :
147 : // other parameters
148 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
149 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
150 3 : }
151 : }
152 8 : CATCH_END_SECTION()
153 :
154 8 : CATCH_START_SECTION("flag_argument: verify a simple --verbose argument in a variable")
155 : {
156 2 : advgetopt::option const options[] =
157 : {
158 : advgetopt::define_option(
159 : advgetopt::Name("verbose")
160 : , advgetopt::ShortName('v')
161 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_FLAG>())
162 : , advgetopt::Help("print info as we work.")
163 : ),
164 : advgetopt::end_options()
165 : };
166 :
167 2 : advgetopt::options_environment environment_options;
168 2 : environment_options.f_project_name = "unittest";
169 2 : environment_options.f_options = options;
170 2 : environment_options.f_environment_flags = 0;
171 2 : environment_options.f_help_header = "Usage: test simple --verbose option";
172 2 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
173 :
174 2 : CATCH_WHEN("using long form")
175 : {
176 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose");
177 :
178 1 : char const * cargv[] =
179 : {
180 : "/usr/bin/arguments",
181 : nullptr
182 : };
183 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
184 1 : char ** argv = const_cast<char **>(cargv);
185 :
186 1 : advgetopt::getopt opt(environment_options, argc, argv);
187 :
188 : // check that the result is valid
189 :
190 : // an invalid parameter, MUST NOT EXIST
191 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
192 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
193 1 : CATCH_REQUIRE(opt.get_option('Z', true) == nullptr);
194 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
195 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
196 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
197 :
198 : // no default
199 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
200 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
201 3 : CATCH_REQUIRE(opt.get_default("--").empty());
202 3 : CATCH_REQUIRE(opt.size("--") == 0);
203 :
204 : // the valid parameter
205 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
206 3 : CATCH_REQUIRE(opt.get_option('v') == opt.get_option("verbose"));
207 1 : CATCH_REQUIRE(opt.get_option('v', true) == opt.get_option('v'));
208 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
209 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
210 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
211 :
212 : // other parameters
213 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
214 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
215 3 : }
216 :
217 2 : CATCH_WHEN("using short form")
218 : {
219 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-v");
220 :
221 1 : char const * cargv[] =
222 : {
223 : "/usr/bin/arguments",
224 : nullptr
225 : };
226 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
227 1 : char ** argv = const_cast<char **>(cargv);
228 :
229 1 : advgetopt::getopt opt(environment_options, argc, argv);
230 :
231 : // check that the result is valid
232 :
233 : // an invalid parameter, MUST NOT EXIST
234 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
235 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
236 1 : CATCH_REQUIRE(opt.get_option('Z', true) == nullptr);
237 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
238 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
239 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
240 :
241 : // no default
242 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
243 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
244 3 : CATCH_REQUIRE(opt.get_default("--").empty());
245 3 : CATCH_REQUIRE(opt.size("--") == 0);
246 :
247 : // the valid parameter
248 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
249 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
250 3 : CATCH_REQUIRE(opt.get_option('v', true) == opt.get_option("verbose"));
251 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
252 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
253 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
254 :
255 : // other parameters
256 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
257 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
258 3 : }
259 : }
260 8 : CATCH_END_SECTION()
261 :
262 8 : CATCH_START_SECTION("flag_argument: verify a simple alias argument")
263 : {
264 2 : advgetopt::option const options[] =
265 : {
266 : advgetopt::define_option(
267 : advgetopt::Name("verbosity")
268 : , advgetopt::ShortName('n')
269 : , advgetopt::Flags(advgetopt::standalone_command_flags<advgetopt::GETOPT_FLAG_FLAG>())
270 : , advgetopt::Alias("verbose")
271 : ),
272 : advgetopt::define_option(
273 : advgetopt::Name("verbose")
274 : , advgetopt::ShortName('v')
275 : , advgetopt::Flags(advgetopt::standalone_command_flags())
276 : , advgetopt::Help("print info as we work.")
277 : ),
278 : advgetopt::end_options()
279 : };
280 :
281 2 : advgetopt::options_environment environment_options;
282 2 : environment_options.f_project_name = "unittest";
283 2 : environment_options.f_options = options;
284 2 : environment_options.f_environment_flags = 0;
285 2 : environment_options.f_help_header = "Usage: test simple --verbosity option";
286 :
287 2 : CATCH_WHEN("using long form")
288 : {
289 1 : char const * cargv[] =
290 : {
291 : "/usr/bin/arguments",
292 : "--verbosity",
293 : nullptr
294 : };
295 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
296 1 : char ** argv = const_cast<char **>(cargv);
297 :
298 1 : advgetopt::getopt opt(environment_options, argc, argv);
299 :
300 : // check that the result is valid
301 :
302 : // an invalid parameter, MUST NOT EXIST
303 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
304 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
305 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
306 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
307 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
308 :
309 : // no default
310 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
311 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
312 3 : CATCH_REQUIRE(opt.get_default("--").empty());
313 3 : CATCH_REQUIRE(opt.size("--") == 0);
314 :
315 : // the valid parameter
316 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
317 3 : CATCH_REQUIRE(opt.get_option('v') == opt.get_option("verbose"));
318 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
319 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
320 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
321 :
322 : // the alias parameter
323 3 : CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
324 5 : CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
325 3 : CATCH_REQUIRE(opt.is_defined("verbosity"));
326 3 : CATCH_REQUIRE(opt.get_default("verbosity").empty());
327 3 : CATCH_REQUIRE(opt.size("verbosity") == 1);
328 :
329 : // other parameters
330 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
331 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
332 3 : }
333 :
334 2 : CATCH_WHEN("using short form")
335 : {
336 1 : char const * cargv[] =
337 : {
338 : "/usr/bin/arguments",
339 : "-n",
340 : nullptr
341 : };
342 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
343 1 : char ** argv = const_cast<char **>(cargv);
344 :
345 1 : advgetopt::getopt opt(environment_options, argc, argv);
346 :
347 : // check that the result is valid
348 :
349 : // an invalid parameter, MUST NOT EXIST
350 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
351 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
352 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
353 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
354 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
355 :
356 : // no default
357 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
358 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
359 3 : CATCH_REQUIRE(opt.get_default("--").empty());
360 3 : CATCH_REQUIRE(opt.size("--") == 0);
361 :
362 : // the valid parameter
363 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
364 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
365 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
366 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
367 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
368 :
369 : // the alias parameter
370 3 : CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
371 5 : CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
372 3 : CATCH_REQUIRE(opt.is_defined("verbosity"));
373 3 : CATCH_REQUIRE(opt.get_option('n') == opt.get_option("verbose"));
374 3 : CATCH_REQUIRE(opt.get_option('n', true) == opt.get_option("verbosity", true));
375 3 : CATCH_REQUIRE(opt.get_option('n', true) != opt.get_option("verbose"));
376 3 : CATCH_REQUIRE(opt.get_default("verbosity").empty());
377 3 : CATCH_REQUIRE(opt.size("verbosity") == 1);
378 :
379 : // other parameters
380 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
381 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
382 3 : }
383 : }
384 8 : CATCH_END_SECTION()
385 :
386 8 : CATCH_START_SECTION("flag_argument: verify a simple alias argument in a variable")
387 : {
388 2 : advgetopt::option const options[] =
389 : {
390 : advgetopt::define_option(
391 : advgetopt::Name("verbose")
392 : , advgetopt::ShortName('v')
393 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_FLAG>())
394 : , advgetopt::Help("print info as we work.")
395 : ),
396 : advgetopt::define_option(
397 : advgetopt::Name("verbosity")
398 : , advgetopt::ShortName('n')
399 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_FLAG>())
400 : , advgetopt::Alias("verbose")
401 : ),
402 : advgetopt::end_options()
403 : };
404 :
405 2 : advgetopt::options_environment environment_options;
406 2 : environment_options.f_project_name = "unittest";
407 2 : environment_options.f_options = options;
408 2 : environment_options.f_environment_flags = 0;
409 2 : environment_options.f_help_header = "Usage: test simple --verbosity option";
410 2 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
411 :
412 2 : CATCH_WHEN("using long form")
413 : {
414 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbosity");
415 :
416 1 : char const * cargv[] =
417 : {
418 : "/usr/bin/arguments",
419 : nullptr
420 : };
421 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
422 1 : char ** argv = const_cast<char **>(cargv);
423 :
424 1 : advgetopt::getopt opt(environment_options, argc, argv);
425 :
426 : // check that the result is valid
427 :
428 : // an invalid parameter, MUST NOT EXIST
429 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
430 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
431 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
432 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
433 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
434 :
435 : // no default
436 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
437 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
438 3 : CATCH_REQUIRE(opt.get_default("--").empty());
439 3 : CATCH_REQUIRE(opt.size("--") == 0);
440 :
441 : // the valid parameter
442 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
443 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
444 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
445 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
446 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
447 :
448 : // the alias parameter
449 3 : CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
450 5 : CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
451 3 : CATCH_REQUIRE(opt.is_defined("verbosity"));
452 3 : CATCH_REQUIRE(opt.get_default("verbosity").empty());
453 3 : CATCH_REQUIRE(opt.size("verbosity") == 1);
454 :
455 : // other parameters
456 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
457 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
458 3 : }
459 :
460 2 : CATCH_WHEN("using short form")
461 : {
462 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-n");
463 :
464 1 : char const * cargv[] =
465 : {
466 : "/usr/bin/arguments",
467 : nullptr
468 : };
469 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
470 1 : char ** argv = const_cast<char **>(cargv);
471 :
472 1 : advgetopt::getopt opt(environment_options, argc, argv);
473 :
474 : // check that the result is valid
475 :
476 : // an invalid parameter, MUST NOT EXIST
477 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
478 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
479 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
480 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
481 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
482 :
483 : // no default
484 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
485 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
486 3 : CATCH_REQUIRE(opt.get_default("--").empty());
487 3 : CATCH_REQUIRE(opt.size("--") == 0);
488 :
489 : // the valid parameter
490 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
491 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
492 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
493 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
494 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
495 :
496 : // the alias parameter
497 3 : CATCH_REQUIRE(opt.get_option("verbosity") != nullptr);
498 5 : CATCH_REQUIRE(opt.get_option("verbosity") == opt.get_option("verbose"));
499 3 : CATCH_REQUIRE(opt.is_defined("verbosity"));
500 3 : CATCH_REQUIRE(opt.get_default("verbosity").empty());
501 3 : CATCH_REQUIRE(opt.size("verbosity") == 1);
502 :
503 : // other parameters
504 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
505 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
506 3 : }
507 : }
508 8 : CATCH_END_SECTION()
509 8 : }
510 :
511 :
512 11 : CATCH_TEST_CASE("require_argument", "[arguments][valid][required][getopt]")
513 : {
514 11 : CATCH_START_SECTION("require_argument: verify a simple --out <filename> argument")
515 : {
516 3 : advgetopt::option const options[] =
517 : {
518 : advgetopt::define_option(
519 : advgetopt::Name("out")
520 : , advgetopt::ShortName('o')
521 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
522 : , advgetopt::Help("output filename.")
523 : ),
524 : advgetopt::end_options()
525 : };
526 :
527 3 : advgetopt::options_environment environment_options;
528 3 : environment_options.f_project_name = "unittest";
529 3 : environment_options.f_options = options;
530 3 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
531 3 : environment_options.f_help_header = "Usage: test simple --out <filename> option";
532 :
533 3 : CATCH_WHEN("using long form")
534 : {
535 1 : char const * cargv[] =
536 : {
537 : "/usr/bin/arguments",
538 : "--out",
539 : "my-filename.out",
540 : "--license",
541 : nullptr
542 : };
543 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
544 1 : char ** argv = const_cast<char **>(cargv);
545 :
546 1 : advgetopt::getopt opt(environment_options, argc, argv);
547 :
548 : // check that the result is valid
549 :
550 : // an invalid parameter, MUST NOT EXIST
551 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
552 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
553 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
554 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
555 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
556 :
557 : // the valid parameter
558 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
559 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
560 3 : CATCH_REQUIRE(opt.is_defined("out"));
561 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
562 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
563 3 : CATCH_REQUIRE(opt.get_default("out").empty());
564 3 : CATCH_REQUIRE(opt.size("out") == 1);
565 :
566 : // the license system parameter
567 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
568 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
569 3 : CATCH_REQUIRE(opt.is_defined("license"));
570 3 : CATCH_REQUIRE(opt.get_default("license").empty());
571 3 : CATCH_REQUIRE(opt.size("license") == 1);
572 :
573 : // the copyright system parameter
574 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
575 1 : CATCH_REQUIRE(opt.get_option('C') != nullptr);
576 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
577 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
578 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
579 :
580 : // other parameters
581 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
582 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
583 4 : }
584 :
585 3 : CATCH_WHEN("using long form with an equal sign")
586 : {
587 1 : char const * cargv[] =
588 : {
589 : "/usr/bin/arguments",
590 : "--out=my-filename.out",
591 : nullptr
592 : };
593 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
594 1 : char ** argv = const_cast<char **>(cargv);
595 :
596 1 : advgetopt::getopt opt(environment_options, argc, argv);
597 :
598 : // check that the result is valid
599 :
600 : // an invalid parameter, MUST NOT EXIST
601 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
602 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
603 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
604 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
605 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
606 :
607 : // the valid parameter
608 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
609 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
610 3 : CATCH_REQUIRE(opt.is_defined("out"));
611 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
612 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
613 3 : CATCH_REQUIRE(opt.get_default("out").empty());
614 3 : CATCH_REQUIRE(opt.size("out") == 1);
615 :
616 : // other parameters
617 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
618 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
619 4 : }
620 :
621 3 : CATCH_WHEN("using short form")
622 : {
623 1 : char const * cargv[] =
624 : {
625 : "/usr/bin/arguments",
626 : "-o",
627 : "my-filename.out",
628 : nullptr
629 : };
630 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
631 1 : char ** argv = const_cast<char **>(cargv);
632 :
633 1 : advgetopt::getopt opt(environment_options, argc, argv);
634 :
635 : // check that the result is valid
636 :
637 : // an invalid parameter, MUST NOT EXIST
638 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
639 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
640 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
641 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
642 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
643 :
644 : // the valid parameter
645 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
646 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
647 3 : CATCH_REQUIRE(opt.is_defined("out"));
648 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
649 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
650 3 : CATCH_REQUIRE(opt.get_default("out").empty());
651 3 : CATCH_REQUIRE(opt.size("out") == 1);
652 :
653 : // other parameters
654 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
655 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
656 4 : }
657 : }
658 11 : CATCH_END_SECTION()
659 :
660 11 : CATCH_START_SECTION("require_argument: verify a simple alias of --out <filename> argument")
661 : {
662 3 : advgetopt::option const options[] =
663 : {
664 : advgetopt::define_option(
665 : advgetopt::Name("out")
666 : , advgetopt::ShortName('o')
667 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
668 : , advgetopt::Help("output filename.")
669 : ),
670 : advgetopt::define_option(
671 : advgetopt::Name("results")
672 : , advgetopt::ShortName('r')
673 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
674 : , advgetopt::Alias("out")
675 : ),
676 : advgetopt::end_options()
677 : };
678 :
679 3 : advgetopt::options_environment environment_options;
680 3 : environment_options.f_project_name = "unittest";
681 3 : environment_options.f_options = options;
682 3 : environment_options.f_environment_flags = 0;
683 3 : environment_options.f_help_header = "Usage: test simple --results <filename> option";
684 :
685 3 : CATCH_WHEN("using long form")
686 : {
687 1 : char const * cargv[] =
688 : {
689 : "/usr/bin/arguments",
690 : "--results",
691 : "my-filename.out",
692 : nullptr
693 : };
694 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
695 1 : char ** argv = const_cast<char **>(cargv);
696 :
697 1 : advgetopt::getopt opt(environment_options, argc, argv);
698 :
699 : // check that the result is valid
700 :
701 : // an invalid parameter, MUST NOT EXIST
702 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
703 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
704 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
705 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
706 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
707 :
708 : // the valid parameter
709 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
710 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
711 3 : CATCH_REQUIRE(opt.is_defined("out"));
712 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
713 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
714 3 : CATCH_REQUIRE(opt.get_default("out").empty());
715 3 : CATCH_REQUIRE(opt.size("out") == 1);
716 :
717 : // the alias parameter
718 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
719 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
720 3 : CATCH_REQUIRE(opt.is_defined("results"));
721 3 : CATCH_REQUIRE(opt.is_defined("results"));
722 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
723 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
724 3 : CATCH_REQUIRE(opt.get_default("results").empty());
725 3 : CATCH_REQUIRE(opt.size("results") == 1);
726 :
727 : // other parameters
728 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
729 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
730 4 : }
731 :
732 3 : CATCH_WHEN("using long form with an equal sign")
733 : {
734 1 : char const * cargv[] =
735 : {
736 : "/usr/bin/arguments",
737 : "--results=my-filename.out",
738 : nullptr
739 : };
740 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
741 1 : char ** argv = const_cast<char **>(cargv);
742 :
743 1 : advgetopt::getopt opt(environment_options, argc, argv);
744 :
745 : // check that the result is valid
746 :
747 : // an invalid parameter, MUST NOT EXIST
748 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
749 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
750 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
751 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
752 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
753 :
754 : // the valid parameter
755 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
756 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
757 3 : CATCH_REQUIRE(opt.is_defined("out"));
758 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
759 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
760 3 : CATCH_REQUIRE(opt.get_default("out").empty());
761 3 : CATCH_REQUIRE(opt.size("out") == 1);
762 :
763 : // the alias parameter
764 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
765 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
766 3 : CATCH_REQUIRE(opt.is_defined("results"));
767 3 : CATCH_REQUIRE(opt.is_defined("results"));
768 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
769 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
770 3 : CATCH_REQUIRE(opt.get_default("results").empty());
771 3 : CATCH_REQUIRE(opt.size("results") == 1);
772 :
773 : // other parameters
774 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
775 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
776 4 : }
777 :
778 3 : CATCH_WHEN("using short form")
779 : {
780 1 : char const * cargv[] =
781 : {
782 : "/usr/bin/arguments",
783 : "-r",
784 : "my-filename.out",
785 : nullptr
786 : };
787 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
788 1 : char ** argv = const_cast<char **>(cargv);
789 :
790 1 : advgetopt::getopt opt(environment_options, argc, argv);
791 :
792 : // check that the result is valid
793 :
794 : // an invalid parameter, MUST NOT EXIST
795 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
796 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
797 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
798 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
799 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
800 :
801 : // the valid parameter
802 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
803 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
804 3 : CATCH_REQUIRE(opt.is_defined("out"));
805 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
806 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
807 3 : CATCH_REQUIRE(opt.get_default("out").empty());
808 3 : CATCH_REQUIRE(opt.size("out") == 1);
809 :
810 : // the alias parameter
811 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
812 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
813 3 : CATCH_REQUIRE(opt.is_defined("results"));
814 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
815 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
816 3 : CATCH_REQUIRE(opt.get_default("results").empty());
817 3 : CATCH_REQUIRE(opt.size("results") == 1);
818 :
819 : // other parameters
820 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
821 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
822 4 : }
823 : }
824 11 : CATCH_END_SECTION()
825 :
826 11 : CATCH_START_SECTION("require_argument: verify a simple --out <filename> argument in a variable")
827 : {
828 3 : advgetopt::option const options[] =
829 : {
830 : advgetopt::define_option(
831 : advgetopt::Name("out_dir")
832 : , advgetopt::ShortName('o')
833 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
834 : , advgetopt::Help("output filename.")
835 : ),
836 : advgetopt::end_options()
837 : };
838 :
839 3 : advgetopt::options_environment environment_options;
840 3 : environment_options.f_project_name = "unittest";
841 3 : environment_options.f_options = options;
842 3 : environment_options.f_environment_flags = 0;
843 3 : environment_options.f_help_header = "Usage: test simple --out_dir <filename> option";
844 3 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
845 :
846 3 : CATCH_WHEN("using long form")
847 : {
848 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out_dir my-filename.out");
849 :
850 1 : char const * cargv[] =
851 : {
852 : "/usr/bin/arguments",
853 : nullptr
854 : };
855 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
856 1 : char ** argv = const_cast<char **>(cargv);
857 :
858 1 : advgetopt::getopt opt(environment_options, argc, argv);
859 :
860 : // check that the result is valid
861 :
862 : // an invalid parameter, MUST NOT EXIST
863 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
864 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
865 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
866 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
867 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
868 :
869 : // the valid parameter
870 3 : CATCH_REQUIRE(opt.get_option("out-dir") != nullptr);
871 3 : CATCH_REQUIRE(opt.get_option("out_dir") != nullptr);
872 5 : CATCH_REQUIRE(opt.get_option("out_dir") == opt.get_option("out-dir"));
873 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
874 3 : CATCH_REQUIRE(opt.is_defined("out-dir"));
875 3 : CATCH_REQUIRE(opt.get_string("out-dir") == "my-filename.out");
876 3 : CATCH_REQUIRE(opt.get_string("out-dir", 0) == "my-filename.out");
877 3 : CATCH_REQUIRE(opt.get_default("out-dir").empty());
878 3 : CATCH_REQUIRE(opt.size("out-dir") == 1);
879 :
880 : // other parameters
881 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
882 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
883 4 : }
884 :
885 3 : CATCH_WHEN("using long form with an equal sign")
886 : {
887 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out_dir=my-filename.out");
888 :
889 1 : char const * cargv[] =
890 : {
891 : "/usr/bin/arguments",
892 : nullptr
893 : };
894 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
895 1 : char ** argv = const_cast<char **>(cargv);
896 :
897 1 : advgetopt::getopt opt(environment_options, argc, argv);
898 :
899 : // check that the result is valid
900 :
901 : // an invalid parameter, MUST NOT EXIST
902 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
903 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
904 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
905 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
906 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
907 :
908 : // the valid parameter
909 3 : CATCH_REQUIRE(opt.get_option("out_dir") != nullptr);
910 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
911 3 : CATCH_REQUIRE(opt.is_defined("out_dir"));
912 3 : CATCH_REQUIRE(opt.get_string("out_dir") == "my-filename.out");
913 3 : CATCH_REQUIRE(opt.get_string("out_dir", 0) == "my-filename.out");
914 3 : CATCH_REQUIRE(opt.get_default("out_dir").empty());
915 3 : CATCH_REQUIRE(opt.size("out_dir") == 1);
916 :
917 : // other parameters
918 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
919 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
920 4 : }
921 :
922 3 : CATCH_WHEN("using short form")
923 : {
924 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o my-filename.out");
925 :
926 1 : char const * cargv[] =
927 : {
928 : "/usr/bin/arguments",
929 : nullptr
930 : };
931 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
932 1 : char ** argv = const_cast<char **>(cargv);
933 :
934 1 : advgetopt::getopt opt(environment_options, argc, argv);
935 :
936 : // check that the result is valid
937 :
938 : // an invalid parameter, MUST NOT EXIST
939 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
940 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
941 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
942 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
943 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
944 :
945 : // the valid parameter
946 3 : CATCH_REQUIRE(opt.get_option("out_dir") != nullptr);
947 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
948 3 : CATCH_REQUIRE(opt.is_defined("out-dir"));
949 3 : CATCH_REQUIRE(opt.get_string("out_dir") == "my-filename.out");
950 3 : CATCH_REQUIRE(opt.get_string("out-dir", 0) == "my-filename.out");
951 3 : CATCH_REQUIRE(opt.get_default("out_dir").empty());
952 3 : CATCH_REQUIRE(opt.size("out-dir") == 1);
953 :
954 : // other parameters
955 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
956 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
957 4 : }
958 : }
959 11 : CATCH_END_SECTION()
960 :
961 11 : CATCH_START_SECTION("require_argument: verify a simple alias of --out <filename> argument in a variable")
962 : {
963 2 : advgetopt::option const options[] =
964 : {
965 : advgetopt::define_option(
966 : advgetopt::Name("out")
967 : , advgetopt::ShortName('o')
968 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
969 : , advgetopt::Help("output filename.")
970 : ),
971 : advgetopt::define_option(
972 : advgetopt::Name("results")
973 : , advgetopt::ShortName('r')
974 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
975 : , advgetopt::Alias("o")
976 : ),
977 : advgetopt::end_options()
978 : };
979 :
980 2 : advgetopt::options_environment environment_options;
981 2 : environment_options.f_project_name = "unittest";
982 2 : environment_options.f_options = options;
983 2 : environment_options.f_environment_flags = 0;
984 2 : environment_options.f_help_header = "Usage: test simple alias of --out <filename> option";
985 2 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
986 :
987 2 : CATCH_WHEN("using long form")
988 : {
989 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--results my-filename.out");
990 :
991 1 : char const * cargv[] =
992 : {
993 : "/usr/bin/arguments",
994 : nullptr
995 : };
996 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
997 1 : char ** argv = const_cast<char **>(cargv);
998 :
999 1 : advgetopt::getopt opt(environment_options, argc, argv);
1000 :
1001 : // check that the result is valid
1002 :
1003 : // an invalid parameter, MUST NOT EXIST
1004 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1005 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1006 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1007 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1008 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1009 :
1010 : // the valid parameter
1011 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1012 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1013 3 : CATCH_REQUIRE(opt.is_defined("out"));
1014 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1015 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1016 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1017 3 : CATCH_REQUIRE(opt.size("out") == 1);
1018 :
1019 : // the alias parameter
1020 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
1021 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
1022 3 : CATCH_REQUIRE(opt.is_defined("results"));
1023 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
1024 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
1025 3 : CATCH_REQUIRE(opt.get_default("results").empty());
1026 3 : CATCH_REQUIRE(opt.size("results") == 1);
1027 :
1028 : // other parameters
1029 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1030 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1031 3 : }
1032 :
1033 2 : CATCH_WHEN("using short form")
1034 : {
1035 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-r my-filename.out");
1036 :
1037 1 : char const * cargv[] =
1038 : {
1039 : "/usr/bin/arguments",
1040 : nullptr
1041 : };
1042 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1043 1 : char ** argv = const_cast<char **>(cargv);
1044 :
1045 1 : advgetopt::getopt opt(environment_options, argc, argv);
1046 :
1047 : // check that the result is valid
1048 :
1049 : // an invalid parameter, MUST NOT EXIST
1050 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1051 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1052 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1053 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1054 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1055 :
1056 : // the valid parameter
1057 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1058 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1059 3 : CATCH_REQUIRE(opt.is_defined("out"));
1060 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1061 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1062 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1063 3 : CATCH_REQUIRE(opt.size("out") == 1);
1064 :
1065 : // the alias parameter
1066 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
1067 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
1068 3 : CATCH_REQUIRE(opt.is_defined("results"));
1069 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
1070 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
1071 3 : CATCH_REQUIRE(opt.get_default("results").empty());
1072 3 : CATCH_REQUIRE(opt.size("results") == 1);
1073 :
1074 : // other parameters
1075 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1076 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1077 3 : }
1078 : }
1079 11 : CATCH_END_SECTION()
1080 11 : }
1081 :
1082 :
1083 6 : CATCH_TEST_CASE("require_arguments", "[arguments][valid][required][multiple][getopt]")
1084 : {
1085 6 : CATCH_START_SECTION("require_arguments: Verify a simple --out <filename> ... argument")
1086 : {
1087 2 : advgetopt::option const options[] =
1088 : {
1089 : advgetopt::define_option(
1090 : advgetopt::Name("out")
1091 : , advgetopt::ShortName('o')
1092 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
1093 : , advgetopt::Help("output filename.")
1094 : ),
1095 : advgetopt::end_options()
1096 : };
1097 :
1098 2 : advgetopt::options_environment environment_options;
1099 2 : environment_options.f_project_name = "unittest";
1100 2 : environment_options.f_options = options;
1101 2 : environment_options.f_environment_flags = 0;
1102 2 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
1103 :
1104 2 : CATCH_WHEN("using long form")
1105 : {
1106 1 : char const * cargv[] =
1107 : {
1108 : "/usr/bin/arguments",
1109 : "--out",
1110 : "my-filename.out",
1111 : "another.out",
1112 : "last.out",
1113 : nullptr
1114 : };
1115 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1116 1 : char ** argv = const_cast<char **>(cargv);
1117 :
1118 1 : advgetopt::getopt opt(environment_options, argc, argv);
1119 :
1120 : // check that the result is valid
1121 :
1122 : // an invalid parameter, MUST NOT EXIST
1123 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1124 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1125 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1126 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1127 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1128 :
1129 : // the valid parameter
1130 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1131 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1132 3 : CATCH_REQUIRE(opt.is_defined("out"));
1133 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1134 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1135 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1136 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1137 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1138 3 : CATCH_REQUIRE(opt.size("out") == 3);
1139 :
1140 : // other parameters
1141 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1142 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1143 3 : }
1144 :
1145 2 : CATCH_WHEN("using short form")
1146 : {
1147 1 : char const * cargv[] =
1148 : {
1149 : "/usr/bin/arguments",
1150 : "-o",
1151 : "my-filename.out",
1152 : "another.out",
1153 : "last.out",
1154 : nullptr
1155 : };
1156 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1157 1 : char ** argv = const_cast<char **>(cargv);
1158 :
1159 1 : advgetopt::getopt opt(environment_options, argc, argv);
1160 :
1161 : // check that the result is valid
1162 :
1163 : // an invalid parameter, MUST NOT EXIST
1164 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1165 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1166 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1167 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1168 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1169 :
1170 : // the valid parameter
1171 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1172 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1173 3 : CATCH_REQUIRE(opt.is_defined("out"));
1174 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1175 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1176 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1177 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1178 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1179 3 : CATCH_REQUIRE(opt.size("out") == 3);
1180 :
1181 : // other parameters
1182 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1183 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1184 3 : }
1185 : }
1186 6 : CATCH_END_SECTION()
1187 :
1188 6 : CATCH_START_SECTION("require_arguments: verify a simple alias of --out <filename> ... argument")
1189 : {
1190 2 : advgetopt::option const options[] =
1191 : {
1192 : advgetopt::define_option(
1193 : advgetopt::Name("out")
1194 : , advgetopt::ShortName('o')
1195 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
1196 : , advgetopt::Help("output filename.")
1197 : ),
1198 : advgetopt::define_option(
1199 : advgetopt::Name("results")
1200 : , advgetopt::ShortName('r')
1201 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
1202 : , advgetopt::Alias("out")
1203 : ),
1204 : advgetopt::end_options()
1205 : };
1206 :
1207 2 : advgetopt::options_environment environment_options;
1208 2 : environment_options.f_project_name = "unittest";
1209 2 : environment_options.f_options = options;
1210 2 : environment_options.f_environment_flags = 0;
1211 2 : environment_options.f_help_header = "Usage: test simple alias of --out <filename> ... option";
1212 :
1213 2 : CATCH_WHEN("using long form")
1214 : {
1215 1 : char const * cargv[] =
1216 : {
1217 : "/usr/bin/arguments",
1218 : "--results",
1219 : "my-filename.out",
1220 : "another.out",
1221 : "last.out",
1222 : nullptr
1223 : };
1224 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1225 1 : char ** argv = const_cast<char **>(cargv);
1226 :
1227 1 : advgetopt::getopt opt(environment_options, argc, argv);
1228 :
1229 : // check that the result is valid
1230 :
1231 : // an invalid parameter, MUST NOT EXIST
1232 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1233 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1234 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1235 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1236 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1237 :
1238 : // the valid parameter
1239 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1240 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1241 3 : CATCH_REQUIRE(opt.is_defined("out"));
1242 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1243 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1244 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1245 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1246 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1247 3 : CATCH_REQUIRE(opt.size("out") == 3);
1248 :
1249 : // the alias parameter
1250 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
1251 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
1252 3 : CATCH_REQUIRE(opt.is_defined("results"));
1253 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
1254 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
1255 3 : CATCH_REQUIRE(opt.get_string("results", 1) == "another.out");
1256 3 : CATCH_REQUIRE(opt.get_string("results", 2) == "last.out");
1257 3 : CATCH_REQUIRE(opt.get_default("results").empty());
1258 3 : CATCH_REQUIRE(opt.size("results") == 3);
1259 :
1260 : // other parameters
1261 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1262 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1263 3 : }
1264 :
1265 2 : CATCH_WHEN("using short form")
1266 : {
1267 1 : char const * cargv[] =
1268 : {
1269 : "/usr/bin/arguments",
1270 : "-r",
1271 : "my-filename.out",
1272 : "another.out",
1273 : "last.out",
1274 : nullptr
1275 : };
1276 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1277 1 : char ** argv = const_cast<char **>(cargv);
1278 :
1279 1 : advgetopt::getopt opt(environment_options, argc, argv);
1280 :
1281 : // check that the result is valid
1282 :
1283 : // an invalid parameter, MUST NOT EXIST
1284 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1285 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1286 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1287 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1288 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1289 :
1290 : // the valid parameter
1291 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1292 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1293 3 : CATCH_REQUIRE(opt.is_defined("out"));
1294 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1295 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1296 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1297 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1298 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1299 3 : CATCH_REQUIRE(opt.size("out") == 3);
1300 :
1301 : // the alias parameter
1302 3 : CATCH_REQUIRE(opt.get_option("results") != nullptr);
1303 5 : CATCH_REQUIRE(opt.get_option("results") == opt.get_option("out"));
1304 3 : CATCH_REQUIRE(opt.is_defined("results"));
1305 3 : CATCH_REQUIRE(opt.get_string("results") == "my-filename.out");
1306 3 : CATCH_REQUIRE(opt.get_string("results", 0) == "my-filename.out");
1307 3 : CATCH_REQUIRE(opt.get_string("results", 1) == "another.out");
1308 3 : CATCH_REQUIRE(opt.get_string("results", 2) == "last.out");
1309 3 : CATCH_REQUIRE(opt.get_default("results").empty());
1310 3 : CATCH_REQUIRE(opt.size("results") == 3);
1311 :
1312 : // other parameters
1313 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1314 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1315 3 : }
1316 : }
1317 6 : CATCH_END_SECTION()
1318 :
1319 6 : CATCH_START_SECTION("require_arguments: verify a simple --out <filename> ... argument in a variable")
1320 : {
1321 2 : advgetopt::option const options[] =
1322 : {
1323 : advgetopt::define_option(
1324 : advgetopt::Name("out")
1325 : , advgetopt::ShortName('o')
1326 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED, advgetopt::GETOPT_FLAG_MULTIPLE>())
1327 : , advgetopt::Help("output filename.")
1328 : ),
1329 : advgetopt::end_options()
1330 : };
1331 :
1332 2 : advgetopt::options_environment environment_options;
1333 2 : environment_options.f_project_name = "unittest";
1334 2 : environment_options.f_options = options;
1335 2 : environment_options.f_environment_flags = 0;
1336 2 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
1337 2 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
1338 :
1339 2 : CATCH_WHEN("using long form")
1340 : {
1341 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out \"my filename.out\" another.out last.out");
1342 :
1343 1 : char const * cargv[] =
1344 : {
1345 : "/usr/bin/arguments",
1346 : nullptr
1347 : };
1348 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1349 1 : char ** argv = const_cast<char **>(cargv);
1350 :
1351 1 : advgetopt::getopt opt(environment_options, argc, argv);
1352 :
1353 : // check that the result is valid
1354 :
1355 : // an invalid parameter, MUST NOT EXIST
1356 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1357 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1358 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1359 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1360 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1361 :
1362 : // the valid parameter
1363 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1364 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1365 3 : CATCH_REQUIRE(opt.is_defined("out"));
1366 3 : CATCH_REQUIRE(opt.get_string("out") == "my filename.out");
1367 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my filename.out");
1368 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1369 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1370 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1371 3 : CATCH_REQUIRE(opt.size("out") == 3);
1372 :
1373 : // other parameters
1374 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1375 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1376 3 : }
1377 :
1378 2 : CATCH_WHEN("using short form")
1379 : {
1380 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o 'my filename.out' another.out last.out");
1381 :
1382 1 : char const * cargv[] =
1383 : {
1384 : "/usr/bin/arguments",
1385 : nullptr
1386 : };
1387 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1388 1 : char ** argv = const_cast<char **>(cargv);
1389 :
1390 1 : advgetopt::getopt opt(environment_options, argc, argv);
1391 :
1392 : // check that the result is valid
1393 :
1394 : // an invalid parameter, MUST NOT EXIST
1395 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1396 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1397 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1398 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1399 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1400 :
1401 : // the valid parameter
1402 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1403 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1404 3 : CATCH_REQUIRE(opt.is_defined("out"));
1405 3 : CATCH_REQUIRE(opt.get_string("out") == "my filename.out");
1406 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my filename.out");
1407 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1408 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1409 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1410 3 : CATCH_REQUIRE(opt.size("out") == 3);
1411 :
1412 : // other parameters
1413 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1414 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1415 3 : }
1416 : }
1417 6 : CATCH_END_SECTION()
1418 6 : }
1419 :
1420 :
1421 15 : CATCH_TEST_CASE("optional_arguments", "[arguments][valid][multiple][getopt]")
1422 : {
1423 15 : CATCH_START_SECTION("optional_arguments: verify a simple --out [<filename> ...] argument")
1424 : {
1425 9 : char const * const separators[] =
1426 : {
1427 : ",",
1428 : nullptr
1429 : };
1430 :
1431 9 : advgetopt::option const options[] =
1432 : {
1433 45 : advgetopt::define_option(
1434 : advgetopt::Name("out")
1435 : , advgetopt::ShortName('o')
1436 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
1437 : , advgetopt::Help("output filename.")
1438 : , advgetopt::Separators(separators)
1439 : ),
1440 : advgetopt::end_options()
1441 45 : };
1442 :
1443 9 : advgetopt::options_environment environment_options;
1444 9 : environment_options.f_project_name = "unittest";
1445 9 : environment_options.f_options = options;
1446 9 : environment_options.f_environment_flags = 0;
1447 9 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
1448 :
1449 9 : CATCH_WHEN("using long form and no arguments")
1450 : {
1451 1 : char const * cargv[] =
1452 : {
1453 : "/usr/bin/arguments",
1454 : "--out",
1455 : nullptr
1456 : };
1457 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1458 1 : char ** argv = const_cast<char **>(cargv);
1459 :
1460 1 : advgetopt::getopt opt(environment_options, argc, argv);
1461 :
1462 : // check that the result is valid
1463 :
1464 : // an invalid parameter, MUST NOT EXIST
1465 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1466 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1467 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1468 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1469 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1470 :
1471 : // the valid parameter
1472 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1473 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1474 3 : CATCH_REQUIRE(opt.is_defined("out"));
1475 3 : CATCH_REQUIRE(opt.get_string("out").empty());
1476 3 : CATCH_REQUIRE(opt.get_string("out", 0).empty());
1477 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1478 3 : CATCH_REQUIRE(opt.size("out") == 1);
1479 :
1480 : // other parameters
1481 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1482 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1483 10 : }
1484 :
1485 9 : CATCH_WHEN("using long form and one empty argument and an equal sign")
1486 : {
1487 1 : char const * cargv[] =
1488 : {
1489 : "/usr/bin/arguments",
1490 : "--out=",
1491 : nullptr
1492 : };
1493 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1494 1 : char ** argv = const_cast<char **>(cargv);
1495 :
1496 1 : advgetopt::getopt opt(environment_options, argc, argv);
1497 :
1498 : // check that the result is valid
1499 :
1500 : // an invalid parameter, MUST NOT EXIST
1501 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1502 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1503 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1504 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1505 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1506 :
1507 : // the valid parameter
1508 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1509 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1510 3 : CATCH_REQUIRE(opt.is_defined("out"));
1511 3 : CATCH_REQUIRE(opt.get_string("out").empty());
1512 3 : CATCH_REQUIRE(opt.get_string("out", 0).empty());
1513 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1514 3 : CATCH_REQUIRE(opt.size("out") == 1);
1515 :
1516 : // other parameters
1517 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1518 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1519 10 : }
1520 :
1521 9 : CATCH_WHEN("using long form and one argument")
1522 : {
1523 1 : char const * cargv[] =
1524 : {
1525 : "/usr/bin/arguments",
1526 : "--out",
1527 : "my-filename.out",
1528 : nullptr
1529 : };
1530 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1531 1 : char ** argv = const_cast<char **>(cargv);
1532 :
1533 1 : advgetopt::getopt opt(environment_options, argc, argv);
1534 :
1535 : // check that the result is valid
1536 :
1537 : // an invalid parameter, MUST NOT EXIST
1538 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1539 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1540 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1541 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1542 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1543 :
1544 : // the valid parameter
1545 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1546 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1547 3 : CATCH_REQUIRE(opt.is_defined("out"));
1548 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1549 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1550 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1551 3 : CATCH_REQUIRE(opt.size("out") == 1);
1552 :
1553 : // other parameters
1554 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1555 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1556 10 : }
1557 :
1558 9 : CATCH_WHEN("using long form and one argument and an equal sign")
1559 : {
1560 1 : char const * cargv[] =
1561 : {
1562 : "/usr/bin/arguments",
1563 : "--out=my-filename.out",
1564 : nullptr
1565 : };
1566 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1567 1 : char ** argv = const_cast<char **>(cargv);
1568 :
1569 1 : advgetopt::getopt opt(environment_options, argc, argv);
1570 :
1571 : // check that the result is valid
1572 :
1573 : // an invalid parameter, MUST NOT EXIST
1574 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1575 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1576 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1577 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1578 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1579 :
1580 : // the valid parameter
1581 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1582 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1583 3 : CATCH_REQUIRE(opt.is_defined("out"));
1584 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1585 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1586 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1587 3 : CATCH_REQUIRE(opt.size("out") == 1);
1588 :
1589 : // other parameters
1590 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1591 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1592 10 : }
1593 :
1594 9 : CATCH_WHEN("using long form and three arguments")
1595 : {
1596 1 : char const * cargv[] =
1597 : {
1598 : "/usr/bin/arguments",
1599 : "--out",
1600 : "my-filename.out",
1601 : "another.out",
1602 : "last.out",
1603 : nullptr
1604 : };
1605 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1606 1 : char ** argv = const_cast<char **>(cargv);
1607 :
1608 1 : advgetopt::getopt opt(environment_options, argc, argv);
1609 :
1610 : // check that the result is valid
1611 :
1612 : // an invalid parameter, MUST NOT EXIST
1613 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1614 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1615 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1616 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1617 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1618 :
1619 : // the valid parameter
1620 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1621 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1622 3 : CATCH_REQUIRE(opt.is_defined("out"));
1623 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1624 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1625 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1626 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1627 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1628 3 : CATCH_REQUIRE(opt.size("out") == 3);
1629 :
1630 : // other parameters
1631 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1632 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1633 10 : }
1634 :
1635 9 : CATCH_WHEN("using long form and three arguments and an equal sign")
1636 : {
1637 1 : char const * cargv[] =
1638 : {
1639 : "/usr/bin/arguments",
1640 : "--out=my-filename.out,another.out,last.out",
1641 : nullptr
1642 : };
1643 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1644 1 : char ** argv = const_cast<char **>(cargv);
1645 :
1646 1 : advgetopt::getopt opt(environment_options, argc, argv);
1647 :
1648 : // check that the result is valid
1649 :
1650 : // an invalid parameter, MUST NOT EXIST
1651 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1652 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1653 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1654 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1655 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1656 :
1657 : // the valid parameter
1658 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1659 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1660 3 : CATCH_REQUIRE(opt.is_defined("out"));
1661 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1662 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1663 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1664 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1665 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1666 3 : CATCH_REQUIRE(opt.size("out") == 3);
1667 :
1668 : // other parameters
1669 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1670 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1671 10 : }
1672 :
1673 9 : CATCH_WHEN("using short form and no arguments")
1674 : {
1675 1 : char const * cargv[] =
1676 : {
1677 : "/usr/bin/arguments",
1678 : "-o",
1679 : nullptr
1680 : };
1681 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1682 1 : char ** argv = const_cast<char **>(cargv);
1683 :
1684 1 : advgetopt::getopt opt(environment_options, argc, argv);
1685 :
1686 : // check that the result is valid
1687 :
1688 : // an invalid parameter, MUST NOT EXIST
1689 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1690 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1691 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1692 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1693 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1694 :
1695 : // the valid parameter
1696 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1697 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1698 3 : CATCH_REQUIRE(opt.is_defined("out"));
1699 3 : CATCH_REQUIRE(opt.get_string("out").empty());
1700 3 : CATCH_REQUIRE(opt.get_string("out", 0).empty());
1701 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1702 3 : CATCH_REQUIRE(opt.size("out") == 1);
1703 :
1704 : // other parameters
1705 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1706 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1707 10 : }
1708 :
1709 9 : CATCH_WHEN("using short form and one argument")
1710 : {
1711 1 : char const * cargv[] =
1712 : {
1713 : "/usr/bin/arguments",
1714 : "-o",
1715 : "my-filename.out",
1716 : nullptr
1717 : };
1718 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1719 1 : char ** argv = const_cast<char **>(cargv);
1720 :
1721 1 : advgetopt::getopt opt(environment_options, argc, argv);
1722 :
1723 : // check that the result is valid
1724 :
1725 : // an invalid parameter, MUST NOT EXIST
1726 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1727 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1728 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1729 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1730 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1731 :
1732 : // the valid parameter
1733 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1734 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1735 3 : CATCH_REQUIRE(opt.is_defined("out"));
1736 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1737 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1738 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1739 3 : CATCH_REQUIRE(opt.size("out") == 1);
1740 :
1741 : // other parameters
1742 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1743 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1744 10 : }
1745 :
1746 9 : CATCH_WHEN("using short form and three arguments")
1747 : {
1748 1 : char const * cargv[] =
1749 : {
1750 : "/usr/bin/arguments",
1751 : "-o",
1752 : "my-filename.out",
1753 : "another.out",
1754 : "last.out",
1755 : nullptr
1756 : };
1757 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1758 1 : char ** argv = const_cast<char **>(cargv);
1759 :
1760 1 : advgetopt::getopt opt(environment_options, argc, argv);
1761 :
1762 : // check that the result is valid
1763 :
1764 : // an invalid parameter, MUST NOT EXIST
1765 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1766 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1767 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1768 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1769 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1770 :
1771 : // the valid parameter
1772 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1773 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1774 3 : CATCH_REQUIRE(opt.is_defined("out"));
1775 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1776 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1777 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1778 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1779 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1780 3 : CATCH_REQUIRE(opt.size("out") == 3);
1781 :
1782 : // other parameters
1783 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1784 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1785 10 : }
1786 : }
1787 15 : CATCH_END_SECTION()
1788 :
1789 15 : CATCH_START_SECTION("optional_arguments: verify a simple --out [<filename> ...] argument in a variable")
1790 : {
1791 6 : advgetopt::option const options[] =
1792 : {
1793 : advgetopt::define_option(
1794 : advgetopt::Name("out")
1795 : , advgetopt::ShortName('o')
1796 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
1797 : , advgetopt::Help("output filename.")
1798 : ),
1799 : advgetopt::end_options()
1800 : };
1801 :
1802 6 : advgetopt::options_environment environment_options;
1803 6 : environment_options.f_project_name = "unittest";
1804 6 : environment_options.f_options = options;
1805 6 : environment_options.f_environment_flags = 0;
1806 6 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
1807 6 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
1808 :
1809 6 : CATCH_WHEN("using long form and no arguments")
1810 : {
1811 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out");
1812 :
1813 1 : char const * cargv[] =
1814 : {
1815 : "/usr/bin/arguments",
1816 : nullptr
1817 : };
1818 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1819 1 : char ** argv = const_cast<char **>(cargv);
1820 :
1821 1 : advgetopt::getopt opt(environment_options, argc, argv);
1822 :
1823 : // check that the result is valid
1824 :
1825 : // an invalid parameter, MUST NOT EXIST
1826 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1827 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1828 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1829 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1830 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1831 :
1832 : // the valid parameter
1833 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1834 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1835 3 : CATCH_REQUIRE(opt.is_defined("out"));
1836 3 : CATCH_REQUIRE(opt.get_string("out").empty());
1837 3 : CATCH_REQUIRE(opt.get_string("out", 0).empty());
1838 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1839 3 : CATCH_REQUIRE(opt.size("out") == 1);
1840 :
1841 : // other parameters
1842 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1843 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1844 7 : }
1845 :
1846 6 : CATCH_WHEN("using long form and one argument")
1847 : {
1848 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out my-filename.out");
1849 :
1850 1 : char const * cargv[] =
1851 : {
1852 : "/usr/bin/arguments",
1853 : nullptr
1854 : };
1855 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1856 1 : char ** argv = const_cast<char **>(cargv);
1857 :
1858 1 : advgetopt::getopt opt(environment_options, argc, argv);
1859 :
1860 : // check that the result is valid
1861 :
1862 : // an invalid parameter, MUST NOT EXIST
1863 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1864 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1865 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1866 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1867 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1868 :
1869 : // the valid parameter
1870 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1871 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1872 3 : CATCH_REQUIRE(opt.is_defined("out"));
1873 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1874 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1875 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1876 3 : CATCH_REQUIRE(opt.size("out") == 1);
1877 :
1878 : // other parameters
1879 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1880 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1881 7 : }
1882 :
1883 6 : CATCH_WHEN("using long form and three arguments")
1884 : {
1885 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--out my-filename.out another.out last.out");
1886 :
1887 1 : char const * cargv[] =
1888 : {
1889 : "/usr/bin/arguments",
1890 : nullptr
1891 : };
1892 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1893 1 : char ** argv = const_cast<char **>(cargv);
1894 :
1895 1 : advgetopt::getopt opt(environment_options, argc, argv);
1896 :
1897 : // check that the result is valid
1898 :
1899 : // an invalid parameter, MUST NOT EXIST
1900 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1901 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1902 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1903 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1904 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1905 :
1906 : // the valid parameter
1907 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1908 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1909 3 : CATCH_REQUIRE(opt.is_defined("out"));
1910 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1911 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1912 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
1913 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
1914 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1915 3 : CATCH_REQUIRE(opt.size("out") == 3);
1916 :
1917 : // other parameters
1918 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1919 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1920 7 : }
1921 :
1922 6 : CATCH_WHEN("using short form and no arguments")
1923 : {
1924 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o");
1925 :
1926 1 : char const * cargv[] =
1927 : {
1928 : "/usr/bin/arguments",
1929 : nullptr
1930 : };
1931 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1932 1 : char ** argv = const_cast<char **>(cargv);
1933 :
1934 1 : advgetopt::getopt opt(environment_options, argc, argv);
1935 :
1936 : // check that the result is valid
1937 :
1938 : // an invalid parameter, MUST NOT EXIST
1939 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1940 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1941 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1942 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1943 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1944 :
1945 : // the valid parameter
1946 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1947 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1948 3 : CATCH_REQUIRE(opt.is_defined("out"));
1949 3 : CATCH_REQUIRE(opt.get_string("out").empty());
1950 3 : CATCH_REQUIRE(opt.get_string("out", 0).empty());
1951 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1952 3 : CATCH_REQUIRE(opt.size("out") == 1);
1953 :
1954 : // other parameters
1955 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1956 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1957 7 : }
1958 :
1959 6 : CATCH_WHEN("using short form and one argument")
1960 : {
1961 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o my-filename.out");
1962 :
1963 1 : char const * cargv[] =
1964 : {
1965 : "/usr/bin/arguments",
1966 : nullptr
1967 : };
1968 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1969 1 : char ** argv = const_cast<char **>(cargv);
1970 :
1971 1 : advgetopt::getopt opt(environment_options, argc, argv);
1972 :
1973 : // check that the result is valid
1974 :
1975 : // an invalid parameter, MUST NOT EXIST
1976 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1977 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1978 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1979 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1980 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1981 :
1982 : // the valid parameter
1983 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
1984 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
1985 3 : CATCH_REQUIRE(opt.is_defined("out"));
1986 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
1987 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
1988 3 : CATCH_REQUIRE(opt.get_default("out").empty());
1989 3 : CATCH_REQUIRE(opt.size("out") == 1);
1990 :
1991 : // other parameters
1992 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1993 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1994 7 : }
1995 :
1996 6 : CATCH_WHEN("using short form and three arguments")
1997 : {
1998 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-o my-filename.out another.out last.out");
1999 :
2000 1 : char const * cargv[] =
2001 : {
2002 : "/usr/bin/arguments",
2003 : nullptr
2004 : };
2005 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2006 1 : char ** argv = const_cast<char **>(cargv);
2007 :
2008 1 : advgetopt::getopt opt(environment_options, argc, argv);
2009 :
2010 : // check that the result is valid
2011 :
2012 : // an invalid parameter, MUST NOT EXIST
2013 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2014 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2015 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2016 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2017 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2018 :
2019 : // the valid parameter
2020 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2021 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2022 3 : CATCH_REQUIRE(opt.is_defined("out"));
2023 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2024 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2025 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
2026 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
2027 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2028 3 : CATCH_REQUIRE(opt.size("out") == 3);
2029 :
2030 : // other parameters
2031 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2032 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2033 7 : }
2034 : }
2035 15 : CATCH_END_SECTION()
2036 15 : }
2037 :
2038 :
2039 6 : CATCH_TEST_CASE("config_dir_argument", "[arguments][valid][getopt][config]")
2040 : {
2041 6 : CATCH_START_SECTION("config_dir_argument: verify that we do get the --config-dir option when we have a standalone configuration filename")
2042 : {
2043 1 : advgetopt::option const options[] =
2044 : {
2045 : advgetopt::define_option(
2046 : advgetopt::Name("out")
2047 : , advgetopt::ShortName('o')
2048 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2049 : , advgetopt::Help("output filename.")
2050 : ),
2051 : advgetopt::end_options()
2052 : };
2053 :
2054 1 : advgetopt::options_environment environment_options;
2055 1 : environment_options.f_project_name = "unittest";
2056 1 : environment_options.f_options = options;
2057 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2058 1 : environment_options.f_configuration_filename = "snapwatchdog.conf";
2059 1 : environment_options.f_help_header = "Usage: test --config-dir";
2060 :
2061 1 : char const * cargv[] =
2062 : {
2063 : "/usr/bin/arguments",
2064 : "--out",
2065 : "my-filename.out",
2066 : "--license",
2067 : "--config-dir",
2068 : "/opt/m2osw/config",
2069 : nullptr
2070 : };
2071 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2072 1 : char ** argv = const_cast<char **>(cargv);
2073 :
2074 1 : advgetopt::getopt opt(environment_options, argc, argv);
2075 :
2076 : // check that the result is valid
2077 :
2078 : // an invalid parameter, MUST NOT EXIST
2079 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2080 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2081 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2082 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2083 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2084 :
2085 : // the valid parameter
2086 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2087 3 : CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
2088 3 : CATCH_REQUIRE(opt.is_defined("out"));
2089 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2090 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2091 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2092 3 : CATCH_REQUIRE(opt.size("out") == 1);
2093 :
2094 : // the license system parameter
2095 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2096 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
2097 3 : CATCH_REQUIRE(opt.is_defined("license"));
2098 3 : CATCH_REQUIRE(opt.get_default("license").empty());
2099 3 : CATCH_REQUIRE(opt.size("license") == 1);
2100 :
2101 : // the copyright system parameter
2102 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2103 3 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2104 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2105 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2106 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
2107 :
2108 : // the config-dir system parameter
2109 3 : CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
2110 3 : CATCH_REQUIRE(opt.is_defined("config-dir"));
2111 3 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
2112 3 : CATCH_REQUIRE(opt.size("config-dir") == 1);
2113 3 : CATCH_REQUIRE(opt.get_string("config-dir") == "/opt/m2osw/config");
2114 :
2115 : // other parameters
2116 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2117 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2118 1 : }
2119 6 : CATCH_END_SECTION()
2120 :
2121 6 : CATCH_START_SECTION("config_dir_argument: verify that we do not get the --config-dir option when the standalone configuration filename is nullptr")
2122 : {
2123 1 : advgetopt::option const options[] =
2124 : {
2125 : advgetopt::define_option(
2126 : advgetopt::Name("out")
2127 : , advgetopt::ShortName('o')
2128 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2129 : , advgetopt::Help("output filename.")
2130 : ),
2131 : advgetopt::end_options()
2132 : };
2133 :
2134 1 : advgetopt::options_environment environment_options;
2135 1 : environment_options.f_project_name = "unittest";
2136 1 : environment_options.f_options = options;
2137 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2138 1 : environment_options.f_configuration_filename = nullptr;
2139 1 : environment_options.f_help_header = "Usage: test --config-dir";
2140 :
2141 1 : char const * cargv[] =
2142 : {
2143 : "/usr/bin/arguments",
2144 : "--out",
2145 : "my-filename.out",
2146 : "--license",
2147 : nullptr
2148 : };
2149 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2150 1 : char ** argv = const_cast<char **>(cargv);
2151 :
2152 1 : advgetopt::getopt opt(environment_options, argc, argv);
2153 :
2154 : // check that the result is valid
2155 :
2156 : // an invalid parameter, MUST NOT EXIST
2157 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2158 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2159 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2160 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2161 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2162 :
2163 : // the valid parameter
2164 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2165 3 : CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
2166 3 : CATCH_REQUIRE(opt.is_defined("out"));
2167 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2168 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2169 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2170 3 : CATCH_REQUIRE(opt.size("out") == 1);
2171 :
2172 : // the license system parameter
2173 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2174 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
2175 3 : CATCH_REQUIRE(opt.is_defined("license"));
2176 3 : CATCH_REQUIRE(opt.get_default("license").empty());
2177 3 : CATCH_REQUIRE(opt.size("license") == 1);
2178 :
2179 : // the copyright system parameter
2180 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2181 3 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2182 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2183 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2184 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
2185 :
2186 : // no config-dir system parameter when the configuration filename is missing
2187 3 : CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
2188 3 : CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
2189 3 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
2190 3 : CATCH_REQUIRE(opt.size("config-dir") == 0);
2191 :
2192 : // other parameters
2193 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2194 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2195 1 : }
2196 6 : CATCH_END_SECTION()
2197 :
2198 6 : CATCH_START_SECTION("config_dir_argument: verify that we do not get the --config-dir option when the standalone configuration filename is \"\"")
2199 : {
2200 1 : advgetopt::option const options[] =
2201 : {
2202 : advgetopt::define_option(
2203 : advgetopt::Name("out")
2204 : , advgetopt::ShortName('o')
2205 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2206 : , advgetopt::Help("output filename.")
2207 : ),
2208 : advgetopt::end_options()
2209 : };
2210 :
2211 1 : advgetopt::options_environment environment_options;
2212 1 : environment_options.f_project_name = "unittest";
2213 1 : environment_options.f_options = options;
2214 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2215 1 : environment_options.f_configuration_filename = "";
2216 1 : environment_options.f_help_header = "Usage: test --config-dir";
2217 :
2218 1 : char const * cargv[] =
2219 : {
2220 : "/usr/bin/arguments",
2221 : "--out",
2222 : "my-filename.out",
2223 : "--license",
2224 : nullptr
2225 : };
2226 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2227 1 : char ** argv = const_cast<char **>(cargv);
2228 :
2229 1 : advgetopt::getopt opt(environment_options, argc, argv);
2230 :
2231 : // check that the result is valid
2232 :
2233 : // an invalid parameter, MUST NOT EXIST
2234 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2235 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2236 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2237 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2238 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2239 :
2240 : // the valid parameter
2241 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2242 3 : CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
2243 3 : CATCH_REQUIRE(opt.is_defined("out"));
2244 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2245 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2246 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2247 3 : CATCH_REQUIRE(opt.size("out") == 1);
2248 :
2249 : // the license system parameter
2250 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2251 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
2252 3 : CATCH_REQUIRE(opt.is_defined("license"));
2253 3 : CATCH_REQUIRE(opt.get_default("license").empty());
2254 3 : CATCH_REQUIRE(opt.size("license") == 1);
2255 :
2256 : // the copyright system parameter
2257 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2258 3 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2259 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2260 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2261 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
2262 :
2263 : // no config-dir system parameter when the configuration filename is missing
2264 3 : CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
2265 3 : CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
2266 3 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
2267 3 : CATCH_REQUIRE(opt.size("config-dir") == 0);
2268 :
2269 : // other parameters
2270 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2271 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2272 1 : }
2273 6 : CATCH_END_SECTION()
2274 :
2275 6 : CATCH_START_SECTION("config_dir_argument: test adding '-c' to '--config-dir'")
2276 : {
2277 1 : advgetopt::option const options[] =
2278 : {
2279 : advgetopt::define_option(
2280 : advgetopt::Name("out")
2281 : , advgetopt::ShortName('o')
2282 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2283 : , advgetopt::Help("output filename.")
2284 : ),
2285 : advgetopt::end_options()
2286 : };
2287 :
2288 1 : advgetopt::options_environment environment_options;
2289 1 : environment_options.f_project_name = "unittest";
2290 1 : environment_options.f_options = options;
2291 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2292 1 : environment_options.f_configuration_filename = "snapwatchdog.conf";
2293 1 : environment_options.f_help_header = "Usage: test --config-dir";
2294 :
2295 1 : char const * cargv[] =
2296 : {
2297 : "/usr/bin/arguments",
2298 : "--out",
2299 : "my-filename.out",
2300 : "--license",
2301 : "-c",
2302 : "/opt/m2osw/config",
2303 : nullptr
2304 : };
2305 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2306 1 : char ** argv = const_cast<char **>(cargv);
2307 :
2308 1 : advgetopt::getopt opt(environment_options);
2309 1 : opt.parse_program_name(argv);
2310 1 : opt.link_aliases();
2311 :
2312 3 : advgetopt::option_info::pointer_t config_dir(opt.get_option("config-dir"));
2313 1 : CATCH_REQUIRE(config_dir != nullptr);
2314 3 : opt.set_short_name("config-dir", U'c');
2315 :
2316 1 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
2317 :
2318 : // check that the result is valid
2319 :
2320 : // an invalid parameter, MUST NOT EXIST
2321 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2322 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2323 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2324 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2325 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2326 :
2327 : // the valid parameter
2328 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2329 3 : CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
2330 3 : CATCH_REQUIRE(opt.is_defined("out"));
2331 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2332 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2333 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2334 3 : CATCH_REQUIRE(opt.size("out") == 1);
2335 :
2336 : // the license system parameter
2337 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2338 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
2339 3 : CATCH_REQUIRE(opt.is_defined("license"));
2340 3 : CATCH_REQUIRE(opt.get_default("license").empty());
2341 3 : CATCH_REQUIRE(opt.size("license") == 1);
2342 :
2343 : // the copyright system parameter
2344 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2345 3 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2346 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2347 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2348 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
2349 :
2350 : // the config-dir system parameter
2351 3 : CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
2352 3 : CATCH_REQUIRE(opt.is_defined("config-dir"));
2353 3 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
2354 3 : CATCH_REQUIRE(opt.size("config-dir") == 1);
2355 3 : CATCH_REQUIRE(opt.get_string("config-dir") == "/opt/m2osw/config");
2356 :
2357 : // other parameters
2358 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2359 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2360 1 : }
2361 6 : CATCH_END_SECTION()
2362 :
2363 6 : CATCH_START_SECTION("config_dir_argument: test our own parsing with '--config-dir' and f_configuration_filename set to nullptr")
2364 : {
2365 1 : advgetopt::option const options[] =
2366 : {
2367 : advgetopt::define_option(
2368 : advgetopt::Name("out")
2369 : , advgetopt::ShortName('o')
2370 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2371 : , advgetopt::Help("output filename.")
2372 : ),
2373 : advgetopt::end_options()
2374 : };
2375 :
2376 1 : advgetopt::options_environment environment_options;
2377 1 : environment_options.f_project_name = "unittest";
2378 1 : environment_options.f_options = options;
2379 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2380 1 : environment_options.f_configuration_filename = nullptr;
2381 1 : environment_options.f_help_header = "Usage: test --config-dir";
2382 :
2383 1 : char const * cargv[] =
2384 : {
2385 : "/usr/bin/arguments",
2386 : "--out",
2387 : "my-filename.out",
2388 : "--license",
2389 : nullptr
2390 : };
2391 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2392 1 : char ** argv = const_cast<char **>(cargv);
2393 :
2394 1 : advgetopt::getopt opt(environment_options);
2395 1 : opt.parse_program_name(argv);
2396 1 : opt.link_aliases();
2397 :
2398 3 : CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
2399 :
2400 1 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
2401 :
2402 : // check that the result is valid
2403 :
2404 : // an invalid parameter, MUST NOT EXIST
2405 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2406 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2407 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2408 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2409 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2410 :
2411 : // the valid parameter
2412 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2413 3 : CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
2414 3 : CATCH_REQUIRE(opt.is_defined("out"));
2415 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2416 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2417 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2418 3 : CATCH_REQUIRE(opt.size("out") == 1);
2419 :
2420 : // the license system parameter
2421 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2422 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
2423 3 : CATCH_REQUIRE(opt.is_defined("license"));
2424 3 : CATCH_REQUIRE(opt.get_default("license").empty());
2425 3 : CATCH_REQUIRE(opt.size("license") == 1);
2426 :
2427 : // the copyright system parameter
2428 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2429 3 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2430 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2431 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2432 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
2433 :
2434 : // the config-dir system parameter
2435 3 : CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
2436 3 : CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
2437 3 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
2438 3 : CATCH_REQUIRE(opt.size("config-dir") == 0);
2439 :
2440 : // other parameters
2441 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2442 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2443 1 : }
2444 6 : CATCH_END_SECTION()
2445 :
2446 6 : CATCH_START_SECTION("config_dir_argument: test our own parsing with '--config-dir' and f_configuration_filename set to \"\"")
2447 : {
2448 1 : advgetopt::option const options[] =
2449 : {
2450 : advgetopt::define_option(
2451 : advgetopt::Name("out")
2452 : , advgetopt::ShortName('o')
2453 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
2454 : , advgetopt::Help("output filename.")
2455 : ),
2456 : advgetopt::end_options()
2457 : };
2458 :
2459 1 : advgetopt::options_environment environment_options;
2460 1 : environment_options.f_project_name = "unittest";
2461 1 : environment_options.f_options = options;
2462 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
2463 1 : environment_options.f_configuration_filename = "";
2464 1 : environment_options.f_help_header = "Usage: test --config-dir";
2465 :
2466 1 : char const * cargv[] =
2467 : {
2468 : "/usr/bin/arguments",
2469 : "--out",
2470 : "my-filename.out",
2471 : "--license",
2472 : nullptr
2473 : };
2474 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2475 1 : char ** argv = const_cast<char **>(cargv);
2476 :
2477 1 : advgetopt::getopt opt(environment_options);
2478 1 : opt.parse_program_name(argv);
2479 1 : opt.link_aliases();
2480 :
2481 3 : CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
2482 :
2483 1 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
2484 :
2485 : // check that the result is valid
2486 :
2487 : // an invalid parameter, MUST NOT EXIST
2488 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2489 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2490 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2491 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2492 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2493 :
2494 : // the valid parameter
2495 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2496 3 : CATCH_REQUIRE(opt.get_option('o') == opt.get_option("out"));
2497 3 : CATCH_REQUIRE(opt.is_defined("out"));
2498 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2499 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2500 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2501 3 : CATCH_REQUIRE(opt.size("out") == 1);
2502 :
2503 : // the license system parameter
2504 3 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
2505 1 : CATCH_REQUIRE(opt.get_option('L') != nullptr);
2506 3 : CATCH_REQUIRE(opt.is_defined("license"));
2507 3 : CATCH_REQUIRE(opt.get_default("license").empty());
2508 3 : CATCH_REQUIRE(opt.size("license") == 1);
2509 :
2510 : // the copyright system parameter
2511 3 : CATCH_REQUIRE(opt.get_option("copyright") != nullptr);
2512 3 : CATCH_REQUIRE(opt.get_option('C') == opt.get_option("copyright"));
2513 3 : CATCH_REQUIRE_FALSE(opt.is_defined("copyright"));
2514 3 : CATCH_REQUIRE(opt.get_default("copyright").empty());
2515 3 : CATCH_REQUIRE(opt.size("copyright") == 0);
2516 :
2517 : // the config-dir system parameter
2518 3 : CATCH_REQUIRE(opt.get_option("config-dir") == nullptr);
2519 3 : CATCH_REQUIRE_FALSE(opt.is_defined("config-dir"));
2520 3 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
2521 3 : CATCH_REQUIRE(opt.size("config-dir") == 0);
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 1 : }
2527 6 : CATCH_END_SECTION()
2528 6 : }
2529 :
2530 :
2531 16 : CATCH_TEST_CASE("default_argument", "[arguments][valid][getopt]")
2532 : {
2533 16 : CATCH_START_SECTION("default_argument: verify a simple [<filename>] argument")
2534 : {
2535 6 : advgetopt::option const options[] =
2536 : {
2537 : advgetopt::define_option(
2538 : advgetopt::Name("out")
2539 : , advgetopt::ShortName('o')
2540 : , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_COMMAND_LINE
2541 : , advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
2542 : , advgetopt::Help("output filename.")
2543 : ),
2544 : advgetopt::end_options()
2545 : };
2546 :
2547 6 : advgetopt::options_environment environment_options;
2548 6 : environment_options.f_project_name = "unittest";
2549 6 : environment_options.f_options = options;
2550 6 : environment_options.f_environment_flags = 0;
2551 6 : environment_options.f_help_header = "Usage: test simple [<filename>] option";
2552 :
2553 6 : CATCH_WHEN("no arguments")
2554 : {
2555 1 : char const * cargv[] =
2556 : {
2557 : "/usr/bin/arguments",
2558 : nullptr
2559 : };
2560 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2561 1 : char ** argv = const_cast<char **>(cargv);
2562 :
2563 1 : advgetopt::getopt opt(environment_options, argc, argv);
2564 :
2565 : // check that the result is valid
2566 :
2567 : // an invalid parameter, MUST NOT EXIST
2568 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2569 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2570 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2571 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2572 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2573 :
2574 : // the valid parameter
2575 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2576 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2577 3 : CATCH_REQUIRE_FALSE(opt.is_defined("out"));
2578 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2579 3 : CATCH_REQUIRE(opt.size("out") == 0);
2580 :
2581 : // the valid parameter is the default
2582 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2583 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2584 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2585 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2586 3 : CATCH_REQUIRE(opt.size("--") == 0);
2587 :
2588 : // other parameters
2589 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2590 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2591 7 : }
2592 :
2593 6 : CATCH_WHEN("one argument")
2594 : {
2595 1 : char const * cargv[] =
2596 : {
2597 : "/usr/bin/arguments",
2598 : "my-filename.out",
2599 : nullptr
2600 : };
2601 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2602 1 : char ** argv = const_cast<char **>(cargv);
2603 :
2604 1 : advgetopt::getopt opt(environment_options, argc, argv);
2605 :
2606 : // check that the result is valid
2607 :
2608 : // an invalid parameter, MUST NOT EXIST
2609 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2610 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2611 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2612 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2613 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2614 :
2615 : // the valid parameter
2616 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2617 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2618 3 : CATCH_REQUIRE(opt.is_defined("out"));
2619 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2620 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2621 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2622 3 : CATCH_REQUIRE(opt.size("out") == 1);
2623 :
2624 : // the valid parameter is the default
2625 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2626 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2627 3 : CATCH_REQUIRE(opt.is_defined("--"));
2628 3 : CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
2629 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
2630 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2631 3 : CATCH_REQUIRE(opt.size("--") == 1);
2632 :
2633 : // other parameters
2634 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2635 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2636 7 : }
2637 :
2638 6 : CATCH_WHEN("three arguments")
2639 : {
2640 1 : char const * cargv[] =
2641 : {
2642 : "/usr/bin/arguments",
2643 : "my-filename.out",
2644 : "another.out",
2645 : "last.out",
2646 : nullptr
2647 : };
2648 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2649 1 : char ** argv = const_cast<char **>(cargv);
2650 :
2651 1 : advgetopt::getopt opt(environment_options, argc, argv);
2652 :
2653 : // check that the result is valid
2654 :
2655 : // an invalid parameter, MUST NOT EXIST
2656 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2657 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2658 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2659 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2660 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2661 :
2662 : // the valid parameter
2663 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2664 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2665 3 : CATCH_REQUIRE(opt.is_defined("out"));
2666 3 : CATCH_REQUIRE(opt.get_string("out") == "last.out");
2667 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "last.out");
2668 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2669 3 : CATCH_REQUIRE(opt.size("out") == 1);
2670 :
2671 : // the valid parameter is the default
2672 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2673 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2674 3 : CATCH_REQUIRE(opt.is_defined("--"));
2675 3 : CATCH_REQUIRE(opt.get_string("--") == "last.out");
2676 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "last.out");
2677 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2678 3 : CATCH_REQUIRE(opt.size("--") == 1);
2679 :
2680 : // other parameters
2681 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2682 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2683 7 : }
2684 :
2685 6 : CATCH_WHEN("using the '--' separator and no arguments")
2686 : {
2687 1 : char const * cargv[] =
2688 : {
2689 : "/usr/bin/arguments",
2690 : "--",
2691 : nullptr
2692 : };
2693 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2694 1 : char ** argv = const_cast<char **>(cargv);
2695 :
2696 1 : advgetopt::getopt opt(environment_options, argc, argv);
2697 :
2698 : // check that the result is valid
2699 :
2700 : // an invalid parameter, MUST NOT EXIST
2701 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2702 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2703 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2704 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2705 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2706 :
2707 : // the valid parameter
2708 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2709 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2710 3 : CATCH_REQUIRE_FALSE(opt.is_defined("out"));
2711 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2712 3 : CATCH_REQUIRE(opt.size("out") == 0);
2713 :
2714 : // the valid parameter is the default
2715 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2716 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2717 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2718 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2719 3 : CATCH_REQUIRE(opt.size("--") == 0);
2720 :
2721 : // other parameters
2722 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2723 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2724 7 : }
2725 :
2726 6 : CATCH_WHEN("using the '--' separator and one argument")
2727 : {
2728 1 : char const * cargv[] =
2729 : {
2730 : "/usr/bin/arguments",
2731 : "--",
2732 : "--my-filename.out",
2733 : nullptr
2734 : };
2735 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2736 1 : char ** argv = const_cast<char **>(cargv);
2737 :
2738 1 : advgetopt::getopt opt(environment_options, argc, argv);
2739 :
2740 : // check that the result is valid
2741 :
2742 : // an invalid parameter, MUST NOT EXIST
2743 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2744 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2745 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2746 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2747 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2748 :
2749 : // the valid parameter
2750 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2751 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2752 3 : CATCH_REQUIRE(opt.is_defined("out"));
2753 3 : CATCH_REQUIRE(opt.get_string("out") == "--my-filename.out");
2754 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "--my-filename.out");
2755 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2756 3 : CATCH_REQUIRE(opt.size("out") == 1);
2757 :
2758 : // the valid parameter is the default
2759 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2760 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2761 3 : CATCH_REQUIRE(opt.is_defined("--"));
2762 3 : CATCH_REQUIRE(opt.get_string("--") == "--my-filename.out");
2763 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "--my-filename.out");
2764 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2765 3 : CATCH_REQUIRE(opt.size("--") == 1);
2766 :
2767 : // other parameters
2768 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2769 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2770 7 : }
2771 :
2772 6 : CATCH_WHEN("using the '--' separator and three arguments")
2773 : {
2774 1 : char const * cargv[] =
2775 : {
2776 : "/usr/bin/arguments",
2777 : "--",
2778 : "my-filename.out",
2779 : "-another.out",
2780 : "--last.out",
2781 : nullptr
2782 : };
2783 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2784 1 : char ** argv = const_cast<char **>(cargv);
2785 :
2786 1 : advgetopt::getopt opt(environment_options, argc, argv);
2787 :
2788 : // check that the result is valid
2789 :
2790 : // an invalid parameter, MUST NOT EXIST
2791 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2792 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2793 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2794 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2795 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2796 :
2797 : // the valid parameter
2798 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2799 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2800 3 : CATCH_REQUIRE(opt.is_defined("out"));
2801 3 : CATCH_REQUIRE(opt.get_string("out") == "--last.out");
2802 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "--last.out");
2803 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2804 3 : CATCH_REQUIRE(opt.size("out") == 1);
2805 :
2806 : // the valid parameter is the default
2807 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2808 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2809 3 : CATCH_REQUIRE(opt.is_defined("--"));
2810 3 : CATCH_REQUIRE(opt.get_string("--") == "--last.out");
2811 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "--last.out");
2812 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2813 3 : CATCH_REQUIRE(opt.size("--") == 1);
2814 :
2815 : // other parameters
2816 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2817 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2818 7 : }
2819 : }
2820 16 : CATCH_END_SECTION()
2821 :
2822 16 : CATCH_START_SECTION("default_argument: verify a simple [<filename>] argument in a variable")
2823 : {
2824 8 : advgetopt::option const options[] =
2825 : {
2826 : advgetopt::define_option(
2827 : advgetopt::Name("out")
2828 : , advgetopt::ShortName('o')
2829 : , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE
2830 : , advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
2831 : , advgetopt::Help("output filename.")
2832 : ),
2833 : advgetopt::end_options()
2834 : };
2835 :
2836 8 : advgetopt::options_environment environment_options;
2837 8 : environment_options.f_project_name = "unittest";
2838 8 : environment_options.f_options = options;
2839 8 : environment_options.f_environment_flags = 0;
2840 8 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
2841 8 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
2842 :
2843 8 : CATCH_WHEN("no arguments")
2844 : {
2845 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "");
2846 :
2847 1 : char const * cargv[] =
2848 : {
2849 : "/usr/bin/arguments",
2850 : nullptr
2851 : };
2852 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2853 1 : char ** argv = const_cast<char **>(cargv);
2854 :
2855 1 : advgetopt::getopt opt(environment_options, argc, argv);
2856 :
2857 : // check that the result is valid
2858 :
2859 : // an invalid parameter, MUST NOT EXIST
2860 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2861 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2862 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2863 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2864 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2865 :
2866 : // the valid parameter
2867 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2868 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2869 3 : CATCH_REQUIRE_FALSE(opt.is_defined("out"));
2870 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2871 3 : CATCH_REQUIRE(opt.size("out") == 0);
2872 :
2873 : // the valid parameter is the default
2874 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2875 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2876 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
2877 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2878 3 : CATCH_REQUIRE(opt.size("--") == 0);
2879 :
2880 : // other parameters
2881 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2882 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2883 9 : }
2884 :
2885 8 : CATCH_WHEN("one argument")
2886 : {
2887 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out");
2888 :
2889 1 : char const * cargv[] =
2890 : {
2891 : "/usr/bin/arguments",
2892 : nullptr
2893 : };
2894 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2895 1 : char ** argv = const_cast<char **>(cargv);
2896 :
2897 1 : advgetopt::getopt opt(environment_options, argc, argv);
2898 :
2899 : // check that the result is valid
2900 :
2901 : // an invalid parameter, MUST NOT EXIST
2902 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2903 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2904 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2905 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2906 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2907 :
2908 : // the valid parameter
2909 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2910 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2911 3 : CATCH_REQUIRE(opt.is_defined("out"));
2912 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
2913 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
2914 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2915 3 : CATCH_REQUIRE(opt.size("out") == 1);
2916 :
2917 : // the valid parameter is the default
2918 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2919 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2920 3 : CATCH_REQUIRE(opt.is_defined("--"));
2921 3 : CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
2922 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
2923 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2924 3 : CATCH_REQUIRE(opt.size("--") == 1);
2925 :
2926 : // other parameters
2927 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2928 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2929 9 : }
2930 :
2931 8 : CATCH_WHEN("three arguments")
2932 : {
2933 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out last.out");
2934 :
2935 1 : char const * cargv[] =
2936 : {
2937 : "/usr/bin/arguments",
2938 : nullptr
2939 : };
2940 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2941 1 : char ** argv = const_cast<char **>(cargv);
2942 :
2943 1 : advgetopt::getopt opt(environment_options, argc, argv);
2944 :
2945 : // check that the result is valid
2946 :
2947 : // an invalid parameter, MUST NOT EXIST
2948 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2949 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2950 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2951 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2952 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2953 :
2954 : // the valid parameter
2955 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
2956 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
2957 3 : CATCH_REQUIRE(opt.is_defined("out"));
2958 3 : CATCH_REQUIRE(opt.get_string("out") == "last.out");
2959 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "last.out");
2960 3 : CATCH_REQUIRE(opt.get_default("out").empty());
2961 3 : CATCH_REQUIRE(opt.size("out") == 1);
2962 :
2963 : // the valid parameter is the default
2964 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
2965 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
2966 3 : CATCH_REQUIRE(opt.is_defined("--"));
2967 3 : CATCH_REQUIRE(opt.get_string("--") == "last.out");
2968 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "last.out");
2969 3 : CATCH_REQUIRE(opt.get_default("--").empty());
2970 3 : CATCH_REQUIRE(opt.size("--") == 1);
2971 :
2972 : // other parameters
2973 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
2974 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
2975 9 : }
2976 :
2977 8 : CATCH_WHEN("four arguments with a '-'")
2978 : {
2979 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out - last.out");
2980 :
2981 1 : char const * cargv[] =
2982 : {
2983 : "/usr/bin/arguments",
2984 : nullptr
2985 : };
2986 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
2987 1 : char ** argv = const_cast<char **>(cargv);
2988 :
2989 1 : advgetopt::getopt opt(environment_options, argc, argv);
2990 :
2991 : // check that the result is valid
2992 :
2993 : // an invalid parameter, MUST NOT EXIST
2994 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
2995 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
2996 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
2997 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
2998 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
2999 :
3000 : // the valid parameter
3001 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3002 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3003 3 : CATCH_REQUIRE(opt.is_defined("out"));
3004 3 : CATCH_REQUIRE(opt.get_string("out") == "last.out");
3005 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "last.out");
3006 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3007 3 : CATCH_REQUIRE(opt.size("out") == 1);
3008 :
3009 : // the valid parameter is the default
3010 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3011 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
3012 3 : CATCH_REQUIRE(opt.is_defined("--"));
3013 3 : CATCH_REQUIRE(opt.get_string("--") == "last.out");
3014 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "last.out");
3015 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3016 3 : CATCH_REQUIRE(opt.size("--") == 1);
3017 :
3018 : // other parameters
3019 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3020 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3021 9 : }
3022 :
3023 8 : CATCH_WHEN("using the '--' separator and no arguments")
3024 : {
3025 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--");
3026 :
3027 1 : char const * cargv[] =
3028 : {
3029 : "/usr/bin/arguments",
3030 : nullptr
3031 : };
3032 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3033 1 : char ** argv = const_cast<char **>(cargv);
3034 :
3035 1 : advgetopt::getopt opt(environment_options, argc, argv);
3036 :
3037 : // check that the result is valid
3038 :
3039 : // an invalid parameter, MUST NOT EXIST
3040 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3041 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3042 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3043 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3044 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3045 :
3046 : // the valid parameter
3047 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3048 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3049 3 : CATCH_REQUIRE_FALSE(opt.is_defined("out"));
3050 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3051 3 : CATCH_REQUIRE(opt.size("out") == 0);
3052 :
3053 : // the valid parameter is the default
3054 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3055 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
3056 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3057 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3058 3 : CATCH_REQUIRE(opt.size("--") == 0);
3059 :
3060 : // other parameters
3061 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3062 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3063 9 : }
3064 :
3065 8 : CATCH_WHEN("using the '--' separator and one argument")
3066 : {
3067 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- my-filename.out");
3068 :
3069 1 : char const * cargv[] =
3070 : {
3071 : "/usr/bin/arguments",
3072 : nullptr
3073 : };
3074 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3075 1 : char ** argv = const_cast<char **>(cargv);
3076 :
3077 1 : advgetopt::getopt opt(environment_options, argc, argv);
3078 :
3079 : // check that the result is valid
3080 :
3081 : // an invalid parameter, MUST NOT EXIST
3082 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3083 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3084 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3085 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3086 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3087 :
3088 : // the valid parameter
3089 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3090 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3091 3 : CATCH_REQUIRE(opt.is_defined("out"));
3092 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3093 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3094 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3095 3 : CATCH_REQUIRE(opt.size("out") == 1);
3096 :
3097 : // the valid parameter is the default
3098 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3099 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
3100 3 : CATCH_REQUIRE(opt.is_defined("--"));
3101 3 : CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
3102 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
3103 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3104 3 : CATCH_REQUIRE(opt.size("--") == 1);
3105 :
3106 : // other parameters
3107 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3108 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3109 9 : }
3110 :
3111 8 : CATCH_WHEN("using the '--' separator and three arguments")
3112 : {
3113 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- my-filename.out -another.out --last.out");
3114 :
3115 1 : char const * cargv[] =
3116 : {
3117 : "/usr/bin/arguments",
3118 : nullptr
3119 : };
3120 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3121 1 : char ** argv = const_cast<char **>(cargv);
3122 :
3123 1 : advgetopt::getopt opt(environment_options, argc, argv);
3124 :
3125 : // check that the result is valid
3126 :
3127 : // an invalid parameter, MUST NOT EXIST
3128 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3129 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3130 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3131 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3132 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3133 :
3134 : // the valid parameter
3135 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3136 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3137 3 : CATCH_REQUIRE(opt.is_defined("out"));
3138 3 : CATCH_REQUIRE(opt.get_string("out") == "--last.out");
3139 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "--last.out");
3140 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3141 3 : CATCH_REQUIRE(opt.size("out") == 1);
3142 :
3143 : // the valid parameter is the default
3144 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3145 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
3146 3 : CATCH_REQUIRE(opt.is_defined("--"));
3147 3 : CATCH_REQUIRE(opt.get_string("--") == "--last.out");
3148 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "--last.out");
3149 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3150 3 : CATCH_REQUIRE(opt.size("--") == 1);
3151 :
3152 : // other parameters
3153 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3154 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3155 9 : }
3156 :
3157 8 : CATCH_WHEN("using the '--' separator and four arguments with a '-'")
3158 : {
3159 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- my-filename.out -another.out - --last.out");
3160 :
3161 1 : char const * cargv[] =
3162 : {
3163 : "/usr/bin/arguments",
3164 : nullptr
3165 : };
3166 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3167 1 : char ** argv = const_cast<char **>(cargv);
3168 :
3169 1 : advgetopt::getopt opt(environment_options, argc, argv);
3170 :
3171 : // check that the result is valid
3172 :
3173 : // an invalid parameter, MUST NOT EXIST
3174 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3175 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3176 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3177 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3178 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3179 :
3180 : // the valid parameter
3181 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3182 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3183 3 : CATCH_REQUIRE(opt.is_defined("out"));
3184 3 : CATCH_REQUIRE(opt.get_string("out") == "--last.out");
3185 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "--last.out");
3186 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3187 3 : CATCH_REQUIRE(opt.size("out") == 1);
3188 :
3189 : // the valid parameter is the default
3190 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3191 5 : CATCH_REQUIRE(opt.get_option("--") == opt.get_option("out"));
3192 3 : CATCH_REQUIRE(opt.is_defined("--"));
3193 3 : CATCH_REQUIRE(opt.get_string("--") == "--last.out");
3194 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "--last.out");
3195 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3196 3 : CATCH_REQUIRE(opt.size("--") == 1);
3197 :
3198 : // other parameters
3199 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3200 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3201 9 : }
3202 : }
3203 16 : CATCH_END_SECTION()
3204 :
3205 16 : CATCH_START_SECTION("default_argument: verify that we can have a non-require argument with an invalid default")
3206 : {
3207 2 : advgetopt::option const options[] =
3208 : {
3209 : advgetopt::define_option(
3210 : advgetopt::Name("before")
3211 : , advgetopt::ShortName('b')
3212 : , advgetopt::Flags(advgetopt::command_flags<>())
3213 : , advgetopt::Help("appears before.")
3214 : , advgetopt::DefaultValue("early")
3215 : ),
3216 : advgetopt::define_option(
3217 : advgetopt::Name("out")
3218 : , advgetopt::ShortName('o')
3219 : , advgetopt::Flags(advgetopt::command_flags<>())
3220 : , advgetopt::Help("output filename.")
3221 : , advgetopt::DefaultValue("default-name")
3222 : , advgetopt::Validator("/[a-z]+/")
3223 : ),
3224 : advgetopt::define_option(
3225 : advgetopt::Name("after")
3226 : , advgetopt::ShortName('a')
3227 : , advgetopt::Flags(advgetopt::command_flags<>())
3228 : , advgetopt::Help("appears after.")
3229 : , advgetopt::DefaultValue("late")
3230 : ),
3231 : advgetopt::end_options()
3232 : };
3233 :
3234 2 : advgetopt::options_environment environment_options;
3235 2 : environment_options.f_project_name = "unittest";
3236 2 : environment_options.f_options = options;
3237 2 : environment_options.f_environment_flags = 0;
3238 2 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
3239 2 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
3240 :
3241 2 : CATCH_WHEN("no parameters to arguments")
3242 : {
3243 1 : char const * cargv[] =
3244 : {
3245 : "/usr/bin/arguments",
3246 : "--before",
3247 : "--out",
3248 : "--after",
3249 : nullptr
3250 : };
3251 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3252 1 : char ** argv = const_cast<char **>(cargv);
3253 :
3254 1 : advgetopt::getopt opt(environment_options, argc, argv);
3255 :
3256 : // check that the result is valid
3257 :
3258 : // an invalid parameter, MUST NOT EXIST
3259 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3260 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3261 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3262 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3263 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3264 :
3265 : // the valid parameter
3266 3 : CATCH_REQUIRE(opt.get_option("before") != nullptr);
3267 1 : CATCH_REQUIRE(opt.get_option('b') != nullptr);
3268 3 : CATCH_REQUIRE(opt.is_defined("before"));
3269 3 : CATCH_REQUIRE(opt.get_string("before") == "early");
3270 3 : CATCH_REQUIRE(opt.get_string("before", 0) == "early");
3271 3 : CATCH_REQUIRE(opt.get_default("before") == "early");
3272 3 : CATCH_REQUIRE(opt.size("before") == 1);
3273 :
3274 : // the valid parameter
3275 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3276 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3277 3 : CATCH_REQUIRE(opt.is_defined("out"));
3278 3 : CATCH_REQUIRE(opt.get_string("out") == "default-name");
3279 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "default-name");
3280 3 : CATCH_REQUIRE(opt.get_default("out") == "default-name");
3281 3 : CATCH_REQUIRE(opt.size("out") == 1);
3282 :
3283 : // the valid parameter
3284 3 : CATCH_REQUIRE(opt.get_option("after") != nullptr);
3285 1 : CATCH_REQUIRE(opt.get_option('a') != nullptr);
3286 3 : CATCH_REQUIRE(opt.is_defined("after"));
3287 3 : CATCH_REQUIRE(opt.get_string("after") == "late");
3288 3 : CATCH_REQUIRE(opt.get_string("after", 0) == "late");
3289 3 : CATCH_REQUIRE(opt.get_default("after") == "late");
3290 3 : CATCH_REQUIRE(opt.size("after") == 1);
3291 :
3292 : // other parameters
3293 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3294 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3295 3 : }
3296 :
3297 2 : CATCH_WHEN("parameters to some arguments")
3298 : {
3299 1 : char const * cargv[] =
3300 : {
3301 : "/usr/bin/arguments",
3302 : "--before",
3303 : "avant",
3304 : "--out",
3305 : "--after",
3306 : "apr\xC3\xA8s", // UTF-8 of "`e"
3307 : nullptr
3308 : };
3309 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3310 1 : char ** argv = const_cast<char **>(cargv);
3311 :
3312 1 : advgetopt::getopt opt(environment_options, argc, argv);
3313 :
3314 : // check that the result is valid
3315 :
3316 : // an invalid parameter, MUST NOT EXIST
3317 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3318 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3319 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3320 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3321 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3322 :
3323 : // the valid parameter
3324 3 : CATCH_REQUIRE(opt.get_option("before") != nullptr);
3325 1 : CATCH_REQUIRE(opt.get_option('b') != nullptr);
3326 3 : CATCH_REQUIRE(opt.is_defined("before"));
3327 3 : CATCH_REQUIRE(opt.get_string("before") == "avant");
3328 3 : CATCH_REQUIRE(opt.get_string("before", 0) == "avant");
3329 3 : CATCH_REQUIRE(opt.get_default("before") == "early");
3330 3 : CATCH_REQUIRE(opt.size("before") == 1);
3331 :
3332 : // the valid parameter
3333 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3334 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3335 3 : CATCH_REQUIRE(opt.is_defined("out"));
3336 3 : CATCH_REQUIRE(opt.get_string("out") == "default-name");
3337 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "default-name");
3338 3 : CATCH_REQUIRE(opt.get_default("out") == "default-name");
3339 3 : CATCH_REQUIRE(opt.size("out") == 1);
3340 :
3341 : // the valid parameter
3342 3 : CATCH_REQUIRE(opt.get_option("after") != nullptr);
3343 1 : CATCH_REQUIRE(opt.get_option('a') != nullptr);
3344 3 : CATCH_REQUIRE(opt.is_defined("after"));
3345 3 : CATCH_REQUIRE(opt.get_string("after") == "apr\xC3\xA8s");
3346 3 : CATCH_REQUIRE(opt.get_string("after", 0) == "apr\xC3\xA8s");
3347 3 : CATCH_REQUIRE(opt.get_default("after") == "late");
3348 3 : CATCH_REQUIRE(opt.size("after") == 1);
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 3 : }
3354 : }
3355 16 : CATCH_END_SECTION()
3356 16 : }
3357 :
3358 :
3359 12 : CATCH_TEST_CASE("default_arguments", "[arguments][valid][multiple][getopt]")
3360 : {
3361 12 : CATCH_START_SECTION("default_arguments: verify a simple [<filename> ...] argument")
3362 : {
3363 4 : advgetopt::option const options[] =
3364 : {
3365 : advgetopt::define_option(
3366 : advgetopt::Name("out")
3367 : , advgetopt::ShortName('o')
3368 : , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_COMMAND_LINE
3369 : , advgetopt::GETOPT_FLAG_DEFAULT_OPTION
3370 : , advgetopt::GETOPT_FLAG_MULTIPLE>())
3371 : , advgetopt::Help("output filename.")
3372 : ),
3373 : advgetopt::end_options()
3374 : };
3375 :
3376 4 : advgetopt::options_environment environment_options;
3377 4 : environment_options.f_project_name = "unittest";
3378 4 : environment_options.f_options = options;
3379 4 : environment_options.f_environment_flags = 0;
3380 4 : environment_options.f_help_header = "Usage: test simple [<filename>] option";
3381 :
3382 4 : CATCH_WHEN("no arguments")
3383 : {
3384 1 : char const * cargv[] =
3385 : {
3386 : "/usr/bin/arguments",
3387 : nullptr
3388 : };
3389 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3390 1 : char ** argv = const_cast<char **>(cargv);
3391 :
3392 1 : advgetopt::getopt opt(environment_options, argc, argv);
3393 :
3394 : // check that the result is valid
3395 :
3396 : // an invalid parameter, MUST NOT EXIST
3397 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3398 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3399 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3400 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3401 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3402 :
3403 : // the valid parameter
3404 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3405 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3406 3 : CATCH_REQUIRE_FALSE(opt.is_defined("out"));
3407 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3408 3 : CATCH_REQUIRE(opt.size("out") == 0);
3409 :
3410 : // other parameters
3411 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3412 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3413 5 : }
3414 :
3415 4 : CATCH_WHEN("one argument")
3416 : {
3417 1 : char const * cargv[] =
3418 : {
3419 : "/usr/bin/arguments",
3420 : "my-filename.out",
3421 : nullptr
3422 : };
3423 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3424 1 : char ** argv = const_cast<char **>(cargv);
3425 :
3426 1 : advgetopt::getopt opt(environment_options, argc, argv);
3427 :
3428 : // check that the result is valid
3429 :
3430 : // an invalid parameter, MUST NOT EXIST
3431 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3432 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3433 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3434 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3435 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3436 :
3437 : // the valid parameter
3438 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3439 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3440 3 : CATCH_REQUIRE(opt.is_defined("out"));
3441 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3442 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3443 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3444 3 : CATCH_REQUIRE(opt.size("out") == 1);
3445 :
3446 : // other parameters
3447 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3448 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3449 5 : }
3450 :
3451 4 : CATCH_WHEN("three arguments")
3452 : {
3453 1 : char const * cargv[] =
3454 : {
3455 : "/usr/bin/arguments",
3456 : "my-filename.out",
3457 : "another.out",
3458 : "last.out",
3459 : nullptr
3460 : };
3461 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3462 1 : char ** argv = const_cast<char **>(cargv);
3463 :
3464 1 : advgetopt::getopt opt(environment_options, argc, argv);
3465 :
3466 : // check that the result is valid
3467 :
3468 : // an invalid parameter, MUST NOT EXIST
3469 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3470 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3471 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3472 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3473 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3474 :
3475 : // the valid parameter
3476 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3477 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3478 3 : CATCH_REQUIRE(opt.is_defined("out"));
3479 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3480 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3481 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
3482 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
3483 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3484 3 : CATCH_REQUIRE(opt.size("out") == 3);
3485 :
3486 : // other parameters
3487 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3488 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3489 5 : }
3490 :
3491 4 : CATCH_WHEN("four arguments with a '-'")
3492 : {
3493 1 : char const * cargv[] =
3494 : {
3495 : "/usr/bin/arguments",
3496 : "my-filename.out",
3497 : "another.out",
3498 : "-",
3499 : "last.out",
3500 : nullptr
3501 : };
3502 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3503 1 : char ** argv = const_cast<char **>(cargv);
3504 :
3505 1 : advgetopt::getopt opt(environment_options, argc, argv);
3506 :
3507 : // check that the result is valid
3508 :
3509 : // an invalid parameter, MUST NOT EXIST
3510 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3511 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3512 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3513 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3514 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3515 :
3516 : // the valid parameter
3517 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3518 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3519 3 : CATCH_REQUIRE(opt.is_defined("out"));
3520 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3521 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3522 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
3523 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "-");
3524 3 : CATCH_REQUIRE(opt.get_string("out", 3) == "last.out");
3525 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3526 3 : CATCH_REQUIRE(opt.size("out") == 4);
3527 :
3528 : // other parameters
3529 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3530 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3531 5 : }
3532 : }
3533 12 : CATCH_END_SECTION()
3534 :
3535 12 : CATCH_START_SECTION("default_arguments: verify a simple [<filename> ...] argument with the default name (a.k.a. \"--\")")
3536 : {
3537 4 : advgetopt::option const options[] =
3538 : {
3539 : advgetopt::define_option(
3540 : advgetopt::Name("--")
3541 : , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_COMMAND_LINE
3542 : , advgetopt::GETOPT_FLAG_DEFAULT_OPTION
3543 : , advgetopt::GETOPT_FLAG_MULTIPLE>())
3544 : , advgetopt::Help("output filename.")
3545 : ),
3546 : advgetopt::end_options()
3547 : };
3548 :
3549 4 : advgetopt::options_environment environment_options;
3550 4 : environment_options.f_project_name = "unittest";
3551 4 : environment_options.f_options = options;
3552 4 : environment_options.f_environment_flags = 0;
3553 4 : environment_options.f_help_header = "Usage: test simple [<filename>] option";
3554 :
3555 4 : CATCH_WHEN("no arguments")
3556 : {
3557 1 : char const * cargv[] =
3558 : {
3559 : "/usr/bin/arguments",
3560 : nullptr
3561 : };
3562 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3563 1 : char ** argv = const_cast<char **>(cargv);
3564 :
3565 1 : advgetopt::getopt opt(environment_options, argc, argv);
3566 :
3567 : // check that the result is valid
3568 :
3569 : // an invalid parameter, MUST NOT EXIST
3570 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3571 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3572 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3573 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3574 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3575 :
3576 : // the valid parameter
3577 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3578 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
3579 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3580 3 : CATCH_REQUIRE(opt.size("--") == 0);
3581 :
3582 : // other parameters
3583 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3584 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3585 5 : }
3586 :
3587 4 : CATCH_WHEN("one argument")
3588 : {
3589 1 : char const * cargv[] =
3590 : {
3591 : "/usr/bin/arguments",
3592 : "my-filename.out",
3593 : nullptr
3594 : };
3595 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3596 1 : char ** argv = const_cast<char **>(cargv);
3597 :
3598 1 : advgetopt::getopt opt(environment_options, argc, argv);
3599 :
3600 : // check that the result is valid
3601 :
3602 : // an invalid parameter, MUST NOT EXIST
3603 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3604 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3605 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3606 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3607 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3608 :
3609 : // the valid parameter
3610 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3611 3 : CATCH_REQUIRE(opt.is_defined("--"));
3612 3 : CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
3613 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
3614 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3615 3 : CATCH_REQUIRE(opt.size("--") == 1);
3616 :
3617 : // other parameters
3618 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3619 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3620 5 : }
3621 :
3622 4 : CATCH_WHEN("three arguments")
3623 : {
3624 1 : char const * cargv[] =
3625 : {
3626 : "/usr/bin/arguments",
3627 : "my-filename.out",
3628 : "another.out",
3629 : "last.out",
3630 : nullptr
3631 : };
3632 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3633 1 : char ** argv = const_cast<char **>(cargv);
3634 :
3635 1 : advgetopt::getopt opt(environment_options, argc, argv);
3636 :
3637 : // check that the result is valid
3638 :
3639 : // an invalid parameter, MUST NOT EXIST
3640 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3641 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3642 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3643 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3644 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3645 :
3646 : // the valid parameter
3647 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3648 3 : CATCH_REQUIRE(opt.is_defined("--"));
3649 3 : CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
3650 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
3651 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "another.out");
3652 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "last.out");
3653 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3654 3 : CATCH_REQUIRE(opt.size("--") == 3);
3655 :
3656 : // other parameters
3657 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3658 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3659 5 : }
3660 :
3661 4 : CATCH_WHEN("four arguments with a '-'")
3662 : {
3663 1 : char const * cargv[] =
3664 : {
3665 : "/usr/bin/arguments",
3666 : "my-filename.out",
3667 : "another.out",
3668 : "-",
3669 : "last.out",
3670 : nullptr
3671 : };
3672 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3673 1 : char ** argv = const_cast<char **>(cargv);
3674 :
3675 1 : advgetopt::getopt opt(environment_options, argc, argv);
3676 :
3677 : // check that the result is valid
3678 :
3679 : // an invalid parameter, MUST NOT EXIST
3680 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3681 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3682 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3683 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3684 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3685 :
3686 : // the valid parameter
3687 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
3688 3 : CATCH_REQUIRE(opt.is_defined("--"));
3689 3 : CATCH_REQUIRE(opt.get_string("--") == "my-filename.out");
3690 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "my-filename.out");
3691 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "another.out");
3692 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "-");
3693 3 : CATCH_REQUIRE(opt.get_string("--", 3) == "last.out");
3694 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3695 3 : CATCH_REQUIRE(opt.size("--") == 4);
3696 :
3697 : // other parameters
3698 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3699 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3700 5 : }
3701 : }
3702 12 : CATCH_END_SECTION()
3703 :
3704 12 : CATCH_START_SECTION("default_arguments: verify a simple [<filename> ...] argument in a variable")
3705 : {
3706 4 : advgetopt::option const options[] =
3707 : {
3708 : advgetopt::define_option(
3709 : advgetopt::Name("out")
3710 : , advgetopt::ShortName('o')
3711 : , advgetopt::Flags(advgetopt::any_flags<advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE
3712 : , advgetopt::GETOPT_FLAG_DEFAULT_OPTION
3713 : , advgetopt::GETOPT_FLAG_MULTIPLE>())
3714 : , advgetopt::Help("output filename.")
3715 : ),
3716 : advgetopt::end_options()
3717 : };
3718 :
3719 4 : advgetopt::options_environment environment_options;
3720 4 : environment_options.f_project_name = "unittest";
3721 4 : environment_options.f_options = options;
3722 4 : environment_options.f_environment_flags = 0;
3723 4 : environment_options.f_help_header = "Usage: test simple --out <filename> ... option";
3724 4 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
3725 :
3726 4 : CATCH_WHEN("no arguments")
3727 : {
3728 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "");
3729 :
3730 1 : char const * cargv[] =
3731 : {
3732 : "/usr/bin/arguments",
3733 : nullptr
3734 : };
3735 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3736 1 : char ** argv = const_cast<char **>(cargv);
3737 :
3738 1 : advgetopt::getopt opt(environment_options, argc, argv);
3739 :
3740 : // check that the result is valid
3741 :
3742 : // an invalid parameter, MUST NOT EXIST
3743 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3744 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3745 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3746 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3747 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3748 :
3749 : // the valid parameter
3750 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3751 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3752 3 : CATCH_REQUIRE_FALSE(opt.is_defined("out"));
3753 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3754 3 : CATCH_REQUIRE(opt.size("out") == 0);
3755 :
3756 : // other parameters
3757 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3758 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3759 5 : }
3760 :
3761 4 : CATCH_WHEN("one argument")
3762 : {
3763 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out");
3764 :
3765 1 : char const * cargv[] =
3766 : {
3767 : "/usr/bin/arguments",
3768 : nullptr
3769 : };
3770 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3771 1 : char ** argv = const_cast<char **>(cargv);
3772 :
3773 1 : advgetopt::getopt opt(environment_options, argc, argv);
3774 :
3775 : // check that the result is valid
3776 :
3777 : // an invalid parameter, MUST NOT EXIST
3778 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3779 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3780 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3781 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3782 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3783 :
3784 : // the valid parameter
3785 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3786 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3787 3 : CATCH_REQUIRE(opt.is_defined("out"));
3788 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3789 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3790 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3791 3 : CATCH_REQUIRE(opt.size("out") == 1);
3792 :
3793 : // other parameters
3794 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3795 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3796 5 : }
3797 :
3798 4 : CATCH_WHEN("three arguments")
3799 : {
3800 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out last.out");
3801 :
3802 1 : char const * cargv[] =
3803 : {
3804 : "/usr/bin/arguments",
3805 : nullptr
3806 : };
3807 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3808 1 : char ** argv = const_cast<char **>(cargv);
3809 :
3810 1 : advgetopt::getopt opt(environment_options, argc, argv);
3811 :
3812 : // check that the result is valid
3813 :
3814 : // an invalid parameter, MUST NOT EXIST
3815 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3816 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3817 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3818 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3819 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3820 :
3821 : // the valid parameter
3822 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3823 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3824 3 : CATCH_REQUIRE(opt.is_defined("out"));
3825 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3826 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3827 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
3828 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "last.out");
3829 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3830 3 : CATCH_REQUIRE(opt.size("out") == 3);
3831 :
3832 : // other parameters
3833 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3834 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3835 5 : }
3836 :
3837 4 : CATCH_WHEN("four arguments with a '-'")
3838 : {
3839 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "my-filename.out another.out - last.out");
3840 :
3841 1 : char const * cargv[] =
3842 : {
3843 : "/usr/bin/arguments",
3844 : nullptr
3845 : };
3846 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3847 1 : char ** argv = const_cast<char **>(cargv);
3848 :
3849 1 : advgetopt::getopt opt(environment_options, argc, argv);
3850 :
3851 : // check that the result is valid
3852 :
3853 : // an invalid parameter, MUST NOT EXIST
3854 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3855 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3856 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
3857 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3858 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
3859 :
3860 : // the valid parameter
3861 3 : CATCH_REQUIRE(opt.get_option("out") != nullptr);
3862 1 : CATCH_REQUIRE(opt.get_option('o') != nullptr);
3863 3 : CATCH_REQUIRE(opt.is_defined("out"));
3864 3 : CATCH_REQUIRE(opt.get_string("out") == "my-filename.out");
3865 3 : CATCH_REQUIRE(opt.get_string("out", 0) == "my-filename.out");
3866 3 : CATCH_REQUIRE(opt.get_string("out", 1) == "another.out");
3867 3 : CATCH_REQUIRE(opt.get_string("out", 2) == "-");
3868 3 : CATCH_REQUIRE(opt.get_string("out", 3) == "last.out");
3869 3 : CATCH_REQUIRE(opt.get_default("out").empty());
3870 3 : CATCH_REQUIRE(opt.size("out") == 4);
3871 :
3872 : // other parameters
3873 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3874 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3875 5 : }
3876 : }
3877 12 : CATCH_END_SECTION()
3878 12 : }
3879 :
3880 :
3881 3 : CATCH_TEST_CASE("manual_arguments", "[arguments][valid][getopt]")
3882 : {
3883 3 : CATCH_START_SECTION("manual_arguments: verify a few arguments added manually")
3884 : {
3885 : // create a getopt object
3886 : //
3887 1 : advgetopt::options_environment environment_options;
3888 1 : environment_options.f_project_name = "unittest";
3889 1 : environment_options.f_help_header = "Usage: test simple --verbose option";
3890 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
3891 :
3892 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.exe file.so file.dll file.lib file.a");
3893 1 : advgetopt::getopt opt(environment_options);
3894 :
3895 : // an invalid parameter, MUST NEVER EXIST
3896 : //
3897 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3898 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3899 7 : CATCH_REQUIRE_THROWS_MATCHES(
3900 : opt.is_defined("invalid-parameter")
3901 : , advgetopt::getopt_initialization
3902 : , Catch::Matchers::ExceptionMessage(
3903 : "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
3904 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3905 7 : CATCH_REQUIRE_THROWS_MATCHES(
3906 : opt.size("invalid-parameter")
3907 : , advgetopt::getopt_initialization
3908 : , Catch::Matchers::ExceptionMessage(
3909 : "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
3910 :
3911 : // verbose
3912 : //
3913 3 : CATCH_REQUIRE(opt.get_option("verbose") == nullptr);
3914 1 : CATCH_REQUIRE(opt.get_option('v') == nullptr);
3915 7 : CATCH_REQUIRE_THROWS_MATCHES(
3916 : opt.is_defined("verbose")
3917 : , advgetopt::getopt_initialization
3918 : , Catch::Matchers::ExceptionMessage(
3919 : "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
3920 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
3921 7 : CATCH_REQUIRE_THROWS_MATCHES(
3922 : opt.size("verbose")
3923 : , advgetopt::getopt_initialization
3924 : , Catch::Matchers::ExceptionMessage(
3925 : "getopt_exception: function called too soon, parser is not done yet (i.e. is_defined(), get_string(), get_long(), get_double() cannot be called until the parser is done)"));
3926 :
3927 : // help
3928 : //
3929 3 : CATCH_REQUIRE(opt.get_option("help") == nullptr);
3930 1 : CATCH_REQUIRE(opt.get_option('h') == nullptr);
3931 3 : CATCH_REQUIRE(opt.get_default("help").empty());
3932 :
3933 : // default
3934 : //
3935 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3936 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3937 :
3938 : // other parameters
3939 : //
3940 1 : CATCH_REQUIRE(opt.get_program_name().empty());
3941 1 : CATCH_REQUIRE(opt.get_program_fullname().empty());
3942 :
3943 : // setup the program name early
3944 : //
3945 1 : char const * cargv[] =
3946 : {
3947 : "/usr/bin/arguments",
3948 : "--verbose",
3949 : "--help",
3950 : nullptr
3951 : };
3952 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
3953 1 : char ** argv = const_cast<char **>(cargv);
3954 :
3955 1 : opt.parse_program_name(argv);
3956 :
3957 : // an invalid parameter, MUST NEVER EXIST
3958 : //
3959 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3960 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3961 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3962 :
3963 : // verbose
3964 : //
3965 3 : CATCH_REQUIRE(opt.get_option("verbose") == nullptr);
3966 1 : CATCH_REQUIRE(opt.get_option('v') == nullptr);
3967 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
3968 :
3969 : // help
3970 : //
3971 3 : CATCH_REQUIRE(opt.get_option("help") == nullptr);
3972 1 : CATCH_REQUIRE(opt.get_option('h') == nullptr);
3973 3 : CATCH_REQUIRE(opt.get_default("help").empty());
3974 :
3975 : // default
3976 : //
3977 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
3978 3 : CATCH_REQUIRE(opt.get_default("--").empty());
3979 :
3980 : // other parameters
3981 : //
3982 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
3983 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
3984 :
3985 : // verify nullptr has no effect
3986 : //
3987 1 : opt.parse_options_info(nullptr);
3988 :
3989 : // an invalid parameter, MUST NEVER EXIST
3990 : //
3991 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
3992 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
3993 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
3994 :
3995 : // verbose
3996 : //
3997 3 : CATCH_REQUIRE(opt.get_option("verbose") == nullptr);
3998 1 : CATCH_REQUIRE(opt.get_option('v') == nullptr);
3999 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4000 :
4001 : // help
4002 : //
4003 3 : CATCH_REQUIRE(opt.get_option("help") == nullptr);
4004 1 : CATCH_REQUIRE(opt.get_option('h') == nullptr);
4005 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4006 :
4007 : // default
4008 : //
4009 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4010 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4011 :
4012 : // other parameters
4013 : //
4014 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4015 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4016 :
4017 : // add --verbose
4018 : //
4019 1 : advgetopt::option const verbose_option[] =
4020 : {
4021 : advgetopt::define_option(
4022 : advgetopt::Name("verbose")
4023 : , advgetopt::ShortName('v')
4024 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4025 : , advgetopt::Help("print info as we work.")
4026 : ),
4027 : advgetopt::end_options()
4028 : };
4029 1 : opt.parse_options_info(verbose_option);
4030 :
4031 : // an invalid parameter, MUST NEVER EXIST
4032 : //
4033 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4034 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4035 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4036 :
4037 : // verbose
4038 : //
4039 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4040 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4041 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4042 :
4043 : // help
4044 : //
4045 3 : CATCH_REQUIRE(opt.get_option("help") == nullptr);
4046 1 : CATCH_REQUIRE(opt.get_option('h') == nullptr);
4047 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4048 :
4049 : // default
4050 : //
4051 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4052 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4053 :
4054 : // other parameters
4055 : //
4056 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4057 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4058 :
4059 : // add --help
4060 : //
4061 1 : advgetopt::option const help_option[] =
4062 : {
4063 : advgetopt::define_option(
4064 : advgetopt::Name("help")
4065 : , advgetopt::ShortName('h')
4066 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4067 : , advgetopt::Help("print this help screen.")
4068 : ),
4069 : advgetopt::end_options()
4070 : };
4071 1 : opt.parse_options_info(help_option);
4072 :
4073 : // an invalid parameter, MUST NEVER EXIST
4074 : //
4075 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4076 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4077 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4078 :
4079 : // verbose
4080 : //
4081 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4082 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4083 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4084 :
4085 : // help
4086 : //
4087 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4088 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4089 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4090 :
4091 : // default
4092 : //
4093 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
4094 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4095 :
4096 : // other parameters
4097 : //
4098 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4099 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4100 :
4101 : // add -- (default option)
4102 : //
4103 1 : advgetopt::option const default_option[] =
4104 : {
4105 : advgetopt::define_option(
4106 : advgetopt::Name("--")
4107 : , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
4108 : , advgetopt::Help("filenames to handle by this command.")
4109 : ),
4110 : advgetopt::end_options()
4111 : };
4112 1 : opt.parse_options_info(default_option);
4113 :
4114 : // an invalid parameter, MUST NEVER EXIST
4115 : //
4116 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4117 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4118 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4119 :
4120 : // verbose
4121 : //
4122 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4123 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4124 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4125 :
4126 : // help
4127 : //
4128 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4129 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4130 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4131 :
4132 : // default
4133 : //
4134 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4135 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4136 :
4137 : // other parameters
4138 : //
4139 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4140 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4141 :
4142 : // first parse the environment variable
4143 : //
4144 1 : opt.parse_environment_variable();
4145 :
4146 : // an invalid parameter, MUST NEVER EXIST
4147 : //
4148 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4149 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4150 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4151 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4152 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4153 :
4154 : // verbose
4155 : //
4156 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4157 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4158 3 : CATCH_REQUIRE_FALSE(opt.is_defined("verbose"));
4159 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4160 3 : CATCH_REQUIRE(opt.size("verbose") == 0);
4161 :
4162 : // help
4163 : //
4164 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4165 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4166 3 : CATCH_REQUIRE_FALSE(opt.is_defined("help"));
4167 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4168 3 : CATCH_REQUIRE(opt.size("help") == 0);
4169 :
4170 : // default
4171 : //
4172 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4173 3 : CATCH_REQUIRE(opt.is_defined("--"));
4174 3 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4175 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4176 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4177 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4178 3 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4179 3 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4180 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4181 3 : CATCH_REQUIRE(opt.size("--") == 5);
4182 :
4183 : // other parameters
4184 : //
4185 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4186 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4187 :
4188 : // now parse our command line arguments
4189 : //
4190 1 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
4191 :
4192 : // an invalid parameter, MUST NEVER EXIST
4193 : //
4194 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4195 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4196 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4197 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4198 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4199 :
4200 : // verbose
4201 : //
4202 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4203 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4204 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
4205 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4206 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
4207 :
4208 : // help
4209 : //
4210 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4211 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4212 3 : CATCH_REQUIRE(opt.is_defined("help"));
4213 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4214 3 : CATCH_REQUIRE(opt.size("help") == 1);
4215 :
4216 : // default
4217 : //
4218 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4219 3 : CATCH_REQUIRE(opt.is_defined("--"));
4220 3 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4221 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4222 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4223 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4224 3 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4225 3 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4226 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4227 3 : CATCH_REQUIRE(opt.size("--") == 5);
4228 :
4229 : // other parameters
4230 : //
4231 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4232 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4233 1 : }
4234 3 : CATCH_END_SECTION()
4235 :
4236 3 : CATCH_START_SECTION("manual_arguments: verify a few arguments added manually and system options")
4237 : {
4238 : // create a getopt object with options
4239 : //
4240 1 : advgetopt::option const options[] =
4241 : {
4242 : advgetopt::define_option(
4243 : advgetopt::Name("verbose")
4244 : , advgetopt::ShortName('v')
4245 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4246 : , advgetopt::Help("print info as we work.")
4247 : ),
4248 : advgetopt::define_option(
4249 : advgetopt::Name("size")
4250 : , advgetopt::ShortName('s')
4251 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4252 : , advgetopt::DefaultValue("123")
4253 : , advgetopt::Help("define a size.")
4254 : ),
4255 : advgetopt::define_option(
4256 : advgetopt::Name("--")
4257 : , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
4258 : , advgetopt::Help("filenames to handle by this command.")
4259 : ),
4260 : advgetopt::end_options()
4261 : };
4262 :
4263 1 : advgetopt::options_environment environment_options;
4264 1 : environment_options.f_project_name = "unittest";
4265 1 : environment_options.f_options = options;
4266 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
4267 1 : environment_options.f_help_header = "Usage: test simple --verbose option";
4268 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
4269 :
4270 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.exe file.so file.dll file.lib file.a");
4271 1 : advgetopt::getopt opt(environment_options);
4272 :
4273 : // an invalid parameter, MUST NEVER EXIST
4274 : //
4275 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4276 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4277 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4278 :
4279 : // verbose
4280 : //
4281 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4282 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4283 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4284 :
4285 : // help
4286 : //
4287 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4288 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4289 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4290 :
4291 : // default
4292 : //
4293 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4294 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4295 :
4296 : // size
4297 : //
4298 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4299 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4300 3 : CATCH_REQUIRE(opt.get_default("size") == "123");
4301 :
4302 : // pos
4303 : //
4304 3 : CATCH_REQUIRE(opt.get_option("pos") == nullptr);
4305 1 : CATCH_REQUIRE(opt.get_option('p') == nullptr);
4306 3 : CATCH_REQUIRE(opt.get_default("pos").empty());
4307 :
4308 : // other parameters
4309 : //
4310 1 : CATCH_REQUIRE(opt.get_program_name().empty());
4311 1 : CATCH_REQUIRE(opt.get_program_fullname().empty());
4312 :
4313 : // setup the program name early
4314 : //
4315 1 : char const * cargv[] =
4316 : {
4317 : "/usr/bin/arguments",
4318 : "--size",
4319 : "40132",
4320 : "--pos",
4321 : "43,91",
4322 : nullptr
4323 : };
4324 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4325 1 : char ** argv = const_cast<char **>(cargv);
4326 :
4327 1 : opt.parse_program_name(argv);
4328 :
4329 : // an invalid parameter, MUST NEVER EXIST
4330 : //
4331 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4332 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4333 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4334 :
4335 : // verbose
4336 : //
4337 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4338 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4339 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4340 :
4341 : // help
4342 : //
4343 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4344 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4345 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4346 :
4347 : // size
4348 : //
4349 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4350 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4351 3 : CATCH_REQUIRE(opt.get_default("size") == "123");
4352 :
4353 : // pos
4354 : //
4355 3 : CATCH_REQUIRE(opt.get_option("pos") == nullptr);
4356 1 : CATCH_REQUIRE(opt.get_option('p') == nullptr);
4357 3 : CATCH_REQUIRE(opt.get_default("pos").empty());
4358 :
4359 : // default
4360 : //
4361 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4362 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4363 :
4364 : // other parameters
4365 : //
4366 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4367 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4368 :
4369 : // add --pos
4370 : //
4371 1 : advgetopt::option const help_option[] =
4372 : {
4373 : advgetopt::define_option(
4374 : advgetopt::Name("pos")
4375 : , advgetopt::ShortName('p')
4376 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4377 : , advgetopt::Help("specify position.")
4378 : , advgetopt::DefaultValue("0,0")
4379 : ),
4380 : advgetopt::end_options()
4381 : };
4382 1 : opt.parse_options_info(help_option);
4383 :
4384 : // an invalid parameter, MUST NEVER EXIST
4385 : //
4386 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4387 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4388 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4389 :
4390 : // verbose
4391 : //
4392 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4393 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4394 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4395 :
4396 : // help
4397 : //
4398 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4399 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4400 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4401 :
4402 : // size
4403 : //
4404 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4405 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4406 3 : CATCH_REQUIRE(opt.get_default("size") == "123");
4407 :
4408 : // pos
4409 : //
4410 3 : CATCH_REQUIRE(opt.get_option("pos") != nullptr);
4411 1 : CATCH_REQUIRE(opt.get_option('p') != nullptr);
4412 3 : CATCH_REQUIRE(opt.get_default("pos") == "0,0");
4413 :
4414 : // default
4415 : //
4416 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4417 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4418 :
4419 : // other parameters
4420 : //
4421 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4422 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4423 :
4424 : // first parse the environment variable
4425 : //
4426 1 : opt.parse_environment_variable();
4427 :
4428 : // an invalid parameter, MUST NEVER EXIST
4429 : //
4430 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4431 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4432 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4433 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4434 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4435 :
4436 : // verbose
4437 : //
4438 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4439 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4440 3 : CATCH_REQUIRE_FALSE(opt.is_defined("verbose"));
4441 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4442 3 : CATCH_REQUIRE(opt.size("verbose") == 0);
4443 :
4444 : // help
4445 : //
4446 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4447 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4448 3 : CATCH_REQUIRE_FALSE(opt.is_defined("help"));
4449 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4450 3 : CATCH_REQUIRE(opt.size("help") == 0);
4451 :
4452 : // size
4453 : //
4454 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4455 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4456 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
4457 3 : CATCH_REQUIRE(opt.get_default("size") == "123");
4458 3 : CATCH_REQUIRE(opt.size("size") == 0);
4459 :
4460 : // pos
4461 : //
4462 3 : CATCH_REQUIRE(opt.get_option("pos") != nullptr);
4463 1 : CATCH_REQUIRE(opt.get_option('p') != nullptr);
4464 3 : CATCH_REQUIRE_FALSE(opt.is_defined("pos"));
4465 3 : CATCH_REQUIRE(opt.get_default("pos") == "0,0");
4466 3 : CATCH_REQUIRE(opt.size("pos") == 0);
4467 :
4468 : // default
4469 : //
4470 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4471 3 : CATCH_REQUIRE(opt.is_defined("--"));
4472 3 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4473 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4474 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4475 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4476 3 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4477 3 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4478 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4479 3 : CATCH_REQUIRE(opt.size("--") == 5);
4480 :
4481 : // other parameters
4482 : //
4483 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4484 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4485 :
4486 : // now parse our command line arguments
4487 : //
4488 1 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
4489 :
4490 : // an invalid parameter, MUST NEVER EXIST
4491 : //
4492 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4493 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4494 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4495 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4496 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4497 :
4498 : // verbose
4499 : //
4500 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4501 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4502 3 : CATCH_REQUIRE_FALSE(opt.is_defined("verbose"));
4503 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4504 3 : CATCH_REQUIRE(opt.size("verbose") == 0);
4505 :
4506 : // help
4507 : //
4508 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4509 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4510 3 : CATCH_REQUIRE_FALSE(opt.is_defined("help"));
4511 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4512 3 : CATCH_REQUIRE(opt.size("help") == 0);
4513 :
4514 : // size
4515 : //
4516 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4517 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4518 3 : CATCH_REQUIRE(opt.is_defined("size"));
4519 3 : CATCH_REQUIRE(opt.get_string("size") == "40132");
4520 3 : CATCH_REQUIRE(opt.get_string("size", 0) == "40132");
4521 3 : CATCH_REQUIRE(opt.get_long("size") == 40132);
4522 3 : CATCH_REQUIRE(opt.get_long("size", 0) == 40132);
4523 : #pragma GCC diagnostic push
4524 : #pragma GCC diagnostic ignored "-Wfloat-equal"
4525 : {
4526 3 : bool const a1(opt.get_double("size") == 40132.0);
4527 1 : CATCH_REQUIRE(a1);
4528 3 : bool const a2(opt.get_double("size", 0) == 40132.0);
4529 1 : CATCH_REQUIRE(a2);
4530 : }
4531 : #pragma GCC diagnostic pop
4532 3 : CATCH_REQUIRE(opt.get_default("size") == "123");
4533 3 : CATCH_REQUIRE(opt.size("size") == 1);
4534 :
4535 : // pos
4536 : //
4537 3 : CATCH_REQUIRE(opt.get_option("pos") != nullptr);
4538 1 : CATCH_REQUIRE(opt.get_option('p') != nullptr);
4539 3 : CATCH_REQUIRE(opt.is_defined("pos"));
4540 3 : CATCH_REQUIRE(opt.get_string("pos") == "43,91");
4541 3 : CATCH_REQUIRE(opt.get_string("pos", 0) == "43,91");
4542 3 : CATCH_REQUIRE(opt.get_default("pos") == "0,0");
4543 3 : CATCH_REQUIRE(opt.size("pos") == 1);
4544 :
4545 : // default
4546 : //
4547 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4548 3 : CATCH_REQUIRE(opt.is_defined("--"));
4549 3 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4550 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4551 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4552 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4553 3 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4554 3 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4555 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4556 3 : CATCH_REQUIRE(opt.size("--") == 5);
4557 :
4558 : // other parameters
4559 : //
4560 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4561 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4562 :
4563 : // second set of arguments
4564 : //
4565 1 : char const * cargv2[] =
4566 : {
4567 : "/usr/bin/arguments",
4568 : "--help",
4569 : "--verbose",
4570 : nullptr
4571 : };
4572 1 : int const argc2(sizeof(cargv2) / sizeof(cargv2[0]) - 1);
4573 1 : char ** argv2 = const_cast<char **>(cargv2);
4574 :
4575 1 : opt.parse_arguments(argc2, argv2, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
4576 :
4577 : // an invalid parameter, MUST NEVER EXIST
4578 : //
4579 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4580 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4581 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4582 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4583 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4584 :
4585 : // verbose
4586 : //
4587 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4588 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4589 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
4590 3 : CATCH_REQUIRE(opt.get_string("verbose").empty());
4591 3 : CATCH_REQUIRE(opt.get_string("verbose", 0).empty());
4592 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4593 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
4594 :
4595 : // help
4596 : //
4597 3 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4598 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4599 3 : CATCH_REQUIRE(opt.is_defined("help"));
4600 3 : CATCH_REQUIRE(opt.get_string("help").empty());
4601 3 : CATCH_REQUIRE(opt.get_string("help", 0).empty());
4602 3 : CATCH_REQUIRE(opt.get_default("help").empty());
4603 3 : CATCH_REQUIRE(opt.size("help") == 1);
4604 :
4605 : // size
4606 : //
4607 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4608 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4609 3 : CATCH_REQUIRE(opt.is_defined("size"));
4610 3 : CATCH_REQUIRE(opt.get_string("size") == "40132");
4611 3 : CATCH_REQUIRE(opt.get_string("size", 0) == "40132");
4612 3 : CATCH_REQUIRE(opt.get_long("size") == 40132);
4613 3 : CATCH_REQUIRE(opt.get_long("size", 0) == 40132);
4614 : #pragma GCC diagnostic push
4615 : #pragma GCC diagnostic ignored "-Wfloat-equal"
4616 : {
4617 3 : bool const a1(opt.get_double("size") == 40132.0);
4618 1 : CATCH_REQUIRE(a1);
4619 3 : bool const a2(opt.get_double("size", 0) == 40132.0);
4620 1 : CATCH_REQUIRE(a2);
4621 : }
4622 : #pragma GCC diagnostic pop
4623 3 : CATCH_REQUIRE(opt.get_default("size") == "123");
4624 3 : CATCH_REQUIRE(opt.size("size") == 1);
4625 :
4626 : // pos
4627 : //
4628 3 : CATCH_REQUIRE(opt.get_option("pos") != nullptr);
4629 1 : CATCH_REQUIRE(opt.get_option('p') != nullptr);
4630 3 : CATCH_REQUIRE(opt.is_defined("pos"));
4631 3 : CATCH_REQUIRE(opt.get_string("pos") == "43,91");
4632 3 : CATCH_REQUIRE(opt.get_string("pos", 0) == "43,91");
4633 3 : CATCH_REQUIRE(opt.get_default("pos") == "0,0");
4634 3 : CATCH_REQUIRE(opt.size("pos") == 1);
4635 :
4636 : // default
4637 : //
4638 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4639 3 : CATCH_REQUIRE(opt.is_defined("--"));
4640 3 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4641 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4642 3 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4643 3 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4644 3 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4645 3 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4646 3 : CATCH_REQUIRE(opt.get_default("--").empty());
4647 3 : CATCH_REQUIRE(opt.size("--") == 5);
4648 :
4649 : // other parameters
4650 : //
4651 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4652 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4653 1 : }
4654 3 : CATCH_END_SECTION()
4655 :
4656 3 : CATCH_START_SECTION("manual_arguments: verify that not calling link_aliases() causes problems")
4657 : {
4658 : // create a getopt object, we will part the options "manually" later
4659 : //
4660 1 : advgetopt::options_environment environment_options;
4661 1 : environment_options.f_project_name = "unittest";
4662 1 : environment_options.f_help_header = "Usage: test --licence as equivalent to --license";
4663 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
4664 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
4665 :
4666 1 : advgetopt::getopt opt(environment_options);
4667 :
4668 1 : const advgetopt::option options[] =
4669 : {
4670 : advgetopt::define_option(
4671 : advgetopt::Name("verbose")
4672 : , advgetopt::ShortName('v')
4673 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4674 : , advgetopt::Help("print info as we work.")
4675 : ),
4676 : advgetopt::define_option(
4677 : advgetopt::Name("licence") // French spelling
4678 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4679 : , advgetopt::Alias("license") // forgot system flags?
4680 : ),
4681 : advgetopt::end_options()
4682 : };
4683 :
4684 1 : opt.parse_options_info(options);
4685 :
4686 : // "forgot" to call the opt.link_aliases() here
4687 :
4688 1 : char const * cargv[] =
4689 : {
4690 : "/usr/bin/arguments",
4691 : "--verbose",
4692 : "--licence",
4693 : nullptr
4694 : };
4695 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4696 1 : char ** argv = const_cast<char **>(cargv);
4697 :
4698 3 : CATCH_REQUIRE_THROWS_MATCHES(
4699 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE)
4700 : , advgetopt::getopt_undefined
4701 : , Catch::Matchers::ExceptionMessage(
4702 : "getopt_exception: getopt::get_alias_destination(): alias is missing. Did you call link_aliases()?"));
4703 1 : }
4704 3 : CATCH_END_SECTION()
4705 3 : }
4706 :
4707 :
4708 5 : CATCH_TEST_CASE("individual_argument_variable", "[arguments][valid][variable][getopt]")
4709 : {
4710 5 : CATCH_START_SECTION("individual_argument_variable: test that we get the values of individual environment variables without an INTRO_...")
4711 : {
4712 : // create a getopt object with options
4713 : //
4714 5 : advgetopt::option const options[] =
4715 : {
4716 : advgetopt::define_option(
4717 : advgetopt::Name("verbose")
4718 : , advgetopt::ShortName('v')
4719 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4720 : , advgetopt::EnvironmentVariableName("VERBOSE")
4721 : , advgetopt::Help("print info as we work.")
4722 : ),
4723 : advgetopt::define_option(
4724 : advgetopt::Name("size")
4725 : , advgetopt::ShortName('s')
4726 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4727 : , advgetopt::DefaultValue("123")
4728 : , advgetopt::EnvironmentVariableName("SIZE")
4729 : , advgetopt::Help("define a size.")
4730 : ),
4731 : advgetopt::define_option(
4732 : advgetopt::Name("--")
4733 : , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
4734 : , advgetopt::EnvironmentVariableName("FILENAMES")
4735 : , advgetopt::Help("filenames to handle by this command.")
4736 : ),
4737 : advgetopt::end_options()
4738 : };
4739 :
4740 5 : advgetopt::options_environment environment_options;
4741 5 : environment_options.f_project_name = "unittest";
4742 5 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
4743 5 : environment_options.f_help_header = "Usage: testing system arguments.";
4744 5 : environment_options.f_options = options;
4745 5 : environment_options.f_version = "2.0.1";
4746 5 : environment_options.f_license = "MIT";
4747 5 : environment_options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
4748 5 : environment_options.f_build_date = "Jun 4 2019";
4749 5 : environment_options.f_build_time = "23:02:36";
4750 :
4751 5 : CATCH_WHEN("Testing all parameters defined on command line")
4752 : {
4753 5 : snapdev::safe_setenv env_verbose("VERBOSE", "");
4754 5 : snapdev::safe_setenv env_size("SIZE", "22159");
4755 5 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4756 :
4757 1 : char const * cargv[] =
4758 : {
4759 : "tests/system-arguments",
4760 : "--verbose",
4761 : "--size",
4762 : "5003",
4763 : "special/file",
4764 : "organic/test",
4765 : nullptr
4766 : };
4767 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4768 1 : char ** argv = const_cast<char **>(cargv);
4769 :
4770 : // the command line has priority, but the MULTIPLE creates a
4771 : // problem here...
4772 : //
4773 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4774 1 : CATCH_REQUIRE(opt != nullptr);
4775 :
4776 3 : CATCH_REQUIRE(opt->is_defined("verbose"));
4777 :
4778 3 : CATCH_REQUIRE(opt->is_defined("size"));
4779 3 : CATCH_REQUIRE(opt->get_string("size") == "5003");
4780 :
4781 3 : CATCH_REQUIRE(opt->is_defined("--"));
4782 3 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4783 3 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4784 3 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4785 6 : }
4786 :
4787 5 : CATCH_WHEN("Testing with verbose not on the list")
4788 : {
4789 5 : snapdev::safe_setenv env_verbose("VERBOSE", "");
4790 5 : snapdev::safe_setenv env_size("SIZE", "22159");
4791 5 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4792 :
4793 1 : char const * cargv[] =
4794 : {
4795 : "tests/system-arguments",
4796 : "--size",
4797 : "5003",
4798 : "special/file",
4799 : "organic/test",
4800 : nullptr
4801 : };
4802 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4803 1 : char ** argv = const_cast<char **>(cargv);
4804 :
4805 : // the command line has priority, but the MULTIPLE creates a
4806 : // problem here...
4807 : //
4808 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4809 1 : CATCH_REQUIRE(opt != nullptr);
4810 :
4811 3 : CATCH_REQUIRE(opt->is_defined("verbose"));
4812 :
4813 3 : CATCH_REQUIRE(opt->is_defined("size"));
4814 3 : CATCH_REQUIRE(opt->get_string("size") == "5003");
4815 :
4816 3 : CATCH_REQUIRE(opt->is_defined("--"));
4817 3 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4818 3 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4819 3 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4820 6 : }
4821 :
4822 5 : CATCH_WHEN("Testing with verbose set to false")
4823 : {
4824 5 : snapdev::safe_setenv env_verbose("VERBOSE", "false");
4825 5 : snapdev::safe_setenv env_size("SIZE", "22159");
4826 5 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4827 :
4828 1 : char const * cargv[] =
4829 : {
4830 : "tests/system-arguments",
4831 : "--size",
4832 : "5003",
4833 : "special/file",
4834 : "organic/test",
4835 : nullptr
4836 : };
4837 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4838 1 : char ** argv = const_cast<char **>(cargv);
4839 :
4840 : // the command line has priority, but the MULTIPLE creates a
4841 : // problem here...
4842 : //
4843 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4844 1 : CATCH_REQUIRE(opt != nullptr);
4845 :
4846 3 : CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
4847 :
4848 3 : CATCH_REQUIRE(opt->is_defined("size"));
4849 3 : CATCH_REQUIRE(opt->get_string("size") == "5003");
4850 :
4851 3 : CATCH_REQUIRE(opt->is_defined("--"));
4852 3 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4853 3 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4854 3 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4855 6 : }
4856 :
4857 5 : CATCH_WHEN("Testing with no verbose, but size in environment")
4858 : {
4859 5 : snapdev::safe_setenv env_size("SIZE", "22159");
4860 5 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4861 :
4862 1 : char const * cargv[] =
4863 : {
4864 : "tests/system-arguments",
4865 : "special/file",
4866 : "organic/test",
4867 : nullptr
4868 : };
4869 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4870 1 : char ** argv = const_cast<char **>(cargv);
4871 :
4872 : // the command line has priority, but the MULTIPLE creates a
4873 : // problem here...
4874 : //
4875 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4876 1 : CATCH_REQUIRE(opt != nullptr);
4877 :
4878 3 : CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
4879 :
4880 3 : CATCH_REQUIRE(opt->is_defined("size"));
4881 3 : CATCH_REQUIRE(opt->get_string("size") == "22159");
4882 :
4883 3 : CATCH_REQUIRE(opt->is_defined("--"));
4884 3 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4885 3 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4886 3 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4887 6 : }
4888 :
4889 5 : CATCH_WHEN("Testing with no command line parameters, but filenames in environment only")
4890 : {
4891 5 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4892 :
4893 1 : char const * cargv[] =
4894 : {
4895 : "tests/system-arguments",
4896 : nullptr
4897 : };
4898 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4899 1 : char ** argv = const_cast<char **>(cargv);
4900 :
4901 : // the command line has priority, but the MULTIPLE creates a
4902 : // problem here...
4903 : //
4904 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4905 1 : CATCH_REQUIRE(opt != nullptr);
4906 :
4907 3 : CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
4908 :
4909 3 : CATCH_REQUIRE_FALSE(opt->is_defined("size"));
4910 :
4911 3 : CATCH_REQUIRE(opt->is_defined("--"));
4912 3 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4913 6 : }
4914 : }
4915 5 : CATCH_END_SECTION()
4916 5 : }
4917 :
4918 :
4919 4 : CATCH_TEST_CASE("auto_process_system_arguments", "[arguments][valid][getopt]")
4920 : {
4921 4 : CATCH_START_SECTION("auto_process_system_arguments: test auto-processing of system arguments (with many CATCH_WHEN)")
4922 : {
4923 4 : advgetopt::options_environment options;
4924 4 : options.f_project_name = "unittest";
4925 4 : options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
4926 4 : options.f_help_header = "Usage: testing system arguments.";
4927 4 : options.f_version = "2.0.1";
4928 4 : options.f_license = "MIT";
4929 4 : options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
4930 4 : options.f_build_date = "Jun 4 2019";
4931 4 : options.f_build_time = "23:02:36";
4932 :
4933 4 : CATCH_WHEN("Testing --version")
4934 : {
4935 1 : char const * cargv[] =
4936 : {
4937 : "tests/system-arguments",
4938 : "--version",
4939 : nullptr
4940 : };
4941 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4942 1 : char ** argv = const_cast<char **>(cargv);
4943 :
4944 : // do our own try/catch because we want to test the message
4945 : // and exit code of the exception and it's easier to do it
4946 : // this way
4947 : //
4948 1 : snapdev::ostream_to_buf<char> out(std::cout);
4949 : try
4950 : {
4951 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
4952 :
4953 : // if it returns opt cannot be nullptr
4954 : //
4955 0 : CATCH_REQUIRE(opt == nullptr);
4956 0 : }
4957 1 : catch(advgetopt::getopt_exit const & e)
4958 : {
4959 : // this is the expected route
4960 : //
4961 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
4962 1 : CATCH_REQUIRE(e.code() == 0);
4963 1 : CATCH_REQUIRE(out.str() == "2.0.1\n");
4964 1 : }
4965 0 : catch(std::exception const & e)
4966 : {
4967 : // no other exception is considered valid here
4968 : //
4969 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
4970 0 : }
4971 5 : }
4972 :
4973 4 : CATCH_WHEN("Testing --copyright")
4974 : {
4975 1 : char const * cargv[] =
4976 : {
4977 : "tests/system-arguments",
4978 : "--copyright",
4979 : nullptr
4980 : };
4981 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4982 1 : char ** argv = const_cast<char **>(cargv);
4983 :
4984 : // do our own try/catch because we want to test the message
4985 : // and exit code of the exception and it's easier to do it
4986 : // this way
4987 : //
4988 1 : snapdev::ostream_to_buf<char> out(std::cout);
4989 : try
4990 : {
4991 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
4992 :
4993 : // if it returns opt cannot be nullptr
4994 : //
4995 0 : CATCH_REQUIRE(opt == nullptr);
4996 0 : }
4997 1 : catch(advgetopt::getopt_exit const & e)
4998 : {
4999 : // this is the expected route
5000 : //
5001 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5002 1 : CATCH_REQUIRE(e.code() == 0);
5003 1 : CATCH_REQUIRE(out.str() == "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved\n");
5004 1 : }
5005 0 : catch(std::exception const & e)
5006 : {
5007 : // no other exception is considered valid here
5008 : //
5009 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5010 0 : }
5011 5 : }
5012 :
5013 4 : CATCH_WHEN("Testing --build-date")
5014 : {
5015 1 : char const * cargv[] =
5016 : {
5017 : "tests/system-arguments",
5018 : "--build-date",
5019 : nullptr
5020 : };
5021 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5022 1 : char ** argv = const_cast<char **>(cargv);
5023 :
5024 : // do our own try/catch because we want to test the message
5025 : // and exit code of the exception and it's easier to do it
5026 : // this way
5027 : //
5028 1 : snapdev::ostream_to_buf<char> out(std::cout);
5029 : try
5030 : {
5031 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
5032 :
5033 : // if it returns opt cannot be nullptr
5034 : //
5035 0 : CATCH_REQUIRE(opt == nullptr);
5036 0 : }
5037 1 : catch(advgetopt::getopt_exit const & e)
5038 : {
5039 : // this is the expected route
5040 : //
5041 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5042 1 : CATCH_REQUIRE(e.code() == 0);
5043 1 : CATCH_REQUIRE(out.str() == "Built on Jun 4 2019 at 23:02:36\n");
5044 1 : }
5045 0 : catch(std::exception const & e)
5046 : {
5047 : // no other exception is considered valid here
5048 : //
5049 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5050 0 : }
5051 5 : }
5052 :
5053 4 : CATCH_WHEN("Testing -L (For --license)")
5054 : {
5055 1 : char const * cargv[] =
5056 : {
5057 : "tests/system-arguments",
5058 : "-L",
5059 : nullptr
5060 : };
5061 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5062 1 : char ** argv = const_cast<char **>(cargv);
5063 :
5064 : // do our own try/catch because we want to test the message
5065 : // and exit code of the exception and it's easier to do it
5066 : // this way
5067 : //
5068 1 : snapdev::ostream_to_buf<char> out(std::cout);
5069 : try
5070 : {
5071 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
5072 :
5073 : // if it returns opt cannot be nullptr
5074 : //
5075 0 : CATCH_REQUIRE(opt == nullptr);
5076 0 : }
5077 1 : catch(advgetopt::getopt_exit const & e)
5078 : {
5079 : // this is the expected route
5080 : //
5081 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5082 1 : CATCH_REQUIRE(e.code() == 0);
5083 1 : CATCH_REQUIRE(out.str() == "MIT\n");
5084 1 : }
5085 0 : catch(std::exception const & e)
5086 : {
5087 : // no other exception is considered valid here
5088 : //
5089 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5090 0 : }
5091 5 : }
5092 : }
5093 4 : CATCH_END_SECTION()
5094 4 : }
5095 :
5096 :
5097 3 : CATCH_TEST_CASE("check_print_option", "[arguments][valid][getopt]")
5098 : {
5099 3 : CATCH_START_SECTION("check_print_option: testing --print-option with a defined parameter")
5100 : {
5101 1 : advgetopt::option const options[] =
5102 : {
5103 : advgetopt::define_option(
5104 : advgetopt::Name("color")
5105 : , advgetopt::ShortName('c')
5106 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5107 : , advgetopt::Help("set color.")
5108 : ),
5109 : advgetopt::end_options()
5110 : };
5111 :
5112 1 : advgetopt::options_environment environment_options;
5113 1 : environment_options.f_project_name = "unittest";
5114 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
5115 1 : environment_options.f_help_header = "Usage: testing system arguments.";
5116 1 : environment_options.f_options = options;
5117 1 : environment_options.f_version = "2.0.1";
5118 1 : environment_options.f_license = "MIT";
5119 1 : environment_options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
5120 1 : environment_options.f_build_date = "Jun 4 2019";
5121 1 : environment_options.f_build_time = "23:02:36";
5122 :
5123 1 : char const * cargv[] =
5124 : {
5125 : "tests/system-arguments",
5126 : "--color",
5127 : "fushia",
5128 : "--print-option",
5129 : "color",
5130 : nullptr
5131 : };
5132 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5133 1 : char ** argv = const_cast<char **>(cargv);
5134 :
5135 : // do our own try/catch because we want to test the message
5136 : // and exit code of the exception and it's easier to do it
5137 : // this way
5138 : //
5139 1 : snapdev::ostream_to_buf<char> out(std::cout);
5140 : try
5141 : {
5142 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
5143 :
5144 : // if it returns opt cannot be nullptr
5145 : //
5146 0 : CATCH_REQUIRE(opt == nullptr);
5147 0 : }
5148 1 : catch(advgetopt::getopt_exit const & e)
5149 : {
5150 : // this is the expected route
5151 : //
5152 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5153 1 : CATCH_REQUIRE(e.code() == 0);
5154 1 : CATCH_REQUIRE(out.str() == "fushia\n");
5155 1 : }
5156 0 : catch(std::exception const & e)
5157 : {
5158 : // no other exception is considered valid here
5159 : //
5160 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5161 0 : }
5162 1 : }
5163 3 : CATCH_END_SECTION()
5164 :
5165 3 : CATCH_START_SECTION("check_print_option: testing --print-option with an undefined parameter but a default")
5166 : {
5167 1 : advgetopt::option const options[] =
5168 : {
5169 : advgetopt::define_option(
5170 : advgetopt::Name("color")
5171 : , advgetopt::ShortName('c')
5172 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5173 : , advgetopt::DefaultValue("maroon")
5174 : , advgetopt::Help("set color.")
5175 : ),
5176 : advgetopt::end_options()
5177 : };
5178 :
5179 1 : advgetopt::options_environment environment_options;
5180 1 : environment_options.f_project_name = "unittest";
5181 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
5182 1 : environment_options.f_help_header = "Usage: testing system arguments.";
5183 1 : environment_options.f_options = options;
5184 1 : environment_options.f_version = "2.0.1";
5185 1 : environment_options.f_license = "MIT";
5186 1 : environment_options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
5187 1 : environment_options.f_build_date = "Jun 4 2019";
5188 1 : environment_options.f_build_time = "23:02:36";
5189 :
5190 1 : char const * cargv[] =
5191 : {
5192 : "tests/system-arguments",
5193 : "--print-option",
5194 : "color",
5195 : nullptr
5196 : };
5197 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5198 1 : char ** argv = const_cast<char **>(cargv);
5199 :
5200 : // do our own try/catch because we want to test the message
5201 : // and exit code of the exception and it's easier to do it
5202 : // this way
5203 : //
5204 1 : snapdev::ostream_to_buf<char> out(std::cout);
5205 : try
5206 : {
5207 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
5208 :
5209 : // if it returns opt cannot be nullptr
5210 : //
5211 0 : CATCH_REQUIRE(opt == nullptr);
5212 0 : }
5213 1 : catch(advgetopt::getopt_exit const & e)
5214 : {
5215 : // this is the expected route
5216 : //
5217 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5218 1 : CATCH_REQUIRE(e.code() == 0);
5219 1 : CATCH_REQUIRE(out.str() == "maroon\n");
5220 1 : }
5221 0 : catch(std::exception const & e)
5222 : {
5223 : // no other exception is considered valid here
5224 : //
5225 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5226 0 : }
5227 1 : }
5228 3 : CATCH_END_SECTION()
5229 :
5230 3 : CATCH_START_SECTION("check_print_option: testing --print-option with an undefined parameter and no default")
5231 : {
5232 1 : advgetopt::option const options[] =
5233 : {
5234 : advgetopt::define_option(
5235 : advgetopt::Name("color")
5236 : , advgetopt::ShortName('c')
5237 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5238 : , advgetopt::Help("set color.")
5239 : ),
5240 : advgetopt::end_options()
5241 : };
5242 :
5243 1 : advgetopt::options_environment environment_options;
5244 1 : environment_options.f_project_name = "unittest";
5245 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
5246 1 : environment_options.f_help_header = "Usage: testing system arguments.";
5247 1 : environment_options.f_options = options;
5248 1 : environment_options.f_version = "2.0.1";
5249 1 : environment_options.f_license = "MIT";
5250 1 : environment_options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
5251 1 : environment_options.f_build_date = "Jun 4 2019";
5252 1 : environment_options.f_build_time = "23:02:36";
5253 :
5254 1 : char const * cargv[] =
5255 : {
5256 : "tests/system-arguments",
5257 : "--print-option",
5258 : "color",
5259 : nullptr
5260 : };
5261 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5262 1 : char ** argv = const_cast<char **>(cargv);
5263 :
5264 : // do our own try/catch because we want to test the message
5265 : // and exit code of the exception and it's easier to do it
5266 : // this way
5267 : //
5268 1 : snapdev::ostream_to_buf<char> out(std::cout);
5269 : try
5270 : {
5271 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
5272 :
5273 : // if it returns opt cannot be nullptr
5274 : //
5275 0 : CATCH_REQUIRE(opt == nullptr);
5276 0 : }
5277 1 : catch(advgetopt::getopt_exit const & e)
5278 : {
5279 : // this is the expected route
5280 : //
5281 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5282 1 : CATCH_REQUIRE(e.code() == 0);
5283 1 : CATCH_REQUIRE(out.str() == "");
5284 1 : }
5285 0 : catch(std::exception const & e)
5286 : {
5287 : // no other exception is considered valid here
5288 : //
5289 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5290 0 : }
5291 1 : }
5292 3 : CATCH_END_SECTION()
5293 3 : }
5294 :
5295 :
5296 1 : CATCH_TEST_CASE("invalid_getopt_pointers", "[invalid][getopt][arguments]")
5297 : {
5298 1 : CATCH_START_SECTION("invalid_getopt_pointers: create getopt with argv set to nullptr.")
5299 : {
5300 1 : advgetopt::options_environment const environment_opt;
5301 :
5302 6 : CATCH_REQUIRE_THROWS_MATCHES(
5303 : std::make_shared<advgetopt::getopt>(environment_opt, 3, nullptr)
5304 : , advgetopt::getopt_logic_error
5305 : , Catch::Matchers::ExceptionMessage(
5306 : "getopt_logic_error: argv pointer cannot be nullptr"));
5307 : }
5308 1 : CATCH_END_SECTION()
5309 1 : }
5310 :
5311 :
5312 2 : CATCH_TEST_CASE("invalid_getopt_missing_options", "[invalid][getopt][arguments]")
5313 : {
5314 2 : CATCH_START_SECTION("invalid_getopt_missing_options: create getopt with no options.")
5315 : {
5316 1 : advgetopt::options_environment options_empty;
5317 1 : options_empty.f_project_name = "unittest";
5318 1 : options_empty.f_options = nullptr;
5319 1 : options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
5320 :
5321 1 : char const * cargv[] =
5322 : {
5323 : "/usr/bin/arguments",
5324 : "--no-options",
5325 : nullptr
5326 : };
5327 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5328 1 : char ** argv = const_cast<char **>(cargv);
5329 :
5330 4 : CATCH_REQUIRE_THROWS_MATCHES(
5331 : std::make_shared<advgetopt::getopt>(options_empty, argc, argv)
5332 : , advgetopt::getopt_logic_error
5333 : , Catch::Matchers::ExceptionMessage(
5334 : "getopt_logic_error: an empty list of options is not legal, you must"
5335 : " defined at least one (i.e. --version, --help...)"));
5336 : }
5337 2 : CATCH_END_SECTION()
5338 :
5339 2 : CATCH_START_SECTION("invalid_getopt_missing_options: create getopt with an empty list of options.")
5340 : {
5341 1 : const advgetopt::option options_empty_list[] =
5342 : {
5343 : {
5344 : '\0',
5345 : advgetopt::GETOPT_FLAG_END,
5346 : nullptr,
5347 : nullptr,
5348 : nullptr,
5349 : nullptr
5350 : }
5351 : };
5352 :
5353 1 : advgetopt::options_environment options_empty;
5354 1 : options_empty.f_project_name = "unittest";
5355 1 : options_empty.f_options = options_empty_list;
5356 1 : options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
5357 :
5358 1 : char const * cargv[] =
5359 : {
5360 : "/usr/bin/arguments",
5361 : "--no-options",
5362 : nullptr
5363 : };
5364 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5365 1 : char ** argv = const_cast<char **>(cargv);
5366 :
5367 4 : CATCH_REQUIRE_THROWS_MATCHES(
5368 : std::make_shared<advgetopt::getopt>(options_empty, argc, argv)
5369 : , advgetopt::getopt_logic_error
5370 : , Catch::Matchers::ExceptionMessage(
5371 : "getopt_logic_error: an empty list of options is not legal, you must"
5372 : " defined at least one (i.e. --version, --help...)"));
5373 : }
5374 2 : CATCH_END_SECTION()
5375 2 : }
5376 :
5377 :
5378 4 : CATCH_TEST_CASE("invalid_getopt_missing_required_option", "[invalid][getopt][arguments][alias]")
5379 : {
5380 4 : CATCH_START_SECTION("invalid_getopt_missing_required_option: specify the option without a corresponding parameter.")
5381 : {
5382 1 : const advgetopt::option options[] =
5383 : {
5384 : advgetopt::define_option(
5385 : advgetopt::Name("verbose")
5386 : , advgetopt::ShortName('v')
5387 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5388 : , advgetopt::Help("print info as we work.")
5389 : ),
5390 : advgetopt::define_option(
5391 : advgetopt::Name("size")
5392 : , advgetopt::Help("The size of the line.")
5393 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5394 : , advgetopt::DefaultValue("100")
5395 : ),
5396 : advgetopt::end_options()
5397 : };
5398 :
5399 1 : advgetopt::options_environment environment_options;
5400 1 : environment_options.f_project_name = "unittest";
5401 1 : environment_options.f_options = options;
5402 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5403 :
5404 1 : char const * cargv[] =
5405 : {
5406 : "/usr/bin/arguments",
5407 : "--verbose",
5408 : "--size",
5409 : nullptr
5410 : };
5411 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5412 1 : char ** argv = const_cast<char **>(cargv);
5413 :
5414 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
5415 1 : advgetopt::getopt opt(environment_options);
5416 : try
5417 : {
5418 1 : opt.finish_parsing(argc, argv);
5419 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5420 : }
5421 1 : catch(advgetopt::getopt_exit const & e)
5422 : {
5423 1 : CATCH_REQUIRE(e.code() == 1);
5424 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5425 1 : }
5426 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5427 :
5428 : // check that the result is valid
5429 :
5430 : // an "invalid-parameter", MUST NOT EXIST
5431 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5432 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5433 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5434 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5435 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5436 :
5437 : // no default
5438 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5439 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5440 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5441 3 : CATCH_REQUIRE(opt.size("--") == 0);
5442 :
5443 : // the valid parameter
5444 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5445 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5446 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5447 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5448 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5449 :
5450 : // the invalid parameter
5451 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5452 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5453 3 : CATCH_REQUIRE(opt.get_default("size") == "100");
5454 3 : CATCH_REQUIRE(opt.size("size") == 0);
5455 :
5456 : // other parameters
5457 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5458 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5459 1 : }
5460 4 : CATCH_END_SECTION()
5461 :
5462 4 : CATCH_START_SECTION("invalid_getopt_missing_required_option: specify the option with an equal sign but without a corresponding parameter.")
5463 : {
5464 1 : const advgetopt::option options[] =
5465 : {
5466 : advgetopt::define_option(
5467 : advgetopt::Name("verbose")
5468 : , advgetopt::ShortName('v')
5469 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5470 : , advgetopt::Help("print info as we work.")
5471 : ),
5472 : advgetopt::define_option(
5473 : advgetopt::Name("size")
5474 : , advgetopt::Help("The size of the line.")
5475 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5476 : , advgetopt::DefaultValue("100")
5477 : ),
5478 : advgetopt::end_options()
5479 : };
5480 :
5481 1 : advgetopt::options_environment environment_options;
5482 1 : environment_options.f_project_name = "unittest";
5483 1 : environment_options.f_options = options;
5484 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5485 :
5486 1 : char const * cargv[] =
5487 : {
5488 : "/usr/bin/arguments",
5489 : "--verbose",
5490 : "--size=",
5491 : nullptr
5492 : };
5493 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5494 1 : char ** argv = const_cast<char **>(cargv);
5495 :
5496 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size must be given a value.");
5497 1 : advgetopt::getopt opt(environment_options);
5498 : try
5499 : {
5500 1 : opt.finish_parsing(argc, argv);
5501 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5502 : }
5503 1 : catch(advgetopt::getopt_exit const & e)
5504 : {
5505 1 : CATCH_REQUIRE(e.code() == 1);
5506 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5507 1 : }
5508 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5509 :
5510 : // check that the result is valid
5511 :
5512 : // an invalid parameter, MUST NOT EXIST
5513 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5514 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5515 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5516 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5517 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5518 :
5519 : // no default
5520 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5521 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5522 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5523 3 : CATCH_REQUIRE(opt.size("--") == 0);
5524 :
5525 : // the valid parameter
5526 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5527 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5528 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5529 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5530 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5531 :
5532 : // the invalid parameter
5533 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5534 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5535 3 : CATCH_REQUIRE(opt.get_default("size") == "100");
5536 3 : CATCH_REQUIRE(opt.size("size") == 0);
5537 :
5538 : // other parameters
5539 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5540 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5541 1 : }
5542 4 : CATCH_END_SECTION()
5543 :
5544 4 : CATCH_START_SECTION("invalid_getopt_missing_required_option: specify the option without a corresponding parameter followed by a long argument.")
5545 : {
5546 1 : const advgetopt::option options[] =
5547 : {
5548 : advgetopt::define_option(
5549 : advgetopt::Name("verbose")
5550 : , advgetopt::ShortName('v')
5551 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5552 : , advgetopt::Help("print info as we work.")
5553 : ),
5554 : advgetopt::define_option(
5555 : advgetopt::Name("size")
5556 : , advgetopt::Help("The size of the line.")
5557 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5558 : , advgetopt::DefaultValue("100")
5559 : ),
5560 : advgetopt::end_options()
5561 : };
5562 :
5563 1 : advgetopt::options_environment environment_options;
5564 1 : environment_options.f_project_name = "unittest";
5565 1 : environment_options.f_options = options;
5566 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5567 :
5568 1 : char const * cargv[] =
5569 : {
5570 : "/usr/bin/arguments",
5571 : "--size",
5572 : "--verbose",
5573 : nullptr
5574 : };
5575 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5576 1 : char ** argv = const_cast<char **>(cargv);
5577 :
5578 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
5579 1 : advgetopt::getopt opt(environment_options);
5580 : try
5581 : {
5582 1 : opt.finish_parsing(argc, argv);
5583 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5584 : }
5585 1 : catch(advgetopt::getopt_exit const & e)
5586 : {
5587 1 : CATCH_REQUIRE(e.code() == 1);
5588 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5589 1 : }
5590 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5591 :
5592 : // check that the result is valid
5593 :
5594 : // an invalid parameter, MUST NOT EXIST
5595 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5596 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5597 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5598 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5599 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5600 :
5601 : // no default
5602 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5603 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5604 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5605 3 : CATCH_REQUIRE(opt.size("--") == 0);
5606 :
5607 : // the valid parameter
5608 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5609 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5610 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5611 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5612 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5613 :
5614 : // the invalid parameter
5615 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5616 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5617 3 : CATCH_REQUIRE(opt.get_default("size") == "100");
5618 3 : CATCH_REQUIRE(opt.size("size") == 0);
5619 :
5620 : // other parameters
5621 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5622 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5623 1 : }
5624 4 : CATCH_END_SECTION()
5625 :
5626 4 : CATCH_START_SECTION("invalid_getopt_missing_required_option: specify the option without a corresponding parameter followed by a short argument.")
5627 : {
5628 1 : const advgetopt::option options[] =
5629 : {
5630 : advgetopt::define_option(
5631 : advgetopt::Name("verbose")
5632 : , advgetopt::ShortName('v')
5633 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5634 : , advgetopt::Help("print info as we work.")
5635 : ),
5636 : advgetopt::define_option(
5637 : advgetopt::Name("size")
5638 : , advgetopt::Help("The size of the line.")
5639 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5640 : , advgetopt::DefaultValue("100")
5641 : ),
5642 : advgetopt::end_options()
5643 : };
5644 :
5645 1 : advgetopt::options_environment environment_options;
5646 1 : environment_options.f_project_name = "unittest";
5647 1 : environment_options.f_options = options;
5648 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5649 :
5650 1 : char const * cargv[] =
5651 : {
5652 : "/usr/bin/arguments",
5653 : "--size",
5654 : "-v",
5655 : nullptr
5656 : };
5657 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5658 1 : char ** argv = const_cast<char **>(cargv);
5659 :
5660 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
5661 1 : advgetopt::getopt opt(environment_options);
5662 : try
5663 : {
5664 1 : opt.finish_parsing(argc, argv);
5665 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5666 : }
5667 1 : catch(advgetopt::getopt_exit const & e)
5668 : {
5669 1 : CATCH_REQUIRE(e.code() == 1);
5670 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5671 1 : }
5672 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5673 :
5674 : // check that the result is valid
5675 :
5676 : // an invalid parameter, MUST NOT EXIST
5677 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5678 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5679 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5680 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5681 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5682 :
5683 : // no default
5684 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5685 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5686 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5687 3 : CATCH_REQUIRE(opt.size("--") == 0);
5688 :
5689 : // the valid parameter
5690 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5691 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5692 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5693 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5694 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5695 :
5696 : // the invalid parameter
5697 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5698 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5699 3 : CATCH_REQUIRE(opt.get_default("size") == "100");
5700 3 : CATCH_REQUIRE(opt.size("size") == 0);
5701 :
5702 : // other parameters
5703 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5704 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5705 1 : }
5706 4 : CATCH_END_SECTION()
5707 4 : }
5708 :
5709 :
5710 9 : CATCH_TEST_CASE("invalid_default_options", "[invalid][getopt][arguments]")
5711 : {
5712 9 : CATCH_START_SECTION("invalid_default_options: using a standalone 'file.txt' when no default option is allowed.")
5713 : {
5714 1 : const advgetopt::option options[] =
5715 : {
5716 : advgetopt::define_option(
5717 : advgetopt::Name("verbose")
5718 : , advgetopt::ShortName('v')
5719 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5720 : , advgetopt::Help("print info as we work.")
5721 : ),
5722 : advgetopt::end_options()
5723 : };
5724 :
5725 1 : advgetopt::options_environment environment_options;
5726 1 : environment_options.f_project_name = "unittest";
5727 1 : environment_options.f_options = options;
5728 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
5729 :
5730 1 : char const * cargv[] =
5731 : {
5732 : "/usr/bin/arguments",
5733 : "--verbose",
5734 : "file.txt",
5735 : nullptr
5736 : };
5737 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5738 1 : char ** argv = const_cast<char **>(cargv);
5739 :
5740 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"file.txt\"; standalone parameters are not accepted by this program.");
5741 1 : advgetopt::getopt opt(environment_options);
5742 : try
5743 : {
5744 1 : opt.finish_parsing(argc, argv);
5745 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5746 : }
5747 1 : catch(advgetopt::getopt_exit const & e)
5748 : {
5749 1 : CATCH_REQUIRE(e.code() == 1);
5750 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5751 1 : }
5752 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5753 :
5754 : // check that the result is valid
5755 :
5756 : // an invalid parameter, MUST NOT EXIST
5757 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5758 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5759 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5760 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5761 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5762 :
5763 : // no default
5764 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5765 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5766 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5767 3 : CATCH_REQUIRE(opt.size("--") == 0);
5768 :
5769 : // the valid parameter
5770 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5771 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5772 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5773 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5774 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5775 :
5776 : // other parameters
5777 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5778 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5779 1 : }
5780 9 : CATCH_END_SECTION()
5781 :
5782 9 : CATCH_START_SECTION("invalid_default_options: using a standalone 'file.txt' on the command line when only allowed in a variable.")
5783 : {
5784 1 : const advgetopt::option options[] =
5785 : {
5786 : advgetopt::define_option(
5787 : advgetopt::Name("verbose")
5788 : , advgetopt::ShortName('v')
5789 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5790 : , advgetopt::Help("print info as we work.")
5791 : ),
5792 : advgetopt::define_option(
5793 : advgetopt::Name("--")
5794 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
5795 : , advgetopt::Help("default option.")
5796 : ),
5797 : advgetopt::end_options()
5798 : };
5799 :
5800 1 : advgetopt::options_environment environment_options;
5801 1 : environment_options.f_project_name = "unittest";
5802 1 : environment_options.f_options = options;
5803 1 : environment_options.f_help_header = "Usage: use '--' on the command line when only allowed in the variable.";
5804 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
5805 :
5806 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "allowed.jpg");
5807 :
5808 1 : char const * cargv[] =
5809 : {
5810 : "/usr/bin/arguments",
5811 : "--verbose",
5812 : "file.txt",
5813 : nullptr
5814 : };
5815 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5816 1 : char ** argv = const_cast<char **>(cargv);
5817 :
5818 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported on the command line.");
5819 1 : advgetopt::getopt opt(environment_options);
5820 : try
5821 : {
5822 1 : opt.finish_parsing(argc, argv);
5823 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5824 : }
5825 1 : catch(advgetopt::getopt_exit const & e)
5826 : {
5827 1 : CATCH_REQUIRE(e.code() == 1);
5828 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5829 1 : }
5830 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5831 :
5832 : // check that the result is valid
5833 :
5834 : // an invalid parameter, MUST NOT EXIST
5835 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5836 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5837 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5838 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5839 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5840 :
5841 : // default on command line passed through
5842 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
5843 3 : CATCH_REQUIRE(opt.is_defined("--"));
5844 3 : CATCH_REQUIRE(opt.get_string("--") == "allowed.jpg");
5845 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.jpg");
5846 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5847 3 : CATCH_REQUIRE(opt.size("--") == 1);
5848 :
5849 : // the valid parameter
5850 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5851 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5852 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5853 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5854 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5855 :
5856 : // other parameters
5857 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5858 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5859 1 : }
5860 9 : CATCH_END_SECTION()
5861 :
5862 9 : CATCH_START_SECTION("invalid_default_options: using a standalone 'file.txt' in a variable when only allowed on the command line.")
5863 : {
5864 1 : const advgetopt::option options[] =
5865 : {
5866 : advgetopt::define_option(
5867 : advgetopt::Name("verbose")
5868 : , advgetopt::ShortName('v')
5869 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5870 : , advgetopt::Help("print info as we work.")
5871 : ),
5872 : advgetopt::define_option(
5873 : advgetopt::Name("--")
5874 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
5875 : , advgetopt::Help("default option.")
5876 : ),
5877 : advgetopt::end_options()
5878 : };
5879 :
5880 1 : advgetopt::options_environment environment_options;
5881 1 : environment_options.f_project_name = "unittest";
5882 1 : environment_options.f_options = options;
5883 1 : environment_options.f_help_header = "Usage: use '--' on the command line when only allowed in the variable.";
5884 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
5885 :
5886 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.txt");
5887 :
5888 1 : char const * cargv[] =
5889 : {
5890 : "/usr/bin/arguments",
5891 : "--verbose",
5892 : "allowed.jpg",
5893 : nullptr
5894 : };
5895 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5896 1 : char ** argv = const_cast<char **>(cargv);
5897 :
5898 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported in the environment variable.");
5899 1 : advgetopt::getopt opt(environment_options);
5900 : try
5901 : {
5902 1 : opt.finish_parsing(argc, argv);
5903 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5904 : }
5905 1 : catch(advgetopt::getopt_exit const & e)
5906 : {
5907 1 : CATCH_REQUIRE(e.code() == 1);
5908 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5909 1 : }
5910 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5911 :
5912 : // check that the result is valid
5913 :
5914 : // an invalid parameter, MUST NOT EXIST
5915 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5916 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5917 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5918 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5919 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5920 :
5921 : // default on command line passed through
5922 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
5923 3 : CATCH_REQUIRE(opt.is_defined("--"));
5924 3 : CATCH_REQUIRE(opt.get_string("--") == "allowed.jpg");
5925 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.jpg");
5926 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5927 3 : CATCH_REQUIRE(opt.size("--") == 1);
5928 :
5929 : // the valid parameter
5930 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5931 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5932 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
5933 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5934 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
5935 :
5936 : // other parameters
5937 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5938 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5939 1 : }
5940 9 : CATCH_END_SECTION()
5941 :
5942 9 : CATCH_START_SECTION("invalid_default_options: using a '--' when no default option is allowed.")
5943 : {
5944 1 : const advgetopt::option options[] =
5945 : {
5946 : advgetopt::define_option(
5947 : advgetopt::Name("verbose")
5948 : , advgetopt::ShortName('v')
5949 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5950 : , advgetopt::Help("print info as we work.")
5951 : ),
5952 : advgetopt::end_options()
5953 : };
5954 :
5955 1 : advgetopt::options_environment environment_options;
5956 1 : environment_options.f_project_name = "unittest";
5957 1 : environment_options.f_options = options;
5958 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
5959 :
5960 1 : char const * cargv[] =
5961 : {
5962 : "/usr/bin/arguments",
5963 : "--verbose",
5964 : "--",
5965 : "file.txt",
5966 : nullptr
5967 : };
5968 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5969 1 : char ** argv = const_cast<char **>(cargv);
5970 :
5971 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus \"--\" is not accepted by this program.");
5972 1 : advgetopt::getopt opt(environment_options);
5973 : try
5974 : {
5975 1 : opt.finish_parsing(argc, argv);
5976 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5977 : }
5978 1 : catch(advgetopt::getopt_exit const & e)
5979 : {
5980 1 : CATCH_REQUIRE(e.code() == 1);
5981 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5982 1 : }
5983 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5984 :
5985 : // check that the result is valid
5986 :
5987 : // an invalid parameter, MUST NOT EXIST
5988 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5989 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5990 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5991 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5992 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5993 :
5994 : // no default
5995 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5996 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5997 3 : CATCH_REQUIRE(opt.get_default("--").empty());
5998 3 : CATCH_REQUIRE(opt.size("--") == 0);
5999 :
6000 : // the valid parameter
6001 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6002 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6003 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6004 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6005 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6006 :
6007 : // other parameters
6008 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6009 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6010 1 : }
6011 9 : CATCH_END_SECTION()
6012 :
6013 9 : CATCH_START_SECTION("invalid_default_options: using a '--' when on the command line when only accepted in variables.")
6014 : {
6015 1 : const advgetopt::option options[] =
6016 : {
6017 : advgetopt::define_option(
6018 : advgetopt::Name("verbose")
6019 : , advgetopt::ShortName('v')
6020 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6021 : , advgetopt::Help("print info as we work.")
6022 : ),
6023 : advgetopt::define_option(
6024 : advgetopt::Name("--")
6025 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
6026 : , advgetopt::Help("default option.")
6027 : ),
6028 : advgetopt::end_options()
6029 : };
6030 :
6031 1 : advgetopt::options_environment environment_options;
6032 1 : environment_options.f_project_name = "unittest";
6033 1 : environment_options.f_options = options;
6034 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
6035 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6036 :
6037 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- allowed.txt");
6038 :
6039 1 : char const * cargv[] =
6040 : {
6041 : "/usr/bin/arguments",
6042 : "--verbose",
6043 : "--",
6044 : "file.txt",
6045 : nullptr
6046 : };
6047 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6048 1 : char ** argv = const_cast<char **>(cargv);
6049 :
6050 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--\" is not supported on the command line.");
6051 1 : advgetopt::getopt opt(environment_options);
6052 : try
6053 : {
6054 1 : opt.finish_parsing(argc, argv);
6055 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6056 : }
6057 1 : catch(advgetopt::getopt_exit const & e)
6058 : {
6059 1 : CATCH_REQUIRE(e.code() == 1);
6060 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6061 1 : }
6062 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6063 :
6064 : // check that the result is valid
6065 :
6066 : // an invalid parameter, MUST NOT EXIST
6067 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6068 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6069 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6070 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6071 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6072 :
6073 : // no default
6074 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
6075 3 : CATCH_REQUIRE(opt.is_defined("--"));
6076 3 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
6077 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
6078 3 : CATCH_REQUIRE(opt.get_default("--").empty());
6079 3 : CATCH_REQUIRE(opt.size("--") == 1);
6080 :
6081 : // the valid parameter
6082 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6083 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6084 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6085 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6086 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6087 :
6088 : // other parameters
6089 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6090 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6091 1 : }
6092 9 : CATCH_END_SECTION()
6093 :
6094 9 : CATCH_START_SECTION("invalid_default_options: using a '--' in the environment variable when only accepted on the command line.")
6095 : {
6096 1 : const advgetopt::option options[] =
6097 : {
6098 : advgetopt::define_option(
6099 : advgetopt::Name("verbose")
6100 : , advgetopt::ShortName('v')
6101 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6102 : , advgetopt::Help("print info as we work.")
6103 : ),
6104 : advgetopt::define_option(
6105 : advgetopt::Name("--")
6106 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
6107 : , advgetopt::Help("default option.")
6108 : ),
6109 : advgetopt::end_options()
6110 : };
6111 :
6112 1 : advgetopt::options_environment environment_options;
6113 1 : environment_options.f_project_name = "unittest";
6114 1 : environment_options.f_options = options;
6115 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
6116 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6117 :
6118 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", " -- file.txt ");
6119 :
6120 1 : char const * cargv[] =
6121 : {
6122 : "/usr/bin/arguments",
6123 : "--verbose",
6124 : "--",
6125 : "allowed.txt",
6126 : nullptr
6127 : };
6128 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6129 1 : char ** argv = const_cast<char **>(cargv);
6130 :
6131 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--\" is not supported in the environment variable.");
6132 1 : advgetopt::getopt opt(environment_options);
6133 : try
6134 : {
6135 1 : opt.finish_parsing(argc, argv);
6136 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6137 : }
6138 1 : catch(advgetopt::getopt_exit const & e)
6139 : {
6140 1 : CATCH_REQUIRE(e.code() == 1);
6141 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6142 1 : }
6143 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6144 :
6145 : // check that the result is valid
6146 :
6147 : // an invalid parameter, MUST NOT EXIST
6148 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6149 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6150 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6151 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6152 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6153 :
6154 : // no default
6155 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
6156 3 : CATCH_REQUIRE(opt.is_defined("--"));
6157 3 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
6158 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
6159 3 : CATCH_REQUIRE(opt.get_default("--").empty());
6160 3 : CATCH_REQUIRE(opt.size("--") == 1);
6161 :
6162 : // the valid parameter
6163 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6164 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6165 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6166 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6167 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6168 :
6169 : // other parameters
6170 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6171 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6172 1 : }
6173 9 : CATCH_END_SECTION()
6174 :
6175 9 : CATCH_START_SECTION("invalid_default_options: using a '-' when no default option is allowed.")
6176 : {
6177 1 : const advgetopt::option options[] =
6178 : {
6179 : advgetopt::define_option(
6180 : advgetopt::Name("verbose")
6181 : , advgetopt::ShortName('v')
6182 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6183 : , advgetopt::Help("print info as we work.")
6184 : ),
6185 : advgetopt::end_options()
6186 : };
6187 :
6188 1 : advgetopt::options_environment environment_options;
6189 1 : environment_options.f_project_name = "unittest";
6190 1 : environment_options.f_options = options;
6191 1 : environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
6192 :
6193 1 : char const * cargv[] =
6194 : {
6195 : "/usr/bin/arguments",
6196 : "--verbose",
6197 : "-",
6198 : "file.txt",
6199 : nullptr
6200 : };
6201 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6202 1 : char ** argv = const_cast<char **>(cargv);
6203 :
6204 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus \"-\" is not accepted by this program.");
6205 1 : advgetopt::getopt opt(environment_options);
6206 : try
6207 : {
6208 1 : opt.finish_parsing(argc, argv);
6209 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6210 : }
6211 1 : catch(advgetopt::getopt_exit const & e)
6212 : {
6213 1 : CATCH_REQUIRE(e.code() == 1);
6214 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6215 1 : }
6216 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6217 :
6218 : // check that the result is valid
6219 :
6220 : // an invalid parameter, MUST NOT EXIST
6221 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6222 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6223 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6224 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6225 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6226 :
6227 : // no default
6228 3 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
6229 3 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
6230 3 : CATCH_REQUIRE(opt.get_default("--").empty());
6231 3 : CATCH_REQUIRE(opt.size("--") == 0);
6232 :
6233 : // the valid parameter
6234 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6235 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6236 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6237 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6238 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6239 :
6240 : // other parameters
6241 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6242 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6243 1 : }
6244 9 : CATCH_END_SECTION()
6245 :
6246 9 : CATCH_START_SECTION("invalid_default_options: using a '-' when on the command line when only accepted in variables.")
6247 : {
6248 1 : const advgetopt::option options[] =
6249 : {
6250 : advgetopt::define_option(
6251 : advgetopt::Name("verbose")
6252 : , advgetopt::ShortName('v')
6253 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6254 : , advgetopt::Help("print info as we work.")
6255 : ),
6256 : advgetopt::define_option(
6257 : advgetopt::Name("--")
6258 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
6259 : , advgetopt::Help("default option.")
6260 : ),
6261 : advgetopt::end_options()
6262 : };
6263 :
6264 1 : advgetopt::options_environment environment_options;
6265 1 : environment_options.f_project_name = "unittest";
6266 1 : environment_options.f_options = options;
6267 1 : environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
6268 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6269 :
6270 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "- allowed.txt");
6271 :
6272 1 : char const * cargv[] =
6273 : {
6274 : "/usr/bin/arguments",
6275 : "--verbose",
6276 : "-",
6277 : "file.txt",
6278 : nullptr
6279 : };
6280 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6281 1 : char ** argv = const_cast<char **>(cargv);
6282 :
6283 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-\" is not supported on the command line.");
6284 1 : advgetopt::getopt opt(environment_options);
6285 : try
6286 : {
6287 1 : opt.finish_parsing(argc, argv);
6288 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6289 : }
6290 1 : catch(advgetopt::getopt_exit const & e)
6291 : {
6292 1 : CATCH_REQUIRE(e.code() == 1);
6293 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6294 1 : }
6295 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6296 :
6297 : // check that the result is valid
6298 :
6299 : // an invalid parameter, MUST NOT EXIST
6300 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6301 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6302 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6303 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6304 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6305 :
6306 : // no default
6307 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
6308 3 : CATCH_REQUIRE(opt.is_defined("--"));
6309 3 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
6310 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
6311 3 : CATCH_REQUIRE(opt.get_default("--").empty());
6312 3 : CATCH_REQUIRE(opt.size("--") == 1);
6313 :
6314 : // the valid parameter
6315 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6316 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6317 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6318 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6319 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6320 :
6321 : // other parameters
6322 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6323 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6324 1 : }
6325 9 : CATCH_END_SECTION()
6326 :
6327 9 : CATCH_START_SECTION("invalid_default_options: using a '-' in the environment variable when only accepted on the command line.")
6328 : {
6329 1 : const advgetopt::option options[] =
6330 : {
6331 : advgetopt::define_option(
6332 : advgetopt::Name("verbose")
6333 : , advgetopt::ShortName('v')
6334 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6335 : , advgetopt::Help("print info as we work.")
6336 : ),
6337 : advgetopt::define_option(
6338 : advgetopt::Name("--")
6339 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
6340 : , advgetopt::Help("default option.")
6341 : ),
6342 : advgetopt::end_options()
6343 : };
6344 :
6345 1 : advgetopt::options_environment environment_options;
6346 1 : environment_options.f_project_name = "unittest";
6347 1 : environment_options.f_options = options;
6348 1 : environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
6349 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6350 :
6351 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", " - file.txt ");
6352 :
6353 1 : char const * cargv[] =
6354 : {
6355 : "/usr/bin/arguments",
6356 : "--verbose",
6357 : "-",
6358 : "allowed.txt",
6359 : nullptr
6360 : };
6361 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6362 1 : char ** argv = const_cast<char **>(cargv);
6363 :
6364 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-\" is not supported in the environment variable.");
6365 1 : advgetopt::getopt opt(environment_options);
6366 : try
6367 : {
6368 1 : opt.finish_parsing(argc, argv);
6369 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6370 : }
6371 1 : catch(advgetopt::getopt_exit const & e)
6372 : {
6373 1 : CATCH_REQUIRE(e.code() == 1);
6374 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6375 1 : }
6376 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6377 :
6378 : // check that the result is valid
6379 :
6380 : // an invalid parameter, MUST NOT EXIST
6381 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6382 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6383 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6384 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6385 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6386 :
6387 : // no default
6388 3 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
6389 3 : CATCH_REQUIRE(opt.is_defined("--"));
6390 3 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
6391 3 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
6392 3 : CATCH_REQUIRE(opt.get_default("--").empty());
6393 3 : CATCH_REQUIRE(opt.size("--") == 1);
6394 :
6395 : // the valid parameter
6396 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6397 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6398 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6399 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6400 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6401 :
6402 : // other parameters
6403 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6404 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6405 1 : }
6406 9 : CATCH_END_SECTION()
6407 9 : }
6408 :
6409 :
6410 7 : CATCH_TEST_CASE("invalid_options", "[invalid][getopt][arguments]")
6411 : {
6412 7 : CATCH_START_SECTION("invalid_options: long option with an equal sign but not name.")
6413 : {
6414 1 : const advgetopt::option options[] =
6415 : {
6416 : advgetopt::define_option(
6417 : advgetopt::Name("size")
6418 : , advgetopt::ShortName('s')
6419 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6420 : , advgetopt::Help("define the size.")
6421 : ),
6422 : advgetopt::end_options()
6423 : };
6424 :
6425 1 : advgetopt::options_environment environment_options;
6426 1 : environment_options.f_project_name = "unittest";
6427 1 : environment_options.f_options = options;
6428 1 : environment_options.f_help_header = "Usage: use a long name option without the long name.";
6429 :
6430 1 : char const * cargv[] =
6431 : {
6432 : "/usr/bin/arguments",
6433 : "--=591",
6434 : nullptr
6435 : };
6436 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6437 1 : char ** argv = const_cast<char **>(cargv);
6438 :
6439 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: name missing in \"--=591\".");
6440 1 : advgetopt::getopt opt(environment_options);
6441 : try
6442 : {
6443 1 : opt.finish_parsing(argc, argv);
6444 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6445 : }
6446 1 : catch(advgetopt::getopt_exit const & e)
6447 : {
6448 1 : CATCH_REQUIRE(e.code() == 1);
6449 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6450 1 : }
6451 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6452 :
6453 : // check that the result is valid
6454 :
6455 : // an invalid parameter, MUST NOT EXIST
6456 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6457 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6458 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6459 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6460 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6461 :
6462 : // the valid parameter
6463 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6464 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6465 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
6466 3 : CATCH_REQUIRE(opt.get_default("size").empty());
6467 3 : CATCH_REQUIRE(opt.size("size") == 0);
6468 :
6469 : // other parameters
6470 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6471 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6472 1 : }
6473 7 : CATCH_END_SECTION()
6474 :
6475 7 : CATCH_START_SECTION("invalid_options: unknown long option.")
6476 : {
6477 1 : const advgetopt::option options[] =
6478 : {
6479 : advgetopt::define_option(
6480 : advgetopt::Name("size")
6481 : , advgetopt::ShortName('s')
6482 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6483 : , advgetopt::Help("define the size.")
6484 : ),
6485 : advgetopt::end_options()
6486 : };
6487 :
6488 1 : advgetopt::options_environment environment_options;
6489 1 : environment_options.f_project_name = "unittest";
6490 1 : environment_options.f_options = options;
6491 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6492 :
6493 1 : char const * cargv[] =
6494 : {
6495 : "/usr/bin/arguments",
6496 : "--unknown=568",
6497 : nullptr
6498 : };
6499 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6500 1 : char ** argv = const_cast<char **>(cargv);
6501 :
6502 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--unknown\" is not supported.");
6503 1 : advgetopt::getopt opt(environment_options);
6504 : try
6505 : {
6506 1 : opt.finish_parsing(argc, argv);
6507 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6508 : }
6509 1 : catch(advgetopt::getopt_exit const & e)
6510 : {
6511 1 : CATCH_REQUIRE(e.code() == 1);
6512 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6513 1 : }
6514 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6515 :
6516 : // check that the result is valid
6517 :
6518 : // an invalid parameter, MUST NOT EXIST
6519 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6520 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6521 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6522 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6523 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6524 :
6525 : // the valid parameter
6526 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6527 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6528 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
6529 3 : CATCH_REQUIRE(opt.get_default("size").empty());
6530 3 : CATCH_REQUIRE(opt.size("size") == 0);
6531 :
6532 : // other parameters
6533 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6534 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6535 1 : }
6536 7 : CATCH_END_SECTION()
6537 :
6538 7 : CATCH_START_SECTION("invalid_options: long option not available in environment variable.")
6539 : {
6540 1 : const advgetopt::option options[] =
6541 : {
6542 : advgetopt::define_option(
6543 : advgetopt::Name("size")
6544 : , advgetopt::ShortName('s')
6545 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6546 : , advgetopt::Help("define the size.")
6547 : ),
6548 : advgetopt::end_options()
6549 : };
6550 :
6551 1 : advgetopt::options_environment environment_options;
6552 1 : environment_options.f_project_name = "unittest";
6553 1 : environment_options.f_options = options;
6554 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6555 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6556 :
6557 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--size 4551");
6558 :
6559 1 : char const * cargv[] =
6560 : {
6561 : "/usr/bin/arguments",
6562 : "--size=568",
6563 : nullptr
6564 : };
6565 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6566 1 : char ** argv = const_cast<char **>(cargv);
6567 :
6568 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--size\" is not supported in the environment variable.");
6569 1 : advgetopt::getopt opt(environment_options);
6570 : try
6571 : {
6572 1 : opt.finish_parsing(argc, argv);
6573 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6574 : }
6575 1 : catch(advgetopt::getopt_exit const & e)
6576 : {
6577 1 : CATCH_REQUIRE(e.code() == 1);
6578 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6579 1 : }
6580 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6581 :
6582 : // check that the result is valid
6583 :
6584 : // an invalid parameter, MUST NOT EXIST
6585 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6586 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6587 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6588 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6589 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6590 :
6591 : // the valid parameter
6592 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6593 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6594 3 : CATCH_REQUIRE(opt.is_defined("size"));
6595 3 : CATCH_REQUIRE(opt.get_string("size") == "568");
6596 3 : CATCH_REQUIRE(opt.get_string("size", 0) == "568");
6597 3 : CATCH_REQUIRE(opt.get_long("size") == 568);
6598 3 : CATCH_REQUIRE(opt.get_long("size", 0) == 568);
6599 : #pragma GCC diagnostic push
6600 : #pragma GCC diagnostic ignored "-Wfloat-equal"
6601 : {
6602 3 : bool const a1(opt.get_double("size") == 568.0);
6603 1 : CATCH_REQUIRE(a1);
6604 3 : bool const a2(opt.get_double("size", 0) == 568.0);
6605 1 : CATCH_REQUIRE(a2);
6606 : }
6607 : #pragma GCC diagnostic pop
6608 3 : CATCH_REQUIRE(opt.get_default("size").empty());
6609 3 : CATCH_REQUIRE(opt.size("size") == 1);
6610 :
6611 : // other parameters
6612 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6613 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6614 1 : }
6615 7 : CATCH_END_SECTION()
6616 :
6617 7 : CATCH_START_SECTION("invalid_options: long option not available on command line.")
6618 : {
6619 1 : const advgetopt::option options[] =
6620 : {
6621 : advgetopt::define_option(
6622 : advgetopt::Name("size")
6623 : , advgetopt::ShortName('s')
6624 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6625 : , advgetopt::Help("define the size.")
6626 : , advgetopt::DefaultValue("331")
6627 : ),
6628 : advgetopt::end_options()
6629 : };
6630 :
6631 1 : advgetopt::options_environment environment_options;
6632 1 : environment_options.f_project_name = "unittest";
6633 1 : environment_options.f_options = options;
6634 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6635 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6636 :
6637 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--size 4551");
6638 :
6639 1 : char const * cargv[] =
6640 : {
6641 : "/usr/bin/arguments",
6642 : "--size=568",
6643 : nullptr
6644 : };
6645 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6646 1 : char ** argv = const_cast<char **>(cargv);
6647 :
6648 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--size\" is not supported on the command line.");
6649 1 : advgetopt::getopt opt(environment_options);
6650 : try
6651 : {
6652 1 : opt.finish_parsing(argc, argv);
6653 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6654 : }
6655 1 : catch(advgetopt::getopt_exit const & e)
6656 : {
6657 1 : CATCH_REQUIRE(e.code() == 1);
6658 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6659 1 : }
6660 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6661 :
6662 : // check that the result is valid
6663 :
6664 : // an invalid parameter, MUST NOT EXIST
6665 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6666 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6667 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6668 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6669 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6670 :
6671 : // the valid parameter
6672 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6673 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6674 3 : CATCH_REQUIRE(opt.is_defined("size"));
6675 3 : CATCH_REQUIRE(opt.get_string("size") == "4551");
6676 3 : CATCH_REQUIRE(opt.get_string("size", 0) == "4551");
6677 3 : CATCH_REQUIRE(opt.get_long("size") == 4551);
6678 3 : CATCH_REQUIRE(opt.get_long("size", 0) == 4551);
6679 : #pragma GCC diagnostic push
6680 : #pragma GCC diagnostic ignored "-Wfloat-equal"
6681 : {
6682 3 : bool const a1(opt.get_double("size") == 4551.0);
6683 1 : CATCH_REQUIRE(a1);
6684 3 : bool const a2(opt.get_double("size", 0) == 4551.0);
6685 1 : CATCH_REQUIRE(a2);
6686 : }
6687 : #pragma GCC diagnostic pop
6688 3 : CATCH_REQUIRE(opt.get_default("size") == "331");
6689 3 : CATCH_REQUIRE(opt.size("size") == 1);
6690 :
6691 : // other parameters
6692 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6693 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6694 1 : }
6695 7 : CATCH_END_SECTION()
6696 :
6697 7 : CATCH_START_SECTION("invalid_options: unknown short option.")
6698 : {
6699 1 : const advgetopt::option options[] =
6700 : {
6701 : advgetopt::define_option(
6702 : advgetopt::Name("verbose")
6703 : , advgetopt::ShortName('v')
6704 : , advgetopt::Flags(advgetopt::standalone_command_flags<>())
6705 : , advgetopt::Help("tell you about our work here.")
6706 : ),
6707 : advgetopt::define_option(
6708 : advgetopt::Name("size")
6709 : , advgetopt::ShortName('s')
6710 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6711 : , advgetopt::Help("define the size.")
6712 : ),
6713 : advgetopt::end_options()
6714 : };
6715 :
6716 1 : advgetopt::options_environment environment_options;
6717 1 : environment_options.f_project_name = "unittest";
6718 1 : environment_options.f_options = options;
6719 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6720 :
6721 1 : char const * cargv[] =
6722 : {
6723 : "/usr/bin/arguments",
6724 : "-vq 568",
6725 : nullptr
6726 : };
6727 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6728 1 : char ** argv = const_cast<char **>(cargv);
6729 :
6730 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-q\" is not supported.");
6731 1 : advgetopt::getopt opt(environment_options);
6732 : try
6733 : {
6734 1 : opt.finish_parsing(argc, argv);
6735 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6736 : }
6737 1 : catch(advgetopt::getopt_exit const & e)
6738 : {
6739 1 : CATCH_REQUIRE(e.code() == 1);
6740 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6741 1 : }
6742 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6743 :
6744 : // check that the result is valid
6745 :
6746 : // an invalid parameter, MUST NOT EXIST
6747 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6748 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6749 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6750 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6751 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6752 :
6753 : // verbose
6754 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6755 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6756 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6757 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6758 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6759 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6760 :
6761 : // the valid parameter
6762 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6763 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6764 3 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
6765 3 : CATCH_REQUIRE(opt.get_default("size").empty());
6766 3 : CATCH_REQUIRE(opt.size("size") == 0);
6767 :
6768 : // other parameters
6769 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6770 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6771 1 : }
6772 7 : CATCH_END_SECTION()
6773 :
6774 7 : CATCH_START_SECTION("invalid_options: short option not available in environment variable.")
6775 : {
6776 1 : const advgetopt::option options[] =
6777 : {
6778 : advgetopt::define_option(
6779 : advgetopt::Name("size")
6780 : , advgetopt::ShortName('s')
6781 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6782 : , advgetopt::Help("define the size.")
6783 : ),
6784 : advgetopt::define_option(
6785 : advgetopt::Name("verbose")
6786 : , advgetopt::ShortName('v')
6787 : , advgetopt::Flags(advgetopt::standalone_command_flags<>())
6788 : , advgetopt::Help("tell you about our work here.")
6789 : ),
6790 : advgetopt::end_options()
6791 : };
6792 :
6793 1 : advgetopt::options_environment environment_options;
6794 1 : environment_options.f_project_name = "unittest";
6795 1 : environment_options.f_options = options;
6796 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6797 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6798 :
6799 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-s 4551");
6800 :
6801 1 : char const * cargv[] =
6802 : {
6803 : "/usr/bin/arguments",
6804 : "-sv",
6805 : "568",
6806 : nullptr
6807 : };
6808 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6809 1 : char ** argv = const_cast<char **>(cargv);
6810 :
6811 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-s\" is not supported in the environment variable.");
6812 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"4551\"; standalone parameters are not accepted by this program.");
6813 1 : advgetopt::getopt opt(environment_options);
6814 : try
6815 : {
6816 1 : opt.finish_parsing(argc, argv);
6817 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6818 : }
6819 1 : catch(advgetopt::getopt_exit const & e)
6820 : {
6821 1 : CATCH_REQUIRE(e.code() == 1);
6822 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6823 1 : }
6824 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6825 :
6826 : // check that the result is valid
6827 :
6828 : // an invalid parameter, MUST NOT EXIST
6829 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6830 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6831 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6832 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6833 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6834 :
6835 : // the valid parameter
6836 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6837 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6838 3 : CATCH_REQUIRE(opt.is_defined("size"));
6839 3 : CATCH_REQUIRE(opt.get_string("size") == "568");
6840 3 : CATCH_REQUIRE(opt.get_string("size", 0) == "568");
6841 3 : CATCH_REQUIRE(opt.get_long("size") == 568);
6842 3 : CATCH_REQUIRE(opt.get_long("size", 0) == 568);
6843 : #pragma GCC diagnostic push
6844 : #pragma GCC diagnostic ignored "-Wfloat-equal"
6845 : {
6846 3 : bool const a1(opt.get_double("size") == 568.0);
6847 1 : CATCH_REQUIRE(a1);
6848 3 : bool const a2(opt.get_double("size", 0) == 568.0);
6849 1 : CATCH_REQUIRE(a2);
6850 : }
6851 : #pragma GCC diagnostic pop
6852 3 : CATCH_REQUIRE(opt.get_default("size").empty());
6853 3 : CATCH_REQUIRE(opt.size("size") == 1);
6854 :
6855 : // verbose
6856 3 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6857 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6858 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6859 3 : CATCH_REQUIRE(opt.is_defined("verbose"));
6860 3 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6861 3 : CATCH_REQUIRE(opt.size("verbose") == 1);
6862 :
6863 : // other parameters
6864 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6865 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6866 1 : }
6867 7 : CATCH_END_SECTION()
6868 :
6869 7 : CATCH_START_SECTION("invalid_options: long option not available on command line.")
6870 : {
6871 1 : const advgetopt::option options[] =
6872 : {
6873 : advgetopt::define_option(
6874 : advgetopt::Name("size")
6875 : , advgetopt::ShortName('s')
6876 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6877 : , advgetopt::Help("define the size.")
6878 : , advgetopt::DefaultValue("331")
6879 : ),
6880 : advgetopt::define_option(
6881 : advgetopt::Name("verbose")
6882 : , advgetopt::ShortName('v')
6883 : , advgetopt::Flags(advgetopt::standalone_command_flags<>())
6884 : , advgetopt::Help("tell you about our work here.")
6885 : ),
6886 : advgetopt::end_options()
6887 : };
6888 :
6889 1 : advgetopt::options_environment environment_options;
6890 1 : environment_options.f_project_name = "unittest";
6891 1 : environment_options.f_options = options;
6892 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6893 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6894 :
6895 5 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-s 4551");
6896 :
6897 1 : char const * cargv[] =
6898 : {
6899 : "/usr/bin/arguments",
6900 : "-sv 568",
6901 : nullptr
6902 : };
6903 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6904 1 : char ** argv = const_cast<char **>(cargv);
6905 :
6906 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-s\" is not supported on the command line.");
6907 : //SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"4551\"; standalone parameters are not accepted by this program.");
6908 1 : advgetopt::getopt opt(environment_options);
6909 : try
6910 : {
6911 1 : opt.finish_parsing(argc, argv);
6912 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6913 : }
6914 1 : catch(advgetopt::getopt_exit const & e)
6915 : {
6916 1 : CATCH_REQUIRE(e.code() == 1);
6917 3 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6918 1 : }
6919 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6920 :
6921 : // check that the result is valid
6922 :
6923 : // an invalid parameter, MUST NOT EXIST
6924 3 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6925 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6926 3 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6927 3 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6928 3 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6929 :
6930 : // the valid parameter
6931 3 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6932 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6933 3 : CATCH_REQUIRE(opt.is_defined("size"));
6934 3 : CATCH_REQUIRE(opt.get_string("size") == "4551");
6935 3 : CATCH_REQUIRE(opt.get_string("size", 0) == "4551");
6936 3 : CATCH_REQUIRE(opt.get_long("size") == 4551);
6937 3 : CATCH_REQUIRE(opt.get_long("size", 0) == 4551);
6938 : #pragma GCC diagnostic push
6939 : #pragma GCC diagnostic ignored "-Wfloat-equal"
6940 : {
6941 3 : bool const a1(opt.get_double("size") == 4551.0);
6942 1 : CATCH_REQUIRE(a1);
6943 3 : bool const a2(opt.get_double("size", 0) == 4551.0);
6944 1 : CATCH_REQUIRE(a2);
6945 : }
6946 : #pragma GCC diagnostic pop
6947 3 : CATCH_REQUIRE(opt.get_default("size") == "331");
6948 3 : CATCH_REQUIRE(opt.size("size") == 1);
6949 :
6950 : // other parameters
6951 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6952 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6953 1 : }
6954 7 : CATCH_END_SECTION()
6955 7 : }
6956 :
6957 :
6958 : #if 0
6959 : // TODO: break this out in sections and even multiple tests
6960 : // the old version would check a command set of options which is
6961 : // not required (doable/useful) with version 2.x
6962 : //
6963 : // also this test used to work but now that I heavily changed
6964 : // the configuration file loading process (specifically, added
6965 : // the cache), it fails since this test assumed that you can
6966 : // load a new copy of the same file over and over again
6967 :
6968 : CATCH_TEST_CASE("invalid_parameters", "[invalid][getopt][arguments]")
6969 : {
6970 :
6971 : CATCH_START_SECTION("invalid_parameters: check all possible invalid argument")
6972 : {
6973 : // default arguments
6974 : //
6975 : char const * cargv[] =
6976 : {
6977 : "tests/unittests/invalid_parameters",
6978 : "--ignore-parameters",
6979 : nullptr
6980 : };
6981 : const int argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
6982 : char **argv = const_cast<char **>(cargv);
6983 :
6984 : // no options available
6985 : //
6986 : const advgetopt::option options_empty_list[] =
6987 : {
6988 : {
6989 : '\0',
6990 : advgetopt::GETOPT_FLAG_END,
6991 : nullptr,
6992 : nullptr,
6993 : nullptr,
6994 : nullptr
6995 : }
6996 : };
6997 :
6998 : advgetopt::options_environment options_empty;
6999 : options_empty.f_project_name = "unittest";
7000 : options_empty.f_options = options_empty_list;
7001 : options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
7002 :
7003 : {
7004 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_empty, argc, argv), advgetopt::getopt_logic_error);
7005 : }
7006 :
7007 : // option without a name and "wrong" type
7008 : //
7009 : const advgetopt::option options_no_name_list[] =
7010 : {
7011 : {
7012 : '\0',
7013 : advgetopt::GETOPT_FLAG_REQUIRED,
7014 : nullptr,
7015 : "we can have a default though",
7016 : nullptr,
7017 : nullptr
7018 : },
7019 : {
7020 : '\0',
7021 : advgetopt::GETOPT_FLAG_END,
7022 : nullptr,
7023 : nullptr,
7024 : nullptr,
7025 : nullptr
7026 : }
7027 : };
7028 :
7029 : advgetopt::options_environment options_no_name;
7030 : options_no_name.f_project_name = "unittest";
7031 : options_no_name.f_options = options_no_name_list;
7032 : options_no_name.f_help_header = "Usage: try this one and we get a throw (no name)";
7033 :
7034 : {
7035 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_no_name, argc, argv), advgetopt::getopt_logic_error);
7036 : }
7037 :
7038 : // long options must be 2+ characters
7039 : //
7040 : const advgetopt::option options_2chars_minimum_list[] =
7041 : {
7042 : {
7043 : '\0',
7044 : advgetopt::GETOPT_FLAG_MULTIPLE,
7045 : "", // cannot be empty string (use nullptr instead)
7046 : nullptr,
7047 : "long option must be 2 characters long at least",
7048 : nullptr
7049 : },
7050 : {
7051 : '\0',
7052 : advgetopt::GETOPT_FLAG_END,
7053 : nullptr,
7054 : nullptr,
7055 : nullptr,
7056 : nullptr
7057 : }
7058 : };
7059 :
7060 : advgetopt::options_environment options_2chars_minimum;
7061 : options_2chars_minimum.f_project_name = "unittest";
7062 : options_2chars_minimum.f_options = options_2chars_minimum_list;
7063 : options_2chars_minimum.f_help_header = "Usage: try this one and we get a throw (2 chars minimum)";
7064 :
7065 : {
7066 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_2chars_minimum, argc, argv), advgetopt::getopt_logic_error);
7067 : }
7068 :
7069 : // long options must be 2+ characters
7070 : //
7071 : const advgetopt::option options_2chars_minimum2_list[] =
7072 : {
7073 : {
7074 : '\0',
7075 : advgetopt::GETOPT_FLAG_MULTIPLE,
7076 : "f", // cannot be 1 character
7077 : nullptr,
7078 : "long option must be 2 characters long at least",
7079 : nullptr
7080 : },
7081 : {
7082 : '\0',
7083 : advgetopt::GETOPT_FLAG_END,
7084 : nullptr,
7085 : nullptr,
7086 : nullptr,
7087 : nullptr
7088 : }
7089 : };
7090 :
7091 : advgetopt::options_environment options_2chars_minimum2;
7092 : options_2chars_minimum2.f_project_name = "unittest";
7093 : options_2chars_minimum2.f_options = options_2chars_minimum2_list;
7094 : options_2chars_minimum2.f_help_header = "Usage: try this one and we get a throw (2 chars minimum 2nd)";
7095 :
7096 : {
7097 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_2chars_minimum2, argc, argv), advgetopt::getopt_logic_error);
7098 : }
7099 :
7100 : // same long option defined twice
7101 : //
7102 : const advgetopt::option options_defined_twice_list[] =
7103 : {
7104 : {
7105 : '\0',
7106 : advgetopt::GETOPT_FLAG_REQUIRED,
7107 : "filename",
7108 : nullptr,
7109 : "options must be unique",
7110 : nullptr
7111 : },
7112 : {
7113 : '\0',
7114 : advgetopt::GETOPT_FLAG_REQUIRED,
7115 : "filename", // copy/paste problem maybe?
7116 : nullptr,
7117 : "options must be unique",
7118 : nullptr
7119 : },
7120 : {
7121 : '\0',
7122 : advgetopt::GETOPT_FLAG_END,
7123 : nullptr,
7124 : nullptr,
7125 : nullptr,
7126 : nullptr
7127 : }
7128 : };
7129 :
7130 : advgetopt::options_environment options_defined_twice;
7131 : options_defined_twice.f_project_name = "unittest";
7132 : options_defined_twice.f_options = options_defined_twice_list;
7133 : options_defined_twice.f_help_header = "Usage: try this one and we get a throw (long defined twice)";
7134 :
7135 : {
7136 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_defined_twice, argc, argv), advgetopt::getopt_logic_error);
7137 : }
7138 :
7139 : // same short option defined twice
7140 : //
7141 : const advgetopt::option options_short_defined_twice_list[] =
7142 : {
7143 : {
7144 : 'f',
7145 : advgetopt::GETOPT_FLAG_REQUIRED,
7146 : "from",
7147 : nullptr,
7148 : "options must be unique",
7149 : nullptr
7150 : },
7151 : {
7152 : 'f',
7153 : advgetopt::GETOPT_FLAG_REQUIRED,
7154 : "to",
7155 : nullptr,
7156 : "options must be unique",
7157 : nullptr
7158 : },
7159 : {
7160 : '\0',
7161 : advgetopt::GETOPT_FLAG_END,
7162 : nullptr,
7163 : nullptr,
7164 : nullptr,
7165 : nullptr
7166 : }
7167 : };
7168 :
7169 : advgetopt::options_environment options_short_defined_twice;
7170 : options_short_defined_twice.f_project_name = "unittest";
7171 : options_short_defined_twice.f_options = options_short_defined_twice_list;
7172 : options_short_defined_twice.f_help_header = "Usage: try this one and we get a throw (short defined twice)";
7173 : options_short_defined_twice.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7174 :
7175 : {
7176 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_short_defined_twice, argc, argv), advgetopt::getopt_logic_error);
7177 : }
7178 :
7179 : // 2 default_multiple_argument's in the same list is invalid
7180 : //
7181 : const advgetopt::option options_two_default_multiple_arguments_list[] =
7182 : {
7183 : {
7184 : '\0',
7185 : advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7186 : "filenames",
7187 : nullptr,
7188 : "other parameters are viewed as filenames",
7189 : nullptr
7190 : },
7191 : {
7192 : '\0',
7193 : advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7194 : "more",
7195 : nullptr,
7196 : "yet other parameters are viewed as \"more\" data--here it breaks, one default max.",
7197 : nullptr
7198 : },
7199 : {
7200 : '\0',
7201 : advgetopt::GETOPT_FLAG_END,
7202 : nullptr,
7203 : nullptr,
7204 : nullptr,
7205 : nullptr
7206 : }
7207 : };
7208 :
7209 : advgetopt::options_environment options_two_default_multiple_arguments;
7210 : options_two_default_multiple_arguments.f_project_name = "unittest";
7211 : options_two_default_multiple_arguments.f_options = options_two_default_multiple_arguments_list;
7212 : options_two_default_multiple_arguments.f_help_header = "Usage: try this one and we get a throw (two defaults by flag, multiple args)";
7213 :
7214 : {
7215 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_two_default_multiple_arguments, argc, argv), advgetopt::getopt_logic_error);
7216 : }
7217 :
7218 : // 2 default_argument's in the same list is invalid
7219 : //
7220 : const advgetopt::option options_two_default_arguments_list[] =
7221 : {
7222 : {
7223 : '\0',
7224 : 0,
7225 : "--",
7226 : nullptr,
7227 : "one other parameter is viewed as a filename",
7228 : nullptr
7229 : },
7230 : {
7231 : '\0',
7232 : 0,
7233 : "--",
7234 : nullptr,
7235 : "yet other parameter viewed as \"more\" data--here it breaks, one default max.",
7236 : nullptr
7237 : },
7238 : {
7239 : '\0',
7240 : advgetopt::GETOPT_FLAG_END,
7241 : nullptr,
7242 : nullptr,
7243 : nullptr,
7244 : nullptr
7245 : }
7246 : };
7247 :
7248 : advgetopt::options_environment options_two_default_arguments;
7249 : options_two_default_arguments.f_project_name = "unittest";
7250 : options_two_default_arguments.f_options = options_two_default_arguments_list;
7251 : options_two_default_arguments.f_help_header = "Usage: try this one and we get a throw (two default args by name)";
7252 :
7253 : {
7254 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_two_default_arguments, argc, argv), advgetopt::getopt_logic_error);
7255 : }
7256 :
7257 : // mix of default arguments in the same list is invalid
7258 : //
7259 : const advgetopt::option options_mix_of_default_list[] =
7260 : {
7261 : {
7262 : '\0',
7263 : advgetopt::GETOPT_FLAG_MULTIPLE,
7264 : "--",
7265 : nullptr,
7266 : "other parameters are viewed as filenames",
7267 : nullptr
7268 : },
7269 : {
7270 : '\0',
7271 : 0,
7272 : "--",
7273 : nullptr,
7274 : "yet other parameter viewed as \"more\" data--here it breaks, one default max.",
7275 : nullptr
7276 : },
7277 : {
7278 : '\0',
7279 : advgetopt::GETOPT_FLAG_END,
7280 : nullptr,
7281 : nullptr,
7282 : nullptr,
7283 : nullptr
7284 : }
7285 : };
7286 :
7287 : advgetopt::options_environment options_mix_of_default;
7288 : options_mix_of_default.f_project_name = "unittest";
7289 : options_mix_of_default.f_options = options_mix_of_default_list;
7290 : options_mix_of_default.f_help_header = "Usage: try this one and we get a throw (mix flags of defaults by name)";
7291 : options_mix_of_default.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7292 :
7293 : {
7294 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_mix_of_default, argc, argv), advgetopt::getopt_logic_error);
7295 : }
7296 :
7297 : // try the - and -- without a default in the arguments
7298 : //
7299 : const advgetopt::option options_no_defaults_list[] =
7300 : {
7301 : {
7302 : '\0',
7303 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7304 : "verbose",
7305 : nullptr,
7306 : "just a flag to test.",
7307 : 0
7308 : },
7309 : {
7310 : '\0',
7311 : advgetopt::GETOPT_FLAG_END,
7312 : nullptr,
7313 : nullptr,
7314 : nullptr,
7315 : nullptr
7316 : }
7317 : };
7318 :
7319 : advgetopt::options_environment options_no_defaults;
7320 : options_no_defaults.f_project_name = "unittest";
7321 : options_no_defaults.f_options = options_no_defaults_list;
7322 : options_no_defaults.f_help_header = "Usage: try this one and we get a throw (no defaults)";
7323 :
7324 : {
7325 : // a filename by itself is a problem when there is no default
7326 : //
7327 : char const * sub_cargv[] =
7328 : {
7329 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7330 : "--verbose",
7331 : "this",
7332 : "filename",
7333 : nullptr
7334 : };
7335 : const int sub_argc(sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1);
7336 : char ** sub_argv(const_cast<char **>(sub_cargv));
7337 :
7338 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; we do not know what to do of \"this\"; standalone parameters are not accepted by this program.");
7339 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7340 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7341 : }
7342 : {
7343 : // a '-' by itself is a problem when there is no default because it
7344 : // is expected to represent a filename (stdin)
7345 : //
7346 : char const * sub_cargv[] =
7347 : {
7348 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7349 : "--verbose",
7350 : "-",
7351 : nullptr
7352 : };
7353 : const int sub_argc(sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1);
7354 : char **sub_argv(const_cast<char **>(sub_cargv));
7355 :
7356 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus - is not accepted by this program.");
7357 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7358 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7359 : }
7360 : {
7361 : // the -- by itself would be fine, but since it represents a
7362 : // transition from arguments to only filenames (or whatever the
7363 : // program expects as default options) it generates an error if
7364 : // no default options are accepted
7365 : //
7366 : const char *sub_cargv[] =
7367 : {
7368 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7369 : "--verbose",
7370 : "--", // already just by itself it causes problems
7371 : nullptr
7372 : };
7373 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7374 : char **sub_argv = const_cast<char **>(sub_cargv);
7375 :
7376 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus -- is not accepted by this program.");
7377 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7378 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7379 : }
7380 : {
7381 : const char *sub_cargv[] =
7382 : {
7383 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7384 : "--verbose",
7385 : "--",
7386 : "66",
7387 : "--filenames",
7388 : "extra",
7389 : "--file",
7390 : "names",
7391 : nullptr
7392 : };
7393 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7394 : char **sub_argv = const_cast<char **>(sub_cargv);
7395 :
7396 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus -- is not accepted by this program.");
7397 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7398 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7399 : }
7400 : {
7401 : // check that -v, that does not exist, generates a usage error
7402 : const char *sub_cargv[] =
7403 : {
7404 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7405 : "-v",
7406 : nullptr
7407 : };
7408 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7409 : char **sub_argv = const_cast<char **>(sub_cargv);
7410 :
7411 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -v is not supported.");
7412 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7413 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7414 : }
7415 :
7416 : // check -- when default does not allowed environment variables
7417 : //
7418 : const advgetopt::option options_no_defaults_in_envvar_list[] =
7419 : {
7420 : {
7421 : '\0',
7422 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE | advgetopt::GETOPT_FLAG_FLAG,
7423 : "verbose",
7424 : nullptr,
7425 : "just a flag to test.",
7426 : nullptr
7427 : },
7428 : {
7429 : '\0',
7430 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
7431 : "--",
7432 : nullptr,
7433 : "default multiple filenames",
7434 : nullptr
7435 : },
7436 : {
7437 : '\0',
7438 : advgetopt::GETOPT_FLAG_END,
7439 : nullptr,
7440 : nullptr,
7441 : nullptr,
7442 : nullptr
7443 : }
7444 : };
7445 :
7446 : advgetopt::options_environment options_no_defaults_in_envvar;
7447 : options_no_defaults_in_envvar.f_project_name = "unittest";
7448 : options_no_defaults_in_envvar.f_options = options_no_defaults_in_envvar_list;
7449 : options_no_defaults_in_envvar.f_help_header = "Usage: try this one and we get a throw (no defaults in envvar)";
7450 : options_no_defaults_in_envvar.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7451 :
7452 : {
7453 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose - no default here");
7454 : char const * sub_cargv[] =
7455 : {
7456 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7457 : "--verbose",
7458 : "-",
7459 : "here",
7460 : "it",
7461 : "works",
7462 : nullptr
7463 : };
7464 : int const sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7465 : char **sub_argv = const_cast<char **>(sub_cargv);
7466 :
7467 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option - is not supported in the environment variable.");
7468 : advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
7469 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7470 : }
7471 : {
7472 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose no default here");
7473 : const char *sub_cargv[] =
7474 : {
7475 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7476 : "--verbose",
7477 : "-",
7478 : "here",
7479 : "it",
7480 : "works",
7481 : nullptr
7482 : };
7483 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7484 : char **sub_argv = const_cast<char **>(sub_cargv);
7485 :
7486 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported in the environment variable.");
7487 : advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
7488 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7489 : }
7490 : {
7491 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose -- foo bar blah");
7492 : const char *sub_cargv[] =
7493 : {
7494 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7495 : "--verbose",
7496 : "here",
7497 : "it",
7498 : "works",
7499 : "--",
7500 : "66",
7501 : "--filenames",
7502 : "extra",
7503 : "--file",
7504 : "names",
7505 : nullptr
7506 : };
7507 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7508 : char **sub_argv = const_cast<char **>(sub_cargv);
7509 :
7510 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -- is not supported in the environment variable.");
7511 : advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
7512 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7513 : }
7514 :
7515 : // unnknown long options
7516 : //
7517 : const advgetopt::option valid_options_unknown_command_line_option_list[] =
7518 : {
7519 : {
7520 : '\0',
7521 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
7522 : "command",
7523 : nullptr,
7524 : "there is a --command, but the user tries --verbose!",
7525 : nullptr
7526 : },
7527 : {
7528 : '\0',
7529 : advgetopt::GETOPT_FLAG_END,
7530 : nullptr,
7531 : nullptr,
7532 : nullptr,
7533 : nullptr
7534 : }
7535 : };
7536 :
7537 : advgetopt::options_environment valid_options_unknown_command_line_option;
7538 : valid_options_unknown_command_line_option.f_project_name = "unittest";
7539 : valid_options_unknown_command_line_option.f_options = valid_options_unknown_command_line_option_list;
7540 : valid_options_unknown_command_line_option.f_help_header = "Usage: try this one and we get a throw (unknown command line option)";
7541 :
7542 : {
7543 : const char *sub_cargv[] =
7544 : {
7545 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7546 : "--verbose",
7547 : nullptr
7548 : };
7549 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7550 : char **sub_argv = const_cast<char **>(sub_cargv);
7551 :
7552 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --verbose is not supported.");
7553 : advgetopt::getopt opt(valid_options_unknown_command_line_option, sub_argc, sub_argv);
7554 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7555 : }
7556 :
7557 : // illegal short or long option in variable
7558 : //
7559 : const advgetopt::option options_illegal_in_variable_list[] =
7560 : {
7561 : {
7562 : 'v',
7563 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7564 : "verbose",
7565 : nullptr,
7566 : "just a flag to test.",
7567 : nullptr
7568 : },
7569 : {
7570 : '\0',
7571 : advgetopt::GETOPT_FLAG_END,
7572 : nullptr,
7573 : nullptr,
7574 : nullptr,
7575 : nullptr
7576 : }
7577 : };
7578 :
7579 : advgetopt::options_environment options_illegal_in_variable;
7580 : options_illegal_in_variable.f_project_name = "unittest";
7581 : options_illegal_in_variable.f_options = options_illegal_in_variable_list;
7582 : options_illegal_in_variable.f_help_header = "Usage: try this one and we get a throw (illegal in variable)";
7583 : options_illegal_in_variable.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7584 :
7585 : {
7586 : // long
7587 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose");
7588 :
7589 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --verbose is not supported in the environment variable.");
7590 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7591 : advgetopt::getopt opt(options_illegal_in_variable, argc, argv);
7592 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7593 : }
7594 : {
7595 : // short
7596 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-v");
7597 :
7598 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -v is not supported in the environment variable.");
7599 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7600 : advgetopt::getopt opt(options_illegal_in_variable, argc, argv);
7601 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7602 : }
7603 :
7604 : // configuration file options must have a long name
7605 : //
7606 : const advgetopt::option configuration_long_name_missing_list[] =
7607 : {
7608 : {
7609 : 'c',
7610 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_CONFIGURATION_FILE,
7611 : nullptr,
7612 : nullptr,
7613 : "a valid option",
7614 : nullptr
7615 : },
7616 : {
7617 : '\0',
7618 : advgetopt::GETOPT_FLAG_END,
7619 : nullptr,
7620 : nullptr,
7621 : nullptr,
7622 : nullptr
7623 : }
7624 : };
7625 :
7626 : advgetopt::options_environment configuration_long_name_missing;
7627 : configuration_long_name_missing.f_project_name = "unittest";
7628 : configuration_long_name_missing.f_options = configuration_long_name_missing_list;
7629 : configuration_long_name_missing.f_help_header = "Usage: try this one and we get a throw (long name missing)";
7630 : configuration_long_name_missing.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7631 :
7632 : {
7633 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(configuration_long_name_missing, argc, argv), advgetopt::getopt_logic_error);
7634 : }
7635 :
7636 : // create invalid configuration files
7637 : //
7638 : const advgetopt::option valid_options_list[] =
7639 : {
7640 : {
7641 : '\0',
7642 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_CONFIGURATION_FILE,
7643 : "valid",
7644 : nullptr,
7645 : "a valid option",
7646 : nullptr
7647 : },
7648 : {
7649 : '\0',
7650 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
7651 : "command",
7652 : nullptr,
7653 : "a valid command, but not a valid configuration option",
7654 : nullptr
7655 : },
7656 : {
7657 : '\0',
7658 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7659 : "filename",
7660 : nullptr,
7661 : "other parameters are viewed as filenames",
7662 : nullptr
7663 : },
7664 : {
7665 : '\0',
7666 : advgetopt::GETOPT_FLAG_END,
7667 : nullptr,
7668 : nullptr,
7669 : nullptr,
7670 : nullptr
7671 : }
7672 : };
7673 :
7674 : std::string tmpdir(SNAP_CATCH2_NAMESPACE::g_tmp_dir);
7675 : tmpdir += "/.config";
7676 : std::stringstream ss;
7677 : ss << "mkdir -p " << tmpdir;
7678 : if(system(ss.str().c_str()) != 0)
7679 : {
7680 : std::cerr << "fatal error: creating sub-temporary directory \"" << tmpdir << "\" failed.\n";
7681 : exit(1);
7682 : }
7683 :
7684 : std::string const config_filename(tmpdir + "/advgetopt.config");
7685 : char const * invalid_confs[] =
7686 : {
7687 : config_filename.c_str(),
7688 : nullptr
7689 : };
7690 :
7691 : advgetopt::options_environment valid_options;
7692 : valid_options.f_project_name = "unittest";
7693 : valid_options.f_options = valid_options_list;
7694 : valid_options.f_help_header = "Usage: try this one and we get a throw (valid options!)";
7695 : valid_options.f_configuration_files = invalid_confs;
7696 :
7697 : {
7698 : // '=' operator missing
7699 : {
7700 : std::ofstream config_file;
7701 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7702 : CATCH_REQUIRE(config_file.good());
7703 : config_file <<
7704 : "# Auto-generated\n"
7705 : "valid param\n"
7706 : "# no spaces acceptable in param names\n"
7707 : ;
7708 : }
7709 : {
7710 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option name from \"valid param\" on line 2 in configuration file \""
7711 : + config_filename
7712 : + "\" cannot include a space, missing assignment operator?");
7713 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7714 : advgetopt::getopt opt(valid_options, argc, argv);
7715 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7716 : }
7717 : }
7718 : {
7719 : // same effect with a few extra spaces
7720 : {
7721 : std::ofstream config_file;
7722 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7723 : CATCH_REQUIRE(config_file.good());
7724 : config_file <<
7725 : "# Auto-generated\n"
7726 : " valid param \n"
7727 : "# no spaces acceptable in param names\n"
7728 : ;
7729 : }
7730 : {
7731 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option name from \" valid param \" on line 2 in configuration file \""
7732 : + config_filename
7733 : + "\" cannot include a space, missing assignment operator?");
7734 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7735 : advgetopt::getopt opt(valid_options, argc, argv);
7736 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7737 : }
7738 : }
7739 : {
7740 : // param name missing
7741 : {
7742 : std::ofstream config_file;
7743 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7744 : CATCH_REQUIRE(config_file.good());
7745 : config_file <<
7746 : "# Auto-generated\n"
7747 : " = valid param\n"
7748 : "# no spaces acceptable in param names\n"
7749 : ;
7750 : }
7751 : {
7752 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no option name in \" = valid param\" on line 2 from configuration file \""
7753 : + config_filename
7754 : + "\", missing name before = sign?");
7755 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7756 : advgetopt::getopt opt(valid_options, argc, argv);
7757 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7758 : }
7759 : }
7760 : {
7761 : // param name starts with a dash or more
7762 : {
7763 : std::ofstream config_file;
7764 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7765 : CATCH_REQUIRE(config_file.good());
7766 : config_file <<
7767 : "# Auto-generated\n"
7768 : "--valid=param\n"
7769 : "# no spaces acceptable in param names\n"
7770 : ;
7771 : }
7772 : {
7773 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option names in configuration files cannot start with a dash or an underscore in \"--valid=param\" on line 2 from configuration file \""
7774 : + config_filename
7775 : + "\".");
7776 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7777 : advgetopt::getopt opt(valid_options, argc, argv);
7778 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7779 : }
7780 : }
7781 : {
7782 : // unknown param name
7783 : {
7784 : std::ofstream config_file;
7785 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7786 : CATCH_REQUIRE(config_file.good());
7787 : config_file <<
7788 : "# Auto-generated\n"
7789 : "invalid=param\n"
7790 : "# no spaces acceptable in param names\n"
7791 : ;
7792 : }
7793 : {
7794 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: unknown option \"invalid\" found in configuration file \""
7795 : + config_filename
7796 : + "\".");
7797 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7798 : advgetopt::getopt opt(valid_options, argc, argv);
7799 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7800 : }
7801 : }
7802 : {
7803 : // known command, not valid in configuration file
7804 : {
7805 : std::ofstream config_file;
7806 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7807 : CATCH_REQUIRE(config_file.good());
7808 : config_file <<
7809 : "# Auto-generated\n"
7810 : "command=value\n"
7811 : "# no spaces acceptable in param names\n"
7812 : ;
7813 : }
7814 : {
7815 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"command\" is not supported in configuration files (found in \""
7816 : + config_filename
7817 : + "\").");
7818 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7819 : advgetopt::getopt opt(valid_options, argc, argv);
7820 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7821 : }
7822 : }
7823 :
7824 : #if 0
7825 : // in version 2.x we do not have this case anymore
7826 :
7827 : // one of the options has an invalid mode; explicit option
7828 : {
7829 : const advgetopt::option options_list[] =
7830 : {
7831 : {
7832 : '\0',
7833 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR,
7834 : "mode",
7835 : nullptr,
7836 : "an argument with an invalid mode to see that we get an exception",
7837 : static_cast<advgetopt::getopt::argument_mode_t>(static_cast<int>(advgetopt::getopt::argument_mode_t::end_of_options) + 1)
7838 : },
7839 : {
7840 : '\0',
7841 : advgetopt::GETOPT_FLAG_END,
7842 : nullptr,
7843 : nullptr,
7844 : nullptr,
7845 : nullptr
7846 : }
7847 : };
7848 :
7849 : advgetopt::options_environment options;
7850 : options.f_project_name = "unittest";
7851 : options.f_options = options_list;
7852 : options.f_help_header = "Usage: one of the options has an invalid mode";
7853 :
7854 : {
7855 : const char *cargv2[] =
7856 : {
7857 : "tests/unittests/unittest_advgetopt",
7858 : "--mode",
7859 : "test",
7860 : nullptr
7861 : };
7862 : const int argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7863 : char **argv2 = const_cast<char **>(cargv2);
7864 :
7865 : // here we hit the one in add_options() (plural)
7866 : // the one in add_option() is not reachable because it is called only
7867 : // when a default option is defined and that means the mode is
7868 : // correct
7869 : CATCH_REQUIRE_THROWS_AS( { advgetopt::getopt opt(argc2, argv2, options, confs, nullptr); }, advgetopt::getopt_invalid );
7870 : }
7871 : {
7872 : const char *cargv2[] =
7873 : {
7874 : "tests/unittests/unittest_advgetopt",
7875 : nullptr
7876 : };
7877 : const int argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7878 : char **argv2 = const_cast<char **>(cargv2);
7879 :
7880 : // this one checks that the --mode flag does indeed generate a
7881 : // throw when not used on the command line but then gets shown
7882 : // in the usage() function
7883 : advgetopt::getopt opt(argc2, argv2, options, confs, nullptr);
7884 : for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
7885 : {
7886 : CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_invalid);
7887 : }
7888 : }
7889 : }
7890 : #endif
7891 :
7892 : // a valid initialization, but not so valid calls afterward
7893 : {
7894 : advgetopt::option const options_list[] =
7895 : {
7896 : {
7897 : '\0',
7898 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7899 : "validate",
7900 : nullptr,
7901 : "this is used to validate different things.",
7902 : nullptr
7903 : },
7904 : {
7905 : '\0',
7906 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7907 : "long",
7908 : nullptr,
7909 : "used to validate that invalid integers generate an error.",
7910 : nullptr
7911 : },
7912 : {
7913 : 'o',
7914 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7915 : "out-of-bounds",
7916 : nullptr,
7917 : "valid values from 1 to 9.",
7918 : nullptr
7919 : },
7920 : {
7921 : '\0',
7922 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7923 : "not-specified-and-no-default",
7924 : nullptr,
7925 : "test long without having used the option and no default.",
7926 : nullptr
7927 : },
7928 : {
7929 : '\0',
7930 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7931 : "not-specified-with-invalid-default",
7932 : "123abc",
7933 : "test long with an invalid default value.",
7934 : nullptr
7935 : },
7936 : {
7937 : '\0',
7938 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7939 : "not-specified-string-without-default",
7940 : nullptr,
7941 : "test long with an invalid default value.",
7942 : nullptr
7943 : },
7944 : {
7945 : '\0',
7946 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7947 : "string",
7948 : nullptr,
7949 : "test long with an invalid default value.",
7950 : nullptr
7951 : },
7952 : {
7953 : '\0',
7954 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7955 : "filename",
7956 : nullptr,
7957 : "other parameters are viewed as filenames",
7958 : nullptr
7959 : },
7960 : {
7961 : '\0',
7962 : advgetopt::GETOPT_FLAG_END,
7963 : nullptr,
7964 : nullptr,
7965 : nullptr,
7966 : nullptr
7967 : }
7968 : };
7969 : char const * cargv2[] =
7970 : {
7971 : "tests/unittests/unittest_advgetopt",
7972 : "--validate",
7973 : "--long",
7974 : "123abc",
7975 : "--double",
7976 : "12.3abc",
7977 : "--out-of-bounds",
7978 : "123",
7979 : "--out-of-bounds-dbl",
7980 : "123.5",
7981 : "--string",
7982 : "string value",
7983 : nullptr
7984 : };
7985 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7986 : char ** argv2 = const_cast<char **>(cargv2);
7987 :
7988 : advgetopt::options_environment options;
7989 : options.f_project_name = "unittest";
7990 : options.f_options = options_list;
7991 : options.f_help_header = "Usage: one of the options has an invalid mode";
7992 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7993 :
7994 : advgetopt::getopt opt(options, argc2, argv2);
7995 :
7996 : // cannot get the default without a valid name!
7997 : CATCH_REQUIRE_THROWS_AS( opt.get_default(""), advgetopt::getopt_logic_error);
7998 :
7999 : // cannot get a long named "blah"
8000 : CATCH_REQUIRE_THROWS_AS(opt.get_long("blah"), advgetopt::getopt_logic_error);
8001 : // existing "long", but only 1 entry
8002 : CATCH_REQUIRE_THROWS_AS(opt.get_long("long", 100), advgetopt::getopt_undefined);
8003 : long l(-1);
8004 : CATCH_REQUIRE_THROWS_AS(l = opt.get_long("not-specified-and-no-default", 0), advgetopt::getopt_logic_error);
8005 : CATCH_REQUIRE(l == -1);
8006 : CATCH_REQUIRE_THROWS_AS(l = opt.get_long("not-specified-with-invalid-default", 0), advgetopt::getopt_logic_error);
8007 : CATCH_REQUIRE(l == -1);
8008 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (123abc) in parameter --long.");
8009 : l = opt.get_long("long");
8010 : CATCH_REQUIRE(l == -1);
8011 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: 123 is out of bounds (1..9 inclusive) in parameter --out-of-bounds.");
8012 : l = opt.get_long("out-of-bounds", 0, 1, 9);
8013 : CATCH_REQUIRE(l == -1);
8014 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (123abc) in parameter --double.");
8015 :
8016 : std::string s;
8017 : CATCH_REQUIRE_THROWS_AS( s = opt.get_string("not-specified-string-without-default", 0), advgetopt::getopt_logic_error);
8018 : CATCH_REQUIRE(s.empty());
8019 : CATCH_REQUIRE_THROWS_AS( s = opt.get_string("string", 100), advgetopt::getopt_undefined);
8020 : CATCH_REQUIRE(s.empty());
8021 :
8022 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8023 :
8024 : // reuse all those invalid options with the reset() function
8025 : // and expect the same result
8026 : // (the constructor is expected to call reset() the exact same way)
8027 : // -- this changed in version 2.x; we can't reset the option definitions
8028 : //
8029 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_empty_list, confs, nullptr), advgetopt::getopt_invalid);
8030 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_no_name_list, confs, nullptr), advgetopt::getopt_invalid);
8031 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_2chars_minimum, confs, nullptr), advgetopt::getopt_invalid);
8032 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_2chars_minimum2, confs, nullptr), advgetopt::getopt_invalid);
8033 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_defined_twice, confs, "ADVGETOPT_TEST_OPTIONS"), advgetopt::getopt_invalid);
8034 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_short_defined_twice, confs, nullptr), advgetopt::getopt_invalid);
8035 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_two_default_multiple_arguments, confs, nullptr), advgetopt::getopt_invalid_default);
8036 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_two_default_arguments, confs, "ADVGETOPT_TEST_OPTIONS"), advgetopt::getopt_invalid_default);
8037 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_mix_of_default, confs, nullptr), advgetopt::getopt_invalid_default);
8038 : }
8039 :
8040 : // valid initialization + usage calls
8041 : {
8042 : const advgetopt::option options_list[] =
8043 : {
8044 : {
8045 : '\0',
8046 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
8047 : "validate",
8048 : nullptr,
8049 : "this is used to validate different things.",
8050 : nullptr
8051 : },
8052 : {
8053 : '\0',
8054 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8055 : "long",
8056 : nullptr,
8057 : "used to validate that invalid numbers generate an error.",
8058 : nullptr
8059 : },
8060 : {
8061 : 'o',
8062 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8063 : "out-of-bounds",
8064 : nullptr,
8065 : "valid values from 1 to 9.",
8066 : nullptr
8067 : },
8068 : {
8069 : '\0',
8070 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8071 : "not-specified-and-no-default",
8072 : nullptr,
8073 : "test long without having used the option and no default.",
8074 : nullptr
8075 : },
8076 : {
8077 : '\0',
8078 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
8079 : "not-specified-with-invalid-default",
8080 : "123abc",
8081 : "test long with an invalid default value.",
8082 : nullptr
8083 : },
8084 : {
8085 : '\0',
8086 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8087 : "not-specified-string-without-default",
8088 : nullptr,
8089 : "test long with an invalid default value.",
8090 : nullptr
8091 : },
8092 : {
8093 : '\0',
8094 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8095 : "string",
8096 : nullptr,
8097 : "test long with an invalid default value.",
8098 : nullptr
8099 : },
8100 : {
8101 : 'u',
8102 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
8103 : "unique",
8104 : nullptr,
8105 : "test long with an invalid default value.",
8106 : nullptr
8107 : },
8108 : {
8109 : 'q',
8110 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
8111 : "quiet",
8112 : nullptr,
8113 : "test long with an invalid default value.",
8114 : nullptr
8115 : },
8116 : {
8117 : '\0',
8118 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
8119 : "filename",
8120 : nullptr,
8121 : "other parameters are viewed as filenames.",
8122 : nullptr
8123 : },
8124 : {
8125 : '\0',
8126 : advgetopt::GETOPT_FLAG_END,
8127 : nullptr,
8128 : nullptr,
8129 : nullptr,
8130 : nullptr
8131 : }
8132 : };
8133 : char const * cargv2[] =
8134 : {
8135 : "tests/unittests/unittest_advgetopt",
8136 : "--validate",
8137 : "--long",
8138 : "123abc",
8139 : "--out-of-bounds",
8140 : "123",
8141 : "--string",
8142 : "string value",
8143 : nullptr
8144 : };
8145 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8146 : char ** argv2 = const_cast<char **>(cargv2);
8147 :
8148 : advgetopt::options_environment options;
8149 : options.f_project_name = "unittest";
8150 : options.f_options = options_list;
8151 : options.f_help_header = "Usage: try this one and we get a throw (valid options + usage calls)";
8152 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
8153 :
8154 : // this initialization works as expected
8155 : advgetopt::getopt opt(options, argc2, argv2);
8156 :
8157 : // all of the following have the exiting exception
8158 : CATCH_REQUIRE(opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) ==
8159 : "Usage: try this one and we get a throw (valid options + usage calls)\n"
8160 : " --long <arg> used to validate that invalid numbers generate an\n"
8161 : " error.\n"
8162 : " --not-specified-and-no-default <arg>\n"
8163 : " test long without having used the option and no\n"
8164 : " default.\n"
8165 : " --not-specified-string-without-default <arg>\n"
8166 : " test long with an invalid default value.\n"
8167 : " --not-specified-with-invalid-default <arg> {<arg>} (default is \"123abc\")\n"
8168 : " test long with an invalid default value.\n"
8169 : " --out-of-bounds or -o <arg>\n"
8170 : " valid values from 1 to 9.\n"
8171 : " --quiet or -q {<arg>} test long with an invalid default value.\n"
8172 : " --string <arg> test long with an invalid default value.\n"
8173 : " --unique or -u [<arg>] test long with an invalid default value.\n"
8174 : " --validate this is used to validate different things.\n"
8175 : " [default arguments] other parameters are viewed as filenames.\n"
8176 : );
8177 : }
8178 :
8179 : // valid initialization + usage calls with a few different options
8180 : {
8181 : const advgetopt::option options_list[] =
8182 : {
8183 : {
8184 : '\0',
8185 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
8186 : "validate",
8187 : nullptr,
8188 : "this is used to validate different things.",
8189 : nullptr
8190 : },
8191 : {
8192 : '\0',
8193 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8194 : "long",
8195 : nullptr,
8196 : "used to validate that invalid numbers generate an error.",
8197 : nullptr
8198 : },
8199 : {
8200 : 'o',
8201 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8202 : "out-of-bounds",
8203 : nullptr,
8204 : "valid values from 1 to 9.",
8205 : nullptr
8206 : },
8207 : {
8208 : '\0',
8209 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8210 : "not-specified-and-no-default",
8211 : nullptr,
8212 : "test long without having used the option and no default.",
8213 : nullptr
8214 : },
8215 : {
8216 : '\0',
8217 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
8218 : "not-specified-with-invalid-default",
8219 : "123abc",
8220 : "test long with an invalid default value.",
8221 : nullptr
8222 : },
8223 : {
8224 : '\0',
8225 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8226 : "not-specified-string-without-default",
8227 : nullptr,
8228 : "test long with an invalid default value.",
8229 : nullptr
8230 : },
8231 : {
8232 : '\0',
8233 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8234 : "string",
8235 : nullptr,
8236 : "test long with an invalid default value.",
8237 : nullptr
8238 : },
8239 : {
8240 : 'u',
8241 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
8242 : "unique",
8243 : nullptr,
8244 : "test long with an invalid default value.",
8245 : nullptr
8246 : },
8247 : {
8248 : 'q',
8249 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
8250 : "quiet",
8251 : nullptr,
8252 : "test long with an invalid default value.",
8253 : nullptr
8254 : },
8255 : {
8256 : 'l',
8257 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8258 : "not-in-v2-though",
8259 : nullptr,
8260 : "long with just a letter.",
8261 : nullptr
8262 : },
8263 : {
8264 : '\0',
8265 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
8266 : "--",
8267 : nullptr,
8268 : "other parameters are viewed as filenames; and we need at least one option with a very long help to check that it wraps perfectly (we'd really need to get the output of the command and check that against what is expected because at this time the test is rather blind in that respect! FIXED IN v2!)",
8269 : nullptr
8270 : },
8271 : {
8272 : '\0',
8273 : advgetopt::GETOPT_FLAG_END,
8274 : nullptr,
8275 : nullptr,
8276 : nullptr,
8277 : nullptr
8278 : }
8279 : };
8280 :
8281 : advgetopt::options_environment options;
8282 : options.f_project_name = "unittest";
8283 : options.f_options = options_list;
8284 : options.f_help_header = "Usage: try this one and we get a throw (valid options + usage calls bis)";
8285 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
8286 :
8287 : {
8288 : // make sure that --long (REQUIRED) fails if the
8289 : // long value is not specified
8290 : //
8291 : char const * cargv2[] =
8292 : {
8293 : "tests/unittests/unittest_advgetopt",
8294 : "--validate",
8295 : "--long",
8296 : "--out-of-bounds",
8297 : "123",
8298 : "--string",
8299 : "string value",
8300 : nullptr
8301 : };
8302 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8303 : char ** argv2 = const_cast<char **>(cargv2);
8304 :
8305 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --long expects an argument.");
8306 : advgetopt::getopt opt(options, argc2, argv2);
8307 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8308 : }
8309 : {
8310 : // again with the lone -l (no long name)
8311 : //
8312 : char const * cargv2[] =
8313 : {
8314 : "tests/unittests/unittest_advgetopt",
8315 : "--validate",
8316 : "-l",
8317 : "--out-of-bounds",
8318 : "123",
8319 : "--string",
8320 : "string value",
8321 : nullptr
8322 : };
8323 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8324 : char ** argv2 = const_cast<char **>(cargv2);
8325 :
8326 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --not-in-v2-though expects an argument.");
8327 : advgetopt::getopt opt(options, argc2, argv2);
8328 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8329 : }
8330 : {
8331 : char const * cargv2[] =
8332 : {
8333 : "tests/unittests/unittest_advgetopt",
8334 : "--validate",
8335 : "--long",
8336 : "123abc",
8337 : "--out-of-bounds",
8338 : "123",
8339 : "--string",
8340 : "string value",
8341 : nullptr
8342 : };
8343 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8344 : char ** argv2 = const_cast<char **>(cargv2);
8345 :
8346 : // this initialization works as expected
8347 : advgetopt::getopt opt(options, argc2, argv2);
8348 :
8349 : // all of the following have the exiting exception
8350 : // for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
8351 : // {
8352 : // CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_exit);
8353 : // }
8354 : CATCH_REQUIRE(opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) ==
8355 : "Usage: try this one and we get a throw (valid options + usage calls bis)\n"
8356 : " --long <arg> used to validate that invalid numbers generate an\n"
8357 : " error.\n"
8358 : " --not-in-v2-though or -l <arg>\n"
8359 : " long with just a letter.\n"
8360 : " --not-specified-and-no-default <arg>\n"
8361 : " test long without having used the option and no\n"
8362 : " default.\n"
8363 : " --not-specified-string-without-default <arg>\n"
8364 : " test long with an invalid default value.\n"
8365 : " --not-specified-with-invalid-default <arg> {<arg>} (default is \"123abc\")\n"
8366 : " test long with an invalid default value.\n"
8367 : " --out-of-bounds or -o <arg>\n"
8368 : " valid values from 1 to 9.\n"
8369 : " --quiet or -q {<arg>} test long with an invalid default value.\n"
8370 : " --string <arg> test long with an invalid default value.\n"
8371 : " --unique or -u [<arg>] test long with an invalid default value.\n"
8372 : " --validate this is used to validate different things.\n"
8373 : " [default argument] other parameters are viewed as filenames; and we\n"
8374 : " need at least one option with a very long help to\n"
8375 : " check that it wraps perfectly (we'd really need to\n"
8376 : " get the output of the command and check that\n"
8377 : " against what is expected because at this time the\n"
8378 : " test is rather blind in that respect! FIXED IN\n"
8379 : " v2!)\n"
8380 : );
8381 : }
8382 : }
8383 :
8384 : // strange entry without a name
8385 : {
8386 : advgetopt::option const options_list[] =
8387 : {
8388 : {
8389 : '\0',
8390 : advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR | advgetopt::GETOPT_FLAG_FLAG,
8391 : nullptr,
8392 : nullptr,
8393 : "this entry has help, but no valid name...",
8394 : nullptr
8395 : },
8396 : {
8397 : 'v',
8398 : advgetopt::GETOPT_FLAG_FLAG,
8399 : "verbose",
8400 : nullptr,
8401 : "show more stuff when found on the command line.",
8402 : nullptr
8403 : },
8404 : {
8405 : '\0',
8406 : advgetopt::GETOPT_FLAG_END,
8407 : nullptr,
8408 : nullptr,
8409 : nullptr,
8410 : nullptr
8411 : }
8412 : };
8413 :
8414 : advgetopt::options_environment options;
8415 : options.f_project_name = "unittest";
8416 : options.f_options = options_list;
8417 : options.f_help_header = "Usage: try this one and we get a throw (strange empty entry!)";
8418 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
8419 :
8420 : {
8421 : char const * cargv2[] =
8422 : {
8423 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8424 : nullptr
8425 : };
8426 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8427 : char ** argv2 = const_cast<char **>(cargv2);
8428 :
8429 : // this initialization works as expected
8430 : //
8431 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options, argc2, argv2), advgetopt::getopt_logic_error );
8432 :
8433 : // // all of the following have the exiting exception
8434 : // for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
8435 : // {
8436 : // CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_invalid);
8437 : // }
8438 : //std::cout << "test usage output here? " << opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) << "\n";
8439 : }
8440 : }
8441 :
8442 : // required multiple without arguments
8443 : {
8444 : advgetopt::option const options_list[] =
8445 : {
8446 : {
8447 : 'f',
8448 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
8449 : "filenames",
8450 : nullptr,
8451 : "test a required multiple without any arguments and fail.",
8452 : nullptr
8453 : },
8454 : {
8455 : '\0',
8456 : advgetopt::GETOPT_FLAG_END,
8457 : nullptr,
8458 : nullptr,
8459 : nullptr,
8460 : nullptr
8461 : }
8462 : };
8463 :
8464 : advgetopt::options_environment options;
8465 : options.f_project_name = "unittest";
8466 : options.f_options = options_list;
8467 : options.f_help_header = "Usage: try this one and we get a throw (required multiple without args)";
8468 :
8469 : {
8470 : // first with -f
8471 : char const * cargv2[] =
8472 : {
8473 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8474 : "-f",
8475 : nullptr
8476 : };
8477 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8478 : char ** argv2 = const_cast<char **>(cargv2);
8479 :
8480 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
8481 : advgetopt::getopt opt(options, argc2, argv2);
8482 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8483 : }
8484 : {
8485 : // second with --filenames
8486 : const char *cargv2[] =
8487 : {
8488 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8489 : "--filenames",
8490 : nullptr
8491 : };
8492 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8493 : char ** argv2 = const_cast<char **>(cargv2);
8494 :
8495 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
8496 : advgetopt::getopt opt(options, argc2, argv2);
8497 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8498 : }
8499 : }
8500 :
8501 : // required multiple without arguments, short name only
8502 : {
8503 : advgetopt::option const options_list[] =
8504 : {
8505 : {
8506 : 'f',
8507 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
8508 : "filenames",
8509 : nullptr,
8510 : "test a required multiple without any arguments and fail.",
8511 : nullptr
8512 : },
8513 : {
8514 : '\0',
8515 : advgetopt::GETOPT_FLAG_END,
8516 : nullptr,
8517 : nullptr,
8518 : nullptr,
8519 : nullptr
8520 : }
8521 : };
8522 :
8523 : advgetopt::options_environment options;
8524 : options.f_project_name = "unittest";
8525 : options.f_options = options_list;
8526 : options.f_help_header = "Usage: try this one and we get a throw (required multiple without args + short name)";
8527 :
8528 : {
8529 : // -f only in this case
8530 : char const * cargv2[] =
8531 : {
8532 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8533 : "-f",
8534 : nullptr
8535 : };
8536 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8537 : char ** argv2 = const_cast<char **>(cargv2);
8538 :
8539 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
8540 : advgetopt::getopt opt(options, argc2, argv2);
8541 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8542 : }
8543 : }
8544 : }
8545 : CATCH_END_SECTION()
8546 : }
8547 : #endif
8548 :
8549 :
8550 :
8551 : // vim: ts=4 sw=4 et
|