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