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 : std::string fullname(advgetopt::insert_project_name(
319 : "/this/is/a/path"
320 2 : , "project-name"));
321 1 : CATCH_REQUIRE(fullname == "/this/is/a/project-name.d/path");
322 : }
323 :
324 : {
325 : std::string fullname(advgetopt::insert_project_name(
326 : "/this/is/a/basename.ext"
327 2 : , "project-name"));
328 1 : CATCH_REQUIRE(fullname == "/this/is/a/project-name.d/basename.ext");
329 : }
330 : CATCH_END_SECTION()
331 :
332 6 : CATCH_START_SECTION("Empty cases")
333 : {
334 : std::string fullname(advgetopt::insert_project_name(
335 : "/this/is/a/path"
336 2 : , nullptr));
337 1 : CATCH_REQUIRE(fullname == std::string());
338 : }
339 :
340 : {
341 : std::string fullname(advgetopt::insert_project_name(
342 : "/this/is/a/path"
343 2 : , ""));
344 1 : CATCH_REQUIRE(fullname == std::string());
345 : }
346 :
347 : {
348 : std::string fullname(advgetopt::insert_project_name(
349 : ""
350 2 : , "project-name"));
351 1 : CATCH_REQUIRE(fullname == std::string());
352 : }
353 : CATCH_END_SECTION()
354 :
355 6 : CATCH_START_SECTION("Basename Only")
356 : {
357 : std::string fullname(advgetopt::insert_project_name(
358 : "basename"
359 2 : , "advgetopt"));
360 1 : CATCH_REQUIRE(fullname == "advgetopt.d/basename");
361 : }
362 :
363 : {
364 : std::string fullname(advgetopt::insert_project_name(
365 : "basename.ext"
366 2 : , "advgetopt"));
367 1 : CATCH_REQUIRE(fullname == "advgetopt.d/basename.ext");
368 : }
369 : CATCH_END_SECTION()
370 3 : }
371 :
372 :
373 :
374 :
375 :
376 :
377 :
378 5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
379 : {
380 6 : CATCH_START_SECTION("Valid cases")
381 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
382 :
383 : {
384 2 : std::string result(advgetopt::handle_user_directory("~"));
385 1 : CATCH_REQUIRE(result == "/home/advgetopt");
386 : }
387 :
388 : {
389 2 : std::string result(advgetopt::handle_user_directory("~/"));
390 1 : CATCH_REQUIRE(result == "/home/advgetopt/");
391 : }
392 :
393 : {
394 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
395 1 : CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
396 : }
397 : CATCH_END_SECTION()
398 :
399 6 : CATCH_START_SECTION("$HOME is empty")
400 2 : snap::safe_setenv env("HOME", "");
401 :
402 : {
403 2 : std::string result(advgetopt::handle_user_directory("~"));
404 1 : CATCH_REQUIRE(result == "~");
405 : }
406 :
407 : {
408 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
409 1 : CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
410 : }
411 : CATCH_END_SECTION()
412 :
413 6 : CATCH_START_SECTION("Paths do not start with ~")
414 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
415 :
416 : {
417 2 : std::string result(advgetopt::handle_user_directory("/~"));
418 1 : CATCH_REQUIRE(result == "/~");
419 : }
420 :
421 : {
422 2 : std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
423 1 : CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
424 : }
425 : CATCH_END_SECTION()
426 9 : }
427 :
428 :
429 :
430 :
431 :
432 :
433 :
434 : // vim: ts=4 sw=4 et
|