// Unit test for boost::lexical_cast. // // See http://www.boost.org for most recent version, including documentation. // // Copyright Terje Slettebų and Kevlin Henney, 2003. // // Permission to use, copy, modify, and distribute this software for any // purpose is hereby granted without fee, provided that this copyright and // permissions notice appear in all copies and derivatives. // // This software is provided "as is" without express or implied warranty. #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 #include #if defined(BOOST_NO_STRINGSTREAM) || \ defined(BOOST_NO_STD_WSTRING) || \ defined(BOOST_NO_STD_LOCALE) || \ defined(BOOST_NO_CWCHAR) #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_to_pointer(); void test_conversion_from_wchar_t(); void test_conversion_to_wchar_t(); void test_conversion_from_wstring(); void test_conversion_to_wstring(); unit_test_framework::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_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 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), boost::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(""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), boost::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("")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), boost::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'),boost::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), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(1e20), boost::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"), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), boost::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")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), boost::bad_lexical_cast); } void test_conversion_to_double() { BOOST_CHECK_EQUAL(1.0, lexical_cast('1')); BOOST_CHECK_THROW(lexical_cast('A'), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(1.0, lexical_cast(1)); BOOST_CHECK_EQUAL(1.23, lexical_cast(1.23)); BOOST_CHECK_CLOSE( std::numeric_limits::max() / 2, lexical_cast(std::numeric_limits::max() / 2), std::numeric_limits::epsilon()); BOOST_CHECK_EQUAL(1.0, lexical_cast(true)); BOOST_CHECK_EQUAL(0.0, lexical_cast(false)); BOOST_CHECK_EQUAL(1.23, lexical_cast("1.23")); BOOST_CHECK_THROW(lexical_cast(""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(1.23, lexical_cast(std::string("1.23"))); BOOST_CHECK_THROW( lexical_cast(std::string("")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), boost::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'), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast(1)); BOOST_CHECK_EQUAL(false, lexical_cast(0)); BOOST_CHECK_THROW(lexical_cast(123), boost::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(""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast("Test"), boost::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("")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::string("Test")), boost::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_to_pointer() { BOOST_CHECK_THROW(lexical_cast("Test"), boost::bad_lexical_cast); #ifndef DISABLE_WIDE_CHAR_SUPPORT BOOST_CHECK_THROW(lexical_cast("Test"), boost::bad_lexical_cast); #endif } void test_conversion_from_wchar_t() { #ifndef DISABLE_WIDE_CHAR_SUPPORT BOOST_CHECK_EQUAL(1, lexical_cast(L'1')); BOOST_CHECK_THROW(lexical_cast(L'A'), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(123, lexical_cast(L"123")); BOOST_CHECK_THROW(lexical_cast(L""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(1.0, lexical_cast(L'1')); BOOST_CHECK_THROW(lexical_cast(L'A'), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(1.23, lexical_cast(L"1.23")); BOOST_CHECK_THROW(lexical_cast(L""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast(L'1')); BOOST_CHECK_EQUAL(false, lexical_cast(L'0')); BOOST_CHECK_THROW(lexical_cast(L'A'), boost::bad_lexical_cast); BOOST_CHECK_EQUAL(true, lexical_cast(L"1")); BOOST_CHECK_EQUAL(false, lexical_cast(L"0")); BOOST_CHECK_THROW(lexical_cast(L""), boost::bad_lexical_cast); BOOST_CHECK_THROW(lexical_cast(L"Test"), boost::bad_lexical_cast); #endif } void test_conversion_to_wchar_t() { #ifndef DISABLE_WIDE_CHAR_SUPPORT BOOST_CHECK_EQUAL(L'1', lexical_cast(1)); BOOST_CHECK_EQUAL(L'0', lexical_cast(0)); #if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1200)) BOOST_CHECK_THROW(lexical_cast(123), boost::bad_lexical_cast); #endif 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""), boost::bad_lexical_cast); #if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1200)) BOOST_CHECK_THROW(lexical_cast(L"Test"), boost::bad_lexical_cast); #endif 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"")), boost::bad_lexical_cast); #if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1200)) BOOST_CHECK_THROW( lexical_cast(std::wstring(L"Test")), boost::bad_lexical_cast); #endif #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"")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"Test")), boost::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"")), boost::bad_lexical_cast); BOOST_CHECK_THROW( lexical_cast(std::wstring(L"Test")), boost::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)); BOOST_CHECK(L"A" == lexical_cast(L'A')); BOOST_CHECK(L" " == lexical_cast(L' ')); 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 }