Line data Source code
1 : // Copyright (c) 2006-2021 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/advgetopt
4 : // contact@m2osw.com
5 : //
6 : // This program is free software; you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation; either version 2 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License along
17 : // with this program; if not, write to the Free Software Foundation, Inc.,
18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 :
20 : // self
21 : //
22 : #include "catch_main.h"
23 :
24 :
25 : // advgetopt lib
26 : //
27 : #include <advgetopt/conf_file.h>
28 : #include <advgetopt/utils.h>
29 :
30 :
31 : // snapdev lib
32 : //
33 : #include <snapdev/safe_setenv.h>
34 :
35 :
36 : // C++ lib
37 : //
38 : #include <fstream>
39 :
40 :
41 : // last include
42 : //
43 : #include <snapdev/poison.h>
44 :
45 :
46 :
47 99 : int shuffle_rand(int n)
48 : {
49 99 : return rand() % n;
50 : }
51 :
52 :
53 :
54 4 : CATCH_TEST_CASE("utils_unquote", "[utils][valid]")
55 : {
56 4 : CATCH_START_SECTION("Unquote, default pairs")
57 1 : CATCH_REQUIRE(advgetopt::unquote("") == "");
58 1 : CATCH_REQUIRE(advgetopt::unquote("a") == "a");
59 1 : CATCH_REQUIRE(advgetopt::unquote("ab") == "ab");
60 1 : CATCH_REQUIRE(advgetopt::unquote("abc") == "abc");
61 :
62 1 : CATCH_REQUIRE(advgetopt::unquote("''") == "");
63 1 : CATCH_REQUIRE(advgetopt::unquote("'a'") == "a");
64 1 : CATCH_REQUIRE(advgetopt::unquote("'ab'") == "ab");
65 1 : CATCH_REQUIRE(advgetopt::unquote("'abc'") == "abc");
66 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd'") == "abcd");
67 :
68 1 : CATCH_REQUIRE(advgetopt::unquote("\"\"") == "");
69 1 : CATCH_REQUIRE(advgetopt::unquote("\"a\"") == "a");
70 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab\"") == "ab");
71 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc\"") == "abc");
72 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd\"") == "abcd");
73 :
74 1 : CATCH_REQUIRE(advgetopt::unquote("\"'") == "\"'");
75 1 : CATCH_REQUIRE(advgetopt::unquote("\"a'") == "\"a'");
76 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab'") == "\"ab'");
77 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc'") == "\"abc'");
78 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd'") == "\"abcd'");
79 :
80 1 : CATCH_REQUIRE(advgetopt::unquote("'\"") == "'\"");
81 1 : CATCH_REQUIRE(advgetopt::unquote("'a\"") == "'a\"");
82 1 : CATCH_REQUIRE(advgetopt::unquote("'ab\"") == "'ab\"");
83 1 : CATCH_REQUIRE(advgetopt::unquote("'abc\"") == "'abc\"");
84 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd\"") == "'abcd\"");
85 :
86 1 : CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
87 1 : CATCH_REQUIRE(advgetopt::unquote("\"a") == "\"a");
88 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab") == "\"ab");
89 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc") == "\"abc");
90 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd") == "\"abcd");
91 :
92 1 : CATCH_REQUIRE(advgetopt::unquote("'") == "'");
93 1 : CATCH_REQUIRE(advgetopt::unquote("'a") == "'a");
94 1 : CATCH_REQUIRE(advgetopt::unquote("'ab") == "'ab");
95 1 : CATCH_REQUIRE(advgetopt::unquote("'abc") == "'abc");
96 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd") == "'abcd");
97 :
98 1 : CATCH_REQUIRE(advgetopt::unquote("'") == "'");
99 1 : CATCH_REQUIRE(advgetopt::unquote("a'") == "a'");
100 1 : CATCH_REQUIRE(advgetopt::unquote("ab'") == "ab'");
101 1 : CATCH_REQUIRE(advgetopt::unquote("abc'") == "abc'");
102 1 : CATCH_REQUIRE(advgetopt::unquote("abcd'") == "abcd'");
103 :
104 1 : CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
105 1 : CATCH_REQUIRE(advgetopt::unquote("a\"") == "a\"");
106 1 : CATCH_REQUIRE(advgetopt::unquote("ab\"") == "ab\"");
107 1 : CATCH_REQUIRE(advgetopt::unquote("abc\"") == "abc\"");
108 1 : CATCH_REQUIRE(advgetopt::unquote("abcd\"") == "abcd\"");
109 : CATCH_END_SECTION()
110 :
111 4 : CATCH_START_SECTION("Unquote, brackets")
112 1 : CATCH_REQUIRE(advgetopt::unquote("", "[]<>{}") == "");
113 1 : CATCH_REQUIRE(advgetopt::unquote("a", "[]<>{}") == "a");
114 1 : CATCH_REQUIRE(advgetopt::unquote("ab", "[]<>{}") == "ab");
115 1 : CATCH_REQUIRE(advgetopt::unquote("abc", "[]<>{}") == "abc");
116 :
117 1 : CATCH_REQUIRE(advgetopt::unquote("{}", "[]<>{}") == "");
118 1 : CATCH_REQUIRE(advgetopt::unquote("{a}", "[]<>{}") == "a");
119 1 : CATCH_REQUIRE(advgetopt::unquote("{ab}", "[]<>{}") == "ab");
120 1 : CATCH_REQUIRE(advgetopt::unquote("{abc}", "[]<>{}") == "abc");
121 1 : CATCH_REQUIRE(advgetopt::unquote("{abcd}", "[]<>{}") == "abcd");
122 :
123 1 : CATCH_REQUIRE(advgetopt::unquote("[]", "[]<>{}") == "");
124 1 : CATCH_REQUIRE(advgetopt::unquote("[a]", "[]<>{}") == "a");
125 1 : CATCH_REQUIRE(advgetopt::unquote("[ab]", "[]<>{}") == "ab");
126 1 : CATCH_REQUIRE(advgetopt::unquote("[abc]", "[]<>{}") == "abc");
127 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd]", "[]<>{}") == "abcd");
128 :
129 1 : CATCH_REQUIRE(advgetopt::unquote("<>", "[]<>{}") == "");
130 1 : CATCH_REQUIRE(advgetopt::unquote("<a>", "[]<>{}") == "a");
131 1 : CATCH_REQUIRE(advgetopt::unquote("<ab>", "[]<>{}") == "ab");
132 1 : CATCH_REQUIRE(advgetopt::unquote("<abc>", "[]<>{}") == "abc");
133 1 : CATCH_REQUIRE(advgetopt::unquote("<abcd>", "[]<>{}") == "abcd");
134 :
135 1 : CATCH_REQUIRE(advgetopt::unquote("[}", "[]<>{}") == "[}");
136 1 : CATCH_REQUIRE(advgetopt::unquote("[a}", "[]<>{}") == "[a}");
137 1 : CATCH_REQUIRE(advgetopt::unquote("[ab}", "[]<>{}") == "[ab}");
138 1 : CATCH_REQUIRE(advgetopt::unquote("[abc}", "[]<>{}") == "[abc}");
139 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd}", "[]<>{}") == "[abcd}");
140 :
141 1 : CATCH_REQUIRE(advgetopt::unquote("[>", "[]<>{}") == "[>");
142 1 : CATCH_REQUIRE(advgetopt::unquote("[a>", "[]<>{}") == "[a>");
143 1 : CATCH_REQUIRE(advgetopt::unquote("[ab>", "[]<>{}") == "[ab>");
144 1 : CATCH_REQUIRE(advgetopt::unquote("[abc>", "[]<>{}") == "[abc>");
145 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd>", "[]<>{}") == "[abcd>");
146 :
147 1 : CATCH_REQUIRE(advgetopt::unquote("'\"", "[]<>{}") == "'\"");
148 1 : CATCH_REQUIRE(advgetopt::unquote("'a\"", "[]<>{}") == "'a\"");
149 1 : CATCH_REQUIRE(advgetopt::unquote("'ab\"", "[]<>{}") == "'ab\"");
150 1 : CATCH_REQUIRE(advgetopt::unquote("'abc\"", "[]<>{}") == "'abc\"");
151 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd\"", "[]<>{}") == "'abcd\"");
152 :
153 1 : CATCH_REQUIRE(advgetopt::unquote("[", "[]<>{}") == "[");
154 1 : CATCH_REQUIRE(advgetopt::unquote("[a", "[]<>{}") == "[a");
155 1 : CATCH_REQUIRE(advgetopt::unquote("[ab", "[]<>{}") == "[ab");
156 1 : CATCH_REQUIRE(advgetopt::unquote("[abc", "[]<>{}") == "[abc");
157 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd", "[]<>{}") == "[abcd");
158 :
159 1 : CATCH_REQUIRE(advgetopt::unquote("{", "[]<>{}") == "{");
160 1 : CATCH_REQUIRE(advgetopt::unquote("{a", "[]<>{}") == "{a");
161 1 : CATCH_REQUIRE(advgetopt::unquote("{ab", "[]<>{}") == "{ab");
162 1 : CATCH_REQUIRE(advgetopt::unquote("{abc", "[]<>{}") == "{abc");
163 1 : CATCH_REQUIRE(advgetopt::unquote("{abcd", "[]<>{}") == "{abcd");
164 :
165 1 : CATCH_REQUIRE(advgetopt::unquote("<", "[]<>{}") == "<");
166 1 : CATCH_REQUIRE(advgetopt::unquote("<a", "[]<>{}") == "<a");
167 1 : CATCH_REQUIRE(advgetopt::unquote("<ab", "[]<>{}") == "<ab");
168 1 : CATCH_REQUIRE(advgetopt::unquote("<abc", "[]<>{}") == "<abc");
169 1 : CATCH_REQUIRE(advgetopt::unquote("<abcd", "[]<>{}") == "<abcd");
170 :
171 1 : CATCH_REQUIRE(advgetopt::unquote("}", "[]<>{}") == "}");
172 1 : CATCH_REQUIRE(advgetopt::unquote("a}", "[]<>{}") == "a}");
173 1 : CATCH_REQUIRE(advgetopt::unquote("ab}", "[]<>{}") == "ab}");
174 1 : CATCH_REQUIRE(advgetopt::unquote("abc}", "[]<>{}") == "abc}");
175 1 : CATCH_REQUIRE(advgetopt::unquote("abcd}", "[]<>{}") == "abcd}");
176 :
177 1 : CATCH_REQUIRE(advgetopt::unquote("]", "[]<>{}") == "]");
178 1 : CATCH_REQUIRE(advgetopt::unquote("a]", "[]<>{}") == "a]");
179 1 : CATCH_REQUIRE(advgetopt::unquote("ab]", "[]<>{}") == "ab]");
180 1 : CATCH_REQUIRE(advgetopt::unquote("abc]", "[]<>{}") == "abc]");
181 1 : CATCH_REQUIRE(advgetopt::unquote("abcd]", "[]<>{}") == "abcd]");
182 :
183 1 : CATCH_REQUIRE(advgetopt::unquote(">", "[]<>{}") == ">");
184 1 : CATCH_REQUIRE(advgetopt::unquote("a>", "[]<>{}") == "a>");
185 1 : CATCH_REQUIRE(advgetopt::unquote("ab>", "[]<>{}") == "ab>");
186 1 : CATCH_REQUIRE(advgetopt::unquote("abc>", "[]<>{}") == "abc>");
187 1 : CATCH_REQUIRE(advgetopt::unquote("abcd>", "[]<>{}") == "abcd>");
188 : CATCH_END_SECTION()
189 2 : }
190 :
191 :
192 :
193 :
194 13 : CATCH_TEST_CASE("utils_split", "[utils][valid]")
195 : {
196 22 : CATCH_START_SECTION("Split three words")
197 2 : advgetopt::string_list_t result;
198 2 : advgetopt::split_string("test with spaces"
199 : , result
200 1 : , {" "});
201 1 : CATCH_REQUIRE(result.size() == 3);
202 1 : CATCH_REQUIRE(result[0] == "test");
203 1 : CATCH_REQUIRE(result[1] == "with");
204 1 : CATCH_REQUIRE(result[2] == "spaces");
205 : CATCH_END_SECTION()
206 :
207 22 : CATCH_START_SECTION("Split three words, one with single quotes")
208 2 : advgetopt::string_list_t result;
209 2 : advgetopt::split_string("test 'with quotes and' spaces"
210 : , result
211 1 : , {" "});
212 1 : CATCH_REQUIRE(result.size() == 3);
213 1 : CATCH_REQUIRE(result[0] == "test");
214 1 : CATCH_REQUIRE(result[1] == "with quotes and");
215 1 : CATCH_REQUIRE(result[2] == "spaces");
216 : CATCH_END_SECTION()
217 :
218 22 : CATCH_START_SECTION("Split three words, one with double quotes")
219 2 : advgetopt::string_list_t result;
220 2 : advgetopt::split_string("test \"with quotes and\" spaces"
221 : , result
222 1 : , {" "});
223 1 : CATCH_REQUIRE(result.size() == 3);
224 1 : CATCH_REQUIRE(result[0] == "test");
225 1 : CATCH_REQUIRE(result[1] == "with quotes and");
226 1 : CATCH_REQUIRE(result[2] == "spaces");
227 : CATCH_END_SECTION()
228 :
229 22 : CATCH_START_SECTION("Split three words, one with single quotes but no spaces")
230 2 : advgetopt::string_list_t result;
231 2 : advgetopt::split_string("test'with quotes and'nospaces"
232 : , result
233 1 : , {" "});
234 1 : CATCH_REQUIRE(result.size() == 3);
235 1 : CATCH_REQUIRE(result[0] == "test");
236 1 : CATCH_REQUIRE(result[1] == "with quotes and");
237 1 : CATCH_REQUIRE(result[2] == "nospaces");
238 : CATCH_END_SECTION()
239 :
240 22 : CATCH_START_SECTION("Split three words, one with double quotes but no spaces")
241 2 : advgetopt::string_list_t result;
242 2 : advgetopt::split_string("test\"with quotes and\"nospaces"
243 : , result
244 1 : , {" "});
245 1 : CATCH_REQUIRE(result.size() == 3);
246 1 : CATCH_REQUIRE(result[0] == "test");
247 1 : CATCH_REQUIRE(result[1] == "with quotes and");
248 1 : CATCH_REQUIRE(result[2] == "nospaces");
249 : CATCH_END_SECTION()
250 :
251 22 : CATCH_START_SECTION("Split five words, four separators")
252 2 : advgetopt::string_list_t result;
253 5 : advgetopt::split_string("test,with quite|many;separators"
254 : , result
255 4 : , {" ",",","|",";"});
256 1 : CATCH_REQUIRE(result.size() == 5);
257 1 : CATCH_REQUIRE(result[0] == "test");
258 1 : CATCH_REQUIRE(result[1] == "with");
259 1 : CATCH_REQUIRE(result[2] == "quite");
260 1 : CATCH_REQUIRE(result[3] == "many");
261 1 : CATCH_REQUIRE(result[4] == "separators");
262 : CATCH_END_SECTION()
263 :
264 22 : CATCH_START_SECTION("Split five words, multiple/repeated separators")
265 2 : advgetopt::string_list_t result;
266 5 : advgetopt::split_string("test, with quite|||many ; separators"
267 : , result
268 4 : , {" ",",","|",";"});
269 1 : CATCH_REQUIRE(result.size() == 5);
270 1 : CATCH_REQUIRE(result[0] == "test");
271 1 : CATCH_REQUIRE(result[1] == "with");
272 1 : CATCH_REQUIRE(result[2] == "quite");
273 1 : CATCH_REQUIRE(result[3] == "many");
274 1 : CATCH_REQUIRE(result[4] == "separators");
275 : CATCH_END_SECTION()
276 :
277 22 : CATCH_START_SECTION("Split five words, and empty entries")
278 2 : advgetopt::string_list_t result;
279 5 : advgetopt::split_string("|||test, with quite\"\"many ; ''separators''"
280 : , result
281 4 : , {" ",",","|",";"});
282 1 : CATCH_REQUIRE(result.size() == 5);
283 1 : CATCH_REQUIRE(result[0] == "test");
284 1 : CATCH_REQUIRE(result[1] == "with");
285 1 : CATCH_REQUIRE(result[2] == "quite");
286 1 : CATCH_REQUIRE(result[3] == "many");
287 1 : CATCH_REQUIRE(result[4] == "separators");
288 : CATCH_END_SECTION()
289 :
290 22 : CATCH_START_SECTION("Split five words, start/end with separator")
291 2 : advgetopt::string_list_t result;
292 2 : advgetopt::split_string("|start|and|end|with|separator|"
293 : , result
294 1 : , {"|"});
295 1 : CATCH_REQUIRE(result.size() == 5);
296 1 : CATCH_REQUIRE(result[0] == "start");
297 1 : CATCH_REQUIRE(result[1] == "and");
298 1 : CATCH_REQUIRE(result[2] == "end");
299 1 : CATCH_REQUIRE(result[3] == "with");
300 1 : CATCH_REQUIRE(result[4] == "separator");
301 : CATCH_END_SECTION()
302 :
303 22 : CATCH_START_SECTION("Split five words, unclosed double quote")
304 2 : advgetopt::string_list_t result;
305 2 : advgetopt::split_string("\"unclosed quote|mark"
306 : , result
307 1 : , {"|"});
308 1 : CATCH_REQUIRE(result.size() == 1);
309 1 : CATCH_REQUIRE(result[0] == "unclosed quote|mark");
310 : CATCH_END_SECTION()
311 :
312 22 : CATCH_START_SECTION("Split five words, unclosed single quote")
313 2 : advgetopt::string_list_t result;
314 3 : advgetopt::split_string("here is an \"unclosed quote|mark"
315 : , result
316 2 : , {"|"," "});
317 : //CATCH_REQUIRE(result.size() == 4);
318 1 : CATCH_REQUIRE(result[0] == "here");
319 1 : CATCH_REQUIRE(result[1] == "is");
320 1 : CATCH_REQUIRE(result[2] == "an");
321 1 : CATCH_REQUIRE(result[3] == "unclosed quote|mark");
322 : CATCH_END_SECTION()
323 11 : }
324 :
325 :
326 :
327 :
328 6 : CATCH_TEST_CASE("utils_insert_group_name", "[utils][valid]")
329 : {
330 8 : CATCH_START_SECTION("Full insert")
331 : // CONFIG FILE HAS NO EXTENSION
332 : {
333 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
334 : "/this/is/a/path"
335 : , "group-name"
336 2 : , "project-name"));
337 1 : CATCH_REQUIRE(fullname.size() == 1);
338 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
339 : }
340 :
341 : {
342 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
343 : "/this/is/a/path"
344 : , "group-name"
345 2 : , ""));
346 1 : CATCH_REQUIRE(fullname.size() == 1);
347 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
348 : }
349 :
350 : {
351 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
352 : "/this/is/a/path"
353 : , "group-name"
354 2 : , nullptr));
355 1 : CATCH_REQUIRE(fullname.size() == 1);
356 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
357 : }
358 :
359 : {
360 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
361 : "/this/is/a/path"
362 : , ""
363 2 : , "project-name"));
364 1 : CATCH_REQUIRE(fullname.size() == 1);
365 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
366 : }
367 :
368 : {
369 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
370 : "/this/is/a/path"
371 : , nullptr
372 2 : , "project-name"));
373 1 : CATCH_REQUIRE(fullname.size() == 1);
374 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
375 : }
376 :
377 : // CONFIG FILE HAS EXTENSION
378 : {
379 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
380 : "/this/is/a/basename.ext"
381 : , "group-name"
382 2 : , "project-name"));
383 1 : CATCH_REQUIRE(fullname.size() == 1);
384 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
385 : }
386 :
387 : {
388 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
389 : "/this/is/a/basename.ext"
390 : , "group-name"
391 2 : , ""));
392 1 : CATCH_REQUIRE(fullname.size() == 1);
393 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
394 : }
395 :
396 : {
397 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
398 : "/this/is/a/basename.ext"
399 : , "group-name"
400 2 : , nullptr));
401 1 : CATCH_REQUIRE(fullname.size() == 1);
402 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
403 : }
404 :
405 : {
406 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
407 : "/this/is/a/basename.ext"
408 : , ""
409 2 : , "project-name"));
410 1 : CATCH_REQUIRE(fullname.size() == 1);
411 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
412 : }
413 :
414 : {
415 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
416 : "/this/is/a/basename.ext"
417 : , nullptr
418 2 : , "project-name"));
419 1 : CATCH_REQUIRE(fullname.size() == 1);
420 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
421 : }
422 : CATCH_END_SECTION()
423 :
424 8 : CATCH_START_SECTION("Empty cases")
425 : {
426 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
427 : "/this/is/a/path"
428 : , nullptr
429 2 : , nullptr));
430 1 : CATCH_REQUIRE(fullname.empty());
431 : }
432 :
433 : {
434 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
435 : "/this/is/a/path"
436 : , nullptr
437 2 : , ""));
438 1 : CATCH_REQUIRE(fullname.empty());
439 : }
440 :
441 : {
442 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
443 : "/this/is/a/path"
444 : , ""
445 2 : , nullptr));
446 1 : CATCH_REQUIRE(fullname.empty());
447 : }
448 :
449 : {
450 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
451 : "/this/is/a/path"
452 : , ""
453 2 : , ""));
454 1 : CATCH_REQUIRE(fullname.empty());
455 : }
456 :
457 : {
458 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
459 : ""
460 : , "group-name"
461 2 : , "project-name"));
462 1 : CATCH_REQUIRE(fullname.empty());
463 : }
464 :
465 : {
466 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
467 : ""
468 : , ""
469 2 : , "project-name"));
470 1 : CATCH_REQUIRE(fullname.empty());
471 : }
472 :
473 : {
474 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
475 : ""
476 : , nullptr
477 2 : , "project-name"));
478 1 : CATCH_REQUIRE(fullname.empty());
479 : }
480 :
481 : {
482 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
483 : ""
484 : , nullptr
485 2 : , ""));
486 1 : CATCH_REQUIRE(fullname.empty());
487 : }
488 :
489 : {
490 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
491 : ""
492 : , nullptr
493 2 : , nullptr));
494 1 : CATCH_REQUIRE(fullname.empty());
495 : }
496 : CATCH_END_SECTION()
497 :
498 8 : CATCH_START_SECTION("Basename Only")
499 : {
500 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
501 : "basename"
502 : , nullptr
503 2 : , "advgetopt"));
504 1 : CATCH_REQUIRE(fullname.size() == 1);
505 1 : CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename");
506 : }
507 :
508 : {
509 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
510 : "basename.ext"
511 : , "advgetopt"
512 2 : , nullptr));
513 1 : CATCH_REQUIRE(fullname.size() == 1);
514 1 : CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename.ext");
515 : }
516 : CATCH_END_SECTION()
517 :
518 8 : CATCH_START_SECTION("Actual List of Files on Disk")
519 : {
520 1 : SNAP_CATCH2_NAMESPACE::init_tmp_dir("advgetopt-multi", "sorted-user-conf", false);
521 :
522 : // generate an array of numbers from 00 to 99
523 : //
524 2 : std::vector<int> numbers;
525 101 : for(int i = 0; i < 100; ++i)
526 : {
527 100 : numbers.push_back(i);
528 : }
529 1 : std::random_shuffle(numbers.begin(), numbers.end(), shuffle_rand);
530 1 : int const max(rand() % 50 + 10);
531 1 : numbers.resize(max);
532 2 : std::string path(SNAP_CATCH2_NAMESPACE::g_config_project_filename);
533 1 : std::string::size_type const pos(path.rfind('/'));
534 1 : path = path.substr(0, pos);
535 2 : advgetopt::string_list_t filenames;
536 49 : for(int i = 0; i < max; ++i)
537 : {
538 96 : std::stringstream ss;
539 48 : ss << path;
540 48 : ss << '/';
541 48 : int const n(numbers[i]);
542 48 : if(n < 10)
543 : {
544 5 : ss << '0';
545 : }
546 48 : ss << n;
547 48 : ss << "-sorted-user-conf.config";
548 48 : filenames.push_back(ss.str());
549 96 : std::ofstream conf;
550 48 : conf.open(ss.str(), std::ios_base::out);
551 48 : CATCH_REQUIRE(conf.is_open());
552 48 : conf << "# Config with a number" << std::endl;
553 48 : conf << "var=\"value: " << numbers[i] << "\"" << std::endl;
554 : }
555 1 : std::sort(filenames.begin(), filenames.end());
556 2 : std::string const last_filename(*filenames.rbegin());
557 1 : std::string::size_type const slash_pos(last_filename.rfind('/'));
558 2 : std::string const expected_var("value: " + last_filename.substr(slash_pos + 1, 2));
559 :
560 1 : advgetopt::string_list_t fullnames(advgetopt::insert_group_name(
561 : SNAP_CATCH2_NAMESPACE::g_config_filename
562 : , "advgetopt-multi"
563 2 : , "multi-channels"));
564 1 : CATCH_REQUIRE(fullnames.size() == filenames.size());
565 49 : for(size_t idx(0); idx < filenames.size(); ++idx)
566 : {
567 48 : CATCH_REQUIRE(fullnames[idx] == filenames[idx]);
568 : }
569 :
570 : {
571 2 : std::ofstream conf;
572 1 : conf.open(SNAP_CATCH2_NAMESPACE::g_config_filename, std::ios_base::out);
573 1 : CATCH_REQUIRE(conf.is_open());
574 1 : conf << "# Original Config with a number" << std::endl;
575 1 : conf << "var=master value" << std::endl;
576 :
577 : // verify the master config file
578 : //
579 2 : advgetopt::conf_file_setup setup(SNAP_CATCH2_NAMESPACE::g_config_filename);
580 2 : advgetopt::conf_file::pointer_t config_file(advgetopt::conf_file::get_conf_file(setup));
581 1 : CATCH_REQUIRE(config_file->get_parameter("var") == "master value");
582 : }
583 :
584 : {
585 : // run a load to verify that we indeed get the last var=...
586 : // value and not some random entry
587 : //
588 2 : std::string temp_dir = SNAP_CATCH2_NAMESPACE::g_tmp_dir + "/.config";
589 1 : char const * const dirs[] = {
590 1 : temp_dir.c_str(),
591 : nullptr
592 1 : };
593 1 : advgetopt::option opts[] = {
594 : advgetopt::define_option(
595 : advgetopt::Name("var")
596 : , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR>())
597 : , advgetopt::Help("verify loading configuration files in a serie.")
598 : ),
599 : advgetopt::end_options()
600 : };
601 : #pragma GCC diagnostic push
602 : #pragma GCC diagnostic ignored "-Wpedantic"
603 1 : advgetopt::options_environment env = {
604 : .f_project_name = "sorted-configs",
605 : .f_group_name = "advgetopt-multi",
606 : .f_options = opts,
607 : .f_options_files_directory = nullptr,
608 : .f_environment_variable_name = nullptr,
609 : .f_configuration_files = nullptr,
610 : .f_configuration_filename = "sorted-user-conf.config",
611 : .f_configuration_directories = dirs,
612 : .f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS,
613 : .f_help_header = nullptr,
614 : .f_help_footer = nullptr,
615 : .f_version = nullptr,
616 : .f_license = nullptr,
617 : .f_copyright = nullptr,
618 : .f_build_date = UTC_BUILD_DATE,
619 : .f_build_time = UTC_BUILD_TIME,
620 : .f_groups = nullptr
621 1 : };
622 : #pragma GCC diagnostic pop
623 1 : char const * const argv[] = {
624 : "test",
625 : nullptr
626 : };
627 2 : advgetopt::getopt opt(env, 1, const_cast<char **>(argv));
628 1 : CATCH_REQUIRE(memcmp(&opt.get_options_environment(), &env, sizeof(env)) == 0);
629 1 : CATCH_REQUIRE(opt.get_string("var") == expected_var);
630 : }
631 : }
632 : CATCH_END_SECTION()
633 4 : }
634 :
635 :
636 :
637 :
638 :
639 :
640 :
641 5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
642 : {
643 6 : CATCH_START_SECTION("Valid cases")
644 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
645 :
646 : {
647 2 : std::string result(advgetopt::handle_user_directory("~"));
648 1 : CATCH_REQUIRE(result == "/home/advgetopt");
649 : }
650 :
651 : {
652 2 : std::string result(advgetopt::handle_user_directory("~/"));
653 1 : CATCH_REQUIRE(result == "/home/advgetopt/");
654 : }
655 :
656 : {
657 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
658 1 : CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
659 : }
660 : CATCH_END_SECTION()
661 :
662 6 : CATCH_START_SECTION("$HOME is empty")
663 2 : snap::safe_setenv env("HOME", "");
664 :
665 : {
666 2 : std::string result(advgetopt::handle_user_directory("~"));
667 1 : CATCH_REQUIRE(result == "~");
668 : }
669 :
670 : {
671 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
672 1 : CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
673 : }
674 : CATCH_END_SECTION()
675 :
676 6 : CATCH_START_SECTION("Paths do not start with ~")
677 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
678 :
679 : {
680 2 : std::string result(advgetopt::handle_user_directory("/~"));
681 1 : CATCH_REQUIRE(result == "/~");
682 : }
683 :
684 : {
685 2 : std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
686 1 : CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
687 : }
688 : CATCH_END_SECTION()
689 3 : }
690 :
691 :
692 :
693 :
694 :
695 4 : CATCH_TEST_CASE("utils_true_false", "[utils][boolean]")
696 : {
697 4 : CATCH_START_SECTION("True Values")
698 : {
699 1 : CATCH_REQUIRE(advgetopt::is_true("true"));
700 1 : CATCH_REQUIRE(advgetopt::is_true("on"));
701 1 : CATCH_REQUIRE(advgetopt::is_true("1"));
702 :
703 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("false"));
704 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("off"));
705 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("0"));
706 :
707 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("random"));
708 : }
709 : CATCH_END_SECTION()
710 :
711 4 : CATCH_START_SECTION("False Values")
712 : {
713 1 : CATCH_REQUIRE(advgetopt::is_false("false"));
714 1 : CATCH_REQUIRE(advgetopt::is_false("off"));
715 1 : CATCH_REQUIRE(advgetopt::is_false("0"));
716 :
717 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("true"));
718 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("on"));
719 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("1"));
720 :
721 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("random"));
722 : }
723 : CATCH_END_SECTION()
724 8 : }
725 :
726 :
727 :
728 :
729 :
730 :
731 :
732 : // vim: ts=4 sw=4 et
|