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