// 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 "escape_struct.hpp" #include #include using namespace boost; #if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING) #define BOOST_LCAST_NO_WCHAR_T #endif template void do_test_on_empty_input(T& v) { BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); #endif BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); #if defined(BOOST_HAS_LONG_LONG) BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); #elif defined(BOOST_HAS_MS_INT64) BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast<__int64>(v), bad_lexical_cast); #endif } void test_empty_iterator_range() { boost::iterator_range v; do_test_on_empty_input(v); BOOST_TEST_EQ(lexical_cast(v), std::string()); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); boost::iterator_range cv; do_test_on_empty_input(cv); BOOST_TEST_EQ(lexical_cast(cv), std::string()); BOOST_TEST_THROWS(lexical_cast(cv), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(cv), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(cv), bad_lexical_cast); const boost::iterator_range ccv; do_test_on_empty_input(ccv); BOOST_TEST_EQ(lexical_cast(ccv), std::string()); BOOST_TEST_THROWS(lexical_cast(ccv), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(ccv), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(ccv), bad_lexical_cast); } void test_empty_string() { std::string v; do_test_on_empty_input(v); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); #ifndef BOOST_LCAST_NO_WCHAR_T std::wstring vw; do_test_on_empty_input(vw); BOOST_TEST_THROWS(lexical_cast(vw), bad_lexical_cast); #endif // Currently, no compiler and STL library fully support char16_t and char32_t //#ifndef BOOST_NO_CXX11_CHAR16_T // std::basic_string v16w; // do_test_on_empty_input(v16w); // BOOST_TEST_THROWS(lexical_cast(v16w), bad_lexical_cast); //#endif //#ifndef BOOST_NO_CXX11_CHAR32_T // std::basic_string v32w; // do_test_on_empty_input(v32w); // BOOST_TEST_THROWS(lexical_cast(v32w), bad_lexical_cast); //#endif } void test_empty_user_class() { EscapeStruct v(""); do_test_on_empty_input(v); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); } namespace std { inline std::ostream & operator<<(std::ostream & out, const std::vector & v) { std::ostream_iterator it(out); std::copy(v.begin(), v.end(), it); BOOST_TEST(out); return out; } } void test_empty_vector() { std::vector v; do_test_on_empty_input(v); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); BOOST_TEST_THROWS(lexical_cast(v), bad_lexical_cast); } struct my_string { friend std::ostream &operator<<(std::ostream& sout, my_string const&/* st*/) { return sout << ""; } }; void test_empty_zero_terminated_string() { my_string st; BOOST_TEST_EQ(boost::lexical_cast(st), std::string());; } int main() { test_empty_iterator_range(); test_empty_string(); test_empty_user_class(); test_empty_vector(); test_empty_zero_terminated_string(); return boost::report_errors(); }