Line data Source code
1 : /*
2 : * Files:
3 : * tests/options_info.cpp
4 : *
5 : * License:
6 : * Copyright (c) 2006-2019 Made to Order Software Corp. All Rights Reserved
7 : *
8 : * https://snapwebsites.org/
9 : * contact@m2osw.com
10 : *
11 : * This program is free software; you can redistribute it and/or modify
12 : * it under the terms of the GNU General Public License as published by
13 : * the Free Software Foundation; either version 2 of the License, or
14 : * (at your option) any later version.
15 : *
16 : * This program is distributed in the hope that it will be useful,
17 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : * GNU General Public License for more details.
20 : *
21 : * You should have received a copy of the GNU General Public License along
22 : * with this program; if not, write to the Free Software Foundation, Inc.,
23 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 : *
25 : * Authors:
26 : * Alexis Wilke alexis@m2osw.com
27 : */
28 :
29 : // self
30 : //
31 : #include "main.h"
32 :
33 : // advgetopt lib
34 : //
35 : #include <advgetopt/exception.h>
36 :
37 : // C++ lib
38 : //
39 : #include <fstream>
40 :
41 :
42 :
43 :
44 :
45 3 : CATCH_TEST_CASE("to_from_short_name", "[option_info][valid][basic][short_name]")
46 : {
47 2 : CATCH_START_SECTION("Short name to string and back")
48 : // wc == U'\0' is a special case
49 : //
50 1 : CATCH_REQUIRE(advgetopt::NO_SHORT_NAME == U'\0');
51 1 : CATCH_REQUIRE(advgetopt::short_name_to_string(U'\0') == std::string());
52 1 : CATCH_REQUIRE(advgetopt::string_to_short_name(std::string()) == U'\0');
53 :
54 1112064 : for(char32_t wc(1); wc < 0x110000; ++wc)
55 : {
56 1112063 : if(wc == 0xD800)
57 : {
58 1 : wc = 0xE000;
59 : }
60 2224126 : std::string str(advgetopt::short_name_to_string(wc));
61 1112063 : CATCH_REQUIRE(advgetopt::string_to_short_name(str) == wc);
62 :
63 : // add a second character to prove that string_to_short_name()
64 : // only works with one character
65 : //
66 1112063 : char32_t const second_char(rand() % (0xD800 - 0x20) + 0x20);
67 1112063 : str += advgetopt::short_name_to_string(second_char);
68 1112063 : CATCH_REQUIRE(advgetopt::string_to_short_name(str) == advgetopt::NO_SHORT_NAME);
69 : }
70 : CATCH_END_SECTION()
71 1 : }
72 :
73 :
74 :
75 :
76 :
77 5 : CATCH_TEST_CASE("option_info_basics", "[option_info][valid][basic]")
78 : {
79 6 : CATCH_START_SECTION("Simple option (verify defaults)")
80 2 : advgetopt::option_info verbose("verbose");
81 :
82 1 : CATCH_REQUIRE(verbose.get_name() == "verbose");
83 1 : CATCH_REQUIRE(verbose.get_short_name() == advgetopt::NO_SHORT_NAME);
84 1 : CATCH_REQUIRE_FALSE(verbose.is_default_option());
85 1 : CATCH_REQUIRE(verbose.get_flags() == 0);
86 :
87 1 : advgetopt::flag_t flag(1);
88 31 : do
89 : {
90 32 : CATCH_REQUIRE(verbose.has_flag(flag) == 0);
91 32 : flag <<= 1;
92 : }
93 32 : while(flag != 0);
94 :
95 1 : CATCH_REQUIRE_FALSE(verbose.has_default());
96 1 : CATCH_REQUIRE(verbose.get_default().empty());
97 1 : CATCH_REQUIRE(verbose.get_help().empty());
98 :
99 1 : CATCH_REQUIRE(verbose.get_alias_destination() == nullptr);
100 1 : CATCH_REQUIRE(verbose.get_multiple_separators().empty());
101 1 : CATCH_REQUIRE_FALSE(verbose.is_defined());
102 1 : CATCH_REQUIRE(verbose.size() == 0);
103 : CATCH_END_SECTION()
104 :
105 6 : CATCH_START_SECTION("Auto-default")
106 2 : advgetopt::option_info auto_default("--");
107 :
108 1 : CATCH_REQUIRE(auto_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
109 1 : CATCH_REQUIRE(auto_default.is_default_option());
110 :
111 1 : auto_default.add_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
112 :
113 1 : CATCH_REQUIRE(auto_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
114 1 : CATCH_REQUIRE(auto_default.is_default_option());
115 :
116 1 : auto_default.remove_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
117 :
118 1 : CATCH_REQUIRE_FALSE(auto_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION)); // unfortunate?
119 1 : CATCH_REQUIRE(auto_default.is_default_option());
120 : CATCH_END_SECTION()
121 :
122 6 : CATCH_START_SECTION("Explicit default")
123 2 : advgetopt::option_info explicit_default("filenames", 'f');
124 :
125 1 : CATCH_REQUIRE_FALSE(explicit_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
126 1 : CATCH_REQUIRE_FALSE(explicit_default.is_default_option());
127 :
128 1 : explicit_default.add_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
129 :
130 1 : CATCH_REQUIRE(explicit_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
131 1 : CATCH_REQUIRE(explicit_default.is_default_option());
132 :
133 1 : explicit_default.remove_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION);
134 :
135 1 : CATCH_REQUIRE_FALSE(explicit_default.has_flag(advgetopt::GETOPT_FLAG_DEFAULT_OPTION));
136 1 : CATCH_REQUIRE_FALSE(explicit_default.is_default_option());
137 : CATCH_END_SECTION()
138 3 : }
139 :
140 :
141 :
142 3 : CATCH_TEST_CASE("option_info_flags", "[option_info][valid][flags]")
143 : {
144 2 : CATCH_START_SECTION("Check flags")
145 2 : advgetopt::option_info flags("flags", 'f');
146 :
147 1 : advgetopt::flag_t flag(1);
148 31 : do
149 : {
150 32 : CATCH_REQUIRE(flags.get_flags() == 0);
151 :
152 32 : advgetopt::flag_t clear(1);
153 992 : do
154 : {
155 1024 : CATCH_REQUIRE_FALSE(flags.has_flag(clear));
156 1024 : clear <<= 1;
157 : }
158 1024 : while(clear != 0);
159 :
160 32 : flags.add_flag(flag);
161 32 : CATCH_REQUIRE(flags.has_flag(flag));
162 32 : CATCH_REQUIRE(flags.get_flags() == flag);
163 :
164 32 : advgetopt::flag_t set(1);
165 992 : do
166 : {
167 1024 : if(set == flag)
168 : {
169 32 : CATCH_REQUIRE(flags.has_flag(set));
170 : }
171 : else
172 : {
173 992 : CATCH_REQUIRE_FALSE(flags.has_flag(set));
174 : }
175 1024 : set <<= 1;
176 : }
177 1024 : while(set != 0);
178 :
179 32 : flags.remove_flag(flag);
180 32 : CATCH_REQUIRE(flags.get_flags() == 0);
181 :
182 32 : clear = 1;
183 992 : do
184 : {
185 1024 : CATCH_REQUIRE_FALSE(flags.has_flag(clear));
186 1024 : clear <<= 1;
187 : }
188 1024 : while(clear != 0);
189 :
190 32 : flag <<= 1;
191 : }
192 32 : while(flag != 0);
193 :
194 1 : flag = 1;
195 31 : do
196 : {
197 32 : CATCH_REQUIRE(flags.get_flags() == 0);
198 :
199 32 : advgetopt::flag_t clear(1);
200 992 : do
201 : {
202 1024 : CATCH_REQUIRE_FALSE(flags.has_flag(clear));
203 1024 : clear <<= 1;
204 : }
205 1024 : while(clear != 0);
206 :
207 32 : flags.set_flags(flag);
208 32 : CATCH_REQUIRE(flags.has_flag(flag));
209 32 : CATCH_REQUIRE(flags.get_flags() == flag);
210 :
211 32 : advgetopt::flag_t set(1);
212 992 : do
213 : {
214 1024 : if(set == flag)
215 : {
216 32 : CATCH_REQUIRE(flags.has_flag(set));
217 : }
218 : else
219 : {
220 992 : CATCH_REQUIRE_FALSE(flags.has_flag(set));
221 : }
222 1024 : set <<= 1;
223 : }
224 1024 : while(set != 0);
225 :
226 32 : flags.set_flags(0);
227 32 : CATCH_REQUIRE(flags.get_flags() == 0);
228 :
229 32 : clear = 1;
230 992 : do
231 : {
232 1024 : CATCH_REQUIRE_FALSE(flags.has_flag(clear));
233 1024 : clear <<= 1;
234 : }
235 1024 : while(clear != 0);
236 :
237 32 : flag <<= 1;
238 : }
239 32 : while(flag != 0);
240 : CATCH_END_SECTION()
241 1 : }
242 :
243 :
244 :
245 3 : CATCH_TEST_CASE("option_info_default", "[option_info][valid][default]")
246 : {
247 2 : CATCH_START_SECTION("Set/remove default")
248 2 : advgetopt::option_info with_default("with_default", 'w');
249 :
250 1 : CATCH_REQUIRE_FALSE(with_default.has_default());
251 1 : CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
252 1 : CATCH_REQUIRE(with_default.get_default().empty());
253 :
254 1 : with_default.set_default("working");
255 1 : CATCH_REQUIRE(with_default.has_default());
256 1 : CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
257 1 : CATCH_REQUIRE(with_default.get_default() == "working");
258 :
259 1 : with_default.remove_default();
260 1 : CATCH_REQUIRE_FALSE(with_default.has_default());
261 1 : CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
262 1 : CATCH_REQUIRE(with_default.get_default().empty());
263 :
264 2 : std::string const default_value("other");
265 1 : with_default.set_default(default_value);
266 1 : CATCH_REQUIRE(with_default.has_default());
267 1 : CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
268 1 : CATCH_REQUIRE(with_default.get_default() == default_value);
269 :
270 1 : with_default.remove_default();
271 1 : CATCH_REQUIRE_FALSE(with_default.has_default());
272 1 : CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
273 1 : CATCH_REQUIRE(with_default.get_default().empty());
274 :
275 2 : std::string const empty_default;
276 1 : with_default.set_default(empty_default);
277 1 : CATCH_REQUIRE(with_default.has_default());
278 1 : CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
279 1 : CATCH_REQUIRE(with_default.get_default().empty());
280 :
281 1 : with_default.remove_default();
282 1 : CATCH_REQUIRE_FALSE(with_default.has_default());
283 1 : CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
284 1 : CATCH_REQUIRE(with_default.get_default().empty());
285 :
286 1 : with_default.set_default(nullptr); // no effects
287 1 : CATCH_REQUIRE_FALSE(with_default.has_default());
288 1 : CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
289 1 : CATCH_REQUIRE(with_default.get_default().empty());
290 :
291 2 : std::string const null_value("null works too");
292 1 : with_default.set_default(null_value);
293 1 : CATCH_REQUIRE(with_default.has_default());
294 1 : CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
295 1 : CATCH_REQUIRE(with_default.get_default() == null_value);
296 :
297 1 : with_default.set_default(nullptr); // no effects
298 1 : CATCH_REQUIRE(with_default.has_default());
299 1 : CATCH_REQUIRE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
300 1 : CATCH_REQUIRE(with_default.get_default() == null_value);
301 :
302 1 : with_default.remove_default();
303 1 : CATCH_REQUIRE_FALSE(with_default.has_default());
304 1 : CATCH_REQUIRE_FALSE(with_default.has_flag(advgetopt::GETOPT_FLAG_HAS_DEFAULT));
305 1 : CATCH_REQUIRE(with_default.get_default().empty());
306 : CATCH_END_SECTION()
307 1 : }
308 :
309 :
310 :
311 3 : CATCH_TEST_CASE("option_info_help", "[option_info][valid][help]")
312 : {
313 2 : CATCH_START_SECTION("Check help")
314 2 : advgetopt::option_info help("help", 'h');
315 :
316 1 : CATCH_REQUIRE(help.get_help().empty());
317 :
318 1 : help.set_help("help me");
319 1 : CATCH_REQUIRE(help.get_help() == "help me");
320 :
321 2 : std::string const msg("help msg");
322 1 : help.set_help(msg);
323 1 : CATCH_REQUIRE(help.get_help() == msg);
324 :
325 1 : help.set_help(nullptr);
326 1 : CATCH_REQUIRE(help.get_help() == msg);
327 :
328 1 : help.set_help("");
329 1 : CATCH_REQUIRE(help.get_help().empty());
330 : CATCH_END_SECTION()
331 1 : }
332 :
333 :
334 :
335 6 : CATCH_TEST_CASE("option_info_validator", "[option_info][valid][validator]")
336 : {
337 8 : CATCH_START_SECTION("Check validator (one value)")
338 2 : advgetopt::option_info auto_validate("validator", 'C');
339 :
340 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
341 :
342 1 : auto_validate.set_value(0, "51");
343 1 : CATCH_REQUIRE(auto_validate.size() == 1);
344 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "51");
345 1 : CATCH_REQUIRE(auto_validate.get_long(0) == 51);
346 :
347 1 : auto_validate.set_validator(nullptr);
348 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
349 :
350 2 : advgetopt::validator::pointer_t integer_validator(advgetopt::validator::create("integer", {"1","2","5","6","8"}));
351 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"51\" given to parameter --validator is not considered valid.");
352 1 : auto_validate.set_validator(integer_validator);
353 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
354 1 : CATCH_REQUIRE(auto_validate.get_validator() == integer_validator);
355 :
356 1 : auto_validate.set_value(0, "6");
357 :
358 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"3\" given to parameter --validator is not considered valid.");
359 1 : auto_validate.set_value(0, "3");
360 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
361 :
362 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"11\" given to parameter --validator is not considered valid.");
363 1 : auto_validate.set_value(0, "11");
364 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
365 : CATCH_END_SECTION()
366 :
367 8 : CATCH_START_SECTION("Check validator (multiple values)")
368 2 : advgetopt::option_info auto_validate("validator", 'C');
369 :
370 1 : auto_validate.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
371 :
372 2 : advgetopt::string_list_t list{","};
373 1 : auto_validate.set_multiple_separators(list);
374 :
375 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
376 :
377 1 : auto_validate.set_value(0, "-15");
378 1 : CATCH_REQUIRE(auto_validate.size() == 1);
379 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "-15");
380 1 : CATCH_REQUIRE(auto_validate.get_long(0) == -15);
381 :
382 1 : auto_validate.set_validator(nullptr);
383 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
384 :
385 2 : advgetopt::validator::pointer_t integer_validator(advgetopt::validator::create("integer", {"-1","2","5","6","18"}));
386 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"-15\" given to parameter --validator is not considered valid.");
387 1 : auto_validate.set_validator(integer_validator);
388 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
389 1 : CATCH_REQUIRE(auto_validate.get_validator() == integer_validator);
390 :
391 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"3\" given to parameter --validator is not considered valid.");
392 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"11\" given to parameter --validator is not considered valid.");
393 1 : auto_validate.set_multiple_value("6,3,18,11");
394 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
395 1 : CATCH_REQUIRE(auto_validate.size() == 2);
396 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "6");
397 1 : CATCH_REQUIRE(auto_validate.get_long(0) == 6);
398 1 : CATCH_REQUIRE(auto_validate.get_value(1) == "18");
399 1 : CATCH_REQUIRE(auto_validate.get_long(1) == 18);
400 :
401 1 : auto_validate.set_validator(nullptr);
402 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
403 :
404 1 : auto_validate.set_multiple_value("6,3,18,11");
405 1 : CATCH_REQUIRE(auto_validate.size() == 4);
406 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "6");
407 1 : CATCH_REQUIRE(auto_validate.get_long(0) == 6);
408 1 : CATCH_REQUIRE(auto_validate.get_value(1) == "3");
409 1 : CATCH_REQUIRE(auto_validate.get_long(1) == 3);
410 1 : CATCH_REQUIRE(auto_validate.get_value(2) == "18");
411 1 : CATCH_REQUIRE(auto_validate.get_long(2) == 18);
412 1 : CATCH_REQUIRE(auto_validate.get_value(3) == "11");
413 1 : CATCH_REQUIRE(auto_validate.get_long(3) == 11);
414 : CATCH_END_SECTION()
415 :
416 8 : CATCH_START_SECTION("Check integer validator from string (multiple values)")
417 2 : advgetopt::option_info auto_validate("validator", 'C');
418 :
419 1 : auto_validate.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
420 :
421 2 : advgetopt::string_list_t list{","};
422 1 : auto_validate.set_multiple_separators(list);
423 :
424 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
425 :
426 1 : auto_validate.set_value(0, "35");
427 1 : CATCH_REQUIRE(auto_validate.size() == 1);
428 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "35");
429 1 : CATCH_REQUIRE(auto_validate.get_long(0) == 35);
430 :
431 1 : auto_validate.set_validator(nullptr);
432 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
433 :
434 1 : auto_validate.set_validator(std::string());
435 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
436 :
437 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"35\" given to parameter --validator is not considered valid.");
438 1 : auto_validate.set_validator("integer(-1,2,5,6,18)");
439 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
440 1 : CATCH_REQUIRE(auto_validate.get_validator() != nullptr);
441 1 : CATCH_REQUIRE(auto_validate.get_validator()->name() == "integer");
442 :
443 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"3\" given to parameter --validator is not considered valid.");
444 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"11\" given to parameter --validator is not considered valid.");
445 1 : auto_validate.set_multiple_value("6,3,18,11");
446 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
447 1 : CATCH_REQUIRE(auto_validate.size() == 2);
448 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "6");
449 1 : CATCH_REQUIRE(auto_validate.get_long(0) == 6);
450 1 : CATCH_REQUIRE(auto_validate.get_value(1) == "18");
451 1 : CATCH_REQUIRE(auto_validate.get_long(1) == 18);
452 :
453 1 : auto_validate.set_validator(std::string());
454 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
455 :
456 1 : auto_validate.set_multiple_value("6,3,18,11");
457 1 : CATCH_REQUIRE(auto_validate.size() == 4);
458 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "6");
459 1 : CATCH_REQUIRE(auto_validate.get_long(0) == 6);
460 1 : CATCH_REQUIRE(auto_validate.get_value(1) == "3");
461 1 : CATCH_REQUIRE(auto_validate.get_long(1) == 3);
462 1 : CATCH_REQUIRE(auto_validate.get_value(2) == "18");
463 1 : CATCH_REQUIRE(auto_validate.get_long(2) == 18);
464 1 : CATCH_REQUIRE(auto_validate.get_value(3) == "11");
465 1 : CATCH_REQUIRE(auto_validate.get_long(3) == 11);
466 : CATCH_END_SECTION()
467 :
468 8 : CATCH_START_SECTION("Check regex validator from string (multiple values)")
469 2 : advgetopt::option_info auto_validate("validator", 'C');
470 :
471 1 : auto_validate.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
472 :
473 2 : advgetopt::string_list_t list{","};
474 1 : auto_validate.set_multiple_separators(list);
475 :
476 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
477 :
478 1 : auto_validate.set_value(0, "abc");
479 1 : CATCH_REQUIRE(auto_validate.size() == 1);
480 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "abc");
481 :
482 1 : auto_validate.set_validator(nullptr);
483 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
484 :
485 1 : auto_validate.set_validator(std::string());
486 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
487 :
488 1 : auto_validate.set_validator("/^[a-z]+$/");
489 1 : CATCH_REQUIRE(auto_validate.get_validator() != nullptr);
490 1 : CATCH_REQUIRE(auto_validate.get_validator()->name() == "regex");
491 :
492 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"33\" given to parameter --validator is not considered valid.");
493 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: input \"45\" given to parameter --validator is not considered valid.");
494 1 : auto_validate.set_multiple_value("abc,qqq,33,zac,pop,45");
495 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
496 1 : CATCH_REQUIRE(auto_validate.size() == 4);
497 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "abc");
498 1 : CATCH_REQUIRE(auto_validate.get_value(1) == "qqq");
499 1 : CATCH_REQUIRE(auto_validate.get_value(2) == "zac");
500 1 : CATCH_REQUIRE(auto_validate.get_value(3) == "pop");
501 :
502 1 : auto_validate.set_validator(std::string());
503 1 : CATCH_REQUIRE(auto_validate.get_validator() == nullptr);
504 :
505 1 : auto_validate.set_multiple_value("abc,-56,zoc");
506 1 : CATCH_REQUIRE(auto_validate.size() == 3);
507 1 : CATCH_REQUIRE(auto_validate.get_value(0) == "abc");
508 1 : CATCH_REQUIRE(auto_validate.get_value(1) == "-56");
509 1 : CATCH_REQUIRE(auto_validate.get_value(2) == "zoc");
510 : CATCH_END_SECTION()
511 4 : }
512 :
513 :
514 :
515 :
516 3 : CATCH_TEST_CASE("option_info_alias", "[option_info][valid][alias]")
517 : {
518 2 : CATCH_START_SECTION("Check alias")
519 2 : advgetopt::option_info::pointer_t option(std::make_shared<advgetopt::option_info>("option", 'o'));
520 2 : advgetopt::option_info alias("alias", 'a');
521 :
522 1 : CATCH_REQUIRE(alias.get_alias_destination() == nullptr);
523 :
524 1 : alias.set_alias_destination(option);
525 :
526 1 : CATCH_REQUIRE(alias.get_alias_destination() == option);
527 : CATCH_END_SECTION()
528 1 : }
529 :
530 :
531 :
532 3 : CATCH_TEST_CASE("option_info_multiple_separators", "[option_info][valid][separators][multiple]")
533 : {
534 2 : CATCH_START_SECTION("Check multiple separators")
535 2 : advgetopt::option_info separators("names", 'n');
536 :
537 1 : separators.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
538 :
539 1 : CATCH_REQUIRE(separators.get_multiple_separators().empty());
540 :
541 1 : separators.set_multiple_separators(nullptr);
542 1 : CATCH_REQUIRE(separators.get_multiple_separators().empty());
543 :
544 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
545 1 : CATCH_REQUIRE(separators.size() == 1);
546 1 : CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
547 :
548 2 : advgetopt::string_list_t empty_list;
549 1 : separators.set_multiple_separators(empty_list);
550 1 : CATCH_REQUIRE(separators.get_multiple_separators().empty());
551 :
552 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
553 1 : CATCH_REQUIRE(separators.size() == 1);
554 1 : CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
555 :
556 : char const * const empty_separator_list[]{
557 : nullptr
558 1 : };
559 1 : separators.set_multiple_separators(empty_separator_list);
560 1 : CATCH_REQUIRE(separators.get_multiple_separators().empty());
561 :
562 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
563 1 : CATCH_REQUIRE(separators.size() == 1);
564 1 : CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
565 :
566 : char const * const separator_list[]{
567 : ",",
568 : ";",
569 : " ",
570 : "^",
571 : nullptr
572 1 : };
573 1 : separators.set_multiple_separators(separator_list);
574 1 : CATCH_REQUIRE(separators.get_multiple_separators().size() == 4);
575 :
576 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
577 1 : CATCH_REQUIRE(separators.size() == 5);
578 1 : CATCH_REQUIRE(separators.get_value(0) == "n1");
579 1 : CATCH_REQUIRE(separators.get_value(1) == "n2");
580 1 : CATCH_REQUIRE(separators.get_value(2) == "n3");
581 1 : CATCH_REQUIRE(separators.get_value(3) == "n4");
582 1 : CATCH_REQUIRE(separators.get_value(4) == "n5");
583 :
584 1 : separators.set_multiple_separators(empty_separator_list);
585 1 : CATCH_REQUIRE(separators.get_multiple_separators().empty());
586 :
587 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
588 1 : CATCH_REQUIRE(separators.size() == 1);
589 1 : CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
590 :
591 : advgetopt::string_list_t list{
592 : ",",
593 : ";",
594 : " ",
595 : "^"
596 2 : };
597 1 : separators.set_multiple_separators(list);
598 1 : CATCH_REQUIRE(separators.get_multiple_separators().size() == 4);
599 :
600 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
601 1 : CATCH_REQUIRE(separators.size() == 5);
602 1 : CATCH_REQUIRE(separators.get_value(0) == "n1");
603 1 : CATCH_REQUIRE(separators.get_value(1) == "n2");
604 1 : CATCH_REQUIRE(separators.get_value(2) == "n3");
605 1 : CATCH_REQUIRE(separators.get_value(3) == "n4");
606 1 : CATCH_REQUIRE(separators.get_value(4) == "n5");
607 :
608 1 : separators.set_multiple_separators(empty_list);
609 1 : CATCH_REQUIRE(separators.get_multiple_separators().empty());
610 :
611 1 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5");
612 1 : CATCH_REQUIRE(separators.size() == 1);
613 1 : CATCH_REQUIRE(separators.get_value(0) == "n1,n2;n3 n4 ^ n5");
614 : CATCH_END_SECTION()
615 1 : }
616 :
617 :
618 :
619 6 : CATCH_TEST_CASE("option_info_add_value", "[option_info][valid][add][multiple]")
620 : {
621 8 : CATCH_START_SECTION("Add value, verify lock (add/remove flag explicitly)")
622 2 : advgetopt::option_info one_value("names", 'n');
623 :
624 1 : CATCH_REQUIRE(one_value.size() == 0);
625 :
626 1 : one_value.add_value("value one");
627 1 : CATCH_REQUIRE(one_value.size() == 1);
628 1 : CATCH_REQUIRE(one_value.get_value(0) == "value one");
629 :
630 1 : one_value.add_value("value two");
631 1 : CATCH_REQUIRE(one_value.size() == 1);
632 1 : CATCH_REQUIRE(one_value.get_value(0) == "value two");
633 :
634 1 : one_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
635 :
636 1 : one_value.add_value("value three");
637 1 : CATCH_REQUIRE(one_value.size() == 1);
638 1 : CATCH_REQUIRE(one_value.get_value(0) == "value two");
639 :
640 1 : one_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
641 :
642 1 : one_value.add_value("value four");
643 1 : CATCH_REQUIRE(one_value.size() == 1);
644 1 : CATCH_REQUIRE(one_value.get_value(0) == "value four");
645 :
646 1 : one_value.reset();
647 1 : CATCH_REQUIRE(one_value.size() == 0);
648 :
649 : // to verify that the f_integer was reset we kind of very much
650 : // have to re-add a value
651 : //
652 1 : one_value.set_value(0, "value one");
653 1 : CATCH_REQUIRE(one_value.size() == 1);
654 1 : CATCH_REQUIRE(one_value.get_value(0) == "value one");
655 : CATCH_END_SECTION()
656 :
657 8 : CATCH_START_SECTION("Add value, verify integer")
658 2 : advgetopt::option_info one_value("names", 'n');
659 :
660 1 : CATCH_REQUIRE(one_value.size() == 0);
661 :
662 1 : one_value.add_value("123");
663 1 : CATCH_REQUIRE(one_value.size() == 1);
664 1 : CATCH_REQUIRE(one_value.get_value(0) == "123");
665 1 : CATCH_REQUIRE(one_value.get_long(0) == 123);
666 :
667 1 : one_value.add_value("456");
668 1 : CATCH_REQUIRE(one_value.size() == 1);
669 1 : CATCH_REQUIRE(one_value.get_value(0) == "456");
670 1 : CATCH_REQUIRE(one_value.get_long(0) == 456);
671 :
672 1 : one_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
673 :
674 1 : one_value.add_value("789");
675 1 : CATCH_REQUIRE(one_value.size() == 1);
676 1 : CATCH_REQUIRE(one_value.get_value(0) == "456");
677 1 : CATCH_REQUIRE(one_value.get_long(0) == 456);
678 :
679 1 : one_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
680 :
681 1 : one_value.add_value("505");
682 1 : CATCH_REQUIRE(one_value.size() == 1);
683 1 : CATCH_REQUIRE(one_value.get_value(0) == "505");
684 1 : CATCH_REQUIRE(one_value.get_long(0) == 505);
685 :
686 1 : one_value.reset();
687 1 : CATCH_REQUIRE(one_value.size() == 0);
688 :
689 : // to verify that the f_integer was reset we kind of very much
690 : // have to re-add a value
691 : //
692 1 : one_value.set_value(0, "123");
693 1 : CATCH_REQUIRE(one_value.size() == 1);
694 1 : CATCH_REQUIRE(one_value.get_value(0) == "123");
695 1 : CATCH_REQUIRE(one_value.get_long(0) == 123);
696 : CATCH_END_SECTION()
697 :
698 8 : CATCH_START_SECTION("Add value, verify multiple strings")
699 2 : advgetopt::option_info multi_value("names", 'n');
700 :
701 1 : CATCH_REQUIRE(multi_value.size() == 0);
702 :
703 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
704 :
705 1 : multi_value.add_value("value one");
706 1 : CATCH_REQUIRE(multi_value.size() == 1);
707 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
708 :
709 1 : multi_value.add_value("value two");
710 1 : CATCH_REQUIRE(multi_value.size() == 2);
711 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
712 1 : CATCH_REQUIRE(multi_value.get_value(1) == "value two");
713 :
714 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
715 :
716 1 : multi_value.add_value("value three");
717 1 : CATCH_REQUIRE(multi_value.size() == 2);
718 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
719 1 : CATCH_REQUIRE(multi_value.get_value(1) == "value two");
720 :
721 1 : multi_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
722 :
723 1 : multi_value.add_value("value four");
724 1 : CATCH_REQUIRE(multi_value.size() == 3);
725 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
726 1 : CATCH_REQUIRE(multi_value.get_value(1) == "value two");
727 1 : CATCH_REQUIRE(multi_value.get_value(2) == "value four");
728 :
729 1 : multi_value.reset();
730 1 : CATCH_REQUIRE(multi_value.size() == 0);
731 :
732 : // to verify that the f_integer was reset we kind of very much
733 : // have to re-add a value
734 : //
735 1 : multi_value.set_value(0, "value one");
736 1 : CATCH_REQUIRE(multi_value.size() == 1);
737 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
738 : CATCH_END_SECTION()
739 :
740 8 : CATCH_START_SECTION("Add value, verify multiple integers")
741 2 : advgetopt::option_info multi_value("names", 'n');
742 :
743 1 : CATCH_REQUIRE(multi_value.size() == 0);
744 :
745 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
746 :
747 1 : multi_value.add_value("123");
748 1 : CATCH_REQUIRE(multi_value.size() == 1);
749 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
750 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
751 :
752 1 : multi_value.add_value("456");
753 1 : CATCH_REQUIRE(multi_value.size() == 2);
754 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
755 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
756 1 : CATCH_REQUIRE(multi_value.get_value(1) == "456");
757 1 : CATCH_REQUIRE(multi_value.get_long(1) == 456);
758 :
759 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_LOCK);
760 :
761 1 : multi_value.add_value("789");
762 1 : CATCH_REQUIRE(multi_value.size() == 2);
763 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
764 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
765 1 : CATCH_REQUIRE(multi_value.get_value(1) == "456");
766 1 : CATCH_REQUIRE(multi_value.get_long(1) == 456);
767 :
768 1 : multi_value.remove_flag(advgetopt::GETOPT_FLAG_LOCK);
769 :
770 1 : multi_value.add_value("505");
771 1 : CATCH_REQUIRE(multi_value.size() == 3);
772 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
773 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
774 1 : CATCH_REQUIRE(multi_value.get_value(1) == "456");
775 1 : CATCH_REQUIRE(multi_value.get_long(1) == 456);
776 1 : CATCH_REQUIRE(multi_value.get_value(2) == "505");
777 1 : CATCH_REQUIRE(multi_value.get_long(2) == 505);
778 :
779 1 : multi_value.reset();
780 1 : CATCH_REQUIRE(multi_value.size() == 0);
781 :
782 : // to verify that the f_integer was reset we kind of very much
783 : // have to re-add a value
784 : //
785 1 : multi_value.set_value(0, "123");
786 1 : CATCH_REQUIRE(multi_value.size() == 1);
787 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
788 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
789 : CATCH_END_SECTION()
790 4 : }
791 :
792 :
793 :
794 6 : CATCH_TEST_CASE("option_info_set_value", "[option_info][valid][set][multiple]")
795 : {
796 8 : CATCH_START_SECTION("Set value, verify lock (use lock()/unlock() functions)")
797 2 : advgetopt::option_info one_value("names", 'n');
798 :
799 1 : CATCH_REQUIRE(one_value.size() == 0);
800 :
801 1 : one_value.set_value(0, "value one");
802 1 : CATCH_REQUIRE(one_value.size() == 1);
803 1 : CATCH_REQUIRE(one_value.get_value(0) == "value one");
804 :
805 1 : one_value.set_value(0, "value two");
806 1 : CATCH_REQUIRE(one_value.size() == 1);
807 1 : CATCH_REQUIRE(one_value.get_value(0) == "value two");
808 :
809 1 : one_value.lock();
810 :
811 1 : one_value.set_value(0, "value three");
812 1 : CATCH_REQUIRE(one_value.size() == 1);
813 1 : CATCH_REQUIRE(one_value.get_value(0) == "value two");
814 :
815 1 : one_value.unlock();
816 :
817 1 : one_value.set_value(0, "value four");
818 1 : CATCH_REQUIRE(one_value.size() == 1);
819 1 : CATCH_REQUIRE(one_value.get_value(0) == "value four");
820 :
821 1 : one_value.reset();
822 1 : CATCH_REQUIRE(one_value.size() == 0);
823 :
824 : // to verify that the f_integer was reset we kind of very much
825 : // have to re-add a value
826 : //
827 1 : one_value.set_value(0, "value one");
828 1 : CATCH_REQUIRE(one_value.size() == 1);
829 1 : CATCH_REQUIRE(one_value.get_value(0) == "value one");
830 : CATCH_END_SECTION()
831 :
832 8 : CATCH_START_SECTION("Set value, verify integer")
833 2 : advgetopt::option_info one_value("names", 'n');
834 :
835 1 : CATCH_REQUIRE(one_value.size() == 0);
836 :
837 1 : one_value.set_value(0, "123");
838 1 : CATCH_REQUIRE(one_value.size() == 1);
839 1 : CATCH_REQUIRE(one_value.get_value(0) == "123");
840 1 : CATCH_REQUIRE(one_value.get_long(0) == 123);
841 :
842 1 : one_value.set_value(0, "456");
843 1 : CATCH_REQUIRE(one_value.size() == 1);
844 1 : CATCH_REQUIRE(one_value.get_value(0) == "456");
845 1 : CATCH_REQUIRE(one_value.get_long(0) == 456);
846 :
847 1 : one_value.lock();
848 :
849 1 : one_value.set_value(0, "789");
850 1 : CATCH_REQUIRE(one_value.size() == 1);
851 1 : CATCH_REQUIRE(one_value.get_value(0) == "456");
852 1 : CATCH_REQUIRE(one_value.get_long(0) == 456);
853 :
854 1 : one_value.unlock();
855 :
856 1 : one_value.set_value(0, "505");
857 1 : CATCH_REQUIRE(one_value.size() == 1);
858 1 : CATCH_REQUIRE(one_value.get_value(0) == "505");
859 1 : CATCH_REQUIRE(one_value.get_long(0) == 505);
860 :
861 1 : one_value.reset();
862 1 : CATCH_REQUIRE(one_value.size() == 0);
863 :
864 : // to verify that the f_integer was reset we kind of very much
865 : // have to re-add a value
866 : //
867 1 : one_value.set_value(0, "123");
868 1 : CATCH_REQUIRE(one_value.size() == 1);
869 1 : CATCH_REQUIRE(one_value.get_value(0) == "123");
870 1 : CATCH_REQUIRE(one_value.get_long(0) == 123);
871 : CATCH_END_SECTION()
872 :
873 8 : CATCH_START_SECTION("Set value, verify multiple strings (with MULTIPLE & lock(false))")
874 2 : advgetopt::option_info multi_value("names", 'n');
875 :
876 1 : multi_value.lock(false);
877 :
878 1 : CATCH_REQUIRE(multi_value.size() == 0);
879 :
880 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
881 :
882 1 : multi_value.set_value(0, "value one");
883 1 : CATCH_REQUIRE(multi_value.size() == 1);
884 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
885 :
886 1 : multi_value.set_value(1, "value two");
887 1 : CATCH_REQUIRE(multi_value.size() == 2);
888 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
889 1 : CATCH_REQUIRE(multi_value.get_value(1) == "value two");
890 :
891 1 : multi_value.lock(false);
892 :
893 1 : multi_value.set_value(2, "value three");
894 1 : CATCH_REQUIRE(multi_value.size() == 2);
895 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
896 1 : CATCH_REQUIRE(multi_value.get_value(1) == "value two");
897 :
898 1 : multi_value.unlock();
899 :
900 1 : multi_value.set_value(2, "value four");
901 1 : CATCH_REQUIRE(multi_value.size() == 3);
902 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
903 1 : CATCH_REQUIRE(multi_value.get_value(1) == "value two");
904 1 : CATCH_REQUIRE(multi_value.get_value(2) == "value four");
905 :
906 1 : multi_value.reset();
907 1 : CATCH_REQUIRE(multi_value.size() == 0);
908 :
909 : // to verify that the f_integer was reset we kind of very much
910 : // have to re-add a value
911 : //
912 1 : multi_value.set_value(0, "value one");
913 1 : CATCH_REQUIRE(multi_value.size() == 1);
914 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
915 : CATCH_END_SECTION()
916 :
917 8 : CATCH_START_SECTION("Set value, verify multiple integers (with MULTIPLE & lock(false))")
918 2 : advgetopt::option_info multi_value("names", 'n');
919 :
920 1 : CATCH_REQUIRE(multi_value.size() == 0);
921 :
922 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
923 :
924 1 : multi_value.lock(false);
925 :
926 1 : multi_value.set_value(0, "123");
927 1 : CATCH_REQUIRE(multi_value.size() == 1);
928 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
929 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
930 :
931 1 : multi_value.set_value(1, "456");
932 1 : CATCH_REQUIRE(multi_value.size() == 2);
933 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
934 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
935 1 : CATCH_REQUIRE(multi_value.get_value(1) == "456");
936 1 : CATCH_REQUIRE(multi_value.get_long(1) == 456);
937 :
938 1 : multi_value.lock(false);
939 :
940 1 : multi_value.set_value(2, "789");
941 1 : CATCH_REQUIRE(multi_value.size() == 2);
942 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
943 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
944 1 : CATCH_REQUIRE(multi_value.get_value(1) == "456");
945 1 : CATCH_REQUIRE(multi_value.get_long(1) == 456);
946 :
947 1 : multi_value.unlock();
948 :
949 1 : multi_value.set_value(2, "505");
950 1 : CATCH_REQUIRE(multi_value.size() == 3);
951 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
952 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
953 1 : CATCH_REQUIRE(multi_value.get_value(1) == "456");
954 1 : CATCH_REQUIRE(multi_value.get_long(1) == 456);
955 1 : CATCH_REQUIRE(multi_value.get_value(2) == "505");
956 1 : CATCH_REQUIRE(multi_value.get_long(2) == 505);
957 :
958 1 : multi_value.reset();
959 1 : CATCH_REQUIRE(multi_value.size() == 0);
960 :
961 : // to verify that the f_integer was reset we kind of very much
962 : // have to re-add a value
963 : //
964 1 : multi_value.set_value(0, "123");
965 1 : CATCH_REQUIRE(multi_value.size() == 1);
966 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
967 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
968 : CATCH_END_SECTION()
969 4 : }
970 :
971 :
972 :
973 6 : CATCH_TEST_CASE("option_info_section_functions", "[option_info][valid][add][section]")
974 : {
975 8 : CATCH_START_SECTION("Value without sections")
976 2 : advgetopt::option_info value("no-sections", 'z');
977 :
978 1 : CATCH_REQUIRE(value.get_basename() == "no-sections");
979 1 : CATCH_REQUIRE(value.get_section_name() == std::string());
980 1 : CATCH_REQUIRE(value.get_section_name_list().empty());
981 : CATCH_END_SECTION()
982 :
983 8 : CATCH_START_SECTION("Value with one section")
984 2 : advgetopt::option_info value("one::section", 'o');
985 :
986 1 : CATCH_REQUIRE(value.get_basename() == "section");
987 1 : CATCH_REQUIRE(value.get_section_name() == "one");
988 2 : advgetopt::string_list_t sections(value.get_section_name_list());
989 1 : CATCH_REQUIRE(sections.size() == 1);
990 1 : CATCH_REQUIRE(sections[0] == "one");
991 : CATCH_END_SECTION()
992 :
993 8 : CATCH_START_SECTION("Value with two sections")
994 2 : advgetopt::option_info value("one::two::section", 't');
995 :
996 1 : CATCH_REQUIRE(value.get_basename() == "section");
997 1 : CATCH_REQUIRE(value.get_section_name() == "one::two");
998 2 : advgetopt::string_list_t sections(value.get_section_name_list());
999 1 : CATCH_REQUIRE(sections.size() == 2);
1000 1 : CATCH_REQUIRE(sections[0] == "one");
1001 1 : CATCH_REQUIRE(sections[1] == "two");
1002 : CATCH_END_SECTION()
1003 :
1004 8 : CATCH_START_SECTION("Value with three sections")
1005 2 : advgetopt::option_info value("s1::s2::s3::section", 'f');
1006 :
1007 1 : CATCH_REQUIRE(value.get_basename() == "section");
1008 1 : CATCH_REQUIRE(value.get_section_name() == "s1::s2::s3");
1009 2 : advgetopt::string_list_t sections(value.get_section_name_list());
1010 1 : CATCH_REQUIRE(sections.size() == 3);
1011 1 : CATCH_REQUIRE(sections[0] == "s1");
1012 1 : CATCH_REQUIRE(sections[1] == "s2");
1013 1 : CATCH_REQUIRE(sections[2] == "s3");
1014 : CATCH_END_SECTION()
1015 4 : }
1016 :
1017 :
1018 :
1019 :
1020 3 : CATCH_TEST_CASE("redefine_option_short_name", "[options][valid][config]")
1021 : {
1022 2 : CATCH_START_SECTION("Test adding '-<delta>' to '--config-dir'")
1023 : {
1024 : advgetopt::option const options[] =
1025 : {
1026 : advgetopt::define_option(
1027 : advgetopt::Name("group")
1028 : , advgetopt::ShortName('g')
1029 : , advgetopt::Flags(advgetopt::command_flags<advgetopt::GETOPT_FLAG_REQUIRED>())
1030 : , advgetopt::Help("group name.")
1031 : ),
1032 : advgetopt::end_options()
1033 1 : };
1034 :
1035 1 : advgetopt::options_environment environment_options;
1036 1 : environment_options.f_project_name = "unittest";
1037 1 : environment_options.f_options = options;
1038 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1039 1 : environment_options.f_configuration_filename = "snaplog.conf";
1040 1 : environment_options.f_help_header = "Usage: test --config-dir";
1041 :
1042 : char const * cargv[] =
1043 : {
1044 : "/usr/bin/arguments",
1045 : "-g",
1046 : "m2osw",
1047 : "-L",
1048 : "-\xE2\xB5\xA0", // Delta character
1049 : "/opt/advgetopt/config",
1050 : nullptr
1051 1 : };
1052 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
1053 1 : char ** argv = const_cast<char **>(cargv);
1054 :
1055 2 : advgetopt::getopt opt(environment_options);
1056 1 : opt.parse_program_name(argv);
1057 :
1058 1 : CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
1059 1 : opt.set_short_name("config-dir", 0x2D60);
1060 :
1061 1 : opt.parse_arguments(argc, argv);
1062 :
1063 : // check that the result is valid
1064 :
1065 : // an invalid parameter, MUST NOT EXIST
1066 1 : CATCH_REQUIRE(opt.get_option("invalid-parameter") == nullptr);
1067 1 : CATCH_REQUIRE(opt.get_option('Z') == nullptr);
1068 1 : CATCH_REQUIRE_FALSE(opt.is_defined("invalid-parameter"));
1069 1 : CATCH_REQUIRE(opt.get_default("invalid-parameter").empty());
1070 1 : CATCH_REQUIRE(opt.size("invalid-parameter") == 0);
1071 :
1072 : // the valid parameter
1073 1 : CATCH_REQUIRE(opt.get_option("group") != nullptr);
1074 1 : CATCH_REQUIRE(opt.get_option('g') == opt.get_option("group"));
1075 1 : CATCH_REQUIRE(opt.is_defined("group"));
1076 1 : CATCH_REQUIRE(opt.get_string("group") == "m2osw");
1077 1 : CATCH_REQUIRE(opt.get_string("group", 0) == "m2osw");
1078 1 : CATCH_REQUIRE(opt.get_default("group").empty());
1079 1 : CATCH_REQUIRE(opt.size("group") == 1);
1080 :
1081 : // the license system parameter
1082 1 : CATCH_REQUIRE(opt.get_option("license") != nullptr);
1083 1 : CATCH_REQUIRE(opt.get_option('L') == opt.get_option("license"));
1084 1 : CATCH_REQUIRE(opt.is_defined("license"));
1085 1 : CATCH_REQUIRE(opt.get_default("license").empty());
1086 1 : CATCH_REQUIRE(opt.size("license") == 1);
1087 :
1088 : // the config-dir system parameter
1089 1 : CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
1090 1 : CATCH_REQUIRE(opt.get_option(static_cast<advgetopt::short_name_t>(0x2D60)) == opt.get_option("config-dir"));
1091 1 : CATCH_REQUIRE(opt.is_defined("config-dir"));
1092 1 : CATCH_REQUIRE(opt.get_default("config-dir").empty());
1093 1 : CATCH_REQUIRE(opt.size("config-dir") == 1);
1094 1 : CATCH_REQUIRE(opt.get_string("config-dir") == "/opt/advgetopt/config");
1095 :
1096 : // other parameters
1097 1 : CATCH_REQUIRE(opt.get_program_name() == "arguments");
1098 1 : CATCH_REQUIRE(opt.get_program_fullname() == "/usr/bin/arguments");
1099 : }
1100 : CATCH_END_SECTION()
1101 1 : }
1102 :
1103 :
1104 :
1105 :
1106 :
1107 :
1108 :
1109 :
1110 :
1111 16 : CATCH_TEST_CASE("invalid_option_info", "[option_info][invalid]")
1112 : {
1113 28 : CATCH_START_SECTION("No name")
1114 1 : CATCH_REQUIRE_THROWS_MATCHES(
1115 : advgetopt::option_info("")
1116 : , advgetopt::getopt_exception_logic
1117 : , Catch::Matchers::ExceptionMessage(
1118 : "option_info::option_info(): all options must at least have a long name."));
1119 :
1120 1 : CATCH_REQUIRE_THROWS_MATCHES(
1121 : advgetopt::option_info("", 'v')
1122 : , advgetopt::getopt_exception_logic
1123 : , Catch::Matchers::ExceptionMessage(
1124 : "option_info::option_info(): all options must at least have a long name (short name: 'v'.)"));
1125 :
1126 1 : CATCH_REQUIRE_THROWS_MATCHES(
1127 : advgetopt::option_info(std::string())
1128 : , advgetopt::getopt_exception_logic
1129 : , Catch::Matchers::ExceptionMessage(
1130 : "option_info::option_info(): all options must at least have a long name."));
1131 :
1132 1 : CATCH_REQUIRE_THROWS_MATCHES(
1133 : advgetopt::option_info(std::string(), 'p')
1134 : , advgetopt::getopt_exception_logic
1135 : , Catch::Matchers::ExceptionMessage(
1136 : "option_info::option_info(): all options must at least have a long name (short name: 'p'.)"));
1137 : CATCH_END_SECTION()
1138 :
1139 28 : CATCH_START_SECTION("Default with short name")
1140 1 : CATCH_REQUIRE_THROWS_MATCHES(
1141 : advgetopt::option_info("--", 'f')
1142 : , advgetopt::getopt_exception_logic
1143 : , Catch::Matchers::ExceptionMessage(
1144 : "option_info::option_info(): the default parameter \"--\" cannot include a short name ('f'.)"));
1145 : CATCH_END_SECTION()
1146 :
1147 28 : CATCH_START_SECTION("Long name cannot start with a dash (-)")
1148 1 : CATCH_REQUIRE_THROWS_MATCHES(
1149 : advgetopt::option_info("--dashes")
1150 : , advgetopt::getopt_exception_logic
1151 : , Catch::Matchers::ExceptionMessage(
1152 : "option_info::option_info(): an option cannot start with a dash (-), \"--dashes\" is not valid."));
1153 : CATCH_END_SECTION()
1154 :
1155 28 : CATCH_START_SECTION("Short name cannot be a dash (-)")
1156 1 : CATCH_REQUIRE_THROWS_MATCHES(
1157 : advgetopt::option_info("dash", '-')
1158 : , advgetopt::getopt_exception_logic
1159 : , Catch::Matchers::ExceptionMessage(
1160 : "option_info::option_info(): the short name of an option cannot be the dash (-)."));
1161 : CATCH_END_SECTION()
1162 :
1163 28 : CATCH_START_SECTION("Get value when undefined")
1164 2 : advgetopt::option_info verbose("verbose", 'v');
1165 1 : CATCH_REQUIRE_THROWS_MATCHES(
1166 : verbose.get_value()
1167 : , advgetopt::getopt_exception_undefined
1168 : , Catch::Matchers::ExceptionMessage(
1169 : "option_info::get_value(): no value at index 0 (idx >= 0) for --verbose so you can't get this value."));
1170 : CATCH_END_SECTION()
1171 :
1172 28 : CATCH_START_SECTION("Get long when undefined")
1173 2 : advgetopt::option_info verbose("verbose", 'v');
1174 1 : CATCH_REQUIRE_THROWS_MATCHES(
1175 : verbose.get_long()
1176 : , advgetopt::getopt_exception_undefined
1177 : , Catch::Matchers::ExceptionMessage(
1178 : "option_info::get_long(): no value at index 0 (idx >= 0) for --verbose so you can't get this value."));
1179 : CATCH_END_SECTION()
1180 :
1181 28 : CATCH_START_SECTION("Check alias of alias")
1182 2 : advgetopt::option_info::pointer_t option(std::make_shared<advgetopt::option_info>("option", 'o'));
1183 2 : advgetopt::option_info alias("alias", 'a');
1184 :
1185 1 : option->add_flag(advgetopt::GETOPT_FLAG_ALIAS);
1186 :
1187 1 : CATCH_REQUIRE(alias.get_alias_destination() == nullptr);
1188 :
1189 1 : CATCH_REQUIRE_THROWS_MATCHES(
1190 : alias.set_alias_destination(option)
1191 : , advgetopt::getopt_exception_invalid
1192 : , Catch::Matchers::ExceptionMessage(
1193 : "option_info::set_alias(): you can't set an alias as"
1194 : " an alias of another option."));
1195 :
1196 1 : CATCH_REQUIRE(alias.get_alias_destination() == nullptr);
1197 : CATCH_END_SECTION()
1198 :
1199 28 : CATCH_START_SECTION("Set value, verify multiple strings (with MULTIPLE)")
1200 2 : advgetopt::option_info multi_value("names", 'n');
1201 :
1202 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
1203 :
1204 1 : CATCH_REQUIRE(multi_value.size() == 0);
1205 :
1206 1 : multi_value.set_value(0, "value one");
1207 1 : CATCH_REQUIRE(multi_value.size() == 1);
1208 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
1209 :
1210 1 : CATCH_REQUIRE_THROWS_MATCHES(
1211 : multi_value.set_value(2, "value two")
1212 : , advgetopt::getopt_exception_logic
1213 : , Catch::Matchers::ExceptionMessage(
1214 : "option_info::set_value(): no value at index 2 and it is not the last available index + 1 (idx > 1) so you can't set this value (try add_value() maybe?)."));
1215 :
1216 1 : CATCH_REQUIRE(multi_value.size() == 1);
1217 1 : CATCH_REQUIRE(multi_value.get_value(0) == "value one");
1218 : CATCH_END_SECTION()
1219 :
1220 28 : CATCH_START_SECTION("Set value, verify multiple integers (with MULTIPLE)")
1221 2 : advgetopt::option_info multi_value("names", 'n');
1222 :
1223 1 : multi_value.add_flag(advgetopt::GETOPT_FLAG_MULTIPLE);
1224 :
1225 1 : CATCH_REQUIRE(multi_value.size() == 0);
1226 :
1227 1 : multi_value.set_value(0, "123");
1228 1 : CATCH_REQUIRE(multi_value.size() == 1);
1229 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
1230 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
1231 :
1232 1 : CATCH_REQUIRE_THROWS_MATCHES(
1233 : multi_value.set_value(2, "456")
1234 : , advgetopt::getopt_exception_logic
1235 : , Catch::Matchers::ExceptionMessage(
1236 : "option_info::set_value(): no value at index 2 and it is not the last available index + 1 (idx > 1) so you can't set this value (try add_value() maybe?)."));
1237 :
1238 1 : CATCH_REQUIRE(multi_value.size() == 1);
1239 1 : CATCH_REQUIRE(multi_value.get_value(0) == "123");
1240 1 : CATCH_REQUIRE(multi_value.get_long(0) == 123);
1241 : CATCH_END_SECTION()
1242 :
1243 28 : CATCH_START_SECTION("Set value, verify multiple strings (without MULTIPLE)")
1244 2 : advgetopt::option_info one_value("names", 'n');
1245 :
1246 1 : CATCH_REQUIRE(one_value.size() == 0);
1247 :
1248 1 : one_value.set_value(0, "value one");
1249 1 : CATCH_REQUIRE(one_value.size() == 1);
1250 1 : CATCH_REQUIRE(one_value.get_value(0) == "value one");
1251 :
1252 1 : CATCH_REQUIRE_THROWS_MATCHES(
1253 : one_value.set_value(1, "value two")
1254 : , advgetopt::getopt_exception_logic
1255 : , Catch::Matchers::ExceptionMessage(
1256 : "option_info::set_value(): single value option \"--names\" does not accepts index 1 which is not 0."));
1257 :
1258 1 : CATCH_REQUIRE(one_value.size() == 1);
1259 1 : CATCH_REQUIRE(one_value.get_value(0) == "value one");
1260 : CATCH_END_SECTION()
1261 :
1262 28 : CATCH_START_SECTION("Set value, verify multiple integers (without MULTIPLE)")
1263 2 : advgetopt::option_info one_value("names", 'n');
1264 :
1265 1 : CATCH_REQUIRE(one_value.size() == 0);
1266 :
1267 1 : one_value.set_value(0, "123");
1268 1 : CATCH_REQUIRE(one_value.size() == 1);
1269 1 : CATCH_REQUIRE(one_value.get_value(0) == "123");
1270 1 : CATCH_REQUIRE(one_value.get_long(0) == 123);
1271 :
1272 1 : CATCH_REQUIRE_THROWS_MATCHES(
1273 : one_value.set_value(1, "456")
1274 : , advgetopt::getopt_exception_logic
1275 : , Catch::Matchers::ExceptionMessage(
1276 : "option_info::set_value(): single value option \"--names\" does not accepts index 1 which is not 0."));
1277 :
1278 1 : CATCH_REQUIRE(one_value.size() == 1);
1279 1 : CATCH_REQUIRE(one_value.get_value(0) == "123");
1280 1 : CATCH_REQUIRE(one_value.get_long(0) == 123);
1281 : CATCH_END_SECTION()
1282 :
1283 28 : CATCH_START_SECTION("Long number too large")
1284 2 : advgetopt::option_info size("size", 's');
1285 :
1286 1 : CATCH_REQUIRE(size.size() == 0);
1287 :
1288 : // really too large
1289 : //
1290 1 : size.set_value(0, "100000000000000000000");
1291 1 : CATCH_REQUIRE(size.size() == 1);
1292 1 : CATCH_REQUIRE(size.get_value(0) == "100000000000000000000");
1293 :
1294 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (100000000000000000000) in parameter --size at offset 0.");
1295 1 : CATCH_REQUIRE(size.get_long(0) == -1);
1296 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
1297 :
1298 : // too large by 1
1299 : //
1300 1 : size.set_value(0, "9223372036854775808");
1301 1 : CATCH_REQUIRE(size.size() == 1);
1302 1 : CATCH_REQUIRE(size.get_value(0) == "9223372036854775808");
1303 :
1304 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (9223372036854775808) in parameter --size at offset 0.");
1305 1 : CATCH_REQUIRE(size.get_long(0) == -1);
1306 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
1307 :
1308 : // too small by 1
1309 : //
1310 1 : size.set_value(0, "-9223372036854775809");
1311 1 : CATCH_REQUIRE(size.size() == 1);
1312 1 : CATCH_REQUIRE(size.get_value(0) == "-9223372036854775809");
1313 :
1314 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (-9223372036854775809) in parameter --size at offset 0.");
1315 1 : CATCH_REQUIRE(size.get_long(0) == -1);
1316 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
1317 :
1318 : // not a valid number
1319 : //
1320 1 : size.set_value(0, "97 potatoes");
1321 1 : CATCH_REQUIRE(size.size() == 1);
1322 1 : CATCH_REQUIRE(size.get_value(0) == "97 potatoes");
1323 :
1324 1 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: invalid number (97 potatoes) in parameter --size at offset 0.");
1325 1 : CATCH_REQUIRE(size.get_long(0) == -1);
1326 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
1327 : CATCH_END_SECTION()
1328 :
1329 28 : CATCH_START_SECTION("Check multiple separators")
1330 2 : advgetopt::option_info separators("names", 'n');
1331 :
1332 : advgetopt::string_list_t list{
1333 : ",",
1334 : ";",
1335 : " ",
1336 : "^"
1337 2 : };
1338 1 : separators.set_multiple_separators(list);
1339 :
1340 1 : CATCH_REQUIRE_THROWS_MATCHES(
1341 : separators.set_multiple_value("n1,n2;n3 n4 ^ n5")
1342 : , advgetopt::getopt_exception_logic
1343 : , Catch::Matchers::ExceptionMessage(
1344 : "option_info::set_multiple_value(): parameter --names expects zero or one parameter."
1345 : " The set_multiple_value() function should not be called with parameters that only accept one value."));
1346 :
1347 1 : CATCH_REQUIRE(separators.size() == 0);
1348 : CATCH_END_SECTION()
1349 :
1350 28 : CATCH_START_SECTION("Check multiple separators")
1351 2 : advgetopt::option_info auto_validate("validator", 'C');
1352 1 : CATCH_REQUIRE_THROWS_MATCHES(
1353 : auto_validate.set_validator("regex('^[a-z]+$/'")
1354 : , advgetopt::getopt_exception_logic
1355 : , Catch::Matchers::ExceptionMessage(
1356 : "invalid validator parameter definition: \"regex('^[a-z]+$/'\", the ')' is missing."));
1357 : CATCH_END_SECTION()
1358 14 : }
1359 :
1360 :
1361 :
1362 :
1363 4 : CATCH_TEST_CASE("check_invalid_config_dir_short_names", "[arguments][invalid][getopt][config]")
1364 : {
1365 4 : CATCH_START_SECTION("Trying to set NO_SHORT_NAME as '--config-dir' short name (option_info)")
1366 : {
1367 : advgetopt::option const options[] =
1368 : {
1369 : advgetopt::define_option(
1370 : advgetopt::Name("print")
1371 : , advgetopt::ShortName(U'p')
1372 : , advgetopt::Flags(advgetopt::command_flags<>())
1373 : , advgetopt::Help("output filename.")
1374 : ),
1375 : advgetopt::end_options()
1376 1 : };
1377 :
1378 1 : advgetopt::options_environment environment_options;
1379 1 : environment_options.f_project_name = "unittest";
1380 1 : environment_options.f_options = options;
1381 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1382 1 : environment_options.f_configuration_filename = "snapwatchdog.conf";
1383 1 : environment_options.f_help_header = "Usage: test --config-dir";
1384 :
1385 2 : advgetopt::getopt opt(environment_options);
1386 :
1387 1 : CATCH_REQUIRE(opt.get_option("config-dir") != nullptr);
1388 1 : CATCH_REQUIRE_THROWS_MATCHES(
1389 : opt.set_short_name("config-dir", advgetopt::NO_SHORT_NAME)
1390 : , advgetopt::getopt_exception_logic
1391 : , Catch::Matchers::ExceptionMessage(
1392 : "The short name of option \"config-dir\" cannot be set to NO_SHORT_NAME."));
1393 : }
1394 : CATCH_END_SECTION()
1395 :
1396 4 : CATCH_START_SECTION("Trying to change short name of '--version' (option_info)")
1397 : {
1398 : advgetopt::option const options[] =
1399 : {
1400 : advgetopt::define_option(
1401 : advgetopt::Name("print")
1402 : , advgetopt::ShortName('p')
1403 : , advgetopt::Flags(advgetopt::command_flags<>())
1404 : , advgetopt::Help("print all info.")
1405 : ),
1406 : advgetopt::end_options()
1407 1 : };
1408 :
1409 1 : advgetopt::options_environment environment_options;
1410 1 : environment_options.f_project_name = "unittest";
1411 1 : environment_options.f_options = options;
1412 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
1413 1 : environment_options.f_configuration_filename = "";
1414 1 : environment_options.f_help_header = "Usage: test --config-dir";
1415 :
1416 2 : advgetopt::getopt opt(environment_options);
1417 :
1418 1 : CATCH_REQUIRE(opt.get_option("version") != nullptr);
1419 1 : CATCH_REQUIRE_THROWS_MATCHES(
1420 : opt.set_short_name("version", U'v') // set to lowercase...
1421 : , advgetopt::getopt_exception_logic
1422 : , Catch::Matchers::ExceptionMessage(
1423 : "The short name of option \"version\" cannot be changed from 'V' to 'v'."));
1424 : }
1425 : CATCH_END_SECTION()
1426 8 : }
1427 :
1428 :
1429 :
1430 :
1431 :
1432 : // vim: ts=4 sw=4 et
|