| /* |
| * Copyright Andrey Semashev 2007 - 2015. |
| * Distributed under the Boost Software License, Version 1.0. |
| * (See accompanying file LICENSE_1_0.txt or copy at |
| * http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| /*! |
| * \file util_string_literal.cpp |
| * \author Andrey Semashev |
| * \date 09.01.2009 |
| * |
| * \brief This header contains tests for the string literals wrapper. |
| */ |
| |
| #define BOOST_TEST_MODULE util_string_literal |
| |
| #include <cwchar> |
| #include <cstring> |
| #include <set> |
| #include <memory> |
| #include <string> |
| #include <algorithm> |
| #include <boost/test/unit_test.hpp> |
| #include <boost/log/utility/string_literal.hpp> |
| |
| namespace logging = boost::log; |
| |
| // Construction tests |
| BOOST_AUTO_TEST_CASE(string_literal_ctors) |
| { |
| // Default construction |
| { |
| logging::string_literal lit; |
| BOOST_CHECK(lit.empty()); |
| BOOST_CHECK_EQUAL(lit.size(), 0UL); |
| BOOST_CHECK(lit.c_str() != NULL); |
| } |
| |
| // Construction from a literal |
| { |
| logging::string_literal lit = "abcd"; |
| BOOST_CHECK(!lit.empty()); |
| BOOST_CHECK_EQUAL(lit.size(), 4UL); |
| BOOST_CHECK(std::strcmp(lit.c_str(), "abcd") == 0); |
| } |
| |
| // Copying |
| { |
| logging::wstring_literal lit1 = L"Hello"; |
| logging::wstring_literal lit2 = lit1; |
| BOOST_CHECK(std::wcscmp(lit2.c_str(), L"Hello") == 0); |
| BOOST_CHECK(std::wcscmp(lit1.c_str(), lit2.c_str()) == 0); |
| } |
| |
| // Generator functions |
| { |
| logging::string_literal lit1 = logging::str_literal("Wow!"); |
| BOOST_CHECK(std::strcmp(lit1.c_str(), "Wow!") == 0); |
| |
| logging::wstring_literal lit2 = logging::str_literal(L"Wow!"); |
| BOOST_CHECK(std::wcscmp(lit2.c_str(), L"Wow!") == 0); |
| } |
| } |
| |
| // Assignment tests |
| BOOST_AUTO_TEST_CASE(string_literal_assignment) |
| { |
| // operator= |
| { |
| logging::string_literal lit; |
| BOOST_CHECK(lit.empty()); |
| |
| lit = "Hello"; |
| BOOST_CHECK(std::strcmp(lit.c_str(), "Hello") == 0); |
| |
| logging::string_literal empty_lit; |
| lit = empty_lit; |
| BOOST_CHECK(lit.empty()); |
| |
| logging::string_literal filled_lit = "Some string"; |
| lit = filled_lit; |
| BOOST_CHECK(std::strcmp(lit.c_str(), filled_lit.c_str()) == 0); |
| } |
| |
| // assign |
| { |
| logging::string_literal lit; |
| BOOST_CHECK(lit.empty()); |
| |
| lit.assign("Hello"); |
| BOOST_CHECK(std::strcmp(lit.c_str(), "Hello") == 0); |
| |
| logging::string_literal empty_lit; |
| lit.assign(empty_lit); |
| BOOST_CHECK(lit.empty()); |
| |
| logging::string_literal filled_lit = "Some string"; |
| lit.assign(filled_lit); |
| BOOST_CHECK(std::strcmp(lit.c_str(), filled_lit.c_str()) == 0); |
| } |
| } |
| |
| // Comparison tests |
| BOOST_AUTO_TEST_CASE(string_literal_comparison) |
| { |
| logging::string_literal lit; |
| BOOST_CHECK(lit == ""); |
| |
| lit = "abcdefg"; |
| BOOST_CHECK(lit == "abcdefg"); |
| BOOST_CHECK(lit != "xyz"); |
| BOOST_CHECK(lit != "aBcDeFg"); |
| |
| logging::string_literal lit2 = "Yo!"; |
| BOOST_CHECK(lit != lit2); |
| lit2 = "abcdefg"; |
| BOOST_CHECK(lit == lit2); |
| |
| BOOST_CHECK(lit.compare(lit2) == 0); |
| BOOST_CHECK(lit.compare("aaaaa") > 0); |
| BOOST_CHECK(lit.compare("zzzzzzzz") < 0); |
| BOOST_CHECK(lit.compare("zbcdefg") < 0); |
| |
| BOOST_CHECK(lit.compare(2, 3, "cde") == 0); |
| BOOST_CHECK(lit.compare(2, 3, "cdefgh", 3) == 0); |
| |
| // Check ordering |
| std::set< logging::string_literal > lit_set; |
| lit_set.insert(logging::str_literal("abc")); |
| lit_set.insert(logging::str_literal("def")); |
| lit_set.insert(logging::str_literal("aaa")); |
| lit_set.insert(logging::str_literal("abcd")); |
| lit_set.insert(logging::str_literal("zz")); |
| |
| std::set< std::string > str_set; |
| str_set.insert(logging::str_literal("abc").str()); |
| str_set.insert(logging::str_literal("def").str()); |
| str_set.insert(logging::str_literal("aaa").str()); |
| str_set.insert(logging::str_literal("abcd").str()); |
| str_set.insert(logging::str_literal("zz").str()); |
| |
| BOOST_CHECK_EQUAL_COLLECTIONS(lit_set.begin(), lit_set.end(), str_set.begin(), str_set.end()); |
| } |
| |
| // Iteration tests |
| BOOST_AUTO_TEST_CASE(string_literal_iteration) |
| { |
| std::string str; |
| logging::string_literal lit = "abcdefg"; |
| |
| std::copy(lit.begin(), lit.end(), std::back_inserter(str)); |
| BOOST_CHECK(str == "abcdefg"); |
| |
| str.clear(); |
| std::copy(lit.rbegin(), lit.rend(), std::back_inserter(str)); |
| BOOST_CHECK(str == "gfedcba"); |
| } |
| |
| // Subscript tests |
| BOOST_AUTO_TEST_CASE(string_literal_indexing) |
| { |
| logging::string_literal lit = "abcdefg"; |
| |
| BOOST_CHECK_EQUAL(lit[2], 'c'); |
| BOOST_CHECK_EQUAL(lit.at(3), 'd'); |
| |
| BOOST_CHECK_THROW(lit.at(100), std::exception); |
| } |
| |
| // Clearing tests |
| BOOST_AUTO_TEST_CASE(string_literal_clear) |
| { |
| logging::string_literal lit = "yo-ho-ho"; |
| BOOST_CHECK(!lit.empty()); |
| |
| lit.clear(); |
| BOOST_CHECK(lit.empty()); |
| BOOST_CHECK_EQUAL(lit, ""); |
| } |
| |
| // Swapping tests |
| BOOST_AUTO_TEST_CASE(string_literal_swap) |
| { |
| logging::string_literal lit1 = "yo-ho-ho"; |
| logging::string_literal lit2 = "hello"; |
| |
| lit1.swap(lit2); |
| BOOST_CHECK_EQUAL(lit1, "hello"); |
| BOOST_CHECK_EQUAL(lit2, "yo-ho-ho"); |
| |
| swap(lit1, lit2); |
| BOOST_CHECK_EQUAL(lit2, "hello"); |
| BOOST_CHECK_EQUAL(lit1, "yo-ho-ho"); |
| } |
| |
| // STL strings acquisition tests |
| BOOST_AUTO_TEST_CASE(string_literal_str) |
| { |
| logging::string_literal lit = "yo-ho-ho"; |
| std::string str = lit.str(); |
| BOOST_CHECK_EQUAL(str, "yo-ho-ho"); |
| BOOST_CHECK_EQUAL(lit, str); |
| } |
| |
| // Substring extraction tests |
| BOOST_AUTO_TEST_CASE(string_literal_copy) |
| { |
| logging::string_literal lit = "yo-ho-ho"; |
| char t[32] = { 0 }; |
| |
| BOOST_CHECK_EQUAL(lit.copy(t, 2), 2UL); |
| BOOST_CHECK(std::strcmp(t, "yo") == 0); |
| |
| BOOST_CHECK_EQUAL(lit.copy(t, 4, 2), 4UL); |
| BOOST_CHECK(std::strcmp(t, "-ho-") == 0); |
| |
| BOOST_CHECK_EQUAL(lit.copy(t, 100), 8UL); |
| BOOST_CHECK(std::strcmp(t, "yo-ho-ho") == 0); |
| } |