comparison tests/src/libirccd/util/main.cpp @ 611:9fbd1700435b

Tests: reoganize hierarchy
author David Demelier <markand@malikania.fr>
date Fri, 15 Dec 2017 15:37:58 +0100
parents tests/src/util/main.cpp@a51b5dd5b761
children 4761e7cbb6f7
comparison
equal deleted inserted replaced
610:22b3cd6f991f 611:9fbd1700435b
1 /*
2 * main.cpp -- test util functions
3 *
4 * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #define BOOST_TEST_MODULE "util"
20 #include <boost/test/unit_test.hpp>
21
22 #include <cstdint>
23
24 #include <irccd/util.hpp>
25 #include <irccd/fs_util.hpp>
26 #include <irccd/string_util.hpp>
27 #include <irccd/system.hpp>
28
29 namespace std {
30
31 std::ostream& operator<<(std::ostream& out, const std::vector<std::string>& list)
32 {
33 for (const auto& s : list)
34 out << s << " ";
35
36 return out;
37 }
38
39 } // !std
40
41 namespace irccd {
42
43 BOOST_AUTO_TEST_SUITE(format)
44
45 /*
46 * string_util::format function
47 * --------------------------------------------------------
48 */
49
50 BOOST_AUTO_TEST_CASE(nothing)
51 {
52 std::string expected = "hello world!";
53 std::string result = string_util::format("hello world!");
54
55 BOOST_REQUIRE_EQUAL(expected, result);
56 }
57
58 BOOST_AUTO_TEST_CASE(escape)
59 {
60 string_util::subst params;
61
62 params.keywords.emplace("target", "hello");
63
64 BOOST_REQUIRE_EQUAL("$@#", string_util::format("$@#"));
65 BOOST_REQUIRE_EQUAL(" $ @ # ", string_util::format(" $ @ # "));
66 BOOST_REQUIRE_EQUAL("#", string_util::format("#"));
67 BOOST_REQUIRE_EQUAL(" # ", string_util::format(" # "));
68 BOOST_REQUIRE_EQUAL("#@", string_util::format("#@"));
69 BOOST_REQUIRE_EQUAL("##", string_util::format("##"));
70 BOOST_REQUIRE_EQUAL("#!", string_util::format("#!"));
71 BOOST_REQUIRE_EQUAL("#{target}", string_util::format("##{target}"));
72 BOOST_REQUIRE_EQUAL("@hello", string_util::format("@#{target}", params));
73 BOOST_REQUIRE_EQUAL("hello#", string_util::format("#{target}#", params));
74 BOOST_REQUIRE_THROW(string_util::format("#{failure"), std::exception);
75 }
76
77 BOOST_AUTO_TEST_CASE(disable_date)
78 {
79 string_util::subst params;
80
81 params.flags &= ~(string_util::subst_flags::date);
82
83 BOOST_REQUIRE_EQUAL("%H:%M", string_util::format("%H:%M", params));
84 }
85
86 BOOST_AUTO_TEST_CASE(disable_keywords)
87 {
88 string_util::subst params;
89
90 params.keywords.emplace("target", "hello");
91 params.flags &= ~(string_util::subst_flags::keywords);
92
93 BOOST_REQUIRE_EQUAL("#{target}", string_util::format("#{target}", params));
94 }
95
96 BOOST_AUTO_TEST_CASE(disable_env)
97 {
98 string_util::subst params;
99
100 params.flags &= ~(string_util::subst_flags::env);
101
102 BOOST_REQUIRE_EQUAL("${HOME}", string_util::format("${HOME}", params));
103 }
104
105 BOOST_AUTO_TEST_CASE(keyword_simple)
106 {
107 string_util::subst params;
108
109 params.keywords.insert({"target", "irccd"});
110
111 std::string expected = "hello irccd!";
112 std::string result = string_util::format("hello #{target}!", params);
113
114 BOOST_REQUIRE_EQUAL(expected, result);
115 }
116
117 BOOST_AUTO_TEST_CASE(keyword_multiple)
118 {
119 string_util::subst params;
120
121 params.keywords.insert({"target", "irccd"});
122 params.keywords.insert({"source", "nightmare"});
123
124 std::string expected = "hello irccd from nightmare!";
125 std::string result = string_util::format("hello #{target} from #{source}!", params);
126
127 BOOST_REQUIRE_EQUAL(expected, result);
128 }
129
130 BOOST_AUTO_TEST_CASE(keyword_adj_twice)
131 {
132 string_util::subst params;
133
134 params.keywords.insert({"target", "irccd"});
135
136 std::string expected = "hello irccdirccd!";
137 std::string result = string_util::format("hello #{target}#{target}!", params);
138
139 BOOST_REQUIRE_EQUAL(expected, result);
140 }
141
142 BOOST_AUTO_TEST_CASE(keyword_missing)
143 {
144 std::string expected = "hello !";
145 std::string result = string_util::format("hello #{target}!");
146
147 BOOST_REQUIRE_EQUAL(expected, result);
148 }
149
150 BOOST_AUTO_TEST_CASE(env_simple)
151 {
152 std::string home = sys::env("HOME");
153
154 if (!home.empty()) {
155 std::string expected = "my home is " + home;
156 std::string result = string_util::format("my home is ${HOME}");
157
158 BOOST_REQUIRE_EQUAL(expected, result);
159 }
160 }
161
162 BOOST_AUTO_TEST_CASE(env_missing)
163 {
164 std::string expected = "value is ";
165 std::string result = string_util::format("value is ${HOPE_THIS_VAR_NOT_EXIST}");
166
167 BOOST_REQUIRE_EQUAL(expected, result);
168 }
169
170 BOOST_AUTO_TEST_SUITE_END()
171
172 /*
173 * string_util::split function
174 * --------------------------------------------------------
175 */
176
177 BOOST_AUTO_TEST_SUITE(split)
178
179 using list = std::vector<std::string>;
180
181 BOOST_AUTO_TEST_CASE(simple)
182 {
183 list expected { "a", "b" };
184 list result = string_util::split("a;b", ";");
185
186 BOOST_REQUIRE_EQUAL(expected, result);
187 }
188
189 BOOST_AUTO_TEST_CASE(cut)
190 {
191 list expected { "msg", "#staff", "foo bar baz" };
192 list result = string_util::split("msg;#staff;foo bar baz", ";", 3);
193
194 BOOST_REQUIRE_EQUAL(expected, result);
195 }
196
197 BOOST_AUTO_TEST_SUITE_END()
198
199 /*
200 * string_util::strip function
201 * --------------------------------------------------------
202 */
203
204 BOOST_AUTO_TEST_SUITE(strip)
205
206 BOOST_AUTO_TEST_CASE(left)
207 {
208 std::string value = " 123";
209 std::string result = string_util::strip(value);
210
211 BOOST_REQUIRE_EQUAL("123", result);
212 }
213
214 BOOST_AUTO_TEST_CASE(right)
215 {
216 std::string value = "123 ";
217 std::string result = string_util::strip(value);
218
219 BOOST_REQUIRE_EQUAL("123", result);
220 }
221
222 BOOST_AUTO_TEST_CASE(both)
223 {
224 std::string value = " 123 ";
225 std::string result = string_util::strip(value);
226
227 BOOST_REQUIRE_EQUAL("123", result);
228 }
229
230 BOOST_AUTO_TEST_CASE(none)
231 {
232 std::string value = "without";
233 std::string result = string_util::strip(value);
234
235 BOOST_REQUIRE_EQUAL("without", result);
236 }
237
238 BOOST_AUTO_TEST_CASE(betweenEmpty)
239 {
240 std::string value = "one list";
241 std::string result = string_util::strip(value);
242
243 BOOST_REQUIRE_EQUAL("one list", result);
244 }
245
246 BOOST_AUTO_TEST_CASE(betweenLeft)
247 {
248 std::string value = " space at left";
249 std::string result = string_util::strip(value);
250
251 BOOST_REQUIRE_EQUAL("space at left", result);
252 }
253
254 BOOST_AUTO_TEST_CASE(betweenRight)
255 {
256 std::string value = "space at right ";
257 std::string result = string_util::strip(value);
258
259 BOOST_REQUIRE_EQUAL("space at right", result);
260 }
261
262 BOOST_AUTO_TEST_CASE(betweenBoth)
263 {
264 std::string value = " space at both ";
265 std::string result = string_util::strip(value);
266
267 BOOST_REQUIRE_EQUAL("space at both", result);
268 }
269
270 BOOST_AUTO_TEST_CASE(empty)
271 {
272 std::string value = " ";
273 std::string result = string_util::strip(value);
274
275 BOOST_REQUIRE_EQUAL("", result);
276 }
277
278 BOOST_AUTO_TEST_SUITE_END()
279
280 /*
281 * string_util::join function
282 * --------------------------------------------------------
283 */
284
285 BOOST_AUTO_TEST_SUITE(join)
286
287 BOOST_AUTO_TEST_CASE(empty)
288 {
289 std::string expected = "";
290 std::string result = string_util::join<int>({});
291
292 BOOST_REQUIRE_EQUAL(expected, result);
293 }
294
295 BOOST_AUTO_TEST_CASE(one)
296 {
297 std::string expected = "1";
298 std::string result = string_util::join({1});
299
300 BOOST_REQUIRE_EQUAL(expected, result);
301 }
302
303 BOOST_AUTO_TEST_CASE(two)
304 {
305 std::string expected = "1:2";
306 std::string result = string_util::join({1, 2});
307
308 BOOST_REQUIRE_EQUAL(expected, result);
309 }
310
311 BOOST_AUTO_TEST_CASE(delimiterString)
312 {
313 std::string expected = "1;;2;;3";
314 std::string result = string_util::join({1, 2, 3}, ";;");
315
316 BOOST_REQUIRE_EQUAL(expected, result);
317 }
318
319 BOOST_AUTO_TEST_CASE(delimiterChar)
320 {
321 std::string expected = "1@2@3@4";
322 std::string result = string_util::join({1, 2, 3, 4}, '@');
323
324 BOOST_REQUIRE_EQUAL(expected, result);
325 }
326
327 BOOST_AUTO_TEST_SUITE_END()
328
329 /*
330 * string_util::is_identifier function
331 * --------------------------------------------------------
332 */
333
334 BOOST_AUTO_TEST_SUITE(is_identifier_valid)
335
336 BOOST_AUTO_TEST_CASE(correct)
337 {
338 BOOST_REQUIRE(string_util::is_identifier("localhost"));
339 BOOST_REQUIRE(string_util::is_identifier("localhost2"));
340 BOOST_REQUIRE(string_util::is_identifier("localhost2-4_"));
341 }
342
343 BOOST_AUTO_TEST_CASE(incorrect)
344 {
345 BOOST_REQUIRE(!string_util::is_identifier(""));
346 BOOST_REQUIRE(!string_util::is_identifier("localhost with spaces"));
347 BOOST_REQUIRE(!string_util::is_identifier("localhost*"));
348 BOOST_REQUIRE(!string_util::is_identifier("&&"));
349 BOOST_REQUIRE(!string_util::is_identifier("@'"));
350 BOOST_REQUIRE(!string_util::is_identifier("##"));
351 BOOST_REQUIRE(!string_util::is_identifier("===++"));
352 }
353
354 BOOST_AUTO_TEST_SUITE_END()
355
356 /*
357 * string_util::is_boolean function
358 * --------------------------------------------------------
359 */
360
361 BOOST_AUTO_TEST_SUITE(is_boolean)
362
363 BOOST_AUTO_TEST_CASE(correct)
364 {
365 // true
366 BOOST_REQUIRE(string_util::is_boolean("true"));
367 BOOST_REQUIRE(string_util::is_boolean("True"));
368 BOOST_REQUIRE(string_util::is_boolean("TRUE"));
369 BOOST_REQUIRE(string_util::is_boolean("TruE"));
370
371 // yes
372 BOOST_REQUIRE(string_util::is_boolean("yes"));
373 BOOST_REQUIRE(string_util::is_boolean("Yes"));
374 BOOST_REQUIRE(string_util::is_boolean("YES"));
375 BOOST_REQUIRE(string_util::is_boolean("YeS"));
376
377 // on
378 BOOST_REQUIRE(string_util::is_boolean("on"));
379 BOOST_REQUIRE(string_util::is_boolean("On"));
380 BOOST_REQUIRE(string_util::is_boolean("oN"));
381 BOOST_REQUIRE(string_util::is_boolean("ON"));
382
383 // 1
384 BOOST_REQUIRE(string_util::is_boolean("1"));
385 }
386
387 BOOST_AUTO_TEST_CASE(incorrect)
388 {
389 BOOST_REQUIRE(!string_util::is_boolean("false"));
390 BOOST_REQUIRE(!string_util::is_boolean("lol"));
391 BOOST_REQUIRE(!string_util::is_boolean(""));
392 BOOST_REQUIRE(!string_util::is_boolean("0"));
393 }
394
395 BOOST_AUTO_TEST_SUITE_END()
396
397 /*
398 * string_util::is_number function
399 * --------------------------------------------------------
400 */
401
402 BOOST_AUTO_TEST_SUITE(is_number)
403
404 BOOST_AUTO_TEST_CASE(correct)
405 {
406 BOOST_REQUIRE(string_util::is_number("123"));
407 BOOST_REQUIRE(string_util::is_number("-123"));
408 BOOST_REQUIRE(string_util::is_number("123.67"));
409 }
410
411 BOOST_AUTO_TEST_CASE(incorrect)
412 {
413 BOOST_REQUIRE(!string_util::is_number("lol"));
414 BOOST_REQUIRE(!string_util::is_number("this is not a number"));
415 }
416
417 BOOST_AUTO_TEST_SUITE_END()
418
419 /*
420 * string_util::to_int function
421 * ------------------------------------------------------------------
422 */
423
424 BOOST_AUTO_TEST_SUITE(to_int)
425
426 BOOST_AUTO_TEST_CASE(signed_to_int)
427 {
428 BOOST_TEST(string_util::to_int("10") == 10);
429 BOOST_TEST(string_util::to_int<std::int8_t>("-10") == -10);
430 BOOST_TEST(string_util::to_int<std::int8_t>("10") == 10);
431 BOOST_TEST(string_util::to_int<std::int16_t>("-1000") == -1000);
432 BOOST_TEST(string_util::to_int<std::int16_t>("1000") == 1000);
433 BOOST_TEST(string_util::to_int<std::int32_t>("-1000") == -1000);
434 BOOST_TEST(string_util::to_int<std::int32_t>("1000") == 1000);
435 }
436
437 BOOST_AUTO_TEST_CASE(signed_to_int64)
438 {
439 BOOST_TEST(string_util::to_int<std::int64_t>("-9223372036854775807") == -9223372036854775807LL);
440 BOOST_TEST(string_util::to_int<std::int64_t>("9223372036854775807") == 9223372036854775807LL);
441 }
442
443 BOOST_AUTO_TEST_CASE(unsigned_to_uint)
444 {
445 BOOST_TEST(string_util::to_uint("10") == 10U);
446 BOOST_TEST(string_util::to_uint<std::uint8_t>("10") == 10U);
447 BOOST_TEST(string_util::to_uint<std::uint16_t>("1000") == 1000U);
448 BOOST_TEST(string_util::to_uint<std::uint32_t>("1000") == 1000U);
449 }
450
451 BOOST_AUTO_TEST_CASE(unsigned_to_uint64)
452 {
453 BOOST_TEST(string_util::to_uint<std::uint64_t>("18446744073709551615") == 18446744073709551615ULL);
454 }
455
456 BOOST_AUTO_TEST_SUITE_END()
457
458 BOOST_AUTO_TEST_SUITE(errors)
459
460 BOOST_AUTO_TEST_CASE(invalid_argument)
461 {
462 BOOST_REQUIRE_THROW(string_util::to_int("plopation"), std::invalid_argument);
463 BOOST_REQUIRE_THROW(string_util::to_uint("plopation"), std::invalid_argument);
464 }
465
466 BOOST_AUTO_TEST_CASE(out_of_range)
467 {
468 BOOST_REQUIRE_THROW(string_util::to_int<std::int8_t>("1000"), std::out_of_range);
469 BOOST_REQUIRE_THROW(string_util::to_int<std::int8_t>("-1000"), std::out_of_range);
470 BOOST_REQUIRE_THROW(string_util::to_uint<std::uint8_t>("1000"), std::out_of_range);
471 BOOST_REQUIRE_THROW(string_util::to_uint<std::uint8_t>("-1000"), std::out_of_range);
472 }
473
474 BOOST_AUTO_TEST_SUITE_END()
475
476 /*
477 * fs_util::find function (name)
478 * ------------------------------------------------------------------
479 */
480
481 BOOST_AUTO_TEST_SUITE(fs_find_name)
482
483 BOOST_AUTO_TEST_CASE(not_recursive)
484 {
485 auto file1 = fs_util::find(CMAKE_SOURCE_DIR "/tests/root", "file-1.txt", false);
486 auto file2 = fs_util::find(CMAKE_SOURCE_DIR "/tests/root", "file-2.txt", false);
487
488 BOOST_TEST(file1.find("file-1.txt") != std::string::npos);
489 BOOST_TEST(file2.empty());
490 }
491
492 BOOST_AUTO_TEST_CASE(recursive)
493 {
494 auto file1 = fs_util::find(CMAKE_SOURCE_DIR "/tests/root", "file-1.txt", true);
495 auto file2 = fs_util::find(CMAKE_SOURCE_DIR "/tests/root", "file-2.txt", true);
496
497 BOOST_TEST(file1.find("file-1.txt") != std::string::npos);
498 BOOST_TEST(file2.find("file-2.txt") != std::string::npos);
499 }
500
501 BOOST_AUTO_TEST_SUITE_END()
502
503 /*
504 * fs_util::find function (regex)
505 * ------------------------------------------------------------------
506 */
507
508 BOOST_AUTO_TEST_SUITE(fs_find_regex)
509
510 BOOST_AUTO_TEST_CASE(not_recursive)
511 {
512 const std::regex regex("file-[12]\\.txt");
513
514 auto file = fs_util::find(CMAKE_SOURCE_DIR "/tests/root", regex, false);
515
516 BOOST_TEST(file.find("file-1.txt") != std::string::npos);
517 }
518
519 BOOST_AUTO_TEST_CASE(recursive)
520 {
521 const std::regex regex("file-[12]\\.txt");
522
523 auto file = fs_util::find(CMAKE_SOURCE_DIR "/tests/root/level-1", regex, true);
524
525 BOOST_TEST(file.find("file-2.txt") != std::string::npos);
526 }
527
528 BOOST_AUTO_TEST_SUITE_END()
529
530 } // !irccd