lexical_cast_no_locale_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Unit test for boost::lexical_cast.
  2. //
  3. // See http://www.boost.org for most recent version, including documentation.
  4. //
  5. // Copyright Antony Polukhin, 2012-2019.
  6. //
  7. // Distributed under the Boost
  8. // Software License, Version 1.0. (See accompanying file
  9. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
  10. #include <boost/config.hpp>
  11. #if defined(__INTEL_COMPILER)
  12. #pragma warning(disable: 193 383 488 981 1418 1419)
  13. #elif defined(BOOST_MSVC)
  14. #pragma warning(disable: 4097 4100 4121 4127 4146 4244 4245 4511 4512 4701 4800)
  15. #endif
  16. #include <boost/lexical_cast.hpp>
  17. #include <boost/test/unit_test.hpp>
  18. #include <boost/range/iterator_range.hpp>
  19. using namespace boost;
  20. // Testing compilation and some basic usage with BOOST_NO_STD_LOCALE
  21. // Tests are mainly copyied from lexical_cast_empty_input_test.cpp (something
  22. // new added to test_empty_3)
  23. #ifndef BOOST_NO_STD_LOCALE
  24. #error "This test must be compiled with -DBOOST_NO_STD_LOCALE"
  25. #endif
  26. template <class T>
  27. void do_test_on_empty_input(T& v)
  28. {
  29. BOOST_CHECK_THROW(lexical_cast<int>(v), bad_lexical_cast);
  30. BOOST_CHECK_THROW(lexical_cast<float>(v), bad_lexical_cast);
  31. BOOST_CHECK_THROW(lexical_cast<double>(v), bad_lexical_cast);
  32. #ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
  33. BOOST_CHECK_THROW(lexical_cast<long double>(v), bad_lexical_cast);
  34. #endif
  35. BOOST_CHECK_THROW(lexical_cast<unsigned int>(v), bad_lexical_cast);
  36. BOOST_CHECK_THROW(lexical_cast<unsigned short>(v), bad_lexical_cast);
  37. #if defined(BOOST_HAS_LONG_LONG)
  38. BOOST_CHECK_THROW(lexical_cast<boost::ulong_long_type>(v), bad_lexical_cast);
  39. BOOST_CHECK_THROW(lexical_cast<boost::long_long_type>(v), bad_lexical_cast);
  40. #elif defined(BOOST_HAS_MS_INT64)
  41. BOOST_CHECK_THROW(lexical_cast<unsigned __int64>(v), bad_lexical_cast);
  42. BOOST_CHECK_THROW(lexical_cast<__int64>(v), bad_lexical_cast);
  43. #endif
  44. }
  45. void test_empty_1()
  46. {
  47. boost::iterator_range<char*> v;
  48. do_test_on_empty_input(v);
  49. BOOST_CHECK_EQUAL(lexical_cast<std::string>(v), std::string());
  50. BOOST_CHECK_THROW(lexical_cast<char>(v), bad_lexical_cast);
  51. BOOST_CHECK_THROW(lexical_cast<unsigned char>(v), bad_lexical_cast);
  52. BOOST_CHECK_THROW(lexical_cast<signed char>(v), bad_lexical_cast);
  53. boost::iterator_range<const char*> cv;
  54. do_test_on_empty_input(cv);
  55. BOOST_CHECK_EQUAL(lexical_cast<std::string>(cv), std::string());
  56. BOOST_CHECK_THROW(lexical_cast<char>(cv), bad_lexical_cast);
  57. BOOST_CHECK_THROW(lexical_cast<unsigned char>(cv), bad_lexical_cast);
  58. BOOST_CHECK_THROW(lexical_cast<signed char>(cv), bad_lexical_cast);
  59. const boost::iterator_range<const char*> ccv;
  60. do_test_on_empty_input(ccv);
  61. BOOST_CHECK_EQUAL(lexical_cast<std::string>(ccv), std::string());
  62. BOOST_CHECK_THROW(lexical_cast<char>(ccv), bad_lexical_cast);
  63. BOOST_CHECK_THROW(lexical_cast<unsigned char>(ccv), bad_lexical_cast);
  64. BOOST_CHECK_THROW(lexical_cast<signed char>(ccv), bad_lexical_cast);
  65. }
  66. void test_empty_2()
  67. {
  68. std::string v;
  69. do_test_on_empty_input(v);
  70. BOOST_CHECK_THROW(lexical_cast<char>(v), bad_lexical_cast);
  71. BOOST_CHECK_THROW(lexical_cast<unsigned char>(v), bad_lexical_cast);
  72. BOOST_CHECK_THROW(lexical_cast<signed char>(v), bad_lexical_cast);
  73. }
  74. struct Escape
  75. {
  76. Escape(){}
  77. Escape(const std::string& s)
  78. : str_(s)
  79. {}
  80. std::string str_;
  81. };
  82. inline std::ostream& operator<< (std::ostream& o, const Escape& rhs)
  83. {
  84. return o << rhs.str_;
  85. }
  86. inline std::istream& operator>> (std::istream& i, Escape& rhs)
  87. {
  88. return i >> rhs.str_;
  89. }
  90. void test_empty_3()
  91. {
  92. Escape v("");
  93. do_test_on_empty_input(v);
  94. BOOST_CHECK_THROW(lexical_cast<char>(v), bad_lexical_cast);
  95. BOOST_CHECK_THROW(lexical_cast<unsigned char>(v), bad_lexical_cast);
  96. BOOST_CHECK_THROW(lexical_cast<signed char>(v), bad_lexical_cast);
  97. v = lexical_cast<Escape>(100);
  98. BOOST_CHECK_EQUAL(lexical_cast<int>(v), 100);
  99. BOOST_CHECK_EQUAL(lexical_cast<unsigned int>(v), 100u);
  100. v = lexical_cast<Escape>(0.0);
  101. BOOST_CHECK_EQUAL(lexical_cast<double>(v), 0.0);
  102. }
  103. namespace std {
  104. inline std::ostream & operator<<(std::ostream & out, const std::vector<long> & v)
  105. {
  106. std::ostream_iterator<long> it(out);
  107. std::copy(v.begin(), v.end(), it);
  108. assert(out);
  109. return out;
  110. }
  111. }
  112. void test_empty_4()
  113. {
  114. std::vector<long> v;
  115. do_test_on_empty_input(v);
  116. BOOST_CHECK_THROW(lexical_cast<char>(v), bad_lexical_cast);
  117. BOOST_CHECK_THROW(lexical_cast<unsigned char>(v), bad_lexical_cast);
  118. BOOST_CHECK_THROW(lexical_cast<signed char>(v), bad_lexical_cast);
  119. }
  120. struct my_string {
  121. friend std::ostream &operator<<(std::ostream& sout, my_string const&/* st*/) {
  122. return sout << "";
  123. }
  124. };
  125. void test_empty_5()
  126. {
  127. my_string st;
  128. BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(st), std::string());;
  129. }
  130. unit_test::test_suite *init_unit_test_suite(int, char *[])
  131. {
  132. unit_test::test_suite *suite =
  133. BOOST_TEST_SUITE("lexical_cast. Testing with BOOST_NO_STD_LOCALE");
  134. suite->add(BOOST_TEST_CASE(&test_empty_1));
  135. suite->add(BOOST_TEST_CASE(&test_empty_2));
  136. suite->add(BOOST_TEST_CASE(&test_empty_3));
  137. suite->add(BOOST_TEST_CASE(&test_empty_4));
  138. suite->add(BOOST_TEST_CASE(&test_empty_5));
  139. return suite;
  140. }