lexical_cast_vc8_bug_test.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Unit test for boost::lexical_cast.
  2. //
  3. // See http://www.boost.org for most recent version, including documentation.
  4. //
  5. // Copyright Alexander Nasonov, 2007.
  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. //
  11. // This tests now must pass on vc8, because lexical_cast
  12. // implementation has changed and it does not use stringstream for casts
  13. // to integral types
  14. #include <boost/config.hpp>
  15. #include <boost/lexical_cast.hpp>
  16. #include <boost/cstdint.hpp>
  17. #include <boost/test/unit_test.hpp>
  18. #include <string>
  19. #ifdef BOOST_MSVC
  20. # pragma warning(disable: 4127) // conditional expression is constant
  21. #endif
  22. using namespace boost;
  23. // See also test_conversion_from_string_to_integral(CharT)
  24. // in libs/conversion/lexical_cast_test.cpp
  25. template<class T, class CharT>
  26. void test_too_long_number(CharT zero)
  27. {
  28. typedef std::numeric_limits<T> limits;
  29. std::basic_string<CharT> s;
  30. std::basic_ostringstream<CharT> o;
  31. o << (limits::max)() << zero;
  32. s = o.str();
  33. BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
  34. s[s.size()-1] += static_cast<CharT>(9); // '0' -> '9'
  35. BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
  36. if (limits::is_signed)
  37. {
  38. std::basic_ostringstream<CharT> o2;
  39. o2 << (limits::min)() << zero;
  40. s = o2.str();
  41. BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
  42. s[s.size()-1] += static_cast<CharT>(9); // '0' -> '9'
  43. BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
  44. }
  45. }
  46. void test_vc8_bug()
  47. {
  48. test_too_long_number<boost::intmax_t>('0');
  49. test_too_long_number<boost::uintmax_t>('0');
  50. #if !defined(BOOST_LCAST_NO_WCHAR_T)
  51. test_too_long_number<boost::intmax_t>(L'0');
  52. test_too_long_number<boost::uintmax_t>(L'0');
  53. #endif
  54. }
  55. unit_test::test_suite *init_unit_test_suite(int, char *[])
  56. {
  57. unit_test::test_suite *suite =
  58. BOOST_TEST_SUITE("lexical_cast vc8 bug unit test");
  59. suite->add(BOOST_TEST_CASE(test_vc8_bug));
  60. return suite;
  61. }