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