// Unit test for boost::lexical_cast. // // See http://www.boost.org for most recent version, including documentation. // // Copyright Terje Slettebų and Kevlin Henney, 2005. // // 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). // // Note: The unit test no longer compile on MSVC 6, but lexical_cast itself works for it. #include #if defined(__INTEL_COMPILER) #pragma warning(disable: 193 383 488 981 1418 1419) #elif defined(BOOST_MSVC) #pragma warning(disable: 4097 4100 4121 4127 4146 4244 4245 4511 4512 4701 4800) #endif #include #include #include #if defined(BOOST_NO_STRINGSTREAM) || \ defined(BOOST_NO_STD_WSTRING) || \ defined(BOOST_NO_STD_LOCALE) #define DISABLE_WIDE_CHAR_SUPPORT #endif using namespace boost; void test_conversion_to_char(); void test_conversion_to_int(); void test_conversion_to_double(); void test_conversion_to_bool(); void test_conversion_to_string(); void test_conversion_from_to_wchar_t_alias(); void test_conversion_to_pointer(); void test_conversion_from_wchar_t(); void test_conversion_to_wchar_t(); void test_conversion_from_wstring(); void test_conversion_to_wstring(); void test_bad_lexical_cast(); void test_no_whitespace_stripping(); unit_test::test_suite *init_unit_test_suite(int, char *[]) { unit_test_framework::test_suite *suite = BOOST_TEST_SUITE("lexical_cast unit test"); suite->add(BOOST_TEST_CASE(test_conversion_to_char)); suite->add(BOOST_TEST_CASE(test_conversion_to_int)); suite->add(BOOST_TEST_CASE(test_conversion_to_double)); suite->add(BOOST_TEST_CASE(test_conversion_to_bool)); suite->add(BOOST_TEST_CASE(test_conversion_from_to_wchar_t_alias)); suite->add(BOOST_TEST_CASE(test_conversion_to_pointer)); suite->add(BOOST_TEST_CASE(test_conversion_to_string)); #ifndef DISABLE_WIDE_CHAR_SUPPORT suite->add(BOOST_TEST_CASE(test_conversion_from_wchar_t)); suite->add(BOOST_TEST_CASE(test_conversion_to_wchar_t)); suite->add(BOOST_TEST_CASE(test_conversion_from_wstring)); suite->add(BOOST_TEST_CASE(test_conversion_to_wstring)); #endif suite->add(BOOST_TEST_CASE(test_bad_lexical_cast)); suite->add(BOOST_TEST_CASE(test_no_whitespace_stripping)); return suite; } void test_conversion_to_char() { BOOST_CHECK_EQUAL('A', lexical_cast('A')); BOOST_CHECK_EQUAL(' ', lexical_cast(' ')); BOOST_CHECK_EQUAL('1', lexical_cast(1)); BOOST_CHECK_EQUAL('0', lexical_cast(0)); BOOST_CHECK_THROW(lexical_cast(123), bad_lexical_cast); BOOST_CHECK_EQUAL('1', lexical_cast(1.0)); BOOST_CHECK_EQUAL('1', lexical_cast(true)); BOOST_CHECK_EQUAL('0', lexical_cast(false)); BOOST_CHECK_EQUAL('A', lexical_cast("A")); BOOST_CHECK_EQUAL(' ', lexical_cast(" ")); BOOST_CHECK_THROW(lexical_cast(""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), bad_lexical_cast); BOOST_CHECK_EQUAL('A', lexical_cast(std::string("A"))); BOOST_CHECK_EQUAL(' ', lexical_cast(std::string(" "))); BOOST_CHECK_THROW( lexical_cast(std::string("")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), bad_lexical_cast); } void test_conversion_to_int() { BOOST_CHECK_EQUAL(1, lexical_cast('1')); BOOST_CHECK_EQUAL(0, lexical_cast('0')); BOOST_CHECK_THROW(lexical_cast('A'), bad_lexical_cast); BOOST_CHECK_EQUAL(1, lexical_cast(1)); BOOST_CHECK_EQUAL( (std::numeric_limits::max)(), lexical_cast((std::numeric_limits::max)())); BOOST_CHECK_EQUAL(1, lexical_cast(1.0)); BOOST_CHECK_THROW(lexical_cast(1.23), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(1e20), bad_lexical_cast); BOOST_CHECK_EQUAL(1, lexical_cast(true)); BOOST_CHECK_EQUAL(0, lexical_cast(false)); BOOST_CHECK_EQUAL(123, lexical_cast("123")); BOOST_CHECK_THROW( lexical_cast(" 123"), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), bad_lexical_cast); BOOST_CHECK_EQUAL(123, lexical_cast("123")); BOOST_CHECK_EQUAL(123, lexical_cast(std::string("123"))); BOOST_CHECK_THROW( lexical_cast(std::string(" 123")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), bad_lexical_cast); } void test_conversion_to_double() { BOOST_CHECK_CLOSE(1.0, lexical_cast('1'), (std::numeric_limits::epsilon())); BOOST_CHECK_THROW(lexical_cast('A'), bad_lexical_cast); BOOST_CHECK_CLOSE(1.0, lexical_cast(1), (std::numeric_limits::epsilon())); BOOST_CHECK_CLOSE(1.23, lexical_cast(1.23), (std::numeric_limits::epsilon())); BOOST_CHECK_CLOSE(1.234567890, 1.234567890, std::numeric_limits::epsilon()); BOOST_CHECK_CLOSE(1.0, lexical_cast(true), (std::numeric_limits::epsilon())); BOOST_CHECK_CLOSE(0.0, lexical_cast(false), (std::numeric_limits::epsilon())); BOOST_CHECK_CLOSE(1.23, lexical_cast("1.23"), (std::numeric_limits::epsilon())); BOOST_CHECK_THROW(lexical_cast(""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), bad_lexical_cast); BOOST_CHECK_CLOSE(1.23, lexical_cast(std::string("1.23")), (std::numeric_limits::epsilon())); BOOST_CHECK_THROW( lexical_cast(std::string("")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), bad_lexical_cast); } void test_conversion_to_bool() { BOOST_CHECK_EQUAL(true, lexical_cast('1')); BOOST_CHECK_EQUAL(false, lexical_cast('0')); BOOST_CHECK_THROW(lexical_cast('A'), bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast(1)); BOOST_CHECK_EQUAL(false, lexical_cast(0)); BOOST_CHECK_THROW(lexical_cast(123), bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast(1.0)); BOOST_CHECK_EQUAL(false, lexical_cast(0.0)); BOOST_CHECK_EQUAL(true, lexical_cast(true)); BOOST_CHECK_EQUAL(false, lexical_cast(false)); BOOST_CHECK_EQUAL(true, lexical_cast("1")); BOOST_CHECK_EQUAL(false, lexical_cast("0")); BOOST_CHECK_THROW(lexical_cast(""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast("1")); BOOST_CHECK_EQUAL(false, lexical_cast("0")); BOOST_CHECK_EQUAL(true, lexical_cast(std::string("1"))); BOOST_CHECK_EQUAL(false, lexical_cast(std::string("0"))); BOOST_CHECK_THROW( lexical_cast(std::string("")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), bad_lexical_cast); } void test_conversion_to_string() { BOOST_CHECK_EQUAL("A", lexical_cast('A')); BOOST_CHECK_EQUAL(" ", lexical_cast(' ')); BOOST_CHECK_EQUAL("123", lexical_cast(123)); BOOST_CHECK_EQUAL("1.23", lexical_cast(1.23)); BOOST_CHECK_EQUAL("1.111111111", lexical_cast(1.111111111)); BOOST_CHECK_EQUAL("1", lexical_cast(true)); BOOST_CHECK_EQUAL("0", lexical_cast(false)); BOOST_CHECK_EQUAL("Test", lexical_cast("Test")); BOOST_CHECK_EQUAL(" ", lexical_cast(" ")); BOOST_CHECK_EQUAL("", lexical_cast("")); BOOST_CHECK_EQUAL("Test", lexical_cast(std::string("Test"))); BOOST_CHECK_EQUAL(" ", lexical_cast(std::string(" "))); BOOST_CHECK_EQUAL("", lexical_cast(std::string(""))); } void test_conversion_from_to_wchar_t_alias() { BOOST_CHECK_EQUAL(123u, lexical_cast("123")); BOOST_CHECK_EQUAL(123u, lexical_cast("123")); BOOST_CHECK_EQUAL(123u, lexical_cast("123")); BOOST_CHECK_EQUAL(std::string("123"), lexical_cast(static_cast(123))); BOOST_CHECK_EQUAL(std::string("123"), lexical_cast(123u)); BOOST_CHECK_EQUAL(std::string("123"), lexical_cast(123ul)); } void test_conversion_to_pointer() { BOOST_CHECK_THROW(lexical_cast("Test"), bad_lexical_cast); #ifndef DISABLE_WIDE_CHAR_SUPPORT BOOST_CHECK_THROW(lexical_cast("Test"), bad_lexical_cast); #endif } void test_conversion_from_wchar_t() { #ifndef DISABLE_WIDE_CHAR_SUPPORT #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_CHECK_EQUAL(1, lexical_cast(L'1')); BOOST_CHECK_THROW(lexical_cast(L'A'), bad_lexical_cast); #endif BOOST_CHECK_EQUAL(123, lexical_cast(L"123")); BOOST_CHECK_THROW(lexical_cast(L""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), bad_lexical_cast); #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_CHECK_EQUAL(1.0, lexical_cast(L'1')); BOOST_CHECK_THROW(lexical_cast(L'A'), bad_lexical_cast); #endif BOOST_CHECK_EQUAL(1.23, lexical_cast(L"1.23")); BOOST_CHECK_THROW(lexical_cast(L""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), bad_lexical_cast); #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_CHECK_EQUAL(true, lexical_cast(L'1')); BOOST_CHECK_EQUAL(false, lexical_cast(L'0')); BOOST_CHECK_THROW(lexical_cast(L'A'), bad_lexical_cast); #endif BOOST_CHECK_EQUAL(true, lexical_cast(L"1")); BOOST_CHECK_EQUAL(false, lexical_cast(L"0")); BOOST_CHECK_THROW(lexical_cast(L""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), bad_lexical_cast); #endif } void test_conversion_to_wchar_t() { #if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_CHECK_EQUAL(L'1', lexical_cast(1)); BOOST_CHECK_EQUAL(L'0', lexical_cast(0)); BOOST_CHECK_THROW(lexical_cast(123), bad_lexical_cast); BOOST_CHECK_EQUAL(L'1', lexical_cast(1.0)); BOOST_CHECK_EQUAL(L'0', lexical_cast(0.0)); BOOST_CHECK_EQUAL(L'1', lexical_cast(true)); BOOST_CHECK_EQUAL(L'0', lexical_cast(false)); BOOST_CHECK_EQUAL(L'A', lexical_cast(L'A')); BOOST_CHECK_EQUAL(L' ', lexical_cast(L' ')); BOOST_CHECK_EQUAL(L'A', lexical_cast(L"A")); BOOST_CHECK_EQUAL(L' ', lexical_cast(L" ")); BOOST_CHECK_THROW(lexical_cast(L""), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), bad_lexical_cast); BOOST_CHECK_EQUAL(L'A', lexical_cast(std::wstring(L"A"))); BOOST_CHECK_EQUAL(L' ', lexical_cast(std::wstring(L" "))); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"Test")), bad_lexical_cast); #endif } void test_conversion_from_wstring() { #ifndef DISABLE_WIDE_CHAR_SUPPORT BOOST_CHECK_EQUAL(123, lexical_cast(std::wstring(L"123"))); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"Test")), bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast(std::wstring(L"1"))); BOOST_CHECK_EQUAL(false, lexical_cast(std::wstring(L"0"))); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"")), bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"Test")), bad_lexical_cast); #endif } void test_conversion_to_wstring() { #ifndef DISABLE_WIDE_CHAR_SUPPORT BOOST_CHECK(L"123" == lexical_cast(123)); BOOST_CHECK(L"1.23" == lexical_cast(1.23)); BOOST_CHECK(L"1.111111111" == lexical_cast(1.111111111)); BOOST_CHECK(L"1" == lexical_cast(true)); BOOST_CHECK(L"0" == lexical_cast(false)); #if !defined(BOOST_NO_INTRINSIC_WCHAR_T) BOOST_CHECK(L"A" == lexical_cast(L'A')); BOOST_CHECK(L" " == lexical_cast(L' ')); #endif BOOST_CHECK(L"Test" == lexical_cast(L"Test")); BOOST_CHECK(L" " == lexical_cast(L" ")); BOOST_CHECK(L"" == lexical_cast(L"")); BOOST_CHECK(L"Test" == lexical_cast(std::wstring(L"Test"))); BOOST_CHECK(L" " == lexical_cast(std::wstring(L" "))); BOOST_CHECK(L"" == lexical_cast(std::wstring(L""))); #endif } void test_bad_lexical_cast() { try { lexical_cast(std::string("Test")); BOOST_CHECK(false); // Exception expected } catch(const bad_lexical_cast &e) { BOOST_CHECK(e.source_type() == typeid(std::string)); BOOST_CHECK(e.target_type() == typeid(int)); } } void test_no_whitespace_stripping() { BOOST_CHECK_THROW(lexical_cast(" 123"), bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("123 "), bad_lexical_cast); }