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