2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
20 /***************************************************************************
21 * Copyright (C) 2006 by Intra2net AG *
23 ***************************************************************************/
25 // #include <iostream>
28 // #include <stdexcept>
30 #define BOOST_TEST_DYN_LINK
31 #include <boost/test/unit_test.hpp>
33 #include <stringfunc.hxx>
34 #include <containerfunc.hpp>
39 typedef std::list< std::string > StringList;
41 BOOST_AUTO_TEST_SUITE(stringfunc)
43 BOOST_AUTO_TEST_CASE(smart_html_entites1)
45 string output = smart_html_entities("Test");
47 BOOST_CHECK_EQUAL(string("Test"), output);
50 BOOST_AUTO_TEST_CASE(smart_html_entites2)
52 string output = smart_html_entities("Täst");
54 BOOST_CHECK_EQUAL(string("Täst"), output);
57 BOOST_AUTO_TEST_CASE(smart_html_entites3)
59 string output = smart_html_entities("<>");
61 BOOST_CHECK_EQUAL(string("<>"), output);
64 BOOST_AUTO_TEST_CASE(smart_html_entites4)
66 string output = smart_html_entities("<ümlaut>");
68 BOOST_CHECK_EQUAL(string("<ümlaut>"), output);
71 BOOST_AUTO_TEST_CASE(smart_html_entites5)
73 string output = smart_html_entities("Test<ümlaut>Blä");
75 BOOST_CHECK_EQUAL(string("Test<ümlaut>Blä"), output);
78 BOOST_AUTO_TEST_CASE(smart_html_entites6)
80 string output = smart_html_entities("System > Einstellungen");
82 BOOST_CHECK_EQUAL(string("System > Einstellungen"), output);
85 BOOST_AUTO_TEST_CASE(smart_html_entites7)
87 string output = smart_html_entities("Finden Sie <b>auf</b> der Seite <a href=\"fdslfsl\">\"System > Einstellungen\"</a>. Oder etwa nicht?");
89 BOOST_CHECK_EQUAL(string("Finden Sie <b>auf</b> der Seite <a href=\"fdslfsl\">"System > Einstellungen"</a>. Oder etwa nicht?"), output);
92 BOOST_AUTO_TEST_CASE(strip_html_tags1)
94 string output = strip_html_tags("Was für ein schöner Tag, finden Sie nicht?");
96 BOOST_CHECK_EQUAL(string("Was für ein schöner Tag, finden Sie nicht?"), output);
99 BOOST_AUTO_TEST_CASE(strip_html_tags2)
101 string output = strip_html_tags("Was für ein <a href=\"wikipedia\" target=\"new\">schöner Tag</a>, finden Sie nicht?");
103 BOOST_CHECK_EQUAL(string("Was für ein schöner Tag, finden Sie nicht?"), output);
108 BOOST_AUTO_TEST_CASE(html_entities1)
110 string output = html_entities("\xC3\xA4\xC3\xB6\xC3\xBC");
111 BOOST_CHECK_EQUAL(string("äöü"), output);
114 BOOST_AUTO_TEST_CASE(html_entities2)
116 string output = html_entities("\xC3\xA5 \xC3\xB5 \xC3\xBF");
117 BOOST_CHECK_EQUAL(string("å õ ÿ"), output);
120 BOOST_AUTO_TEST_CASE(html_entities3)
122 string output = html_entities("\xC4\x8E \xE0\xBC\xB1 \xE8\x82\x88");
123 BOOST_CHECK_EQUAL(string("Ď ༱ 肈"), output);
128 BOOST_AUTO_TEST_CASE(nice_unit_format1)
130 const int64_t two_bytes = 2;
132 string output = nice_unit_format(two_bytes, LongUnitFormat, UnitBase1000);
133 BOOST_CHECK_EQUAL(string("2.00 Bytes"), output);
135 output = nice_unit_format(two_bytes);
136 BOOST_CHECK_EQUAL(string("2.0 B"), output);
139 BOOST_AUTO_TEST_CASE(nice_unit_format2)
141 const int64_t two_kilobytes = 2000;
143 string output = nice_unit_format(two_kilobytes, LongUnitFormat, UnitBase1000);
144 BOOST_CHECK_EQUAL(string("2.00 KBytes"), output);
146 output = nice_unit_format(two_kilobytes);
147 BOOST_CHECK_EQUAL(string("2.0 KB"), output);
149 const int64_t two_and_half_kilobytes = 2500;
151 output = nice_unit_format(two_and_half_kilobytes, LongUnitFormat, UnitBase1000);
152 BOOST_CHECK_EQUAL(string("2.50 KBytes"), output);
154 output = nice_unit_format(two_and_half_kilobytes);
155 BOOST_CHECK_EQUAL(string("2.4 KB"), output);
158 BOOST_AUTO_TEST_CASE(nice_unit_format3)
160 const int64_t two_megabytes = 2000000;
162 string output = nice_unit_format(two_megabytes, LongUnitFormat, UnitBase1000);
163 BOOST_CHECK_EQUAL(string("2.00 MBytes"), output);
165 output = nice_unit_format(two_megabytes);
166 BOOST_CHECK_EQUAL(string("1.9 MB"), output);
168 const int64_t two_and_half_megabytes = 2500000;
170 output = nice_unit_format(two_and_half_megabytes, LongUnitFormat, UnitBase1000);
171 BOOST_CHECK_EQUAL(string("2.50 MBytes"), output);
173 output = nice_unit_format(two_and_half_megabytes);
174 BOOST_CHECK_EQUAL(string("2.4 MB"), output);
178 BOOST_AUTO_TEST_CASE(nice_unit_format4)
180 const int64_t two_gigabytes = 2000000000LL;
182 string output = nice_unit_format(two_gigabytes, LongUnitFormat, UnitBase1000);
183 BOOST_CHECK_EQUAL(string("2.00 GBytes"), output);
185 output = nice_unit_format(two_gigabytes);
186 BOOST_CHECK_EQUAL(string("1.9 GB"), output);
188 const int64_t two_and_half_gigabytes = 2500000000LL;
190 output = nice_unit_format(two_and_half_gigabytes, LongUnitFormat, UnitBase1000);
191 BOOST_CHECK_EQUAL(string("2.50 GBytes"), output);
193 output = nice_unit_format(two_and_half_gigabytes);
194 BOOST_CHECK_EQUAL(string("2.3 GB"), output);
197 BOOST_AUTO_TEST_CASE(nice_unit_format5)
199 const int64_t two_terabytes = 2000000000000LL;
201 string output = nice_unit_format(two_terabytes, LongUnitFormat, UnitBase1000);
202 BOOST_CHECK_EQUAL(string("2.00 TBytes"), output);
204 output = nice_unit_format(two_terabytes);
205 BOOST_CHECK_EQUAL(string("1.8 TB"), output);
207 const int64_t two_and_half_terabytes = 2500000000000LL;
209 output = nice_unit_format(two_and_half_terabytes, LongUnitFormat, UnitBase1000);
210 BOOST_CHECK_EQUAL(string("2.50 TBytes"), output);
212 output = nice_unit_format(two_and_half_terabytes);
213 BOOST_CHECK_EQUAL(string("2.3 TB"), output);
216 BOOST_AUTO_TEST_CASE(nice_unit_format6)
218 const int64_t two_petabytes = 2000000000000000LL;
220 string output = nice_unit_format(two_petabytes, LongUnitFormat, UnitBase1000);
221 BOOST_CHECK_EQUAL(string("2.00 PBytes"), output);
223 output = nice_unit_format(two_petabytes);
224 BOOST_CHECK_EQUAL(string("1.8 PB"), output);
226 const int64_t two_and_half_petabytes = 2500000000000000LL;
228 output = nice_unit_format(two_and_half_petabytes, LongUnitFormat, UnitBase1000);
229 BOOST_CHECK_EQUAL(string("2.50 PBytes"), output);
231 output = nice_unit_format(two_and_half_petabytes);
232 BOOST_CHECK_EQUAL(string("2.2 PB"), output);
235 BOOST_AUTO_TEST_CASE(nice_unit_format7)
237 const int64_t two_exabytes = 2000000000000000000LL;
239 string output = nice_unit_format(two_exabytes, LongUnitFormat, UnitBase1000);
240 BOOST_CHECK_EQUAL(string("2000.00 PBytes"), output);
242 output = nice_unit_format(two_exabytes);
243 BOOST_CHECK_EQUAL(string("1776.4 PB"), output);
245 const int64_t two_and_half_exabytes = 2500000000000000000LL;
247 output = nice_unit_format(two_and_half_exabytes, LongUnitFormat, UnitBase1000);
248 BOOST_CHECK_EQUAL(string("2500.00 PBytes"), output);
250 output = nice_unit_format(two_and_half_exabytes);
251 BOOST_CHECK_EQUAL(string("2220.4 PB"), output);
254 BOOST_AUTO_TEST_CASE(nice_unit_format8)
256 const int64_t max_representable_64bits_number = 9223372036854775807LL;
258 string output = nice_unit_format(max_representable_64bits_number, LongUnitFormat, UnitBase1000);
259 BOOST_CHECK_EQUAL(string("9223.40 PBytes"), output);
261 output = nice_unit_format(max_representable_64bits_number);
262 BOOST_CHECK_EQUAL(string("8192.0 PB"), output);
267 BOOST_AUTO_TEST_CASE(imaputf7_to_utf8)
269 string output = utf7imap_to_utf8("Sp&AOQ-m");
270 BOOST_CHECK_EQUAL(string("Späm"), output);
273 BOOST_AUTO_TEST_CASE(utf8_to_imaputf7)
275 string output = utf8_to_utf7imap("Späm");
276 BOOST_CHECK_EQUAL(string("Sp&AOQ-m"), output);
283 BOOST_AUTO_TEST_CASE(TestTrim)
287 BOOST_CHECK_EQUAL( std::string("s1"), s );
291 BOOST_CHECK_EQUAL( std::string("s2"), s );
295 BOOST_CHECK_EQUAL( std::string("s3"), s );
299 BOOST_CHECK_EQUAL( std::string("s4:s4"), s);
301 /* non modifying version */
304 BOOST_CHECK_EQUAL( std::string("s1"), trim(s) );
307 BOOST_CHECK_EQUAL( std::string("s2"), trim(s) );
308 BOOST_CHECK_EQUAL( std::string(" s2"), s );
311 BOOST_CHECK_EQUAL( std::string("s3"), trim(s) );
312 BOOST_CHECK_EQUAL( std::string("s3 "), s );
315 BOOST_CHECK_EQUAL( std::string("s4:s4"), trim(s,":+-a") );
320 BOOST_AUTO_TEST_CASE(TestChomp)
325 BOOST_CHECK_EQUAL( std::string("s1"), s );
329 BOOST_CHECK_EQUAL( std::string("s2"), s );
333 BOOST_CHECK_EQUAL( std::string("s3"), s );
337 BOOST_CHECK_EQUAL( std::string(":s4:"), s);
339 /* non modifiying versions */
342 BOOST_CHECK_EQUAL( std::string("s1"), chomp(s) );
345 BOOST_CHECK_EQUAL( std::string("s2"), chomp(s) );
346 BOOST_CHECK_EQUAL( std::string("s2\n"), s);
349 BOOST_CHECK_EQUAL( std::string("s3"), chomp(s,":") );
350 BOOST_CHECK_EQUAL( std::string("s3:"), s);
353 BOOST_CHECK_EQUAL( std::string(":s4:"), chomp(s,"s:") );
354 BOOST_CHECK_EQUAL( std::string(":s4::"), s);
359 BOOST_AUTO_TEST_CASE(TestSuffixFuncs)
361 std::string s1("12.cpp");
363 BOOST_CHECK_EQUAL( true, has_suffix(s1,".cpp") );
364 BOOST_CHECK_EQUAL( true, has_suffix(s1,"pp") );
365 BOOST_CHECK_EQUAL( false, has_suffix(s1,"hpp") );
366 BOOST_CHECK_EQUAL( false, has_suffix(s1,"cp") );
367 BOOST_CHECK_EQUAL( false, has_suffix(s1,"") );
369 std::string s1c1= remove_suffix(s1,".cpp");
370 BOOST_CHECK_EQUAL( std::string("12"), s1c1 );
372 std::string s1c2= remove_suffix(s1,"p");
373 BOOST_CHECK_EQUAL( std::string("12.cp"), s1c2 );
375 std::string s1c3= remove_suffix(s1,"cp");
376 BOOST_CHECK_EQUAL( std::string("12.cpp"), s1c3 );
378 std::string s2(".cpp");
379 BOOST_CHECK_EQUAL( true, has_suffix(s2,".cpp") );
381 std::string s2c1= remove_suffix(s2,".cpp");
382 BOOST_CHECK_EQUAL( std::string(""), s2c1 );
384 } // eo TestSuffixFuncs()
388 BOOST_AUTO_TEST_CASE(TestPrefixFuncs)
390 std::string s1("12.cpp");
392 BOOST_CHECK_EQUAL( true, has_prefix(s1,"12") );
393 BOOST_CHECK_EQUAL( true, has_prefix(s1, "1") );
394 BOOST_CHECK_EQUAL( false, has_prefix(s1, "2") );
395 BOOST_CHECK_EQUAL( false, has_prefix(s1, "") );
397 std::string s1c1= remove_prefix(s1, "12");
398 BOOST_CHECK_EQUAL( std::string(".cpp"), s1c1);
399 } // eo TestPrefixFuncs()
403 BOOST_AUTO_TEST_CASE(TestLowerUpperFuncs)
405 std::string u1("CASE CONVERSION TEST..");
406 std::string l1("case conversion test..");
408 std::string test1(l1);
411 BOOST_CHECK_EQUAL( u1, test1 );
414 BOOST_CHECK_EQUAL( l1, test1 );
417 BOOST_CHECK_EQUAL( u1, to_upper(l1) );
418 BOOST_CHECK_EQUAL( l1, to_lower(u1) );
419 } // eo TestLowerUpper
423 BOOST_AUTO_TEST_CASE(PairSplit1)
426 get_push_back_filler(str_list)
427 ("a=11")("a= 11")("a =11 ")("a = 11 ")(" a = 11 ")
429 BOOST_CHECK_EQUAL( 5u, str_list.size() );
430 for(StringList::iterator it= str_list.begin();
431 it != str_list.end();
434 std::string key, value;
435 bool res= pair_split( *it, key, value);
437 BOOST_CHECK_EQUAL( true , res );
438 BOOST_CHECK_EQUAL( std::string("a"), key );
439 BOOST_CHECK_EQUAL( std::string("11"), value );
442 std::string key, value;
445 res= pair_split(" 1 : 2 ", key, value, ':');
446 BOOST_CHECK_EQUAL( true, res );
447 BOOST_CHECK_EQUAL( std::string("1"), key);
448 BOOST_CHECK_EQUAL( std::string("2"), value);
453 BOOST_AUTO_TEST_CASE(SplitString1)
465 split_string(block, list1, "\n");
466 // since the blocks ends with \n we should have 6 lines (the last one empty):
467 BOOST_CHECK_EQUAL( 6u, list1.size() );
468 BOOST_CHECK_EQUAL( std::string(), list1.back() );
469 BOOST_CHECK_EQUAL( std::string("Zeile 1"), list1.front() );
473 split_string(block, list2, "\n", true);
475 // now we omitted empty lines, now we should have only 4 lines left:
476 BOOST_CHECK_EQUAL( 4u, list2.size() );
477 BOOST_CHECK_EQUAL( std::string("Zeile 5"), list2.back() );
478 BOOST_CHECK_EQUAL( std::string("Zeile 1"), list2.front() );
480 list2= split_string(block, "\n", true, "+-");
482 // again, we omitted empty lines, but also trimmed away leading and trailing "+" and "-"
483 BOOST_CHECK_EQUAL( 4u, list2.size() );
484 BOOST_CHECK_EQUAL( std::string("Zeile 5"), list2.back() );
485 BOOST_CHECK_EQUAL( std::string("Zeile 1"), list2.front() );
486 BOOST_CHECK_EQUAL( std::string("Zeile-2"), *(++list2.begin()) );
491 BOOST_AUTO_TEST_CASE(SplitString2)
493 std::string line("172.16.0.0/16 dev eth0 scope link src 172.16.1.111");
497 split_string(line, list1, " ", true, Whitespaces);
499 BOOST_CHECK_EQUAL( 7u, list1.size() );
505 BOOST_AUTO_TEST_CASE(SplitStringEmpty)
507 std::string line("");
511 split_string(line, list1, " ", true, Whitespaces);
513 BOOST_CHECK_EQUAL( 0u, list1.size() );
514 } // eo SplitStringEmpty
517 BOOST_AUTO_TEST_CASE(SplitStringDelimiterOnly)
519 std::string line(" ");
523 split_string(line, list1, " ", true, Whitespaces);
525 BOOST_CHECK_EQUAL( 0u, list1.size() );
526 } // eo SplitStringDelimiterOnly
530 BOOST_AUTO_TEST_CASE(JoinString1)
532 std::list< std::string > parts;
533 get_push_back_filler(parts)("1")("2")("drei");
535 std::string joined_string= join_string(parts,"/");
536 // we should have slashes between the strings:
537 BOOST_CHECK_EQUAL( std::string("1/2/drei") , joined_string );
539 parts.push_back( std::string() );
540 joined_string= join_string(parts,"/");
541 // now we should have an additional trailing slash:
542 BOOST_CHECK_EQUAL( std::string("1/2/drei/") , joined_string );
544 parts.push_front( std::string() );
545 joined_string= join_string(parts,"/");
546 // now we should have an additional leading slash:
547 BOOST_CHECK_EQUAL( std::string("/1/2/drei/") , joined_string );
553 BOOST_AUTO_TEST_CASE(ConversionStringInt)
555 std::string s1("24");
556 std::string s1x("25x");
560 i1= string_to<int>(s1);
561 BOOST_CHECK_EQUAL( 24, i1 );
562 i1= string_to<int>(s1x);
563 BOOST_CHECK_EQUAL( 25, i1 );
565 res= string_to<int>(s1,i1);
566 BOOST_CHECK_EQUAL( true, res );
567 BOOST_CHECK_EQUAL( 24, i1 );
569 res= string_to<int>(s1x,i1);
570 BOOST_CHECK_EQUAL( false, res );
572 std::string ss1= to_string( 24 );
573 BOOST_CHECK_EQUAL( std::string("24"), ss1);
575 } // eo ConversionStringInt()
579 BOOST_AUTO_TEST_CASE(HexConversion)
581 std::string hex1("49324E");
582 std::string bin1("I2N");
584 BOOST_CHECK_EQUAL( hex1, convert_binary_to_hex(bin1,true) );
585 BOOST_CHECK_EQUAL( bin1, convert_hex_to_binary(hex1) );
586 BOOST_CHECK_EQUAL( to_lower(hex1), convert_binary_to_hex(bin1) );
588 std::string hex2("0001");
589 std::string hex2a("00 01");
590 std::string hex2b("00:01");
591 std::string bin2("\0\1",2);
593 BOOST_CHECK_EQUAL( hex2, convert_binary_to_hex(bin2) );
594 BOOST_CHECK_EQUAL( bin2, convert_hex_to_binary(hex2) );
595 BOOST_CHECK_EQUAL( bin2, convert_hex_to_binary(hex2a) );
596 BOOST_CHECK_EQUAL( bin2, convert_hex_to_binary(hex2b) );
598 BOOST_REQUIRE_THROW( convert_hex_to_binary("01 kein hex"), std::runtime_error);
599 } // eo HexConversion()
601 BOOST_AUTO_TEST_SUITE_END()