1 /*
2 * Copyright Andrey Semashev 2007 - 2015.
3 * Distributed under the Boost Software License, Version 1.0.
4 * (See accompanying file LICENSE_1_0.txt or copy at
5 * http://www.boost.org/LICENSE_1_0.txt)
6 */
7 /*!
8 * \file util_string_literal.cpp
9 * \author Andrey Semashev
10 * \date 09.01.2009
11 *
12 * \brief This header contains tests for the string literals wrapper.
13 */
14
15 #define BOOST_TEST_MODULE util_string_literal
16
17 #include <cwchar>
18 #include <cstring>
19 #include <set>
20 #include <memory>
21 #include <string>
22 #include <algorithm>
23 #include <boost/test/unit_test.hpp>
24 #include <boost/log/utility/string_literal.hpp>
25
26 namespace logging = boost::log;
27
28 // Construction tests
BOOST_AUTO_TEST_CASE(string_literal_ctors)29 BOOST_AUTO_TEST_CASE(string_literal_ctors)
30 {
31 // Default construction
32 {
33 logging::string_literal lit;
34 BOOST_CHECK(lit.empty());
35 BOOST_CHECK_EQUAL(lit.size(), 0UL);
36 BOOST_CHECK(lit.c_str() != NULL);
37 }
38
39 // Construction from a literal
40 {
41 logging::string_literal lit = "abcd";
42 BOOST_CHECK(!lit.empty());
43 BOOST_CHECK_EQUAL(lit.size(), 4UL);
44 BOOST_CHECK(std::strcmp(lit.c_str(), "abcd") == 0);
45 }
46
47 #ifdef BOOST_LOG_USE_WCHAR_T
48 // Copying
49 {
50 logging::wstring_literal lit1 = L"Hello";
51 logging::wstring_literal lit2 = lit1;
52 BOOST_CHECK(std::wcscmp(lit2.c_str(), L"Hello") == 0);
53 BOOST_CHECK(std::wcscmp(lit1.c_str(), lit2.c_str()) == 0);
54 }
55
56 // Generator functions
57 {
58 logging::string_literal lit1 = logging::str_literal("Wow!");
59 BOOST_CHECK(std::strcmp(lit1.c_str(), "Wow!") == 0);
60
61 logging::wstring_literal lit2 = logging::str_literal(L"Wow!");
62 BOOST_CHECK(std::wcscmp(lit2.c_str(), L"Wow!") == 0);
63 }
64 #endif
65 }
66
67 // Assignment tests
BOOST_AUTO_TEST_CASE(string_literal_assignment)68 BOOST_AUTO_TEST_CASE(string_literal_assignment)
69 {
70 // operator=
71 {
72 logging::string_literal lit;
73 BOOST_CHECK(lit.empty());
74
75 lit = "Hello";
76 BOOST_CHECK(std::strcmp(lit.c_str(), "Hello") == 0);
77
78 logging::string_literal empty_lit;
79 lit = empty_lit;
80 BOOST_CHECK(lit.empty());
81
82 logging::string_literal filled_lit = "Some string";
83 lit = filled_lit;
84 BOOST_CHECK(std::strcmp(lit.c_str(), filled_lit.c_str()) == 0);
85 }
86
87 // assign
88 {
89 logging::string_literal lit;
90 BOOST_CHECK(lit.empty());
91
92 lit.assign("Hello");
93 BOOST_CHECK(std::strcmp(lit.c_str(), "Hello") == 0);
94
95 logging::string_literal empty_lit;
96 lit.assign(empty_lit);
97 BOOST_CHECK(lit.empty());
98
99 logging::string_literal filled_lit = "Some string";
100 lit.assign(filled_lit);
101 BOOST_CHECK(std::strcmp(lit.c_str(), filled_lit.c_str()) == 0);
102 }
103 }
104
105 // Comparison tests
BOOST_AUTO_TEST_CASE(string_literal_comparison)106 BOOST_AUTO_TEST_CASE(string_literal_comparison)
107 {
108 logging::string_literal lit;
109 BOOST_CHECK(lit == "");
110
111 lit = "abcdefg";
112 BOOST_CHECK(lit == "abcdefg");
113 BOOST_CHECK(lit != "xyz");
114 BOOST_CHECK(lit != "aBcDeFg");
115
116 logging::string_literal lit2 = "Yo!";
117 BOOST_CHECK(lit != lit2);
118 lit2 = "abcdefg";
119 BOOST_CHECK(lit == lit2);
120
121 BOOST_CHECK(lit.compare(lit2) == 0);
122 BOOST_CHECK(lit.compare("aaaaa") > 0);
123 BOOST_CHECK(lit.compare("zzzzzzzz") < 0);
124 BOOST_CHECK(lit.compare("zbcdefg") < 0);
125
126 BOOST_CHECK(lit.compare(2, 3, "cde") == 0);
127 BOOST_CHECK(lit.compare(2, 3, "cdefgh", 3) == 0);
128
129 // Check ordering
130 std::set< logging::string_literal > lit_set;
131 lit_set.insert(logging::str_literal("abc"));
132 lit_set.insert(logging::str_literal("def"));
133 lit_set.insert(logging::str_literal("aaa"));
134 lit_set.insert(logging::str_literal("abcd"));
135 lit_set.insert(logging::str_literal("zz"));
136
137 std::set< std::string > str_set;
138 str_set.insert(logging::str_literal("abc").str());
139 str_set.insert(logging::str_literal("def").str());
140 str_set.insert(logging::str_literal("aaa").str());
141 str_set.insert(logging::str_literal("abcd").str());
142 str_set.insert(logging::str_literal("zz").str());
143
144 BOOST_CHECK_EQUAL_COLLECTIONS(lit_set.begin(), lit_set.end(), str_set.begin(), str_set.end());
145 }
146
147 // Iteration tests
BOOST_AUTO_TEST_CASE(string_literal_iteration)148 BOOST_AUTO_TEST_CASE(string_literal_iteration)
149 {
150 std::string str;
151 logging::string_literal lit = "abcdefg";
152
153 std::copy(lit.begin(), lit.end(), std::back_inserter(str));
154 BOOST_CHECK(str == "abcdefg");
155
156 str.clear();
157 std::copy(lit.rbegin(), lit.rend(), std::back_inserter(str));
158 BOOST_CHECK(str == "gfedcba");
159 }
160
161 // Subscript tests
BOOST_AUTO_TEST_CASE(string_literal_indexing)162 BOOST_AUTO_TEST_CASE(string_literal_indexing)
163 {
164 logging::string_literal lit = "abcdefg";
165
166 BOOST_CHECK_EQUAL(lit[2], 'c');
167 BOOST_CHECK_EQUAL(lit.at(3), 'd');
168
169 BOOST_CHECK_THROW(lit.at(100), std::exception);
170 }
171
172 // Clearing tests
BOOST_AUTO_TEST_CASE(string_literal_clear)173 BOOST_AUTO_TEST_CASE(string_literal_clear)
174 {
175 logging::string_literal lit = "yo-ho-ho";
176 BOOST_CHECK(!lit.empty());
177
178 lit.clear();
179 BOOST_CHECK(lit.empty());
180 BOOST_CHECK_EQUAL(lit, "");
181 }
182
183 // Swapping tests
BOOST_AUTO_TEST_CASE(string_literal_swap)184 BOOST_AUTO_TEST_CASE(string_literal_swap)
185 {
186 logging::string_literal lit1 = "yo-ho-ho";
187 logging::string_literal lit2 = "hello";
188
189 lit1.swap(lit2);
190 BOOST_CHECK_EQUAL(lit1, "hello");
191 BOOST_CHECK_EQUAL(lit2, "yo-ho-ho");
192
193 swap(lit1, lit2);
194 BOOST_CHECK_EQUAL(lit2, "hello");
195 BOOST_CHECK_EQUAL(lit1, "yo-ho-ho");
196 }
197
198 // STL strings acquisition tests
BOOST_AUTO_TEST_CASE(string_literal_str)199 BOOST_AUTO_TEST_CASE(string_literal_str)
200 {
201 logging::string_literal lit = "yo-ho-ho";
202 std::string str = lit.str();
203 BOOST_CHECK_EQUAL(str, "yo-ho-ho");
204 BOOST_CHECK_EQUAL(lit, str);
205 }
206
207 // Substring extraction tests
BOOST_AUTO_TEST_CASE(string_literal_copy)208 BOOST_AUTO_TEST_CASE(string_literal_copy)
209 {
210 logging::string_literal lit = "yo-ho-ho";
211 char t[32] = { 0 };
212
213 BOOST_CHECK_EQUAL(lit.copy(t, 2), 2UL);
214 BOOST_CHECK(std::strcmp(t, "yo") == 0);
215
216 BOOST_CHECK_EQUAL(lit.copy(t, 4, 2), 4UL);
217 BOOST_CHECK(std::strcmp(t, "-ho-") == 0);
218
219 BOOST_CHECK_EQUAL(lit.copy(t, 100), 8UL);
220 BOOST_CHECK(std::strcmp(t, "yo-ho-ho") == 0);
221 }
222