// Unit test for boost::lexical_cast. // // See http://www.boost.org for most recent version, including documentation. // // Copyright Antony Polukhin, 2011-2025. // // 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). #include #include #include #include #if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING) #define BOOST_LCAST_NO_WCHAR_T #endif using namespace boost; template bool is_pos_inf(T value) { return (boost::core::isinf)(value) && !(boost::core::signbit)(value); } template bool is_neg_inf(T value) { return (boost::core::isinf)(value) && (boost::core::signbit)(value); } template bool is_pos_nan(T value) { return (boost::core::isnan)(value) && !(boost::core::signbit)(value); } template bool is_neg_nan(T value) { /* There is some strange behaviour on Itanium platform with -nan nuber for long double. * It is a IA64 feature, or it is a boost::math feature, not a lexical_cast bug */ #if defined(__ia64__) || defined(_M_IA64) return (boost::core::isnan)(value) && ( boost::is_same::value || (boost::core::signbit)(value) ); #else return (boost::core::isnan)(value) && (boost::core::signbit)(value); #endif } template void test_inf_nan_templated() { typedef T test_t; BOOST_TEST( is_pos_inf( lexical_cast("inf") ) ); BOOST_TEST( is_pos_inf( lexical_cast("INF") ) ); BOOST_TEST( is_neg_inf( lexical_cast("-inf") ) ); BOOST_TEST( is_neg_inf( lexical_cast("-INF") ) ); BOOST_TEST( is_pos_inf( lexical_cast("+inf") ) ); BOOST_TEST( is_pos_inf( lexical_cast("+INF") ) ); BOOST_TEST( is_pos_inf( lexical_cast("infinity") ) ); BOOST_TEST( is_pos_inf( lexical_cast("INFINITY") ) ); BOOST_TEST( is_neg_inf( lexical_cast("-infinity") ) ); BOOST_TEST( is_neg_inf( lexical_cast("-INFINITY") ) ); BOOST_TEST( is_pos_inf( lexical_cast("+infinity") ) ); BOOST_TEST( is_pos_inf( lexical_cast("+INFINITY") ) ); BOOST_TEST( is_pos_inf( lexical_cast("iNfiNity") ) ); BOOST_TEST( is_pos_inf( lexical_cast("INfinity") ) ); BOOST_TEST( is_neg_inf( lexical_cast("-inFINITY") ) ); BOOST_TEST( is_neg_inf( lexical_cast("-INFINITY") ) ); BOOST_TEST( is_pos_nan( lexical_cast("nan") ) ); BOOST_TEST( is_pos_nan( lexical_cast("NAN") ) ); BOOST_TEST( is_neg_nan( lexical_cast("-nan") ) ); BOOST_TEST( is_neg_nan( lexical_cast("-NAN") ) ); BOOST_TEST( is_pos_nan( lexical_cast("+nan") ) ); BOOST_TEST( is_pos_nan( lexical_cast("+NAN") ) ); BOOST_TEST( is_pos_nan( lexical_cast("nAn") ) ); BOOST_TEST( is_pos_nan( lexical_cast("NaN") ) ); BOOST_TEST( is_neg_nan( lexical_cast("-nAn") ) ); BOOST_TEST( is_neg_nan( lexical_cast("-NaN") ) ); BOOST_TEST( is_pos_nan( lexical_cast("+Nan") ) ); BOOST_TEST( is_pos_nan( lexical_cast("+nAN") ) ); BOOST_TEST( is_pos_nan( lexical_cast("nan()") ) ); BOOST_TEST( is_pos_nan( lexical_cast("NAN(some string)") ) ); BOOST_TEST_THROWS( lexical_cast("NAN(some string"), bad_lexical_cast ); BOOST_TEST(lexical_cast( (boost::core::copysign)(std::numeric_limits::infinity(), static_cast(-1.0))) == "-inf" ); BOOST_TEST(lexical_cast( std::numeric_limits::infinity()) == "inf" ); BOOST_TEST(lexical_cast( std::numeric_limits::quiet_NaN()) == "nan" ); #if !defined(__ia64__) && !defined(_M_IA64) BOOST_TEST(lexical_cast( (boost::core::copysign)(std::numeric_limits::quiet_NaN(), static_cast(-1.0))) == "-nan" ); #endif #ifndef BOOST_LCAST_NO_WCHAR_T BOOST_TEST( is_pos_inf( lexical_cast(L"inf") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"INF") ) ); BOOST_TEST( is_neg_inf( lexical_cast(L"-inf") ) ); BOOST_TEST( is_neg_inf( lexical_cast(L"-INF") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"+inf") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"+INF") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"infinity") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"INFINITY") ) ); BOOST_TEST( is_neg_inf( lexical_cast(L"-infinity") ) ); BOOST_TEST( is_neg_inf( lexical_cast(L"-INFINITY") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"+infinity") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"+INFINITY") ) ); BOOST_TEST( is_neg_inf( lexical_cast(L"-infINIty") ) ); BOOST_TEST( is_neg_inf( lexical_cast(L"-INFiniTY") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"+inFINIty") ) ); BOOST_TEST( is_pos_inf( lexical_cast(L"+INfinITY") ) ); BOOST_TEST( is_pos_nan( lexical_cast(L"nan") ) ); BOOST_TEST( is_pos_nan( lexical_cast(L"NAN") ) ); BOOST_TEST( is_neg_nan( lexical_cast(L"-nan") ) ); BOOST_TEST( is_neg_nan( lexical_cast(L"-NAN") ) ); BOOST_TEST( is_pos_nan( lexical_cast(L"+nan") ) ); BOOST_TEST( is_pos_nan( lexical_cast(L"+NAN") ) ); BOOST_TEST( is_pos_nan( lexical_cast(L"nan()") ) ); BOOST_TEST( is_pos_nan( lexical_cast(L"NAN(some string)") ) ); BOOST_TEST_THROWS( lexical_cast(L"NAN(some string"), bad_lexical_cast ); BOOST_TEST(lexical_cast( (boost::core::copysign)(std::numeric_limits::infinity(), static_cast(-1.0))) == L"-inf" ); BOOST_TEST(lexical_cast( std::numeric_limits::infinity()) == L"inf" ); BOOST_TEST(lexical_cast( std::numeric_limits::quiet_NaN()) == L"nan" ); #if !defined(__ia64__) && !defined(_M_IA64) BOOST_TEST(lexical_cast( (boost::core::copysign)(std::numeric_limits::quiet_NaN(), static_cast(-1.0))) == L"-nan" ); #endif #endif } void test_inf_nan_float() { test_inf_nan_templated(); BOOST_TEST(is_pos_nan(lexical_cast(std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_neg_nan(lexical_cast(-std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_pos_inf(lexical_cast(std::numeric_limits::infinity()))); BOOST_TEST(is_neg_inf(lexical_cast(-std::numeric_limits::infinity()))); BOOST_TEST(is_pos_nan(lexical_cast(std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_neg_nan(lexical_cast(-std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_pos_inf(lexical_cast(std::numeric_limits::infinity()))); BOOST_TEST(is_neg_inf(lexical_cast(-std::numeric_limits::infinity()))); } void test_inf_nan_double() { test_inf_nan_templated(); BOOST_TEST(is_pos_nan(lexical_cast(std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_neg_nan(lexical_cast(-std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_pos_inf(lexical_cast(std::numeric_limits::infinity()))); BOOST_TEST(is_neg_inf(lexical_cast(-std::numeric_limits::infinity()))); BOOST_TEST(is_pos_nan(lexical_cast(std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_neg_nan(lexical_cast(-std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_pos_inf(lexical_cast(std::numeric_limits::infinity()))); BOOST_TEST(is_neg_inf(lexical_cast(-std::numeric_limits::infinity()))); BOOST_TEST(is_pos_nan(lexical_cast(std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_neg_nan(lexical_cast(-std::numeric_limits::quiet_NaN()))); BOOST_TEST(is_pos_inf(lexical_cast(std::numeric_limits::infinity()))); BOOST_TEST(is_neg_inf(lexical_cast(-std::numeric_limits::infinity()))); } void test_inf_nan_long_double() { // We do not run tests on compilers with bugs #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS test_inf_nan_templated(); #endif BOOST_TEST(true); } int main() { test_inf_nan_float(); test_inf_nan_double(); test_inf_nan_long_double(); return boost::report_errors(); }