• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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