Line data Source code
1 : // Copyright (c) 2006-2022 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/advgetopt
4 : // contact@m2osw.com
5 : //
6 : // This program is free software; you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation; either version 2 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License along
17 : // with this program; if not, write to the Free Software Foundation, Inc.,
18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 :
20 : // self
21 : //
22 : #include "catch_main.h"
23 :
24 :
25 : // advgetopt lib
26 : //
27 : #include <advgetopt/exception.h>
28 :
29 :
30 : // snapdev lib
31 : //
32 : #include <snapdev/ostream_to_buf.h>
33 : #include <snapdev/safe_setenv.h>
34 :
35 :
36 : // C++ lib
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_integer(), 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_integer(), 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_integer(), 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_integer(), 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 1 : CATCH_REQUIRE(opt.get_default("size") == "123");
4533 1 : CATCH_REQUIRE(opt.size("size") == 1);
4534 :
4535 : // pos
4536 : //
4537 1 : CATCH_REQUIRE(opt.get_option("pos") != nullptr);
4538 1 : CATCH_REQUIRE(opt.get_option('p') != nullptr);
4539 1 : CATCH_REQUIRE(opt.is_defined("pos"));
4540 1 : CATCH_REQUIRE(opt.get_string("pos") == "43,91");
4541 1 : CATCH_REQUIRE(opt.get_string("pos", 0) == "43,91");
4542 1 : CATCH_REQUIRE(opt.get_default("pos") == "0,0");
4543 1 : CATCH_REQUIRE(opt.size("pos") == 1);
4544 :
4545 : // default
4546 : //
4547 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4548 1 : CATCH_REQUIRE(opt.is_defined("--"));
4549 1 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4550 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4551 1 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4552 1 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4553 1 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4554 1 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4555 1 : CATCH_REQUIRE(opt.get_default("--").empty());
4556 1 : CATCH_REQUIRE(opt.size("--") == 5);
4557 :
4558 : // other parameters
4559 : //
4560 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4561 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4562 :
4563 : // second set of arguments
4564 : //
4565 1 : char const * cargv2[] =
4566 : {
4567 : "/usr/bin/arguments",
4568 : "--help",
4569 : "--verbose",
4570 : nullptr
4571 : };
4572 1 : int const argc2(sizeof(cargv2) / sizeof(cargv2[0]) - 1);
4573 1 : char ** argv2 = const_cast<char **>(cargv2);
4574 :
4575 1 : opt.parse_arguments(argc2, argv2, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
4576 :
4577 : // an invalid parameter, MUST NEVER EXIST
4578 : //
4579 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
4580 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
4581 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
4582 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
4583 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
4584 :
4585 : // verbose
4586 : //
4587 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
4588 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
4589 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
4590 1 : CATCH_REQUIRE(opt.get_string("verbose").empty());
4591 1 : CATCH_REQUIRE(opt.get_string("verbose", 0).empty());
4592 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
4593 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
4594 :
4595 : // help
4596 : //
4597 1 : CATCH_REQUIRE(opt.get_option("help") != nullptr);
4598 1 : CATCH_REQUIRE(opt.get_option('h') != nullptr);
4599 1 : CATCH_REQUIRE(opt.is_defined("help"));
4600 1 : CATCH_REQUIRE(opt.get_string("help").empty());
4601 1 : CATCH_REQUIRE(opt.get_string("help", 0).empty());
4602 1 : CATCH_REQUIRE(opt.get_default("help").empty());
4603 1 : CATCH_REQUIRE(opt.size("help") == 1);
4604 :
4605 : // size
4606 : //
4607 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
4608 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
4609 1 : CATCH_REQUIRE(opt.is_defined("size"));
4610 1 : CATCH_REQUIRE(opt.get_string("size") == "40132");
4611 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "40132");
4612 1 : CATCH_REQUIRE(opt.get_long("size") == 40132);
4613 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 40132);
4614 1 : CATCH_REQUIRE(opt.get_default("size") == "123");
4615 1 : CATCH_REQUIRE(opt.size("size") == 1);
4616 :
4617 : // pos
4618 : //
4619 1 : CATCH_REQUIRE(opt.get_option("pos") != nullptr);
4620 1 : CATCH_REQUIRE(opt.get_option('p') != nullptr);
4621 1 : CATCH_REQUIRE(opt.is_defined("pos"));
4622 1 : CATCH_REQUIRE(opt.get_string("pos") == "43,91");
4623 1 : CATCH_REQUIRE(opt.get_string("pos", 0) == "43,91");
4624 1 : CATCH_REQUIRE(opt.get_default("pos") == "0,0");
4625 1 : CATCH_REQUIRE(opt.size("pos") == 1);
4626 :
4627 : // default
4628 : //
4629 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
4630 1 : CATCH_REQUIRE(opt.is_defined("--"));
4631 1 : CATCH_REQUIRE(opt.get_string("--") == "file.exe");
4632 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "file.exe");
4633 1 : CATCH_REQUIRE(opt.get_string("--", 1) == "file.so");
4634 1 : CATCH_REQUIRE(opt.get_string("--", 2) == "file.dll");
4635 1 : CATCH_REQUIRE(opt.get_string("--", 3) == "file.lib");
4636 1 : CATCH_REQUIRE(opt.get_string("--", 4) == "file.a");
4637 1 : CATCH_REQUIRE(opt.get_default("--").empty());
4638 1 : CATCH_REQUIRE(opt.size("--") == 5);
4639 :
4640 : // other parameters
4641 : //
4642 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
4643 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
4644 : }
4645 : CATCH_END_SECTION()
4646 :
4647 6 : CATCH_START_SECTION("Verify that not calling link_aliases() causes problems")
4648 : {
4649 : // create a getopt object, we will part the options "manually" later
4650 : //
4651 1 : advgetopt::options_environment environment_options;
4652 1 : environment_options.f_project_name = "unittest";
4653 1 : environment_options.f_help_header = "Usage: test --licence as equivalent to --license";
4654 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
4655 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
4656 :
4657 2 : advgetopt::getopt opt(environment_options);
4658 :
4659 1 : const advgetopt::option options[] =
4660 : {
4661 : advgetopt::define_option(
4662 : advgetopt::Name("verbose")
4663 : , advgetopt::ShortName('v')
4664 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4665 : , advgetopt::Help("print info as we work.")
4666 : ),
4667 : advgetopt::define_option(
4668 : advgetopt::Name("licence") // French spelling
4669 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4670 : , advgetopt::Alias("license") // forgot system flags?
4671 : ),
4672 : advgetopt::end_options()
4673 : };
4674 :
4675 1 : opt.parse_options_info(options);
4676 :
4677 : // "forgot" to call the opt.link_aliases() here
4678 :
4679 1 : char const * cargv[] =
4680 : {
4681 : "/usr/bin/arguments",
4682 : "--verbose",
4683 : "--licence",
4684 : nullptr
4685 : };
4686 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
4687 1 : char ** argv = const_cast<char **>(cargv);
4688 :
4689 1 : CATCH_REQUIRE_THROWS_MATCHES(
4690 : opt.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE)
4691 : , advgetopt::getopt_undefined
4692 : , Catch::Matchers::ExceptionMessage(
4693 : "getopt_exception: getopt::get_alias_destination(): alias is missing. Did you call link_aliases()?"));
4694 : }
4695 : CATCH_END_SECTION()
4696 3 : }
4697 :
4698 :
4699 7 : CATCH_TEST_CASE("individual_argument_variable", "[arguments][valid][variable][getopt]")
4700 : {
4701 10 : CATCH_START_SECTION("Test that we get the values of individual environment variables without an INTRO_...")
4702 : {
4703 : // create a getopt object with options
4704 : //
4705 5 : advgetopt::option const options[] =
4706 : {
4707 : advgetopt::define_option(
4708 : advgetopt::Name("verbose")
4709 : , advgetopt::ShortName('v')
4710 : , advgetopt::Flags(advgetopt::standalone_command_flags())
4711 : , advgetopt::EnvironmentVariableName("VERBOSE")
4712 : , advgetopt::Help("print info as we work.")
4713 : ),
4714 : advgetopt::define_option(
4715 : advgetopt::Name("size")
4716 : , advgetopt::ShortName('s')
4717 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
4718 : , advgetopt::DefaultValue("123")
4719 : , advgetopt::EnvironmentVariableName("SIZE")
4720 : , advgetopt::Help("define a size.")
4721 : ),
4722 : advgetopt::define_option(
4723 : advgetopt::Name("--")
4724 : , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_MULTIPLE>())
4725 : , advgetopt::EnvironmentVariableName("FILENAMES")
4726 : , advgetopt::Help("filenames to handle by this command.")
4727 : ),
4728 : advgetopt::end_options()
4729 : };
4730 :
4731 5 : advgetopt::options_environment environment_options;
4732 5 : environment_options.f_project_name = "unittest";
4733 5 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
4734 5 : environment_options.f_help_header = "Usage: testing system arguments.";
4735 5 : environment_options.f_options = options;
4736 5 : environment_options.f_version = "2.0.1";
4737 5 : environment_options.f_license = "MIT";
4738 5 : environment_options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
4739 5 : environment_options.f_build_date = "Jun 4 2019";
4740 5 : environment_options.f_build_time = "23:02:36";
4741 :
4742 10 : CATCH_WHEN("Testing all parameters defined on command line")
4743 : {
4744 2 : snapdev::safe_setenv env_verbose("VERBOSE", "");
4745 2 : snapdev::safe_setenv env_size("SIZE", "22159");
4746 2 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4747 :
4748 1 : char const * cargv[] =
4749 : {
4750 : "tests/system-arguments",
4751 : "--verbose",
4752 : "--size",
4753 : "5003",
4754 : "special/file",
4755 : "organic/test",
4756 : nullptr
4757 : };
4758 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4759 1 : char ** argv = const_cast<char **>(cargv);
4760 :
4761 : // the command line has priority, but the MULTIPLE creates a
4762 : // problem here...
4763 : //
4764 2 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4765 1 : CATCH_REQUIRE(opt != nullptr);
4766 :
4767 1 : CATCH_REQUIRE(opt->is_defined("verbose"));
4768 :
4769 1 : CATCH_REQUIRE(opt->is_defined("size"));
4770 1 : CATCH_REQUIRE(opt->get_string("size") == "5003");
4771 :
4772 1 : CATCH_REQUIRE(opt->is_defined("--"));
4773 1 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4774 1 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4775 1 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4776 : }
4777 :
4778 10 : CATCH_WHEN("Testing with verbose not on the list")
4779 : {
4780 2 : snapdev::safe_setenv env_verbose("VERBOSE", "");
4781 2 : snapdev::safe_setenv env_size("SIZE", "22159");
4782 2 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4783 :
4784 1 : char const * cargv[] =
4785 : {
4786 : "tests/system-arguments",
4787 : "--size",
4788 : "5003",
4789 : "special/file",
4790 : "organic/test",
4791 : nullptr
4792 : };
4793 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4794 1 : char ** argv = const_cast<char **>(cargv);
4795 :
4796 : // the command line has priority, but the MULTIPLE creates a
4797 : // problem here...
4798 : //
4799 2 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4800 1 : CATCH_REQUIRE(opt != nullptr);
4801 :
4802 1 : CATCH_REQUIRE(opt->is_defined("verbose"));
4803 :
4804 1 : CATCH_REQUIRE(opt->is_defined("size"));
4805 1 : CATCH_REQUIRE(opt->get_string("size") == "5003");
4806 :
4807 1 : CATCH_REQUIRE(opt->is_defined("--"));
4808 1 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4809 1 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4810 1 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4811 : }
4812 :
4813 10 : CATCH_WHEN("Testing with verbose set to false")
4814 : {
4815 2 : snapdev::safe_setenv env_verbose("VERBOSE", "false");
4816 2 : snapdev::safe_setenv env_size("SIZE", "22159");
4817 2 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4818 :
4819 1 : char const * cargv[] =
4820 : {
4821 : "tests/system-arguments",
4822 : "--size",
4823 : "5003",
4824 : "special/file",
4825 : "organic/test",
4826 : nullptr
4827 : };
4828 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4829 1 : char ** argv = const_cast<char **>(cargv);
4830 :
4831 : // the command line has priority, but the MULTIPLE creates a
4832 : // problem here...
4833 : //
4834 2 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4835 1 : CATCH_REQUIRE(opt != nullptr);
4836 :
4837 1 : CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
4838 :
4839 1 : CATCH_REQUIRE(opt->is_defined("size"));
4840 1 : CATCH_REQUIRE(opt->get_string("size") == "5003");
4841 :
4842 1 : CATCH_REQUIRE(opt->is_defined("--"));
4843 1 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4844 1 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4845 1 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4846 : }
4847 :
4848 10 : CATCH_WHEN("Testing with no verbose, but size in environment")
4849 : {
4850 2 : snapdev::safe_setenv env_size("SIZE", "22159");
4851 2 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4852 :
4853 1 : char const * cargv[] =
4854 : {
4855 : "tests/system-arguments",
4856 : "special/file",
4857 : "organic/test",
4858 : nullptr
4859 : };
4860 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4861 1 : char ** argv = const_cast<char **>(cargv);
4862 :
4863 : // the command line has priority, but the MULTIPLE creates a
4864 : // problem here...
4865 : //
4866 2 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4867 1 : CATCH_REQUIRE(opt != nullptr);
4868 :
4869 1 : CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
4870 :
4871 1 : CATCH_REQUIRE(opt->is_defined("size"));
4872 1 : CATCH_REQUIRE(opt->get_string("size") == "22159");
4873 :
4874 1 : CATCH_REQUIRE(opt->is_defined("--"));
4875 1 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4876 1 : CATCH_REQUIRE(opt->get_string("--", 1) == "special/file");
4877 1 : CATCH_REQUIRE(opt->get_string("--", 2) == "organic/test");
4878 : }
4879 :
4880 10 : CATCH_WHEN("Testing with no command line parameters, but filenames in environment only")
4881 : {
4882 2 : snapdev::safe_setenv env_filenames("FILENAMES", "name1 other-name more-names");
4883 :
4884 1 : char const * cargv[] =
4885 : {
4886 : "tests/system-arguments",
4887 : nullptr
4888 : };
4889 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4890 1 : char ** argv = const_cast<char **>(cargv);
4891 :
4892 : // the command line has priority, but the MULTIPLE creates a
4893 : // problem here...
4894 : //
4895 2 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(environment_options, argc, argv));
4896 1 : CATCH_REQUIRE(opt != nullptr);
4897 :
4898 1 : CATCH_REQUIRE_FALSE(opt->is_defined("verbose"));
4899 :
4900 1 : CATCH_REQUIRE_FALSE(opt->is_defined("size"));
4901 :
4902 1 : CATCH_REQUIRE(opt->is_defined("--"));
4903 1 : CATCH_REQUIRE(opt->get_string("--", 0) == "name1 other-name more-names");
4904 : }
4905 : }
4906 : CATCH_END_SECTION()
4907 5 : }
4908 :
4909 :
4910 6 : CATCH_TEST_CASE("auto_process_system_arguments", "[arguments][valid][getopt]")
4911 : {
4912 8 : CATCH_START_SECTION("Test auto-processing of system arguments (with many CATCH_WHEN)")
4913 : {
4914 4 : advgetopt::options_environment options;
4915 4 : options.f_project_name = "unittest";
4916 4 : options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS;
4917 4 : options.f_help_header = "Usage: testing system arguments.";
4918 4 : options.f_version = "2.0.1";
4919 4 : options.f_license = "MIT";
4920 4 : options.f_copyright = "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved";
4921 4 : options.f_build_date = "Jun 4 2019";
4922 4 : options.f_build_time = "23:02:36";
4923 :
4924 8 : CATCH_WHEN("Testing --version")
4925 : {
4926 1 : char const * cargv[] =
4927 : {
4928 : "tests/system-arguments",
4929 : "--version",
4930 : nullptr
4931 : };
4932 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4933 1 : char ** argv = const_cast<char **>(cargv);
4934 :
4935 : // do our own try/catch because we want to test the message
4936 : // and exit code of the exception and it's easier to do it
4937 : // this way
4938 : //
4939 2 : snapdev::ostream_to_buf<char> out(std::cout);
4940 : try
4941 : {
4942 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
4943 :
4944 : // if it returns opt cannot be nullptr
4945 : //
4946 0 : CATCH_REQUIRE(opt == nullptr);
4947 : }
4948 2 : catch(advgetopt::getopt_exit const & e)
4949 : {
4950 : // this is the expected route
4951 : //
4952 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
4953 1 : CATCH_REQUIRE(e.code() == 0);
4954 1 : CATCH_REQUIRE(out.str() == "2.0.1\n");
4955 : }
4956 0 : catch(std::exception const & e)
4957 : {
4958 : // no other exception is considered valid here
4959 : //
4960 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
4961 : }
4962 : }
4963 :
4964 8 : CATCH_WHEN("Testing --copyright")
4965 : {
4966 1 : char const * cargv[] =
4967 : {
4968 : "tests/system-arguments",
4969 : "--copyright",
4970 : nullptr
4971 : };
4972 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
4973 1 : char ** argv = const_cast<char **>(cargv);
4974 :
4975 : // do our own try/catch because we want to test the message
4976 : // and exit code of the exception and it's easier to do it
4977 : // this way
4978 : //
4979 2 : snapdev::ostream_to_buf<char> out(std::cout);
4980 : try
4981 : {
4982 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
4983 :
4984 : // if it returns opt cannot be nullptr
4985 : //
4986 0 : CATCH_REQUIRE(opt == nullptr);
4987 : }
4988 2 : catch(advgetopt::getopt_exit const & e)
4989 : {
4990 : // this is the expected route
4991 : //
4992 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
4993 1 : CATCH_REQUIRE(e.code() == 0);
4994 1 : CATCH_REQUIRE(out.str() == "Copyright (c) 2019 Made to Order Software Corp. -- All Rights Reserved\n");
4995 : }
4996 0 : catch(std::exception const & e)
4997 : {
4998 : // no other exception is considered valid here
4999 : //
5000 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5001 : }
5002 : }
5003 :
5004 8 : CATCH_WHEN("Testing --build-date")
5005 : {
5006 1 : char const * cargv[] =
5007 : {
5008 : "tests/system-arguments",
5009 : "--build-date",
5010 : nullptr
5011 : };
5012 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5013 1 : char ** argv = const_cast<char **>(cargv);
5014 :
5015 : // do our own try/catch because we want to test the message
5016 : // and exit code of the exception and it's easier to do it
5017 : // this way
5018 : //
5019 2 : snapdev::ostream_to_buf<char> out(std::cout);
5020 : try
5021 : {
5022 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
5023 :
5024 : // if it returns opt cannot be nullptr
5025 : //
5026 0 : CATCH_REQUIRE(opt == nullptr);
5027 : }
5028 2 : catch(advgetopt::getopt_exit const & e)
5029 : {
5030 : // this is the expected route
5031 : //
5032 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5033 1 : CATCH_REQUIRE(e.code() == 0);
5034 1 : CATCH_REQUIRE(out.str() == "Built on Jun 4 2019 at 23:02:36\n");
5035 : }
5036 0 : catch(std::exception const & e)
5037 : {
5038 : // no other exception is considered valid here
5039 : //
5040 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5041 : }
5042 : }
5043 :
5044 8 : CATCH_WHEN("Testing -L (For --license)")
5045 : {
5046 1 : char const * cargv[] =
5047 : {
5048 : "tests/system-arguments",
5049 : "-L",
5050 : nullptr
5051 : };
5052 1 : int const argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
5053 1 : char ** argv = const_cast<char **>(cargv);
5054 :
5055 : // do our own try/catch because we want to test the message
5056 : // and exit code of the exception and it's easier to do it
5057 : // this way
5058 : //
5059 2 : snapdev::ostream_to_buf<char> out(std::cout);
5060 : try
5061 : {
5062 1 : advgetopt::getopt::pointer_t opt(std::make_shared<advgetopt::getopt>(options, argc, argv));
5063 :
5064 : // if it returns opt cannot be nullptr
5065 : //
5066 0 : CATCH_REQUIRE(opt == nullptr);
5067 : }
5068 2 : catch(advgetopt::getopt_exit const & e)
5069 : {
5070 : // this is the expected route
5071 : //
5072 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: system command processed."));
5073 1 : CATCH_REQUIRE(e.code() == 0);
5074 1 : CATCH_REQUIRE(out.str() == "MIT\n");
5075 : }
5076 0 : catch(std::exception const & e)
5077 : {
5078 : // no other exception is considered valid here
5079 : //
5080 0 : CATCH_REQUIRE(e.what() == std::string("no other exception was expected..."));
5081 : }
5082 : }
5083 : }
5084 : CATCH_END_SECTION()
5085 4 : }
5086 :
5087 :
5088 3 : CATCH_TEST_CASE("invalid_getopt_pointers", "[invalid][getopt][arguments]")
5089 : {
5090 2 : CATCH_START_SECTION("Create getopt with argv set to nullptr.")
5091 : {
5092 1 : advgetopt::options_environment const environment_opt;
5093 :
5094 1 : CATCH_REQUIRE_THROWS_MATCHES(
5095 : std::make_shared<advgetopt::getopt>(environment_opt, 3, nullptr)
5096 : , advgetopt::getopt_logic_error
5097 : , Catch::Matchers::ExceptionMessage(
5098 : "getopt_logic_error: argv pointer cannot be nullptr"));
5099 : }
5100 : CATCH_END_SECTION()
5101 1 : }
5102 :
5103 :
5104 4 : CATCH_TEST_CASE("invalid_getopt_missing_options", "[invalid][getopt][arguments]")
5105 : {
5106 4 : CATCH_START_SECTION("Create getopt with no options.")
5107 : {
5108 1 : advgetopt::options_environment options_empty;
5109 1 : options_empty.f_project_name = "unittest";
5110 1 : options_empty.f_options = nullptr;
5111 1 : options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
5112 :
5113 1 : char const * cargv[] =
5114 : {
5115 : "/usr/bin/arguments",
5116 : "--no-options",
5117 : nullptr
5118 : };
5119 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5120 1 : char ** argv = const_cast<char **>(cargv);
5121 :
5122 1 : CATCH_REQUIRE_THROWS_MATCHES(
5123 : std::make_shared<advgetopt::getopt>(options_empty, argc, argv)
5124 : , advgetopt::getopt_logic_error
5125 : , Catch::Matchers::ExceptionMessage(
5126 : "getopt_logic_error: an empty list of options is not legal, you must"
5127 : " defined at least one (i.e. --version, --help...)"));
5128 : }
5129 : CATCH_END_SECTION()
5130 :
5131 4 : CATCH_START_SECTION("Create getopt with an empty list of options.")
5132 : {
5133 1 : const advgetopt::option options_empty_list[] =
5134 : {
5135 : {
5136 : '\0',
5137 : advgetopt::GETOPT_FLAG_END,
5138 : nullptr,
5139 : nullptr,
5140 : nullptr,
5141 : nullptr
5142 : }
5143 : };
5144 :
5145 1 : advgetopt::options_environment options_empty;
5146 1 : options_empty.f_project_name = "unittest";
5147 1 : options_empty.f_options = options_empty_list;
5148 1 : options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
5149 :
5150 1 : char const * cargv[] =
5151 : {
5152 : "/usr/bin/arguments",
5153 : "--no-options",
5154 : nullptr
5155 : };
5156 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5157 1 : char ** argv = const_cast<char **>(cargv);
5158 :
5159 1 : CATCH_REQUIRE_THROWS_MATCHES(
5160 : std::make_shared<advgetopt::getopt>(options_empty, argc, argv)
5161 : , advgetopt::getopt_logic_error
5162 : , Catch::Matchers::ExceptionMessage(
5163 : "getopt_logic_error: an empty list of options is not legal, you must"
5164 : " defined at least one (i.e. --version, --help...)"));
5165 : }
5166 : CATCH_END_SECTION()
5167 2 : }
5168 :
5169 :
5170 6 : CATCH_TEST_CASE("invalid_getopt_missing_required_option", "[invalid][getopt][arguments][alias]")
5171 : {
5172 8 : CATCH_START_SECTION("Specify the option without a corresponding parameter.")
5173 : {
5174 1 : const advgetopt::option options[] =
5175 : {
5176 : advgetopt::define_option(
5177 : advgetopt::Name("verbose")
5178 : , advgetopt::ShortName('v')
5179 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5180 : , advgetopt::Help("print info as we work.")
5181 : ),
5182 : advgetopt::define_option(
5183 : advgetopt::Name("size")
5184 : , advgetopt::Help("The size of the line.")
5185 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5186 : , advgetopt::DefaultValue("100")
5187 : ),
5188 : advgetopt::end_options()
5189 : };
5190 :
5191 1 : advgetopt::options_environment environment_options;
5192 1 : environment_options.f_project_name = "unittest";
5193 1 : environment_options.f_options = options;
5194 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5195 :
5196 1 : char const * cargv[] =
5197 : {
5198 : "/usr/bin/arguments",
5199 : "--verbose",
5200 : "--size",
5201 : nullptr
5202 : };
5203 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5204 1 : char ** argv = const_cast<char **>(cargv);
5205 :
5206 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
5207 2 : advgetopt::getopt opt(environment_options);
5208 : try
5209 : {
5210 1 : opt.finish_parsing(argc, argv);
5211 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5212 : }
5213 2 : catch(advgetopt::getopt_exit const & e)
5214 : {
5215 1 : CATCH_REQUIRE(e.code() == 1);
5216 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5217 : }
5218 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5219 :
5220 : // check that the result is valid
5221 :
5222 : // an "invalid-parameter", MUST NOT EXIST
5223 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5224 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5225 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5226 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5227 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5228 :
5229 : // no default
5230 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5231 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5232 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5233 1 : CATCH_REQUIRE(opt.size("--") == 0);
5234 :
5235 : // the valid parameter
5236 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5237 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5238 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5239 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5240 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5241 :
5242 : // the invalid parameter
5243 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5244 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5245 1 : CATCH_REQUIRE(opt.get_default("size") == "100");
5246 1 : CATCH_REQUIRE(opt.size("size") == 0);
5247 :
5248 : // other parameters
5249 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5250 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5251 : }
5252 : CATCH_END_SECTION()
5253 :
5254 8 : CATCH_START_SECTION("Specify the option with an equal sign but without a corresponding parameter.")
5255 : {
5256 1 : const advgetopt::option options[] =
5257 : {
5258 : advgetopt::define_option(
5259 : advgetopt::Name("verbose")
5260 : , advgetopt::ShortName('v')
5261 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5262 : , advgetopt::Help("print info as we work.")
5263 : ),
5264 : advgetopt::define_option(
5265 : advgetopt::Name("size")
5266 : , advgetopt::Help("The size of the line.")
5267 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5268 : , advgetopt::DefaultValue("100")
5269 : ),
5270 : advgetopt::end_options()
5271 : };
5272 :
5273 1 : advgetopt::options_environment environment_options;
5274 1 : environment_options.f_project_name = "unittest";
5275 1 : environment_options.f_options = options;
5276 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5277 :
5278 1 : char const * cargv[] =
5279 : {
5280 : "/usr/bin/arguments",
5281 : "--verbose",
5282 : "--size=",
5283 : nullptr
5284 : };
5285 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5286 1 : char ** argv = const_cast<char **>(cargv);
5287 :
5288 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size must be given a value.");
5289 2 : advgetopt::getopt opt(environment_options);
5290 : try
5291 : {
5292 1 : opt.finish_parsing(argc, argv);
5293 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5294 : }
5295 2 : catch(advgetopt::getopt_exit const & e)
5296 : {
5297 1 : CATCH_REQUIRE(e.code() == 1);
5298 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5299 : }
5300 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5301 :
5302 : // check that the result is valid
5303 :
5304 : // an invalid parameter, MUST NOT EXIST
5305 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5306 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5307 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5308 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5309 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5310 :
5311 : // no default
5312 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5313 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5314 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5315 1 : CATCH_REQUIRE(opt.size("--") == 0);
5316 :
5317 : // the valid parameter
5318 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5319 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5320 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5321 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5322 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5323 :
5324 : // the invalid parameter
5325 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5326 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5327 1 : CATCH_REQUIRE(opt.get_default("size") == "100");
5328 1 : CATCH_REQUIRE(opt.size("size") == 0);
5329 :
5330 : // other parameters
5331 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5332 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5333 : }
5334 : CATCH_END_SECTION()
5335 :
5336 8 : CATCH_START_SECTION("Specify the option without a corresponding parameter followed by a long argument.")
5337 : {
5338 1 : const advgetopt::option options[] =
5339 : {
5340 : advgetopt::define_option(
5341 : advgetopt::Name("verbose")
5342 : , advgetopt::ShortName('v')
5343 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5344 : , advgetopt::Help("print info as we work.")
5345 : ),
5346 : advgetopt::define_option(
5347 : advgetopt::Name("size")
5348 : , advgetopt::Help("The size of the line.")
5349 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5350 : , advgetopt::DefaultValue("100")
5351 : ),
5352 : advgetopt::end_options()
5353 : };
5354 :
5355 1 : advgetopt::options_environment environment_options;
5356 1 : environment_options.f_project_name = "unittest";
5357 1 : environment_options.f_options = options;
5358 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5359 :
5360 1 : char const * cargv[] =
5361 : {
5362 : "/usr/bin/arguments",
5363 : "--size",
5364 : "--verbose",
5365 : nullptr
5366 : };
5367 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5368 1 : char ** argv = const_cast<char **>(cargv);
5369 :
5370 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
5371 2 : advgetopt::getopt opt(environment_options);
5372 : try
5373 : {
5374 1 : opt.finish_parsing(argc, argv);
5375 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5376 : }
5377 2 : catch(advgetopt::getopt_exit const & e)
5378 : {
5379 1 : CATCH_REQUIRE(e.code() == 1);
5380 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5381 : }
5382 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5383 :
5384 : // check that the result is valid
5385 :
5386 : // an invalid parameter, MUST NOT EXIST
5387 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5388 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5389 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5390 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5391 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5392 :
5393 : // no default
5394 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5395 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5396 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5397 1 : CATCH_REQUIRE(opt.size("--") == 0);
5398 :
5399 : // the valid parameter
5400 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5401 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5402 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5403 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5404 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5405 :
5406 : // the invalid parameter
5407 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5408 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5409 1 : CATCH_REQUIRE(opt.get_default("size") == "100");
5410 1 : CATCH_REQUIRE(opt.size("size") == 0);
5411 :
5412 : // other parameters
5413 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5414 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5415 : }
5416 : CATCH_END_SECTION()
5417 :
5418 8 : CATCH_START_SECTION("Specify the option without a corresponding parameter followed by a short argument.")
5419 : {
5420 1 : const advgetopt::option options[] =
5421 : {
5422 : advgetopt::define_option(
5423 : advgetopt::Name("verbose")
5424 : , advgetopt::ShortName('v')
5425 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5426 : , advgetopt::Help("print info as we work.")
5427 : ),
5428 : advgetopt::define_option(
5429 : advgetopt::Name("size")
5430 : , advgetopt::Help("The size of the line.")
5431 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
5432 : , advgetopt::DefaultValue("100")
5433 : ),
5434 : advgetopt::end_options()
5435 : };
5436 :
5437 1 : advgetopt::options_environment environment_options;
5438 1 : environment_options.f_project_name = "unittest";
5439 1 : environment_options.f_options = options;
5440 1 : environment_options.f_help_header = "Usage: use --size without a value.";
5441 :
5442 1 : char const * cargv[] =
5443 : {
5444 : "/usr/bin/arguments",
5445 : "--size",
5446 : "-v",
5447 : nullptr
5448 : };
5449 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5450 1 : char ** argv = const_cast<char **>(cargv);
5451 :
5452 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --size expects an argument.");
5453 2 : advgetopt::getopt opt(environment_options);
5454 : try
5455 : {
5456 1 : opt.finish_parsing(argc, argv);
5457 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5458 : }
5459 2 : catch(advgetopt::getopt_exit const & e)
5460 : {
5461 1 : CATCH_REQUIRE(e.code() == 1);
5462 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5463 : }
5464 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5465 :
5466 : // check that the result is valid
5467 :
5468 : // an invalid parameter, MUST NOT EXIST
5469 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5470 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5471 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5472 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5473 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5474 :
5475 : // no default
5476 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5477 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5478 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5479 1 : CATCH_REQUIRE(opt.size("--") == 0);
5480 :
5481 : // the valid parameter
5482 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5483 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5484 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5485 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5486 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5487 :
5488 : // the invalid parameter
5489 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
5490 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
5491 1 : CATCH_REQUIRE(opt.get_default("size") == "100");
5492 1 : CATCH_REQUIRE(opt.size("size") == 0);
5493 :
5494 : // other parameters
5495 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5496 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5497 : }
5498 : CATCH_END_SECTION()
5499 4 : }
5500 :
5501 :
5502 11 : CATCH_TEST_CASE("invalid_default_options", "[invalid][getopt][arguments]")
5503 : {
5504 18 : CATCH_START_SECTION("Using a standalone 'file.txt' when no default option is allowed.")
5505 : {
5506 1 : const advgetopt::option options[] =
5507 : {
5508 : advgetopt::define_option(
5509 : advgetopt::Name("verbose")
5510 : , advgetopt::ShortName('v')
5511 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5512 : , advgetopt::Help("print info as we work.")
5513 : ),
5514 : advgetopt::end_options()
5515 : };
5516 :
5517 1 : advgetopt::options_environment environment_options;
5518 1 : environment_options.f_project_name = "unittest";
5519 1 : environment_options.f_options = options;
5520 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
5521 :
5522 1 : char const * cargv[] =
5523 : {
5524 : "/usr/bin/arguments",
5525 : "--verbose",
5526 : "file.txt",
5527 : nullptr
5528 : };
5529 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5530 1 : char ** argv = const_cast<char **>(cargv);
5531 :
5532 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.");
5533 2 : advgetopt::getopt opt(environment_options);
5534 : try
5535 : {
5536 1 : opt.finish_parsing(argc, argv);
5537 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5538 : }
5539 2 : catch(advgetopt::getopt_exit const & e)
5540 : {
5541 1 : CATCH_REQUIRE(e.code() == 1);
5542 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5543 : }
5544 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5545 :
5546 : // check that the result is valid
5547 :
5548 : // an invalid parameter, MUST NOT EXIST
5549 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5550 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5551 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5552 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5553 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5554 :
5555 : // no default
5556 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5557 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5558 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5559 1 : CATCH_REQUIRE(opt.size("--") == 0);
5560 :
5561 : // the valid parameter
5562 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5563 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5564 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5565 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5566 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5567 :
5568 : // other parameters
5569 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5570 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5571 : }
5572 : CATCH_END_SECTION()
5573 :
5574 18 : CATCH_START_SECTION("Using a standalone 'file.txt' on the command line when only allowed in a variable.")
5575 : {
5576 1 : const advgetopt::option options[] =
5577 : {
5578 : advgetopt::define_option(
5579 : advgetopt::Name("verbose")
5580 : , advgetopt::ShortName('v')
5581 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5582 : , advgetopt::Help("print info as we work.")
5583 : ),
5584 : advgetopt::define_option(
5585 : advgetopt::Name("--")
5586 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
5587 : , advgetopt::Help("default option.")
5588 : ),
5589 : advgetopt::end_options()
5590 : };
5591 :
5592 1 : advgetopt::options_environment environment_options;
5593 1 : environment_options.f_project_name = "unittest";
5594 1 : environment_options.f_options = options;
5595 1 : environment_options.f_help_header = "Usage: use '--' on the command line when only allowed in the variable.";
5596 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
5597 :
5598 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "allowed.jpg");
5599 :
5600 1 : char const * cargv[] =
5601 : {
5602 : "/usr/bin/arguments",
5603 : "--verbose",
5604 : "file.txt",
5605 : nullptr
5606 : };
5607 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5608 1 : char ** argv = const_cast<char **>(cargv);
5609 :
5610 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported on the command line.");
5611 2 : advgetopt::getopt opt(environment_options);
5612 : try
5613 : {
5614 1 : opt.finish_parsing(argc, argv);
5615 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5616 : }
5617 2 : catch(advgetopt::getopt_exit const & e)
5618 : {
5619 1 : CATCH_REQUIRE(e.code() == 1);
5620 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5621 : }
5622 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5623 :
5624 : // check that the result is valid
5625 :
5626 : // an invalid parameter, MUST NOT EXIST
5627 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5628 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5629 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5630 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5631 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5632 :
5633 : // default on command line passed through
5634 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
5635 1 : CATCH_REQUIRE(opt.is_defined("--"));
5636 1 : CATCH_REQUIRE(opt.get_string("--") == "allowed.jpg");
5637 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.jpg");
5638 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5639 1 : CATCH_REQUIRE(opt.size("--") == 1);
5640 :
5641 : // the valid parameter
5642 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5643 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5644 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5645 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5646 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5647 :
5648 : // other parameters
5649 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5650 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5651 : }
5652 : CATCH_END_SECTION()
5653 :
5654 18 : CATCH_START_SECTION("Using a standalone 'file.txt' in a variable when only allowed on the command line.")
5655 : {
5656 1 : const advgetopt::option options[] =
5657 : {
5658 : advgetopt::define_option(
5659 : advgetopt::Name("verbose")
5660 : , advgetopt::ShortName('v')
5661 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5662 : , advgetopt::Help("print info as we work.")
5663 : ),
5664 : advgetopt::define_option(
5665 : advgetopt::Name("--")
5666 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
5667 : , advgetopt::Help("default option.")
5668 : ),
5669 : advgetopt::end_options()
5670 : };
5671 :
5672 1 : advgetopt::options_environment environment_options;
5673 1 : environment_options.f_project_name = "unittest";
5674 1 : environment_options.f_options = options;
5675 1 : environment_options.f_help_header = "Usage: use '--' on the command line when only allowed in the variable.";
5676 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
5677 :
5678 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "file.txt");
5679 :
5680 1 : char const * cargv[] =
5681 : {
5682 : "/usr/bin/arguments",
5683 : "--verbose",
5684 : "allowed.jpg",
5685 : nullptr
5686 : };
5687 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5688 1 : char ** argv = const_cast<char **>(cargv);
5689 :
5690 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported in the environment variable.");
5691 2 : advgetopt::getopt opt(environment_options);
5692 : try
5693 : {
5694 1 : opt.finish_parsing(argc, argv);
5695 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5696 : }
5697 2 : catch(advgetopt::getopt_exit const & e)
5698 : {
5699 1 : CATCH_REQUIRE(e.code() == 1);
5700 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5701 : }
5702 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5703 :
5704 : // check that the result is valid
5705 :
5706 : // an invalid parameter, MUST NOT EXIST
5707 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5708 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5709 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5710 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5711 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5712 :
5713 : // default on command line passed through
5714 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
5715 1 : CATCH_REQUIRE(opt.is_defined("--"));
5716 1 : CATCH_REQUIRE(opt.get_string("--") == "allowed.jpg");
5717 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.jpg");
5718 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5719 1 : CATCH_REQUIRE(opt.size("--") == 1);
5720 :
5721 : // the valid parameter
5722 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5723 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5724 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5725 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5726 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5727 :
5728 : // other parameters
5729 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5730 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5731 : }
5732 : CATCH_END_SECTION()
5733 :
5734 18 : CATCH_START_SECTION("Using a '--' when no default option is allowed.")
5735 : {
5736 1 : const advgetopt::option options[] =
5737 : {
5738 : advgetopt::define_option(
5739 : advgetopt::Name("verbose")
5740 : , advgetopt::ShortName('v')
5741 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5742 : , advgetopt::Help("print info as we work.")
5743 : ),
5744 : advgetopt::end_options()
5745 : };
5746 :
5747 1 : advgetopt::options_environment environment_options;
5748 1 : environment_options.f_project_name = "unittest";
5749 1 : environment_options.f_options = options;
5750 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
5751 :
5752 1 : char const * cargv[] =
5753 : {
5754 : "/usr/bin/arguments",
5755 : "--verbose",
5756 : "--",
5757 : "file.txt",
5758 : nullptr
5759 : };
5760 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5761 1 : char ** argv = const_cast<char **>(cargv);
5762 :
5763 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus \"--\" is not accepted by this program.");
5764 2 : advgetopt::getopt opt(environment_options);
5765 : try
5766 : {
5767 1 : opt.finish_parsing(argc, argv);
5768 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5769 : }
5770 2 : catch(advgetopt::getopt_exit const & e)
5771 : {
5772 1 : CATCH_REQUIRE(e.code() == 1);
5773 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5774 : }
5775 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5776 :
5777 : // check that the result is valid
5778 :
5779 : // an invalid parameter, MUST NOT EXIST
5780 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5781 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5782 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5783 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5784 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5785 :
5786 : // no default
5787 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
5788 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
5789 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5790 1 : CATCH_REQUIRE(opt.size("--") == 0);
5791 :
5792 : // the valid parameter
5793 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5794 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5795 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5796 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5797 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5798 :
5799 : // other parameters
5800 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5801 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5802 : }
5803 : CATCH_END_SECTION()
5804 :
5805 18 : CATCH_START_SECTION("Using a '--' when on the command line when only accepted in variables.")
5806 : {
5807 1 : const advgetopt::option options[] =
5808 : {
5809 : advgetopt::define_option(
5810 : advgetopt::Name("verbose")
5811 : , advgetopt::ShortName('v')
5812 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5813 : , advgetopt::Help("print info as we work.")
5814 : ),
5815 : advgetopt::define_option(
5816 : advgetopt::Name("--")
5817 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
5818 : , advgetopt::Help("default option.")
5819 : ),
5820 : advgetopt::end_options()
5821 : };
5822 :
5823 1 : advgetopt::options_environment environment_options;
5824 1 : environment_options.f_project_name = "unittest";
5825 1 : environment_options.f_options = options;
5826 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
5827 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
5828 :
5829 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-- allowed.txt");
5830 :
5831 1 : char const * cargv[] =
5832 : {
5833 : "/usr/bin/arguments",
5834 : "--verbose",
5835 : "--",
5836 : "file.txt",
5837 : nullptr
5838 : };
5839 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5840 1 : char ** argv = const_cast<char **>(cargv);
5841 :
5842 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--\" is not supported on the command line.");
5843 2 : advgetopt::getopt opt(environment_options);
5844 : try
5845 : {
5846 1 : opt.finish_parsing(argc, argv);
5847 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5848 : }
5849 2 : catch(advgetopt::getopt_exit const & e)
5850 : {
5851 1 : CATCH_REQUIRE(e.code() == 1);
5852 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5853 : }
5854 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5855 :
5856 : // check that the result is valid
5857 :
5858 : // an invalid parameter, MUST NOT EXIST
5859 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5860 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5861 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5862 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5863 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5864 :
5865 : // no default
5866 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
5867 1 : CATCH_REQUIRE(opt.is_defined("--"));
5868 1 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
5869 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
5870 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5871 1 : CATCH_REQUIRE(opt.size("--") == 1);
5872 :
5873 : // the valid parameter
5874 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5875 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5876 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5877 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5878 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5879 :
5880 : // other parameters
5881 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5882 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5883 : }
5884 : CATCH_END_SECTION()
5885 :
5886 18 : CATCH_START_SECTION("Using a '--' in the environment variable when only accepted on the command line.")
5887 : {
5888 1 : const advgetopt::option options[] =
5889 : {
5890 : advgetopt::define_option(
5891 : advgetopt::Name("verbose")
5892 : , advgetopt::ShortName('v')
5893 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5894 : , advgetopt::Help("print info as we work.")
5895 : ),
5896 : advgetopt::define_option(
5897 : advgetopt::Name("--")
5898 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
5899 : , advgetopt::Help("default option.")
5900 : ),
5901 : advgetopt::end_options()
5902 : };
5903 :
5904 1 : advgetopt::options_environment environment_options;
5905 1 : environment_options.f_project_name = "unittest";
5906 1 : environment_options.f_options = options;
5907 1 : environment_options.f_help_header = "Usage: use '--' when no default option was defined.";
5908 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
5909 :
5910 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", " -- file.txt ");
5911 :
5912 1 : char const * cargv[] =
5913 : {
5914 : "/usr/bin/arguments",
5915 : "--verbose",
5916 : "--",
5917 : "allowed.txt",
5918 : nullptr
5919 : };
5920 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5921 1 : char ** argv = const_cast<char **>(cargv);
5922 :
5923 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--\" is not supported in the environment variable.");
5924 2 : advgetopt::getopt opt(environment_options);
5925 : try
5926 : {
5927 1 : opt.finish_parsing(argc, argv);
5928 0 : CATCH_REQUIRE(false); // the library is expected to throw here
5929 : }
5930 2 : catch(advgetopt::getopt_exit const & e)
5931 : {
5932 1 : CATCH_REQUIRE(e.code() == 1);
5933 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
5934 : }
5935 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
5936 :
5937 : // check that the result is valid
5938 :
5939 : // an invalid parameter, MUST NOT EXIST
5940 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
5941 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
5942 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
5943 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
5944 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
5945 :
5946 : // no default
5947 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
5948 1 : CATCH_REQUIRE(opt.is_defined("--"));
5949 1 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
5950 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
5951 1 : CATCH_REQUIRE(opt.get_default("--").empty());
5952 1 : CATCH_REQUIRE(opt.size("--") == 1);
5953 :
5954 : // the valid parameter
5955 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
5956 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
5957 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
5958 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
5959 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
5960 :
5961 : // other parameters
5962 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
5963 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
5964 : }
5965 : CATCH_END_SECTION()
5966 :
5967 18 : CATCH_START_SECTION("Using a '-' when no default option is allowed.")
5968 : {
5969 1 : const advgetopt::option options[] =
5970 : {
5971 : advgetopt::define_option(
5972 : advgetopt::Name("verbose")
5973 : , advgetopt::ShortName('v')
5974 : , advgetopt::Flags(advgetopt::standalone_command_flags())
5975 : , advgetopt::Help("print info as we work.")
5976 : ),
5977 : advgetopt::end_options()
5978 : };
5979 :
5980 1 : advgetopt::options_environment environment_options;
5981 1 : environment_options.f_project_name = "unittest";
5982 1 : environment_options.f_options = options;
5983 1 : environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
5984 :
5985 1 : char const * cargv[] =
5986 : {
5987 : "/usr/bin/arguments",
5988 : "--verbose",
5989 : "-",
5990 : "file.txt",
5991 : nullptr
5992 : };
5993 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
5994 1 : char ** argv = const_cast<char **>(cargv);
5995 :
5996 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus \"-\" is not accepted by this program.");
5997 2 : advgetopt::getopt opt(environment_options);
5998 : try
5999 : {
6000 1 : opt.finish_parsing(argc, argv);
6001 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6002 : }
6003 2 : catch(advgetopt::getopt_exit const & e)
6004 : {
6005 1 : CATCH_REQUIRE(e.code() == 1);
6006 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6007 : }
6008 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6009 :
6010 : // check that the result is valid
6011 :
6012 : // an invalid parameter, MUST NOT EXIST
6013 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6014 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6015 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6016 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6017 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6018 :
6019 : // no default
6020 1 : CATCH_REQUIRE(opt.get_option("--") == nullptr);
6021 1 : CATCH_REQUIRE_FALSE(opt.is_defined("--"));
6022 1 : CATCH_REQUIRE(opt.get_default("--").empty());
6023 1 : CATCH_REQUIRE(opt.size("--") == 0);
6024 :
6025 : // the valid parameter
6026 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6027 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6028 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6029 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6030 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
6031 :
6032 : // other parameters
6033 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6034 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6035 : }
6036 : CATCH_END_SECTION()
6037 :
6038 18 : CATCH_START_SECTION("Using a '-' when on the command line when only accepted in variables.")
6039 : {
6040 1 : const advgetopt::option options[] =
6041 : {
6042 : advgetopt::define_option(
6043 : advgetopt::Name("verbose")
6044 : , advgetopt::ShortName('v')
6045 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6046 : , advgetopt::Help("print info as we work.")
6047 : ),
6048 : advgetopt::define_option(
6049 : advgetopt::Name("--")
6050 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
6051 : , advgetopt::Help("default option.")
6052 : ),
6053 : advgetopt::end_options()
6054 : };
6055 :
6056 1 : advgetopt::options_environment environment_options;
6057 1 : environment_options.f_project_name = "unittest";
6058 1 : environment_options.f_options = options;
6059 1 : environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
6060 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6061 :
6062 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "- allowed.txt");
6063 :
6064 1 : char const * cargv[] =
6065 : {
6066 : "/usr/bin/arguments",
6067 : "--verbose",
6068 : "-",
6069 : "file.txt",
6070 : nullptr
6071 : };
6072 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6073 1 : char ** argv = const_cast<char **>(cargv);
6074 :
6075 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-\" is not supported on the command line.");
6076 2 : advgetopt::getopt opt(environment_options);
6077 : try
6078 : {
6079 1 : opt.finish_parsing(argc, argv);
6080 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6081 : }
6082 2 : catch(advgetopt::getopt_exit const & e)
6083 : {
6084 1 : CATCH_REQUIRE(e.code() == 1);
6085 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6086 : }
6087 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6088 :
6089 : // check that the result is valid
6090 :
6091 : // an invalid parameter, MUST NOT EXIST
6092 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6093 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6094 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6095 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6096 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6097 :
6098 : // no default
6099 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
6100 1 : CATCH_REQUIRE(opt.is_defined("--"));
6101 1 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
6102 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
6103 1 : CATCH_REQUIRE(opt.get_default("--").empty());
6104 1 : CATCH_REQUIRE(opt.size("--") == 1);
6105 :
6106 : // the valid parameter
6107 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6108 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6109 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6110 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6111 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
6112 :
6113 : // other parameters
6114 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6115 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6116 : }
6117 : CATCH_END_SECTION()
6118 :
6119 18 : CATCH_START_SECTION("Using a '-' in the environment variable when only accepted on the command line.")
6120 : {
6121 1 : const advgetopt::option options[] =
6122 : {
6123 : advgetopt::define_option(
6124 : advgetopt::Name("verbose")
6125 : , advgetopt::ShortName('v')
6126 : , advgetopt::Flags(advgetopt::standalone_command_flags())
6127 : , advgetopt::Help("print info as we work.")
6128 : ),
6129 : advgetopt::define_option(
6130 : advgetopt::Name("--")
6131 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_DEFAULT_OPTION>())
6132 : , advgetopt::Help("default option.")
6133 : ),
6134 : advgetopt::end_options()
6135 : };
6136 :
6137 1 : advgetopt::options_environment environment_options;
6138 1 : environment_options.f_project_name = "unittest";
6139 1 : environment_options.f_options = options;
6140 1 : environment_options.f_help_header = "Usage: use '-' when no default option was defined.";
6141 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6142 :
6143 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", " - file.txt ");
6144 :
6145 1 : char const * cargv[] =
6146 : {
6147 : "/usr/bin/arguments",
6148 : "--verbose",
6149 : "-",
6150 : "allowed.txt",
6151 : nullptr
6152 : };
6153 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6154 1 : char ** argv = const_cast<char **>(cargv);
6155 :
6156 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-\" is not supported in the environment variable.");
6157 2 : advgetopt::getopt opt(environment_options);
6158 : try
6159 : {
6160 1 : opt.finish_parsing(argc, argv);
6161 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6162 : }
6163 2 : catch(advgetopt::getopt_exit const & e)
6164 : {
6165 1 : CATCH_REQUIRE(e.code() == 1);
6166 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6167 : }
6168 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6169 :
6170 : // check that the result is valid
6171 :
6172 : // an invalid parameter, MUST NOT EXIST
6173 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6174 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6175 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6176 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6177 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6178 :
6179 : // no default
6180 1 : CATCH_REQUIRE(opt.get_option("--") != nullptr);
6181 1 : CATCH_REQUIRE(opt.is_defined("--"));
6182 1 : CATCH_REQUIRE(opt.get_string("--") == "allowed.txt");
6183 1 : CATCH_REQUIRE(opt.get_string("--", 0) == "allowed.txt");
6184 1 : CATCH_REQUIRE(opt.get_default("--").empty());
6185 1 : CATCH_REQUIRE(opt.size("--") == 1);
6186 :
6187 : // the valid parameter
6188 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6189 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6190 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6191 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6192 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
6193 :
6194 : // other parameters
6195 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6196 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6197 : }
6198 : CATCH_END_SECTION()
6199 9 : }
6200 :
6201 :
6202 9 : CATCH_TEST_CASE("invalid_options", "[invalid][getopt][arguments]")
6203 : {
6204 14 : CATCH_START_SECTION("Long option with an equal sign but not name.")
6205 : {
6206 1 : const advgetopt::option options[] =
6207 : {
6208 : advgetopt::define_option(
6209 : advgetopt::Name("size")
6210 : , advgetopt::ShortName('s')
6211 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6212 : , advgetopt::Help("define the size.")
6213 : ),
6214 : advgetopt::end_options()
6215 : };
6216 :
6217 1 : advgetopt::options_environment environment_options;
6218 1 : environment_options.f_project_name = "unittest";
6219 1 : environment_options.f_options = options;
6220 1 : environment_options.f_help_header = "Usage: use a long name option without the long name.";
6221 :
6222 1 : char const * cargv[] =
6223 : {
6224 : "/usr/bin/arguments",
6225 : "--=591",
6226 : nullptr
6227 : };
6228 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6229 1 : char ** argv = const_cast<char **>(cargv);
6230 :
6231 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: name missing in \"--=591\".");
6232 2 : advgetopt::getopt opt(environment_options);
6233 : try
6234 : {
6235 1 : opt.finish_parsing(argc, argv);
6236 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6237 : }
6238 2 : catch(advgetopt::getopt_exit const & e)
6239 : {
6240 1 : CATCH_REQUIRE(e.code() == 1);
6241 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6242 : }
6243 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6244 :
6245 : // check that the result is valid
6246 :
6247 : // an invalid parameter, MUST NOT EXIST
6248 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6249 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6250 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6251 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6252 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6253 :
6254 : // the valid parameter
6255 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6256 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6257 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
6258 1 : CATCH_REQUIRE(opt.get_default("size").empty());
6259 1 : CATCH_REQUIRE(opt.size("size") == 0);
6260 :
6261 : // other parameters
6262 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6263 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6264 : }
6265 : CATCH_END_SECTION()
6266 :
6267 14 : CATCH_START_SECTION("Unknown long option.")
6268 : {
6269 1 : const advgetopt::option options[] =
6270 : {
6271 : advgetopt::define_option(
6272 : advgetopt::Name("size")
6273 : , advgetopt::ShortName('s')
6274 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6275 : , advgetopt::Help("define the size.")
6276 : ),
6277 : advgetopt::end_options()
6278 : };
6279 :
6280 1 : advgetopt::options_environment environment_options;
6281 1 : environment_options.f_project_name = "unittest";
6282 1 : environment_options.f_options = options;
6283 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6284 :
6285 1 : char const * cargv[] =
6286 : {
6287 : "/usr/bin/arguments",
6288 : "--unknown=568",
6289 : nullptr
6290 : };
6291 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6292 1 : char ** argv = const_cast<char **>(cargv);
6293 :
6294 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--unknown\" is not supported.");
6295 2 : advgetopt::getopt opt(environment_options);
6296 : try
6297 : {
6298 1 : opt.finish_parsing(argc, argv);
6299 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6300 : }
6301 2 : catch(advgetopt::getopt_exit const & e)
6302 : {
6303 1 : CATCH_REQUIRE(e.code() == 1);
6304 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6305 : }
6306 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6307 :
6308 : // check that the result is valid
6309 :
6310 : // an invalid parameter, MUST NOT EXIST
6311 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6312 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6313 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6314 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6315 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6316 :
6317 : // the valid parameter
6318 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6319 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6320 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
6321 1 : CATCH_REQUIRE(opt.get_default("size").empty());
6322 1 : CATCH_REQUIRE(opt.size("size") == 0);
6323 :
6324 : // other parameters
6325 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6326 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6327 : }
6328 : CATCH_END_SECTION()
6329 :
6330 14 : CATCH_START_SECTION("Long option not available in environment variable.")
6331 : {
6332 1 : const advgetopt::option options[] =
6333 : {
6334 : advgetopt::define_option(
6335 : advgetopt::Name("size")
6336 : , advgetopt::ShortName('s')
6337 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6338 : , advgetopt::Help("define the size.")
6339 : ),
6340 : advgetopt::end_options()
6341 : };
6342 :
6343 1 : advgetopt::options_environment environment_options;
6344 1 : environment_options.f_project_name = "unittest";
6345 1 : environment_options.f_options = options;
6346 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6347 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6348 :
6349 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--size 4551");
6350 :
6351 1 : char const * cargv[] =
6352 : {
6353 : "/usr/bin/arguments",
6354 : "--size=568",
6355 : nullptr
6356 : };
6357 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6358 1 : char ** argv = const_cast<char **>(cargv);
6359 :
6360 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--size\" is not supported in the environment variable.");
6361 2 : advgetopt::getopt opt(environment_options);
6362 : try
6363 : {
6364 1 : opt.finish_parsing(argc, argv);
6365 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6366 : }
6367 2 : catch(advgetopt::getopt_exit const & e)
6368 : {
6369 1 : CATCH_REQUIRE(e.code() == 1);
6370 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6371 : }
6372 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6373 :
6374 : // check that the result is valid
6375 :
6376 : // an invalid parameter, MUST NOT EXIST
6377 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6378 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6379 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6380 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6381 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6382 :
6383 : // the valid parameter
6384 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6385 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6386 1 : CATCH_REQUIRE(opt.is_defined("size"));
6387 1 : CATCH_REQUIRE(opt.get_string("size") == "568");
6388 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "568");
6389 1 : CATCH_REQUIRE(opt.get_long("size") == 568);
6390 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 568);
6391 1 : CATCH_REQUIRE(opt.get_default("size").empty());
6392 1 : CATCH_REQUIRE(opt.size("size") == 1);
6393 :
6394 : // other parameters
6395 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6396 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6397 : }
6398 : CATCH_END_SECTION()
6399 :
6400 14 : CATCH_START_SECTION("Long option not available on command line.")
6401 : {
6402 1 : const advgetopt::option options[] =
6403 : {
6404 : advgetopt::define_option(
6405 : advgetopt::Name("size")
6406 : , advgetopt::ShortName('s')
6407 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6408 : , advgetopt::Help("define the size.")
6409 : , advgetopt::DefaultValue("331")
6410 : ),
6411 : advgetopt::end_options()
6412 : };
6413 :
6414 1 : advgetopt::options_environment environment_options;
6415 1 : environment_options.f_project_name = "unittest";
6416 1 : environment_options.f_options = options;
6417 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6418 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6419 :
6420 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--size 4551");
6421 :
6422 1 : char const * cargv[] =
6423 : {
6424 : "/usr/bin/arguments",
6425 : "--size=568",
6426 : nullptr
6427 : };
6428 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6429 1 : char ** argv = const_cast<char **>(cargv);
6430 :
6431 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"--size\" is not supported on the command line.");
6432 2 : advgetopt::getopt opt(environment_options);
6433 : try
6434 : {
6435 1 : opt.finish_parsing(argc, argv);
6436 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6437 : }
6438 2 : catch(advgetopt::getopt_exit const & e)
6439 : {
6440 1 : CATCH_REQUIRE(e.code() == 1);
6441 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6442 : }
6443 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6444 :
6445 : // check that the result is valid
6446 :
6447 : // an invalid parameter, MUST NOT EXIST
6448 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6449 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6450 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6451 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6452 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6453 :
6454 : // the valid parameter
6455 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6456 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6457 1 : CATCH_REQUIRE(opt.is_defined("size"));
6458 1 : CATCH_REQUIRE(opt.get_string("size") == "4551");
6459 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "4551");
6460 1 : CATCH_REQUIRE(opt.get_long("size") == 4551);
6461 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 4551);
6462 1 : CATCH_REQUIRE(opt.get_default("size") == "331");
6463 1 : CATCH_REQUIRE(opt.size("size") == 1);
6464 :
6465 : // other parameters
6466 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6467 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6468 : }
6469 : CATCH_END_SECTION()
6470 :
6471 14 : CATCH_START_SECTION("Unknown short option.")
6472 : {
6473 1 : const advgetopt::option options[] =
6474 : {
6475 : advgetopt::define_option(
6476 : advgetopt::Name("verbose")
6477 : , advgetopt::ShortName('v')
6478 : , advgetopt::Flags(advgetopt::standalone_command_flags<>())
6479 : , advgetopt::Help("tell you about our work here.")
6480 : ),
6481 : advgetopt::define_option(
6482 : advgetopt::Name("size")
6483 : , advgetopt::ShortName('s')
6484 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6485 : , advgetopt::Help("define the size.")
6486 : ),
6487 : advgetopt::end_options()
6488 : };
6489 :
6490 1 : advgetopt::options_environment environment_options;
6491 1 : environment_options.f_project_name = "unittest";
6492 1 : environment_options.f_options = options;
6493 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6494 :
6495 1 : char const * cargv[] =
6496 : {
6497 : "/usr/bin/arguments",
6498 : "-vq 568",
6499 : nullptr
6500 : };
6501 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6502 1 : char ** argv = const_cast<char **>(cargv);
6503 :
6504 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-q\" is not supported.");
6505 2 : advgetopt::getopt opt(environment_options);
6506 : try
6507 : {
6508 1 : opt.finish_parsing(argc, argv);
6509 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6510 : }
6511 2 : catch(advgetopt::getopt_exit const & e)
6512 : {
6513 1 : CATCH_REQUIRE(e.code() == 1);
6514 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6515 : }
6516 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6517 :
6518 : // check that the result is valid
6519 :
6520 : // an invalid parameter, MUST NOT EXIST
6521 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6522 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6523 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6524 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6525 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6526 :
6527 : // verbose
6528 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6529 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6530 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6531 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6532 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6533 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
6534 :
6535 : // the valid parameter
6536 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6537 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6538 1 : CATCH_REQUIRE_FALSE(opt.is_defined("size"));
6539 1 : CATCH_REQUIRE(opt.get_default("size").empty());
6540 1 : CATCH_REQUIRE(opt.size("size") == 0);
6541 :
6542 : // other parameters
6543 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6544 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6545 : }
6546 : CATCH_END_SECTION()
6547 :
6548 14 : CATCH_START_SECTION("Short option not available in environment variable.")
6549 : {
6550 1 : const advgetopt::option options[] =
6551 : {
6552 : advgetopt::define_option(
6553 : advgetopt::Name("size")
6554 : , advgetopt::ShortName('s')
6555 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6556 : , advgetopt::Help("define the size.")
6557 : ),
6558 : advgetopt::define_option(
6559 : advgetopt::Name("verbose")
6560 : , advgetopt::ShortName('v')
6561 : , advgetopt::Flags(advgetopt::standalone_command_flags<>())
6562 : , advgetopt::Help("tell you about our work here.")
6563 : ),
6564 : advgetopt::end_options()
6565 : };
6566 :
6567 1 : advgetopt::options_environment environment_options;
6568 1 : environment_options.f_project_name = "unittest";
6569 1 : environment_options.f_options = options;
6570 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6571 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6572 :
6573 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-s 4551");
6574 :
6575 1 : char const * cargv[] =
6576 : {
6577 : "/usr/bin/arguments",
6578 : "-sv",
6579 : "568",
6580 : nullptr
6581 : };
6582 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6583 1 : char ** argv = const_cast<char **>(cargv);
6584 :
6585 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-s\" is not supported in the environment variable.");
6586 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.");
6587 2 : advgetopt::getopt opt(environment_options);
6588 : try
6589 : {
6590 1 : opt.finish_parsing(argc, argv);
6591 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6592 : }
6593 2 : catch(advgetopt::getopt_exit const & e)
6594 : {
6595 1 : CATCH_REQUIRE(e.code() == 1);
6596 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6597 : }
6598 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6599 :
6600 : // check that the result is valid
6601 :
6602 : // an invalid parameter, MUST NOT EXIST
6603 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6604 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6605 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6606 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6607 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6608 :
6609 : // the valid parameter
6610 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6611 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6612 1 : CATCH_REQUIRE(opt.is_defined("size"));
6613 1 : CATCH_REQUIRE(opt.get_string("size") == "568");
6614 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "568");
6615 1 : CATCH_REQUIRE(opt.get_long("size") == 568);
6616 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 568);
6617 1 : CATCH_REQUIRE(opt.get_default("size").empty());
6618 1 : CATCH_REQUIRE(opt.size("size") == 1);
6619 :
6620 : // verbose
6621 1 : CATCH_REQUIRE(opt.get_option("verbose") != nullptr);
6622 1 : CATCH_REQUIRE(opt.get_option('v') != nullptr);
6623 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6624 1 : CATCH_REQUIRE(opt.is_defined("verbose"));
6625 1 : CATCH_REQUIRE(opt.get_default("verbose").empty());
6626 1 : CATCH_REQUIRE(opt.size("verbose") == 1);
6627 :
6628 : // other parameters
6629 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6630 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6631 : }
6632 : CATCH_END_SECTION()
6633 :
6634 14 : CATCH_START_SECTION("Long option not available on command line.")
6635 : {
6636 1 : const advgetopt::option options[] =
6637 : {
6638 : advgetopt::define_option(
6639 : advgetopt::Name("size")
6640 : , advgetopt::ShortName('s')
6641 : , advgetopt::Flags(advgetopt::var_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
6642 : , advgetopt::Help("define the size.")
6643 : , advgetopt::DefaultValue("331")
6644 : ),
6645 : advgetopt::define_option(
6646 : advgetopt::Name("verbose")
6647 : , advgetopt::ShortName('v')
6648 : , advgetopt::Flags(advgetopt::standalone_command_flags<>())
6649 : , advgetopt::Help("tell you about our work here.")
6650 : ),
6651 : advgetopt::end_options()
6652 : };
6653 :
6654 1 : advgetopt::options_environment environment_options;
6655 1 : environment_options.f_project_name = "unittest";
6656 1 : environment_options.f_options = options;
6657 1 : environment_options.f_help_header = "Usage: use an unknown long option.";
6658 1 : environment_options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6659 :
6660 2 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-s 4551");
6661 :
6662 1 : char const * cargv[] =
6663 : {
6664 : "/usr/bin/arguments",
6665 : "-sv 568",
6666 : nullptr
6667 : };
6668 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
6669 1 : char ** argv = const_cast<char **>(cargv);
6670 :
6671 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"-s\" is not supported on the command line.");
6672 : //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.");
6673 2 : advgetopt::getopt opt(environment_options);
6674 : try
6675 : {
6676 1 : opt.finish_parsing(argc, argv);
6677 0 : CATCH_REQUIRE(false); // the library is expected to throw here
6678 : }
6679 2 : catch(advgetopt::getopt_exit const & e)
6680 : {
6681 1 : CATCH_REQUIRE(e.code() == 1);
6682 1 : CATCH_REQUIRE(e.what() == std::string("getopt_exception: errors were found on your command line, environment variable, or configuration file."));
6683 : }
6684 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
6685 :
6686 : // check that the result is valid
6687 :
6688 : // an invalid parameter, MUST NOT EXIST
6689 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
6690 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
6691 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
6692 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
6693 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
6694 :
6695 : // the valid parameter
6696 1 : CATCH_REQUIRE(opt.get_option("size") != nullptr);
6697 1 : CATCH_REQUIRE(opt.get_option('s') != nullptr);
6698 1 : CATCH_REQUIRE(opt.is_defined("size"));
6699 1 : CATCH_REQUIRE(opt.get_string("size") == "4551");
6700 1 : CATCH_REQUIRE(opt.get_string("size", 0) == "4551");
6701 1 : CATCH_REQUIRE(opt.get_long("size") == 4551);
6702 1 : CATCH_REQUIRE(opt.get_long("size", 0) == 4551);
6703 1 : CATCH_REQUIRE(opt.get_default("size") == "331");
6704 1 : CATCH_REQUIRE(opt.size("size") == 1);
6705 :
6706 : // other parameters
6707 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
6708 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
6709 : }
6710 : CATCH_END_SECTION()
6711 13 : }
6712 :
6713 :
6714 : #if 0
6715 : // TODO: break this out in sections and even multiple tests
6716 : // the old version would check a command set of options which is
6717 : // not required (doable/useful) with version 2.x
6718 : //
6719 : // also this test used to work but now that I heavily changed
6720 : // the configuration file loading process (specifically, added
6721 : // the cache), it fails since this test assumed that you can
6722 : // load a new copy of the same file over and over again
6723 :
6724 : CATCH_TEST_CASE("invalid_parameters", "[invalid][getopt][arguments]")
6725 : {
6726 :
6727 : CATCH_START_SECTION("Check all possible invalid argument")
6728 : {
6729 : // default arguments
6730 : //
6731 : char const * cargv[] =
6732 : {
6733 : "tests/unittests/invalid_parameters",
6734 : "--ignore-parameters",
6735 : nullptr
6736 : };
6737 : const int argc = sizeof(cargv) / sizeof(cargv[0]) - 1;
6738 : char **argv = const_cast<char **>(cargv);
6739 :
6740 : // no options available
6741 : //
6742 : const advgetopt::option options_empty_list[] =
6743 : {
6744 : {
6745 : '\0',
6746 : advgetopt::GETOPT_FLAG_END,
6747 : nullptr,
6748 : nullptr,
6749 : nullptr,
6750 : nullptr
6751 : }
6752 : };
6753 :
6754 : advgetopt::options_environment options_empty;
6755 : options_empty.f_project_name = "unittest";
6756 : options_empty.f_options = options_empty_list;
6757 : options_empty.f_help_header = "Usage: try this one and we get a throw (empty list)";
6758 :
6759 : {
6760 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_empty, argc, argv), advgetopt::getopt_logic_error);
6761 : }
6762 :
6763 : // option without a name and "wrong" type
6764 : //
6765 : const advgetopt::option options_no_name_list[] =
6766 : {
6767 : {
6768 : '\0',
6769 : advgetopt::GETOPT_FLAG_REQUIRED,
6770 : nullptr,
6771 : "we can have a default though",
6772 : nullptr,
6773 : nullptr
6774 : },
6775 : {
6776 : '\0',
6777 : advgetopt::GETOPT_FLAG_END,
6778 : nullptr,
6779 : nullptr,
6780 : nullptr,
6781 : nullptr
6782 : }
6783 : };
6784 :
6785 : advgetopt::options_environment options_no_name;
6786 : options_no_name.f_project_name = "unittest";
6787 : options_no_name.f_options = options_no_name_list;
6788 : options_no_name.f_help_header = "Usage: try this one and we get a throw (no name)";
6789 :
6790 : {
6791 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_no_name, argc, argv), advgetopt::getopt_logic_error);
6792 : }
6793 :
6794 : // long options must be 2+ characters
6795 : //
6796 : const advgetopt::option options_2chars_minimum_list[] =
6797 : {
6798 : {
6799 : '\0',
6800 : advgetopt::GETOPT_FLAG_MULTIPLE,
6801 : "", // cannot be empty string (use nullptr instead)
6802 : nullptr,
6803 : "long option must be 2 characters long at least",
6804 : nullptr
6805 : },
6806 : {
6807 : '\0',
6808 : advgetopt::GETOPT_FLAG_END,
6809 : nullptr,
6810 : nullptr,
6811 : nullptr,
6812 : nullptr
6813 : }
6814 : };
6815 :
6816 : advgetopt::options_environment options_2chars_minimum;
6817 : options_2chars_minimum.f_project_name = "unittest";
6818 : options_2chars_minimum.f_options = options_2chars_minimum_list;
6819 : options_2chars_minimum.f_help_header = "Usage: try this one and we get a throw (2 chars minimum)";
6820 :
6821 : {
6822 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_2chars_minimum, argc, argv), advgetopt::getopt_logic_error);
6823 : }
6824 :
6825 : // long options must be 2+ characters
6826 : //
6827 : const advgetopt::option options_2chars_minimum2_list[] =
6828 : {
6829 : {
6830 : '\0',
6831 : advgetopt::GETOPT_FLAG_MULTIPLE,
6832 : "f", // cannot be 1 character
6833 : nullptr,
6834 : "long option must be 2 characters long at least",
6835 : nullptr
6836 : },
6837 : {
6838 : '\0',
6839 : advgetopt::GETOPT_FLAG_END,
6840 : nullptr,
6841 : nullptr,
6842 : nullptr,
6843 : nullptr
6844 : }
6845 : };
6846 :
6847 : advgetopt::options_environment options_2chars_minimum2;
6848 : options_2chars_minimum2.f_project_name = "unittest";
6849 : options_2chars_minimum2.f_options = options_2chars_minimum2_list;
6850 : options_2chars_minimum2.f_help_header = "Usage: try this one and we get a throw (2 chars minimum 2nd)";
6851 :
6852 : {
6853 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_2chars_minimum2, argc, argv), advgetopt::getopt_logic_error);
6854 : }
6855 :
6856 : // same long option defined twice
6857 : //
6858 : const advgetopt::option options_defined_twice_list[] =
6859 : {
6860 : {
6861 : '\0',
6862 : advgetopt::GETOPT_FLAG_REQUIRED,
6863 : "filename",
6864 : nullptr,
6865 : "options must be unique",
6866 : nullptr
6867 : },
6868 : {
6869 : '\0',
6870 : advgetopt::GETOPT_FLAG_REQUIRED,
6871 : "filename", // copy/paste problem maybe?
6872 : nullptr,
6873 : "options must be unique",
6874 : nullptr
6875 : },
6876 : {
6877 : '\0',
6878 : advgetopt::GETOPT_FLAG_END,
6879 : nullptr,
6880 : nullptr,
6881 : nullptr,
6882 : nullptr
6883 : }
6884 : };
6885 :
6886 : advgetopt::options_environment options_defined_twice;
6887 : options_defined_twice.f_project_name = "unittest";
6888 : options_defined_twice.f_options = options_defined_twice_list;
6889 : options_defined_twice.f_help_header = "Usage: try this one and we get a throw (long defined twice)";
6890 :
6891 : {
6892 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_defined_twice, argc, argv), advgetopt::getopt_logic_error);
6893 : }
6894 :
6895 : // same short option defined twice
6896 : //
6897 : const advgetopt::option options_short_defined_twice_list[] =
6898 : {
6899 : {
6900 : 'f',
6901 : advgetopt::GETOPT_FLAG_REQUIRED,
6902 : "from",
6903 : nullptr,
6904 : "options must be unique",
6905 : nullptr
6906 : },
6907 : {
6908 : 'f',
6909 : advgetopt::GETOPT_FLAG_REQUIRED,
6910 : "to",
6911 : nullptr,
6912 : "options must be unique",
6913 : nullptr
6914 : },
6915 : {
6916 : '\0',
6917 : advgetopt::GETOPT_FLAG_END,
6918 : nullptr,
6919 : nullptr,
6920 : nullptr,
6921 : nullptr
6922 : }
6923 : };
6924 :
6925 : advgetopt::options_environment options_short_defined_twice;
6926 : options_short_defined_twice.f_project_name = "unittest";
6927 : options_short_defined_twice.f_options = options_short_defined_twice_list;
6928 : options_short_defined_twice.f_help_header = "Usage: try this one and we get a throw (short defined twice)";
6929 : options_short_defined_twice.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
6930 :
6931 : {
6932 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_short_defined_twice, argc, argv), advgetopt::getopt_logic_error);
6933 : }
6934 :
6935 : // 2 default_multiple_argument's in the same list is invalid
6936 : //
6937 : const advgetopt::option options_two_default_multiple_arguments_list[] =
6938 : {
6939 : {
6940 : '\0',
6941 : advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
6942 : "filenames",
6943 : nullptr,
6944 : "other parameters are viewed as filenames",
6945 : nullptr
6946 : },
6947 : {
6948 : '\0',
6949 : advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
6950 : "more",
6951 : nullptr,
6952 : "yet other parameters are viewed as \"more\" data--here it breaks, one default max.",
6953 : nullptr
6954 : },
6955 : {
6956 : '\0',
6957 : advgetopt::GETOPT_FLAG_END,
6958 : nullptr,
6959 : nullptr,
6960 : nullptr,
6961 : nullptr
6962 : }
6963 : };
6964 :
6965 : advgetopt::options_environment options_two_default_multiple_arguments;
6966 : options_two_default_multiple_arguments.f_project_name = "unittest";
6967 : options_two_default_multiple_arguments.f_options = options_two_default_multiple_arguments_list;
6968 : options_two_default_multiple_arguments.f_help_header = "Usage: try this one and we get a throw (two defaults by flag, multiple args)";
6969 :
6970 : {
6971 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_two_default_multiple_arguments, argc, argv), advgetopt::getopt_logic_error);
6972 : }
6973 :
6974 : // 2 default_argument's in the same list is invalid
6975 : //
6976 : const advgetopt::option options_two_default_arguments_list[] =
6977 : {
6978 : {
6979 : '\0',
6980 : 0,
6981 : "--",
6982 : nullptr,
6983 : "one other parameter is viewed as a filename",
6984 : nullptr
6985 : },
6986 : {
6987 : '\0',
6988 : 0,
6989 : "--",
6990 : nullptr,
6991 : "yet other parameter viewed as \"more\" data--here it breaks, one default max.",
6992 : nullptr
6993 : },
6994 : {
6995 : '\0',
6996 : advgetopt::GETOPT_FLAG_END,
6997 : nullptr,
6998 : nullptr,
6999 : nullptr,
7000 : nullptr
7001 : }
7002 : };
7003 :
7004 : advgetopt::options_environment options_two_default_arguments;
7005 : options_two_default_arguments.f_project_name = "unittest";
7006 : options_two_default_arguments.f_options = options_two_default_arguments_list;
7007 : options_two_default_arguments.f_help_header = "Usage: try this one and we get a throw (two default args by name)";
7008 :
7009 : {
7010 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_two_default_arguments, argc, argv), advgetopt::getopt_logic_error);
7011 : }
7012 :
7013 : // mix of default arguments in the same list is invalid
7014 : //
7015 : const advgetopt::option options_mix_of_default_list[] =
7016 : {
7017 : {
7018 : '\0',
7019 : advgetopt::GETOPT_FLAG_MULTIPLE,
7020 : "--",
7021 : nullptr,
7022 : "other parameters are viewed as filenames",
7023 : nullptr
7024 : },
7025 : {
7026 : '\0',
7027 : 0,
7028 : "--",
7029 : nullptr,
7030 : "yet other parameter viewed as \"more\" data--here it breaks, one default max.",
7031 : nullptr
7032 : },
7033 : {
7034 : '\0',
7035 : advgetopt::GETOPT_FLAG_END,
7036 : nullptr,
7037 : nullptr,
7038 : nullptr,
7039 : nullptr
7040 : }
7041 : };
7042 :
7043 : advgetopt::options_environment options_mix_of_default;
7044 : options_mix_of_default.f_project_name = "unittest";
7045 : options_mix_of_default.f_options = options_mix_of_default_list;
7046 : options_mix_of_default.f_help_header = "Usage: try this one and we get a throw (mix flags of defaults by name)";
7047 : options_mix_of_default.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7048 :
7049 : {
7050 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options_mix_of_default, argc, argv), advgetopt::getopt_logic_error);
7051 : }
7052 :
7053 : // try the - and -- without a default in the arguments
7054 : //
7055 : const advgetopt::option options_no_defaults_list[] =
7056 : {
7057 : {
7058 : '\0',
7059 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7060 : "verbose",
7061 : nullptr,
7062 : "just a flag to test.",
7063 : 0
7064 : },
7065 : {
7066 : '\0',
7067 : advgetopt::GETOPT_FLAG_END,
7068 : nullptr,
7069 : nullptr,
7070 : nullptr,
7071 : nullptr
7072 : }
7073 : };
7074 :
7075 : advgetopt::options_environment options_no_defaults;
7076 : options_no_defaults.f_project_name = "unittest";
7077 : options_no_defaults.f_options = options_no_defaults_list;
7078 : options_no_defaults.f_help_header = "Usage: try this one and we get a throw (no defaults)";
7079 :
7080 : {
7081 : // a filename by itself is a problem when there is no default
7082 : //
7083 : char const * sub_cargv[] =
7084 : {
7085 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7086 : "--verbose",
7087 : "this",
7088 : "filename",
7089 : nullptr
7090 : };
7091 : const int sub_argc(sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1);
7092 : char ** sub_argv(const_cast<char **>(sub_cargv));
7093 :
7094 : 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.");
7095 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7096 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7097 : }
7098 : {
7099 : // a '-' by itself is a problem when there is no default because it
7100 : // is expected to represent a filename (stdin)
7101 : //
7102 : char const * sub_cargv[] =
7103 : {
7104 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7105 : "--verbose",
7106 : "-",
7107 : nullptr
7108 : };
7109 : const int sub_argc(sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1);
7110 : char **sub_argv(const_cast<char **>(sub_cargv));
7111 :
7112 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus - is not accepted by this program.");
7113 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7114 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7115 : }
7116 : {
7117 : // the -- by itself would be fine, but since it represents a
7118 : // transition from arguments to only filenames (or whatever the
7119 : // program expects as default options) it generates an error if
7120 : // no default options are accepted
7121 : //
7122 : const char *sub_cargv[] =
7123 : {
7124 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7125 : "--verbose",
7126 : "--", // already just by itself it causes problems
7127 : nullptr
7128 : };
7129 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7130 : char **sub_argv = const_cast<char **>(sub_cargv);
7131 :
7132 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus -- is not accepted by this program.");
7133 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7134 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7135 : }
7136 : {
7137 : const char *sub_cargv[] =
7138 : {
7139 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7140 : "--verbose",
7141 : "--",
7142 : "66",
7143 : "--filenames",
7144 : "extra",
7145 : "--file",
7146 : "names",
7147 : nullptr
7148 : };
7149 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7150 : char **sub_argv = const_cast<char **>(sub_cargv);
7151 :
7152 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no default options defined; thus -- is not accepted by this program.");
7153 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7154 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7155 : }
7156 : {
7157 : // check that -v, that does not exist, generates a usage error
7158 : const char *sub_cargv[] =
7159 : {
7160 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7161 : "-v",
7162 : nullptr
7163 : };
7164 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7165 : char **sub_argv = const_cast<char **>(sub_cargv);
7166 :
7167 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -v is not supported.");
7168 : advgetopt::getopt opt(options_no_defaults, sub_argc, sub_argv);
7169 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7170 : }
7171 :
7172 : // check -- when default does not allowed environment variables
7173 : //
7174 : const advgetopt::option options_no_defaults_in_envvar_list[] =
7175 : {
7176 : {
7177 : '\0',
7178 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_ENVIRONMENT_VARIABLE | advgetopt::GETOPT_FLAG_FLAG,
7179 : "verbose",
7180 : nullptr,
7181 : "just a flag to test.",
7182 : nullptr
7183 : },
7184 : {
7185 : '\0',
7186 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
7187 : "--",
7188 : nullptr,
7189 : "default multiple filenames",
7190 : nullptr
7191 : },
7192 : {
7193 : '\0',
7194 : advgetopt::GETOPT_FLAG_END,
7195 : nullptr,
7196 : nullptr,
7197 : nullptr,
7198 : nullptr
7199 : }
7200 : };
7201 :
7202 : advgetopt::options_environment options_no_defaults_in_envvar;
7203 : options_no_defaults_in_envvar.f_project_name = "unittest";
7204 : options_no_defaults_in_envvar.f_options = options_no_defaults_in_envvar_list;
7205 : options_no_defaults_in_envvar.f_help_header = "Usage: try this one and we get a throw (no defaults in envvar)";
7206 : options_no_defaults_in_envvar.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7207 :
7208 : {
7209 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose - no default here");
7210 : char const * sub_cargv[] =
7211 : {
7212 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7213 : "--verbose",
7214 : "-",
7215 : "here",
7216 : "it",
7217 : "works",
7218 : nullptr
7219 : };
7220 : int const sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7221 : char **sub_argv = const_cast<char **>(sub_cargv);
7222 :
7223 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option - is not supported in the environment variable.");
7224 : advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
7225 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7226 : }
7227 : {
7228 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose no default here");
7229 : const char *sub_cargv[] =
7230 : {
7231 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7232 : "--verbose",
7233 : "-",
7234 : "here",
7235 : "it",
7236 : "works",
7237 : nullptr
7238 : };
7239 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7240 : char **sub_argv = const_cast<char **>(sub_cargv);
7241 :
7242 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: default options are not supported in the environment variable.");
7243 : advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
7244 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7245 : }
7246 : {
7247 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose -- foo bar blah");
7248 : const char *sub_cargv[] =
7249 : {
7250 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7251 : "--verbose",
7252 : "here",
7253 : "it",
7254 : "works",
7255 : "--",
7256 : "66",
7257 : "--filenames",
7258 : "extra",
7259 : "--file",
7260 : "names",
7261 : nullptr
7262 : };
7263 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7264 : char **sub_argv = const_cast<char **>(sub_cargv);
7265 :
7266 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -- is not supported in the environment variable.");
7267 : advgetopt::getopt opt(options_no_defaults_in_envvar, sub_argc, sub_argv);
7268 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7269 : }
7270 :
7271 : // unnknown long options
7272 : //
7273 : const advgetopt::option valid_options_unknown_command_line_option_list[] =
7274 : {
7275 : {
7276 : '\0',
7277 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
7278 : "command",
7279 : nullptr,
7280 : "there is a --command, but the user tries --verbose!",
7281 : nullptr
7282 : },
7283 : {
7284 : '\0',
7285 : advgetopt::GETOPT_FLAG_END,
7286 : nullptr,
7287 : nullptr,
7288 : nullptr,
7289 : nullptr
7290 : }
7291 : };
7292 :
7293 : advgetopt::options_environment valid_options_unknown_command_line_option;
7294 : valid_options_unknown_command_line_option.f_project_name = "unittest";
7295 : valid_options_unknown_command_line_option.f_options = valid_options_unknown_command_line_option_list;
7296 : valid_options_unknown_command_line_option.f_help_header = "Usage: try this one and we get a throw (unknown command line option)";
7297 :
7298 : {
7299 : const char *sub_cargv[] =
7300 : {
7301 : "tests/unittests/AdvGetOptUnitTests::invalid_parameters",
7302 : "--verbose",
7303 : nullptr
7304 : };
7305 : const int sub_argc = sizeof(sub_cargv) / sizeof(sub_cargv[0]) - 1;
7306 : char **sub_argv = const_cast<char **>(sub_cargv);
7307 :
7308 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --verbose is not supported.");
7309 : advgetopt::getopt opt(valid_options_unknown_command_line_option, sub_argc, sub_argv);
7310 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7311 : }
7312 :
7313 : // illegal short or long option in variable
7314 : //
7315 : const advgetopt::option options_illegal_in_variable_list[] =
7316 : {
7317 : {
7318 : 'v',
7319 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7320 : "verbose",
7321 : nullptr,
7322 : "just a flag to test.",
7323 : nullptr
7324 : },
7325 : {
7326 : '\0',
7327 : advgetopt::GETOPT_FLAG_END,
7328 : nullptr,
7329 : nullptr,
7330 : nullptr,
7331 : nullptr
7332 : }
7333 : };
7334 :
7335 : advgetopt::options_environment options_illegal_in_variable;
7336 : options_illegal_in_variable.f_project_name = "unittest";
7337 : options_illegal_in_variable.f_options = options_illegal_in_variable_list;
7338 : options_illegal_in_variable.f_help_header = "Usage: try this one and we get a throw (illegal in variable)";
7339 : options_illegal_in_variable.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7340 :
7341 : {
7342 : // long
7343 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "--verbose");
7344 :
7345 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --verbose is not supported in the environment variable.");
7346 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7347 : advgetopt::getopt opt(options_illegal_in_variable, argc, argv);
7348 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7349 : }
7350 : {
7351 : // short
7352 : snapdev::safe_setenv env("ADVGETOPT_TEST_OPTIONS", "-v");
7353 :
7354 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option -v is not supported in the environment variable.");
7355 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7356 : advgetopt::getopt opt(options_illegal_in_variable, argc, argv);
7357 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7358 : }
7359 :
7360 : // configuration file options must have a long name
7361 : //
7362 : const advgetopt::option configuration_long_name_missing_list[] =
7363 : {
7364 : {
7365 : 'c',
7366 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_CONFIGURATION_FILE,
7367 : nullptr,
7368 : nullptr,
7369 : "a valid option",
7370 : nullptr
7371 : },
7372 : {
7373 : '\0',
7374 : advgetopt::GETOPT_FLAG_END,
7375 : nullptr,
7376 : nullptr,
7377 : nullptr,
7378 : nullptr
7379 : }
7380 : };
7381 :
7382 : advgetopt::options_environment configuration_long_name_missing;
7383 : configuration_long_name_missing.f_project_name = "unittest";
7384 : configuration_long_name_missing.f_options = configuration_long_name_missing_list;
7385 : configuration_long_name_missing.f_help_header = "Usage: try this one and we get a throw (long name missing)";
7386 : configuration_long_name_missing.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7387 :
7388 : {
7389 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(configuration_long_name_missing, argc, argv), advgetopt::getopt_logic_error);
7390 : }
7391 :
7392 : // create invalid configuration files
7393 : //
7394 : const advgetopt::option valid_options_list[] =
7395 : {
7396 : {
7397 : '\0',
7398 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_CONFIGURATION_FILE,
7399 : "valid",
7400 : nullptr,
7401 : "a valid option",
7402 : nullptr
7403 : },
7404 : {
7405 : '\0',
7406 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
7407 : "command",
7408 : nullptr,
7409 : "a valid command, but not a valid configuration option",
7410 : nullptr
7411 : },
7412 : {
7413 : '\0',
7414 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7415 : "filename",
7416 : nullptr,
7417 : "other parameters are viewed as filenames",
7418 : nullptr
7419 : },
7420 : {
7421 : '\0',
7422 : advgetopt::GETOPT_FLAG_END,
7423 : nullptr,
7424 : nullptr,
7425 : nullptr,
7426 : nullptr
7427 : }
7428 : };
7429 :
7430 : std::string tmpdir(SNAP_CATCH2_NAMESPACE::g_tmp_dir);
7431 : tmpdir += "/.config";
7432 : std::stringstream ss;
7433 : ss << "mkdir -p " << tmpdir;
7434 : if(system(ss.str().c_str()) != 0)
7435 : {
7436 : std::cerr << "fatal error: creating sub-temporary directory \"" << tmpdir << "\" failed.\n";
7437 : exit(1);
7438 : }
7439 :
7440 : std::string const config_filename(tmpdir + "/advgetopt.config");
7441 : char const * invalid_confs[] =
7442 : {
7443 : config_filename.c_str(),
7444 : nullptr
7445 : };
7446 :
7447 : advgetopt::options_environment valid_options;
7448 : valid_options.f_project_name = "unittest";
7449 : valid_options.f_options = valid_options_list;
7450 : valid_options.f_help_header = "Usage: try this one and we get a throw (valid options!)";
7451 : valid_options.f_configuration_files = invalid_confs;
7452 :
7453 : {
7454 : // '=' operator missing
7455 : {
7456 : std::ofstream config_file;
7457 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7458 : CATCH_REQUIRE(config_file.good());
7459 : config_file <<
7460 : "# Auto-generated\n"
7461 : "valid param\n"
7462 : "# no spaces acceptable in param names\n"
7463 : ;
7464 : }
7465 : {
7466 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option name from \"valid param\" on line 2 in configuration file \""
7467 : + config_filename
7468 : + "\" cannot include a space, missing assignment operator?");
7469 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7470 : advgetopt::getopt opt(valid_options, argc, argv);
7471 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7472 : }
7473 : }
7474 : {
7475 : // same effect with a few extra spaces
7476 : {
7477 : std::ofstream config_file;
7478 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7479 : CATCH_REQUIRE(config_file.good());
7480 : config_file <<
7481 : "# Auto-generated\n"
7482 : " valid param \n"
7483 : "# no spaces acceptable in param names\n"
7484 : ;
7485 : }
7486 : {
7487 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option name from \" valid param \" on line 2 in configuration file \""
7488 : + config_filename
7489 : + "\" cannot include a space, missing assignment operator?");
7490 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7491 : advgetopt::getopt opt(valid_options, argc, argv);
7492 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7493 : }
7494 : }
7495 : {
7496 : // param name missing
7497 : {
7498 : std::ofstream config_file;
7499 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7500 : CATCH_REQUIRE(config_file.good());
7501 : config_file <<
7502 : "# Auto-generated\n"
7503 : " = valid param\n"
7504 : "# no spaces acceptable in param names\n"
7505 : ;
7506 : }
7507 : {
7508 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: no option name in \" = valid param\" on line 2 from configuration file \""
7509 : + config_filename
7510 : + "\", missing name before = sign?");
7511 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7512 : advgetopt::getopt opt(valid_options, argc, argv);
7513 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7514 : }
7515 : }
7516 : {
7517 : // param name starts with a dash or more
7518 : {
7519 : std::ofstream config_file;
7520 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7521 : CATCH_REQUIRE(config_file.good());
7522 : config_file <<
7523 : "# Auto-generated\n"
7524 : "--valid=param\n"
7525 : "# no spaces acceptable in param names\n"
7526 : ;
7527 : }
7528 : {
7529 : 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 \""
7530 : + config_filename
7531 : + "\".");
7532 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7533 : advgetopt::getopt opt(valid_options, argc, argv);
7534 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7535 : }
7536 : }
7537 : {
7538 : // unknown param name
7539 : {
7540 : std::ofstream config_file;
7541 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7542 : CATCH_REQUIRE(config_file.good());
7543 : config_file <<
7544 : "# Auto-generated\n"
7545 : "invalid=param\n"
7546 : "# no spaces acceptable in param names\n"
7547 : ;
7548 : }
7549 : {
7550 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: unknown option \"invalid\" found in configuration file \""
7551 : + config_filename
7552 : + "\".");
7553 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7554 : advgetopt::getopt opt(valid_options, argc, argv);
7555 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7556 : }
7557 : }
7558 : {
7559 : // known command, not valid in configuration file
7560 : {
7561 : std::ofstream config_file;
7562 : config_file.open(config_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
7563 : CATCH_REQUIRE(config_file.good());
7564 : config_file <<
7565 : "# Auto-generated\n"
7566 : "command=value\n"
7567 : "# no spaces acceptable in param names\n"
7568 : ;
7569 : }
7570 : {
7571 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option \"command\" is not supported in configuration files (found in \""
7572 : + config_filename
7573 : + "\").");
7574 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --ignore-parameters is not supported.");
7575 : advgetopt::getopt opt(valid_options, argc, argv);
7576 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7577 : }
7578 : }
7579 :
7580 : #if 0
7581 : // in version 2.x we do not have this case anymore
7582 :
7583 : // one of the options has an invalid mode; explicit option
7584 : {
7585 : const advgetopt::option options_list[] =
7586 : {
7587 : {
7588 : '\0',
7589 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR,
7590 : "mode",
7591 : nullptr,
7592 : "an argument with an invalid mode to see that we get an exception",
7593 : static_cast<advgetopt::getopt::argument_mode_t>(static_cast<int>(advgetopt::getopt::argument_mode_t::end_of_options) + 1)
7594 : },
7595 : {
7596 : '\0',
7597 : advgetopt::GETOPT_FLAG_END,
7598 : nullptr,
7599 : nullptr,
7600 : nullptr,
7601 : nullptr
7602 : }
7603 : };
7604 :
7605 : advgetopt::options_environment options;
7606 : options.f_project_name = "unittest";
7607 : options.f_options = options_list;
7608 : options.f_help_header = "Usage: one of the options has an invalid mode";
7609 :
7610 : {
7611 : const char *cargv2[] =
7612 : {
7613 : "tests/unittests/unittest_advgetopt",
7614 : "--mode",
7615 : "test",
7616 : nullptr
7617 : };
7618 : const int argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7619 : char **argv2 = const_cast<char **>(cargv2);
7620 :
7621 : // here we hit the one in add_options() (plural)
7622 : // the one in add_option() is not reachable because it is called only
7623 : // when a default option is defined and that means the mode is
7624 : // correct
7625 : CATCH_REQUIRE_THROWS_AS( { advgetopt::getopt opt(argc2, argv2, options, confs, nullptr); }, advgetopt::getopt_invalid );
7626 : }
7627 : {
7628 : const char *cargv2[] =
7629 : {
7630 : "tests/unittests/unittest_advgetopt",
7631 : nullptr
7632 : };
7633 : const int argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7634 : char **argv2 = const_cast<char **>(cargv2);
7635 :
7636 : // this one checks that the --mode flag does indeed generate a
7637 : // throw when not used on the command line but then gets shown
7638 : // in the usage() function
7639 : advgetopt::getopt opt(argc2, argv2, options, confs, nullptr);
7640 : for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
7641 : {
7642 : CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_invalid);
7643 : }
7644 : }
7645 : }
7646 : #endif
7647 :
7648 : // a valid initialization, but not so valid calls afterward
7649 : {
7650 : advgetopt::option const options_list[] =
7651 : {
7652 : {
7653 : '\0',
7654 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7655 : "validate",
7656 : nullptr,
7657 : "this is used to validate different things.",
7658 : nullptr
7659 : },
7660 : {
7661 : '\0',
7662 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7663 : "long",
7664 : nullptr,
7665 : "used to validate that invalid numbers generate an error.",
7666 : nullptr
7667 : },
7668 : {
7669 : 'o',
7670 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7671 : "out-of-bounds",
7672 : nullptr,
7673 : "valid values from 1 to 9.",
7674 : nullptr
7675 : },
7676 : {
7677 : '\0',
7678 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7679 : "not-specified-and-no-default",
7680 : nullptr,
7681 : "test long without having used the option and no default.",
7682 : nullptr
7683 : },
7684 : {
7685 : '\0',
7686 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7687 : "not-specified-with-invalid-default",
7688 : "123abc",
7689 : "test long with an invalid default value.",
7690 : nullptr
7691 : },
7692 : {
7693 : '\0',
7694 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7695 : "not-specified-string-without-default",
7696 : nullptr,
7697 : "test long with an invalid default value.",
7698 : nullptr
7699 : },
7700 : {
7701 : '\0',
7702 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7703 : "string",
7704 : nullptr,
7705 : "test long with an invalid default value.",
7706 : nullptr
7707 : },
7708 : {
7709 : '\0',
7710 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7711 : "filename",
7712 : nullptr,
7713 : "other parameters are viewed as filenames",
7714 : nullptr
7715 : },
7716 : {
7717 : '\0',
7718 : advgetopt::GETOPT_FLAG_END,
7719 : nullptr,
7720 : nullptr,
7721 : nullptr,
7722 : nullptr
7723 : }
7724 : };
7725 : char const * cargv2[] =
7726 : {
7727 : "tests/unittests/unittest_advgetopt",
7728 : "--validate",
7729 : "--long",
7730 : "123abc",
7731 : "--out-of-bounds",
7732 : "123",
7733 : "--string",
7734 : "string value",
7735 : nullptr
7736 : };
7737 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7738 : char ** argv2 = const_cast<char **>(cargv2);
7739 :
7740 : advgetopt::options_environment options;
7741 : options.f_project_name = "unittest";
7742 : options.f_options = options_list;
7743 : options.f_help_header = "Usage: one of the options has an invalid mode";
7744 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7745 :
7746 : advgetopt::getopt opt(options, argc2, argv2);
7747 :
7748 : // cannot get the default without a valid name!
7749 : CATCH_REQUIRE_THROWS_AS( opt.get_default(""), advgetopt::getopt_logic_error);
7750 :
7751 : // cannot get a long named "blah"
7752 : CATCH_REQUIRE_THROWS_AS( opt.get_long("blah"), advgetopt::getopt_logic_error);
7753 : // existing "long", but only 1 entry
7754 : CATCH_REQUIRE_THROWS_AS( opt.get_long("long", 100), advgetopt::getopt_undefined);
7755 : long l(-1);
7756 : CATCH_REQUIRE_THROWS_AS( l = opt.get_long("not-specified-and-no-default", 0), advgetopt::getopt_logic_error);
7757 : CATCH_REQUIRE(l == -1);
7758 : CATCH_REQUIRE_THROWS_AS( l = opt.get_long("not-specified-with-invalid-default", 0), advgetopt::getopt_logic_error);
7759 : CATCH_REQUIRE(l == -1);
7760 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (123abc) in parameter --long.");
7761 : l = opt.get_long("long");
7762 : CATCH_REQUIRE(l == -1);
7763 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: 123 is out of bounds (1..9 inclusive) in parameter --out-of-bounds.");
7764 : l = opt.get_long("out-of-bounds", 0, 1, 9);
7765 : CATCH_REQUIRE(l == -1);
7766 : std::string s;
7767 : CATCH_REQUIRE_THROWS_AS( s = opt.get_string("not-specified-string-without-default", 0), advgetopt::getopt_logic_error);
7768 : CATCH_REQUIRE(s.empty());
7769 : CATCH_REQUIRE_THROWS_AS( s = opt.get_string("string", 100), advgetopt::getopt_undefined);
7770 : CATCH_REQUIRE(s.empty());
7771 :
7772 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
7773 :
7774 : // reuse all those invalid options with the reset() function
7775 : // and expect the same result
7776 : // (the constructor is expected to call reset() the exact same way)
7777 : // -- this changed in version 2.x; we can't reset the option definitions
7778 : //
7779 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_empty_list, confs, nullptr), advgetopt::getopt_invalid);
7780 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_no_name_list, confs, nullptr), advgetopt::getopt_invalid);
7781 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_2chars_minimum, confs, nullptr), advgetopt::getopt_invalid);
7782 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_2chars_minimum2, confs, nullptr), advgetopt::getopt_invalid);
7783 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_defined_twice, confs, "ADVGETOPT_TEST_OPTIONS"), advgetopt::getopt_invalid);
7784 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_short_defined_twice, confs, nullptr), advgetopt::getopt_invalid);
7785 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_two_default_multiple_arguments, confs, nullptr), advgetopt::getopt_invalid_default);
7786 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_two_default_arguments, confs, "ADVGETOPT_TEST_OPTIONS"), advgetopt::getopt_invalid_default);
7787 : //CATCH_REQUIRE_THROWS_AS( opt.reset(argc, argv, options_mix_of_default, confs, nullptr), advgetopt::getopt_invalid_default);
7788 : }
7789 :
7790 : // valid initialization + usage calls
7791 : {
7792 : const advgetopt::option options_list[] =
7793 : {
7794 : {
7795 : '\0',
7796 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7797 : "validate",
7798 : nullptr,
7799 : "this is used to validate different things.",
7800 : nullptr
7801 : },
7802 : {
7803 : '\0',
7804 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7805 : "long",
7806 : nullptr,
7807 : "used to validate that invalid numbers generate an error.",
7808 : nullptr
7809 : },
7810 : {
7811 : 'o',
7812 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7813 : "out-of-bounds",
7814 : nullptr,
7815 : "valid values from 1 to 9.",
7816 : nullptr
7817 : },
7818 : {
7819 : '\0',
7820 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7821 : "not-specified-and-no-default",
7822 : nullptr,
7823 : "test long without having used the option and no default.",
7824 : nullptr
7825 : },
7826 : {
7827 : '\0',
7828 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
7829 : "not-specified-with-invalid-default",
7830 : "123abc",
7831 : "test long with an invalid default value.",
7832 : nullptr
7833 : },
7834 : {
7835 : '\0',
7836 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7837 : "not-specified-string-without-default",
7838 : nullptr,
7839 : "test long with an invalid default value.",
7840 : nullptr
7841 : },
7842 : {
7843 : '\0',
7844 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7845 : "string",
7846 : nullptr,
7847 : "test long with an invalid default value.",
7848 : nullptr
7849 : },
7850 : {
7851 : 'u',
7852 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
7853 : "unique",
7854 : nullptr,
7855 : "test long with an invalid default value.",
7856 : nullptr
7857 : },
7858 : {
7859 : 'q',
7860 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
7861 : "quiet",
7862 : nullptr,
7863 : "test long with an invalid default value.",
7864 : nullptr
7865 : },
7866 : {
7867 : '\0',
7868 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
7869 : "filename",
7870 : nullptr,
7871 : "other parameters are viewed as filenames.",
7872 : nullptr
7873 : },
7874 : {
7875 : '\0',
7876 : advgetopt::GETOPT_FLAG_END,
7877 : nullptr,
7878 : nullptr,
7879 : nullptr,
7880 : nullptr
7881 : }
7882 : };
7883 : char const * cargv2[] =
7884 : {
7885 : "tests/unittests/unittest_advgetopt",
7886 : "--validate",
7887 : "--long",
7888 : "123abc",
7889 : "--out-of-bounds",
7890 : "123",
7891 : "--string",
7892 : "string value",
7893 : nullptr
7894 : };
7895 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
7896 : char ** argv2 = const_cast<char **>(cargv2);
7897 :
7898 : advgetopt::options_environment options;
7899 : options.f_project_name = "unittest";
7900 : options.f_options = options_list;
7901 : options.f_help_header = "Usage: try this one and we get a throw (valid options + usage calls)";
7902 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
7903 :
7904 : // this initialization works as expected
7905 : advgetopt::getopt opt(options, argc2, argv2);
7906 :
7907 : // all of the following have the exiting exception
7908 : CATCH_REQUIRE(opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) ==
7909 : "Usage: try this one and we get a throw (valid options + usage calls)\n"
7910 : " --long <arg> used to validate that invalid numbers generate an\n"
7911 : " error.\n"
7912 : " --not-specified-and-no-default <arg>\n"
7913 : " test long without having used the option and no\n"
7914 : " default.\n"
7915 : " --not-specified-string-without-default <arg>\n"
7916 : " test long with an invalid default value.\n"
7917 : " --not-specified-with-invalid-default <arg> {<arg>} (default is \"123abc\")\n"
7918 : " test long with an invalid default value.\n"
7919 : " --out-of-bounds or -o <arg>\n"
7920 : " valid values from 1 to 9.\n"
7921 : " --quiet or -q {<arg>} test long with an invalid default value.\n"
7922 : " --string <arg> test long with an invalid default value.\n"
7923 : " --unique or -u [<arg>] test long with an invalid default value.\n"
7924 : " --validate this is used to validate different things.\n"
7925 : " [default arguments] other parameters are viewed as filenames.\n"
7926 : );
7927 : }
7928 :
7929 : // valid initialization + usage calls with a few different options
7930 : {
7931 : const advgetopt::option options_list[] =
7932 : {
7933 : {
7934 : '\0',
7935 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_FLAG,
7936 : "validate",
7937 : nullptr,
7938 : "this is used to validate different things.",
7939 : nullptr
7940 : },
7941 : {
7942 : '\0',
7943 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7944 : "long",
7945 : nullptr,
7946 : "used to validate that invalid numbers generate an error.",
7947 : nullptr
7948 : },
7949 : {
7950 : 'o',
7951 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7952 : "out-of-bounds",
7953 : nullptr,
7954 : "valid values from 1 to 9.",
7955 : nullptr
7956 : },
7957 : {
7958 : '\0',
7959 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7960 : "not-specified-and-no-default",
7961 : nullptr,
7962 : "test long without having used the option and no default.",
7963 : nullptr
7964 : },
7965 : {
7966 : '\0',
7967 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
7968 : "not-specified-with-invalid-default",
7969 : "123abc",
7970 : "test long with an invalid default value.",
7971 : nullptr
7972 : },
7973 : {
7974 : '\0',
7975 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7976 : "not-specified-string-without-default",
7977 : nullptr,
7978 : "test long with an invalid default value.",
7979 : nullptr
7980 : },
7981 : {
7982 : '\0',
7983 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
7984 : "string",
7985 : nullptr,
7986 : "test long with an invalid default value.",
7987 : nullptr
7988 : },
7989 : {
7990 : 'u',
7991 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
7992 : "unique",
7993 : nullptr,
7994 : "test long with an invalid default value.",
7995 : nullptr
7996 : },
7997 : {
7998 : 'q',
7999 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_MULTIPLE,
8000 : "quiet",
8001 : nullptr,
8002 : "test long with an invalid default value.",
8003 : nullptr
8004 : },
8005 : {
8006 : 'l',
8007 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED,
8008 : "not-in-v2-though",
8009 : nullptr,
8010 : "long with just a letter.",
8011 : nullptr
8012 : },
8013 : {
8014 : '\0',
8015 : advgetopt::GETOPT_FLAG_COMMAND_LINE,
8016 : "--",
8017 : nullptr,
8018 : "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!)",
8019 : nullptr
8020 : },
8021 : {
8022 : '\0',
8023 : advgetopt::GETOPT_FLAG_END,
8024 : nullptr,
8025 : nullptr,
8026 : nullptr,
8027 : nullptr
8028 : }
8029 : };
8030 :
8031 : advgetopt::options_environment options;
8032 : options.f_project_name = "unittest";
8033 : options.f_options = options_list;
8034 : options.f_help_header = "Usage: try this one and we get a throw (valid options + usage calls bis)";
8035 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
8036 :
8037 : {
8038 : // make sure that --long (REQUIRED) fails if the
8039 : // long value is not specified
8040 : //
8041 : char const * cargv2[] =
8042 : {
8043 : "tests/unittests/unittest_advgetopt",
8044 : "--validate",
8045 : "--long",
8046 : "--out-of-bounds",
8047 : "123",
8048 : "--string",
8049 : "string value",
8050 : nullptr
8051 : };
8052 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8053 : char ** argv2 = const_cast<char **>(cargv2);
8054 :
8055 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --long expects an argument.");
8056 : advgetopt::getopt opt(options, argc2, argv2);
8057 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8058 : }
8059 : {
8060 : // again with the lone -l (no long name)
8061 : //
8062 : char const * cargv2[] =
8063 : {
8064 : "tests/unittests/unittest_advgetopt",
8065 : "--validate",
8066 : "-l",
8067 : "--out-of-bounds",
8068 : "123",
8069 : "--string",
8070 : "string value",
8071 : nullptr
8072 : };
8073 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8074 : char ** argv2 = const_cast<char **>(cargv2);
8075 :
8076 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --not-in-v2-though expects an argument.");
8077 : advgetopt::getopt opt(options, argc2, argv2);
8078 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8079 : }
8080 : {
8081 : char const * cargv2[] =
8082 : {
8083 : "tests/unittests/unittest_advgetopt",
8084 : "--validate",
8085 : "--long",
8086 : "123abc",
8087 : "--out-of-bounds",
8088 : "123",
8089 : "--string",
8090 : "string value",
8091 : nullptr
8092 : };
8093 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8094 : char ** argv2 = const_cast<char **>(cargv2);
8095 :
8096 : // this initialization works as expected
8097 : advgetopt::getopt opt(options, argc2, argv2);
8098 :
8099 : // all of the following have the exiting exception
8100 : // for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
8101 : // {
8102 : // CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_exit);
8103 : // }
8104 : CATCH_REQUIRE(opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) ==
8105 : "Usage: try this one and we get a throw (valid options + usage calls bis)\n"
8106 : " --long <arg> used to validate that invalid numbers generate an\n"
8107 : " error.\n"
8108 : " --not-in-v2-though or -l <arg>\n"
8109 : " long with just a letter.\n"
8110 : " --not-specified-and-no-default <arg>\n"
8111 : " test long without having used the option and no\n"
8112 : " default.\n"
8113 : " --not-specified-string-without-default <arg>\n"
8114 : " test long with an invalid default value.\n"
8115 : " --not-specified-with-invalid-default <arg> {<arg>} (default is \"123abc\")\n"
8116 : " test long with an invalid default value.\n"
8117 : " --out-of-bounds or -o <arg>\n"
8118 : " valid values from 1 to 9.\n"
8119 : " --quiet or -q {<arg>} test long with an invalid default value.\n"
8120 : " --string <arg> test long with an invalid default value.\n"
8121 : " --unique or -u [<arg>] test long with an invalid default value.\n"
8122 : " --validate this is used to validate different things.\n"
8123 : " [default argument] other parameters are viewed as filenames; and we\n"
8124 : " need at least one option with a very long help to\n"
8125 : " check that it wraps perfectly (we'd really need to\n"
8126 : " get the output of the command and check that\n"
8127 : " against what is expected because at this time the\n"
8128 : " test is rather blind in that respect! FIXED IN\n"
8129 : " v2!)\n"
8130 : );
8131 : }
8132 : }
8133 :
8134 : // strange entry without a name
8135 : {
8136 : advgetopt::option const options_list[] =
8137 : {
8138 : {
8139 : '\0',
8140 : advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR | advgetopt::GETOPT_FLAG_FLAG,
8141 : nullptr,
8142 : nullptr,
8143 : "this entry has help, but no valid name...",
8144 : nullptr
8145 : },
8146 : {
8147 : 'v',
8148 : advgetopt::GETOPT_FLAG_FLAG,
8149 : "verbose",
8150 : nullptr,
8151 : "show more stuff when found on the command line.",
8152 : nullptr
8153 : },
8154 : {
8155 : '\0',
8156 : advgetopt::GETOPT_FLAG_END,
8157 : nullptr,
8158 : nullptr,
8159 : nullptr,
8160 : nullptr
8161 : }
8162 : };
8163 :
8164 : advgetopt::options_environment options;
8165 : options.f_project_name = "unittest";
8166 : options.f_options = options_list;
8167 : options.f_help_header = "Usage: try this one and we get a throw (strange empty entry!)";
8168 : options.f_environment_variable_name = "ADVGETOPT_TEST_OPTIONS";
8169 :
8170 : {
8171 : char const * cargv2[] =
8172 : {
8173 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8174 : nullptr
8175 : };
8176 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8177 : char ** argv2 = const_cast<char **>(cargv2);
8178 :
8179 : // this initialization works as expected
8180 : //
8181 : CATCH_REQUIRE_THROWS_AS(std::make_shared<advgetopt::getopt>(options, argc2, argv2), advgetopt::getopt_logic_error );
8182 :
8183 : // // all of the following have the exiting exception
8184 : // for(int i(static_cast<int>(advgetopt::getopt::status_t::no_error)); i <= static_cast<int>(advgetopt::getopt::status_t::fatal); ++i)
8185 : // {
8186 : // CATCH_REQUIRE_THROWS_AS( opt.usage(static_cast<advgetopt::getopt::status_t>(i), "test no error, warnings, errors..."), advgetopt::getopt_invalid);
8187 : // }
8188 : //std::cout << "test usage output here? " << opt.usage(advgetopt::GETOPT_FLAG_SHOW_ALL) << "\n";
8189 : }
8190 : }
8191 :
8192 : // required multiple without arguments
8193 : {
8194 : advgetopt::option const options_list[] =
8195 : {
8196 : {
8197 : 'f',
8198 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE | advgetopt::GETOPT_FLAG_DEFAULT_OPTION,
8199 : "filenames",
8200 : nullptr,
8201 : "test a required multiple without any arguments and fail.",
8202 : nullptr
8203 : },
8204 : {
8205 : '\0',
8206 : advgetopt::GETOPT_FLAG_END,
8207 : nullptr,
8208 : nullptr,
8209 : nullptr,
8210 : nullptr
8211 : }
8212 : };
8213 :
8214 : advgetopt::options_environment options;
8215 : options.f_project_name = "unittest";
8216 : options.f_options = options_list;
8217 : options.f_help_header = "Usage: try this one and we get a throw (required multiple without args)";
8218 :
8219 : {
8220 : // first with -f
8221 : char const * cargv2[] =
8222 : {
8223 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8224 : "-f",
8225 : nullptr
8226 : };
8227 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8228 : char ** argv2 = const_cast<char **>(cargv2);
8229 :
8230 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
8231 : advgetopt::getopt opt(options, argc2, argv2);
8232 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8233 : }
8234 : {
8235 : // second with --filenames
8236 : const char *cargv2[] =
8237 : {
8238 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8239 : "--filenames",
8240 : nullptr
8241 : };
8242 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8243 : char ** argv2 = const_cast<char **>(cargv2);
8244 :
8245 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
8246 : advgetopt::getopt opt(options, argc2, argv2);
8247 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8248 : }
8249 : }
8250 :
8251 : // required multiple without arguments, short name only
8252 : {
8253 : advgetopt::option const options_list[] =
8254 : {
8255 : {
8256 : 'f',
8257 : advgetopt::GETOPT_FLAG_COMMAND_LINE | advgetopt::GETOPT_FLAG_REQUIRED | advgetopt::GETOPT_FLAG_MULTIPLE,
8258 : "filenames",
8259 : nullptr,
8260 : "test a required multiple without any arguments and fail.",
8261 : nullptr
8262 : },
8263 : {
8264 : '\0',
8265 : advgetopt::GETOPT_FLAG_END,
8266 : nullptr,
8267 : nullptr,
8268 : nullptr,
8269 : nullptr
8270 : }
8271 : };
8272 :
8273 : advgetopt::options_environment options;
8274 : options.f_project_name = "unittest";
8275 : options.f_options = options_list;
8276 : options.f_help_header = "Usage: try this one and we get a throw (required multiple without args + short name)";
8277 :
8278 : {
8279 : // -f only in this case
8280 : char const * cargv2[] =
8281 : {
8282 : "tests/unittests/unittest_advgetopt/AdvGetOptUnitTests::invalid_parameters/test-with-an-empty-entry",
8283 : "-f",
8284 : nullptr
8285 : };
8286 : int const argc2 = sizeof(cargv2) / sizeof(cargv2[0]) - 1;
8287 : char ** argv2 = const_cast<char **>(cargv2);
8288 :
8289 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: option --filenames expects an argument.");
8290 : advgetopt::getopt opt(options, argc2, argv2);
8291 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
8292 : }
8293 : }
8294 : }
8295 : CATCH_END_SECTION()
8296 : }
8297 : #endif
8298 :
8299 :
8300 : // vim: ts=4 sw=4 et
|