Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r56230 - in branches/release/libs/conversion: . test
From: Alexander.Nasonov_at_[hidden]
Date: 2009-09-15 19:41:03


Author: nasonov
Date: 2009-09-15 19:41:02 EDT (Tue, 15 Sep 2009)
New Revision: 56230
URL: http://svn.boost.org/trac/boost/changeset/56230

Log:
Add new test libs/conversion/test/lexical_cast_vc8_bug_test.cpp.
Added:
   branches/release/libs/conversion/test/lexical_cast_vc8_bug_test.cpp (contents, props changed)
Text files modified:
   branches/release/libs/conversion/lexical_cast_test.cpp | 20 ++++++++++++++++----
   branches/release/libs/conversion/test/Jamfile.v2 | 1 +
   2 files changed, 17 insertions(+), 4 deletions(-)

Modified: branches/release/libs/conversion/lexical_cast_test.cpp
==============================================================================
--- branches/release/libs/conversion/lexical_cast_test.cpp (original)
+++ branches/release/libs/conversion/lexical_cast_test.cpp 2009-09-15 19:41:02 EDT (Tue, 15 Sep 2009)
@@ -533,14 +533,26 @@
     BOOST_CHECK_EQUAL(lexical_cast<T>(s), min_val);
     if(limits::is_signed)
     {
- BOOST_CHECK_THROW(lexical_cast<T>(s + zero), bad_lexical_cast);
- BOOST_CHECK_THROW(lexical_cast<T>(s + nine), bad_lexical_cast);
+#if defined(BOOST_MSVC) && BOOST_MSVC == 1400
+ // VC++ 8.0 bug, see libs/conversion/test/lexical_cast_vc8_bug_test.cpp
+ if(sizeof(T) < sizeof(boost::intmax_t))
+#endif
+ {
+ BOOST_CHECK_THROW(lexical_cast<T>(s + zero), bad_lexical_cast);
+ BOOST_CHECK_THROW(lexical_cast<T>(s + nine), bad_lexical_cast);
+ }
     }
 
     s = to_str<CharT>(max_val);
     BOOST_CHECK_EQUAL(lexical_cast<T>(s), max_val);
- BOOST_CHECK_THROW(lexical_cast<T>(s + zero), bad_lexical_cast);
- BOOST_CHECK_THROW(lexical_cast<T>(s + nine), bad_lexical_cast);
+#if defined(BOOST_MSVC) && BOOST_MSVC == 1400
+ // VC++ 8.0 bug, see libs/conversion/test/lexical_cast_vc8_bug_test.cpp
+ if(sizeof(T) != sizeof(boost::intmax_t))
+#endif
+ {
+ BOOST_CHECK_THROW(lexical_cast<T>(s + zero), bad_lexical_cast);
+ BOOST_CHECK_THROW(lexical_cast<T>(s + nine), bad_lexical_cast);
+ }
 
     if(limits::digits <= 16 && lcast_test_small_integral_types_completely)
         // min and max have already been tested.

Modified: branches/release/libs/conversion/test/Jamfile.v2
==============================================================================
--- branches/release/libs/conversion/test/Jamfile.v2 (original)
+++ branches/release/libs/conversion/test/Jamfile.v2 2009-09-15 19:41:02 EDT (Tue, 15 Sep 2009)
@@ -24,6 +24,7 @@
     [ run lexical_cast_loopback_test.cpp ../../test/build//boost_unit_test_framework/<link>static ]
     [ run lexical_cast_abstract_test.cpp ../../test/build//boost_unit_test_framework/<link>static ]
     [ run lexical_cast_noncopyable_test.cpp ../../test/build//boost_unit_test_framework/<link>static ]
+ [ run lexical_cast_vc8_bug_test.cpp ../../test/build//boost_unit_test_framework/<link>static ]
   ;
 
       

Added: branches/release/libs/conversion/test/lexical_cast_vc8_bug_test.cpp
==============================================================================
--- (empty file)
+++ branches/release/libs/conversion/test/lexical_cast_vc8_bug_test.cpp 2009-09-15 19:41:02 EDT (Tue, 15 Sep 2009)
@@ -0,0 +1,53 @@
+#include <boost/config.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/test/unit_test.hpp>
+
+#include <string>
+
+using namespace boost;
+
+// See also test_conversion_from_string_to_integral(CharT)
+// in libs/conversion/lexical_cast_test.cpp
+template<class T, class CharT>
+void test_too_long_number(CharT zero)
+{
+ typedef std::numeric_limits<T> limits;
+
+ std::basic_string<CharT> s;
+
+ std::basic_ostringstream<CharT> o;
+ o << (limits::max)() << zero;
+ s = o.str();
+ BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
+ s[s.size()-1] += 9; // '0' -> '9'
+ BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
+
+ if(limits::is_signed)
+ {
+ std::basic_ostringstream<CharT> o;
+ o << (limits::min)() << zero;
+ s = o.str();
+ BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
+ s[s.size()-1] += 9; // '0' -> '9'
+ BOOST_CHECK_THROW(lexical_cast<T>(s), bad_lexical_cast);
+ }
+}
+
+void test_vc8_bug()
+{
+ test_too_long_number<boost::intmax_t>('0');
+ test_too_long_number<boost::uintmax_t>('0');
+#if !defined(BOOST_LCAST_NO_WCHAR_T)
+ test_too_long_number<boost::intmax_t>(L'0');
+ test_too_long_number<boost::uintmax_t>(L'0');
+#endif
+}
+
+unit_test::test_suite *init_unit_test_suite(int, char *[])
+{
+ unit_test_framework::test_suite *suite =
+ BOOST_TEST_SUITE("lexical_cast vc8 bug unit test");
+ suite->add(BOOST_TEST_CASE(test_vc8_bug));
+ return suite;
+}


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk