]> git.mxchange.org Git - simgear.git/blob - simgear/misc/strutils_test.cxx
0ab87224c0c9b82b0c3b372da1a2cc2c14ce4b4b
[simgear.git] / simgear / misc / strutils_test.cxx
1 /// Unit tests for function inside strutils package
2 #define BOOST_TEST_MODULE misc
3 #include <BoostTestTargetConfig.h>
4
5 #include <errno.h>
6 #include <stdlib.h>             // _set_errno() on Windows
7 #include <fstream>              // std::ifstream
8 #include <simgear/compiler.h>
9 #include "strutils.hxx"
10
11 namespace strutils = simgear::strutils;
12
13 BOOST_AUTO_TEST_CASE( strutils_functions )
14 {
15   std::string a("abcd");
16   BOOST_CHECK_EQUAL(strutils::strip(a), a);
17   BOOST_CHECK_EQUAL(strutils::strip(" a "), "a");
18   BOOST_CHECK_EQUAL(strutils::lstrip(" a  "), "a  ");
19   BOOST_CHECK_EQUAL(strutils::rstrip("\ta "), "\ta");
20
21   // check internal spacing is preserved
22   BOOST_CHECK_EQUAL(strutils::strip("\t \na \t b\r \n "), "a \t b");
23
24
25   BOOST_CHECK(strutils::starts_with("banana", "ban"));
26   BOOST_CHECK(!strutils::starts_with("abanana", "ban"));
27   BOOST_CHECK(strutils::starts_with("banana", "banana")); // pass - string starts with itself
28   BOOST_CHECK(!strutils::starts_with("ban", "banana")); // fail - original string is prefix of
29
30   BOOST_CHECK(strutils::ends_with("banana", "ana"));
31   BOOST_CHECK(strutils::ends_with("foo.text", ".text"));
32   BOOST_CHECK(!strutils::ends_with("foo.text", ".html"));
33
34   BOOST_CHECK_EQUAL(strutils::simplify("\ta\t b  \nc\n\r \r\n"), "a b c");
35   BOOST_CHECK_EQUAL(strutils::simplify("The quick  - brown dog!"), "The quick - brown dog!");
36   BOOST_CHECK_EQUAL(strutils::simplify("\r\n  \r\n   \t  \r"), "");
37
38   BOOST_CHECK_EQUAL(strutils::to_int("999"), 999);
39   BOOST_CHECK_EQUAL(strutils::to_int("0000000"), 0);
40   BOOST_CHECK_EQUAL(strutils::to_int("-10000"), -10000);
41
42   string_list la = strutils::split("zero one two three four five");
43   BOOST_CHECK_EQUAL(la[2], "two");
44   BOOST_CHECK_EQUAL(la[5], "five");
45   BOOST_CHECK_EQUAL(la.size(), 6);
46
47   string_list lb = strutils::split("alpha:beta:gamma:delta", ":", 2);
48   BOOST_CHECK_EQUAL(lb.size(), 3);
49   BOOST_CHECK_EQUAL(lb[0], "alpha");
50   BOOST_CHECK_EQUAL(lb[1], "beta");
51   BOOST_CHECK_EQUAL(lb[2], "gamma:delta");
52
53   std::string j = strutils::join(la, "&");
54   BOOST_CHECK_EQUAL(j, "zero&one&two&three&four&five");
55
56   BOOST_CHECK_EQUAL(strutils::unescape("\\ \\n\\t\\x41\\117a"), " \n\tAOa");
57 }
58
59 BOOST_AUTO_TEST_CASE( compare_versions )
60 {
61   BOOST_CHECK_LT(strutils::compare_versions("1.0.12", "1.1"), 0);
62   BOOST_CHECK_GT(strutils::compare_versions("1.1", "1.0.12"), 0);
63   BOOST_CHECK_EQUAL(strutils::compare_versions("10.6.7", "10.6.7"), 0);
64   BOOST_CHECK_LT(strutils::compare_versions("2.0", "2.0.99"), 0);
65   BOOST_CHECK_EQUAL(strutils::compare_versions("99", "99"), 0);
66   BOOST_CHECK_GT(strutils::compare_versions("99", "98"), 0);
67
68   // since we compare numerically, leasing zeros shouldn't matter
69   BOOST_CHECK_EQUAL(strutils::compare_versions("0.06.7", "0.6.07"), 0);
70 }
71
72 BOOST_AUTO_TEST_CASE( md5_hex )
73 {
74   // hex encoding
75   unsigned char raw_data[] = {0x0f, 0x1a, 0xbc, 0xd2, 0xe3, 0x45, 0x67, 0x89};
76   const std::string& hex_data =
77     strutils::encodeHex(raw_data, sizeof(raw_data)/sizeof(raw_data[0]));
78   BOOST_REQUIRE_EQUAL(hex_data, "0f1abcd2e3456789");
79   BOOST_REQUIRE_EQUAL(strutils::encodeHex("abcde"), "6162636465");
80
81   // md5
82   BOOST_CHECK_EQUAL(strutils::md5("test"), "098f6bcd4621d373cade4e832627b4f6");
83 }
84
85 BOOST_AUTO_TEST_CASE( error_string )
86 {
87 #if defined(SG_WINDOWS)
88   _set_errno(0);
89 #else
90   errno = 0;
91 #endif
92
93   std::ifstream f("/\\/non-existent/file/a8f7bz97-3ffe-4f5b-b8db-38ccurJL-");
94
95 #if defined(SG_WINDOWS)
96   errno_t saved_errno = errno;
97 #else
98   int saved_errno = errno;
99 #endif
100
101   BOOST_CHECK(!f.is_open());
102   BOOST_CHECK_NE(saved_errno, 0);
103   BOOST_CHECK_GT(strutils::error_string(saved_errno).size(), 0);
104 }