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/utils.h>
33 :
34 : // snapdev lib
35 : //
36 : #include <snapdev/safe_setenv.h>
37 :
38 :
39 :
40 4 : CATCH_TEST_CASE("utils_unquote", "[utils][valid]")
41 : {
42 4 : CATCH_START_SECTION("Unquote, default pairs")
43 1 : CATCH_REQUIRE(advgetopt::unquote("") == "");
44 1 : CATCH_REQUIRE(advgetopt::unquote("a") == "a");
45 1 : CATCH_REQUIRE(advgetopt::unquote("ab") == "ab");
46 1 : CATCH_REQUIRE(advgetopt::unquote("abc") == "abc");
47 :
48 1 : CATCH_REQUIRE(advgetopt::unquote("''") == "");
49 1 : CATCH_REQUIRE(advgetopt::unquote("'a'") == "a");
50 1 : CATCH_REQUIRE(advgetopt::unquote("'ab'") == "ab");
51 1 : CATCH_REQUIRE(advgetopt::unquote("'abc'") == "abc");
52 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd'") == "abcd");
53 :
54 1 : CATCH_REQUIRE(advgetopt::unquote("\"\"") == "");
55 1 : CATCH_REQUIRE(advgetopt::unquote("\"a\"") == "a");
56 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab\"") == "ab");
57 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc\"") == "abc");
58 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd\"") == "abcd");
59 :
60 1 : CATCH_REQUIRE(advgetopt::unquote("\"'") == "\"'");
61 1 : CATCH_REQUIRE(advgetopt::unquote("\"a'") == "\"a'");
62 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab'") == "\"ab'");
63 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc'") == "\"abc'");
64 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd'") == "\"abcd'");
65 :
66 1 : CATCH_REQUIRE(advgetopt::unquote("'\"") == "'\"");
67 1 : CATCH_REQUIRE(advgetopt::unquote("'a\"") == "'a\"");
68 1 : CATCH_REQUIRE(advgetopt::unquote("'ab\"") == "'ab\"");
69 1 : CATCH_REQUIRE(advgetopt::unquote("'abc\"") == "'abc\"");
70 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd\"") == "'abcd\"");
71 :
72 1 : CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
73 1 : CATCH_REQUIRE(advgetopt::unquote("\"a") == "\"a");
74 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab") == "\"ab");
75 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc") == "\"abc");
76 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd") == "\"abcd");
77 :
78 1 : CATCH_REQUIRE(advgetopt::unquote("'") == "'");
79 1 : CATCH_REQUIRE(advgetopt::unquote("'a") == "'a");
80 1 : CATCH_REQUIRE(advgetopt::unquote("'ab") == "'ab");
81 1 : CATCH_REQUIRE(advgetopt::unquote("'abc") == "'abc");
82 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd") == "'abcd");
83 :
84 1 : CATCH_REQUIRE(advgetopt::unquote("'") == "'");
85 1 : CATCH_REQUIRE(advgetopt::unquote("a'") == "a'");
86 1 : CATCH_REQUIRE(advgetopt::unquote("ab'") == "ab'");
87 1 : CATCH_REQUIRE(advgetopt::unquote("abc'") == "abc'");
88 1 : CATCH_REQUIRE(advgetopt::unquote("abcd'") == "abcd'");
89 :
90 1 : CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
91 1 : CATCH_REQUIRE(advgetopt::unquote("a\"") == "a\"");
92 1 : CATCH_REQUIRE(advgetopt::unquote("ab\"") == "ab\"");
93 1 : CATCH_REQUIRE(advgetopt::unquote("abc\"") == "abc\"");
94 1 : CATCH_REQUIRE(advgetopt::unquote("abcd\"") == "abcd\"");
95 : CATCH_END_SECTION()
96 :
97 4 : CATCH_START_SECTION("Unquote, brackets")
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 :
103 1 : CATCH_REQUIRE(advgetopt::unquote("{}", "[]<>{}") == "");
104 1 : CATCH_REQUIRE(advgetopt::unquote("{a}", "[]<>{}") == "a");
105 1 : CATCH_REQUIRE(advgetopt::unquote("{ab}", "[]<>{}") == "ab");
106 1 : CATCH_REQUIRE(advgetopt::unquote("{abc}", "[]<>{}") == "abc");
107 1 : CATCH_REQUIRE(advgetopt::unquote("{abcd}", "[]<>{}") == "abcd");
108 :
109 1 : CATCH_REQUIRE(advgetopt::unquote("[]", "[]<>{}") == "");
110 1 : CATCH_REQUIRE(advgetopt::unquote("[a]", "[]<>{}") == "a");
111 1 : CATCH_REQUIRE(advgetopt::unquote("[ab]", "[]<>{}") == "ab");
112 1 : CATCH_REQUIRE(advgetopt::unquote("[abc]", "[]<>{}") == "abc");
113 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd]", "[]<>{}") == "abcd");
114 :
115 1 : CATCH_REQUIRE(advgetopt::unquote("<>", "[]<>{}") == "");
116 1 : CATCH_REQUIRE(advgetopt::unquote("<a>", "[]<>{}") == "a");
117 1 : CATCH_REQUIRE(advgetopt::unquote("<ab>", "[]<>{}") == "ab");
118 1 : CATCH_REQUIRE(advgetopt::unquote("<abc>", "[]<>{}") == "abc");
119 1 : CATCH_REQUIRE(advgetopt::unquote("<abcd>", "[]<>{}") == "abcd");
120 :
121 1 : CATCH_REQUIRE(advgetopt::unquote("[}", "[]<>{}") == "[}");
122 1 : CATCH_REQUIRE(advgetopt::unquote("[a}", "[]<>{}") == "[a}");
123 1 : CATCH_REQUIRE(advgetopt::unquote("[ab}", "[]<>{}") == "[ab}");
124 1 : CATCH_REQUIRE(advgetopt::unquote("[abc}", "[]<>{}") == "[abc}");
125 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd}", "[]<>{}") == "[abcd}");
126 :
127 1 : CATCH_REQUIRE(advgetopt::unquote("[>", "[]<>{}") == "[>");
128 1 : CATCH_REQUIRE(advgetopt::unquote("[a>", "[]<>{}") == "[a>");
129 1 : CATCH_REQUIRE(advgetopt::unquote("[ab>", "[]<>{}") == "[ab>");
130 1 : CATCH_REQUIRE(advgetopt::unquote("[abc>", "[]<>{}") == "[abc>");
131 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd>", "[]<>{}") == "[abcd>");
132 :
133 1 : CATCH_REQUIRE(advgetopt::unquote("'\"", "[]<>{}") == "'\"");
134 1 : CATCH_REQUIRE(advgetopt::unquote("'a\"", "[]<>{}") == "'a\"");
135 1 : CATCH_REQUIRE(advgetopt::unquote("'ab\"", "[]<>{}") == "'ab\"");
136 1 : CATCH_REQUIRE(advgetopt::unquote("'abc\"", "[]<>{}") == "'abc\"");
137 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd\"", "[]<>{}") == "'abcd\"");
138 :
139 1 : CATCH_REQUIRE(advgetopt::unquote("[", "[]<>{}") == "[");
140 1 : CATCH_REQUIRE(advgetopt::unquote("[a", "[]<>{}") == "[a");
141 1 : CATCH_REQUIRE(advgetopt::unquote("[ab", "[]<>{}") == "[ab");
142 1 : CATCH_REQUIRE(advgetopt::unquote("[abc", "[]<>{}") == "[abc");
143 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd", "[]<>{}") == "[abcd");
144 :
145 1 : CATCH_REQUIRE(advgetopt::unquote("{", "[]<>{}") == "{");
146 1 : CATCH_REQUIRE(advgetopt::unquote("{a", "[]<>{}") == "{a");
147 1 : CATCH_REQUIRE(advgetopt::unquote("{ab", "[]<>{}") == "{ab");
148 1 : CATCH_REQUIRE(advgetopt::unquote("{abc", "[]<>{}") == "{abc");
149 1 : CATCH_REQUIRE(advgetopt::unquote("{abcd", "[]<>{}") == "{abcd");
150 :
151 1 : CATCH_REQUIRE(advgetopt::unquote("<", "[]<>{}") == "<");
152 1 : CATCH_REQUIRE(advgetopt::unquote("<a", "[]<>{}") == "<a");
153 1 : CATCH_REQUIRE(advgetopt::unquote("<ab", "[]<>{}") == "<ab");
154 1 : CATCH_REQUIRE(advgetopt::unquote("<abc", "[]<>{}") == "<abc");
155 1 : CATCH_REQUIRE(advgetopt::unquote("<abcd", "[]<>{}") == "<abcd");
156 :
157 1 : CATCH_REQUIRE(advgetopt::unquote("}", "[]<>{}") == "}");
158 1 : CATCH_REQUIRE(advgetopt::unquote("a}", "[]<>{}") == "a}");
159 1 : CATCH_REQUIRE(advgetopt::unquote("ab}", "[]<>{}") == "ab}");
160 1 : CATCH_REQUIRE(advgetopt::unquote("abc}", "[]<>{}") == "abc}");
161 1 : CATCH_REQUIRE(advgetopt::unquote("abcd}", "[]<>{}") == "abcd}");
162 :
163 1 : CATCH_REQUIRE(advgetopt::unquote("]", "[]<>{}") == "]");
164 1 : CATCH_REQUIRE(advgetopt::unquote("a]", "[]<>{}") == "a]");
165 1 : CATCH_REQUIRE(advgetopt::unquote("ab]", "[]<>{}") == "ab]");
166 1 : CATCH_REQUIRE(advgetopt::unquote("abc]", "[]<>{}") == "abc]");
167 1 : CATCH_REQUIRE(advgetopt::unquote("abcd]", "[]<>{}") == "abcd]");
168 :
169 1 : CATCH_REQUIRE(advgetopt::unquote(">", "[]<>{}") == ">");
170 1 : CATCH_REQUIRE(advgetopt::unquote("a>", "[]<>{}") == "a>");
171 1 : CATCH_REQUIRE(advgetopt::unquote("ab>", "[]<>{}") == "ab>");
172 1 : CATCH_REQUIRE(advgetopt::unquote("abc>", "[]<>{}") == "abc>");
173 1 : CATCH_REQUIRE(advgetopt::unquote("abcd>", "[]<>{}") == "abcd>");
174 : CATCH_END_SECTION()
175 2 : }
176 :
177 :
178 :
179 :
180 13 : CATCH_TEST_CASE("utils_split", "[utils][valid]")
181 : {
182 22 : CATCH_START_SECTION("Split three words")
183 2 : advgetopt::string_list_t result;
184 3 : advgetopt::split_string("test with spaces"
185 : , result
186 2 : , {" "});
187 1 : CATCH_REQUIRE(result.size() == 3);
188 1 : CATCH_REQUIRE(result[0] == "test");
189 1 : CATCH_REQUIRE(result[1] == "with");
190 1 : CATCH_REQUIRE(result[2] == "spaces");
191 : CATCH_END_SECTION()
192 :
193 22 : CATCH_START_SECTION("Split three words, one with single quotes")
194 2 : advgetopt::string_list_t result;
195 3 : advgetopt::split_string("test 'with quotes and' spaces"
196 : , result
197 2 : , {" "});
198 1 : CATCH_REQUIRE(result.size() == 3);
199 1 : CATCH_REQUIRE(result[0] == "test");
200 1 : CATCH_REQUIRE(result[1] == "with quotes and");
201 1 : CATCH_REQUIRE(result[2] == "spaces");
202 : CATCH_END_SECTION()
203 :
204 22 : CATCH_START_SECTION("Split three words, one with double quotes")
205 2 : advgetopt::string_list_t result;
206 3 : advgetopt::split_string("test \"with quotes and\" spaces"
207 : , result
208 2 : , {" "});
209 1 : CATCH_REQUIRE(result.size() == 3);
210 1 : CATCH_REQUIRE(result[0] == "test");
211 1 : CATCH_REQUIRE(result[1] == "with quotes and");
212 1 : CATCH_REQUIRE(result[2] == "spaces");
213 : CATCH_END_SECTION()
214 :
215 22 : CATCH_START_SECTION("Split three words, one with single quotes but no spaces")
216 2 : advgetopt::string_list_t result;
217 3 : advgetopt::split_string("test'with quotes and'nospaces"
218 : , result
219 2 : , {" "});
220 1 : CATCH_REQUIRE(result.size() == 3);
221 1 : CATCH_REQUIRE(result[0] == "test");
222 1 : CATCH_REQUIRE(result[1] == "with quotes and");
223 1 : CATCH_REQUIRE(result[2] == "nospaces");
224 : CATCH_END_SECTION()
225 :
226 22 : CATCH_START_SECTION("Split three words, one with double quotes but no spaces")
227 2 : advgetopt::string_list_t result;
228 3 : advgetopt::split_string("test\"with quotes and\"nospaces"
229 : , result
230 2 : , {" "});
231 1 : CATCH_REQUIRE(result.size() == 3);
232 1 : CATCH_REQUIRE(result[0] == "test");
233 1 : CATCH_REQUIRE(result[1] == "with quotes and");
234 1 : CATCH_REQUIRE(result[2] == "nospaces");
235 : CATCH_END_SECTION()
236 :
237 22 : CATCH_START_SECTION("Split five words, four separators")
238 2 : advgetopt::string_list_t result;
239 6 : advgetopt::split_string("test,with quite|many;separators"
240 : , result
241 5 : , {" ",",","|",";"});
242 1 : CATCH_REQUIRE(result.size() == 5);
243 1 : CATCH_REQUIRE(result[0] == "test");
244 1 : CATCH_REQUIRE(result[1] == "with");
245 1 : CATCH_REQUIRE(result[2] == "quite");
246 1 : CATCH_REQUIRE(result[3] == "many");
247 1 : CATCH_REQUIRE(result[4] == "separators");
248 : CATCH_END_SECTION()
249 :
250 22 : CATCH_START_SECTION("Split five words, multiple/repeated separators")
251 2 : advgetopt::string_list_t result;
252 6 : advgetopt::split_string("test, with quite|||many ; separators"
253 : , result
254 5 : , {" ",",","|",";"});
255 1 : CATCH_REQUIRE(result.size() == 5);
256 1 : CATCH_REQUIRE(result[0] == "test");
257 1 : CATCH_REQUIRE(result[1] == "with");
258 1 : CATCH_REQUIRE(result[2] == "quite");
259 1 : CATCH_REQUIRE(result[3] == "many");
260 1 : CATCH_REQUIRE(result[4] == "separators");
261 : CATCH_END_SECTION()
262 :
263 22 : CATCH_START_SECTION("Split five words, and empty entries")
264 2 : advgetopt::string_list_t result;
265 6 : advgetopt::split_string("|||test, with quite\"\"many ; ''separators''"
266 : , result
267 5 : , {" ",",","|",";"});
268 1 : CATCH_REQUIRE(result.size() == 5);
269 1 : CATCH_REQUIRE(result[0] == "test");
270 1 : CATCH_REQUIRE(result[1] == "with");
271 1 : CATCH_REQUIRE(result[2] == "quite");
272 1 : CATCH_REQUIRE(result[3] == "many");
273 1 : CATCH_REQUIRE(result[4] == "separators");
274 : CATCH_END_SECTION()
275 :
276 22 : CATCH_START_SECTION("Split five words, start/end with separator")
277 2 : advgetopt::string_list_t result;
278 3 : advgetopt::split_string("|start|and|end|with|separator|"
279 : , result
280 2 : , {"|"});
281 1 : CATCH_REQUIRE(result.size() == 5);
282 1 : CATCH_REQUIRE(result[0] == "start");
283 1 : CATCH_REQUIRE(result[1] == "and");
284 1 : CATCH_REQUIRE(result[2] == "end");
285 1 : CATCH_REQUIRE(result[3] == "with");
286 1 : CATCH_REQUIRE(result[4] == "separator");
287 : CATCH_END_SECTION()
288 :
289 22 : CATCH_START_SECTION("Split five words, unclosed double quote")
290 2 : advgetopt::string_list_t result;
291 3 : advgetopt::split_string("\"unclosed quote|mark"
292 : , result
293 2 : , {"|"});
294 1 : CATCH_REQUIRE(result.size() == 1);
295 1 : CATCH_REQUIRE(result[0] == "unclosed quote|mark");
296 : CATCH_END_SECTION()
297 :
298 22 : CATCH_START_SECTION("Split five words, unclosed single quote")
299 2 : advgetopt::string_list_t result;
300 4 : advgetopt::split_string("here is an \"unclosed quote|mark"
301 : , result
302 3 : , {"|"," "});
303 : //CATCH_REQUIRE(result.size() == 4);
304 1 : CATCH_REQUIRE(result[0] == "here");
305 1 : CATCH_REQUIRE(result[1] == "is");
306 1 : CATCH_REQUIRE(result[2] == "an");
307 1 : CATCH_REQUIRE(result[3] == "unclosed quote|mark");
308 : CATCH_END_SECTION()
309 11 : }
310 :
311 :
312 :
313 :
314 5 : CATCH_TEST_CASE("utils_insert_project_name", "[utils][valid]")
315 : {
316 6 : CATCH_START_SECTION("Full insert")
317 : {
318 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
319 : "/this/is/a/path"
320 2 : , "project-name"));
321 1 : CATCH_REQUIRE(fullname.size() == 1);
322 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
323 : }
324 :
325 : {
326 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
327 : "/this/is/a/basename.ext"
328 2 : , "project-name"));
329 1 : CATCH_REQUIRE(fullname.size() == 1);
330 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
331 : }
332 : CATCH_END_SECTION()
333 :
334 6 : CATCH_START_SECTION("Empty cases")
335 : {
336 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
337 : "/this/is/a/path"
338 2 : , nullptr));
339 1 : CATCH_REQUIRE(fullname.empty());
340 : //CATCH_REQUIRE(fullname == std::string());
341 : }
342 :
343 : {
344 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
345 : "/this/is/a/path"
346 2 : , ""));
347 1 : CATCH_REQUIRE(fullname.empty());
348 : //CATCH_REQUIRE(fullname == std::string());
349 : }
350 :
351 : {
352 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
353 : ""
354 2 : , "project-name"));
355 1 : CATCH_REQUIRE(fullname.empty());
356 : //CATCH_REQUIRE(fullname == std::string());
357 : }
358 : CATCH_END_SECTION()
359 :
360 6 : CATCH_START_SECTION("Basename Only")
361 : {
362 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
363 : "basename"
364 2 : , "advgetopt"));
365 1 : CATCH_REQUIRE(fullname.size() == 1);
366 1 : CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename");
367 : }
368 :
369 : {
370 : advgetopt::string_list_t fullname(advgetopt::insert_project_name(
371 : "basename.ext"
372 2 : , "advgetopt"));
373 1 : CATCH_REQUIRE(fullname.size() == 1);
374 1 : CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename.ext");
375 : }
376 : CATCH_END_SECTION()
377 3 : }
378 :
379 :
380 :
381 :
382 :
383 :
384 :
385 5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
386 : {
387 6 : CATCH_START_SECTION("Valid cases")
388 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
389 :
390 : {
391 2 : std::string result(advgetopt::handle_user_directory("~"));
392 1 : CATCH_REQUIRE(result == "/home/advgetopt");
393 : }
394 :
395 : {
396 2 : std::string result(advgetopt::handle_user_directory("~/"));
397 1 : CATCH_REQUIRE(result == "/home/advgetopt/");
398 : }
399 :
400 : {
401 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
402 1 : CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
403 : }
404 : CATCH_END_SECTION()
405 :
406 6 : CATCH_START_SECTION("$HOME is empty")
407 2 : snap::safe_setenv env("HOME", "");
408 :
409 : {
410 2 : std::string result(advgetopt::handle_user_directory("~"));
411 1 : CATCH_REQUIRE(result == "~");
412 : }
413 :
414 : {
415 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
416 1 : CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
417 : }
418 : CATCH_END_SECTION()
419 :
420 6 : CATCH_START_SECTION("Paths do not start with ~")
421 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
422 :
423 : {
424 2 : std::string result(advgetopt::handle_user_directory("/~"));
425 1 : CATCH_REQUIRE(result == "/~");
426 : }
427 :
428 : {
429 2 : std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
430 1 : CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
431 : }
432 : CATCH_END_SECTION()
433 9 : }
434 :
435 :
436 :
437 :
438 :
439 :
440 :
441 : // vim: ts=4 sw=4 et
|