forked from boostorg/conversion
Add new test libs/conversion/test/lexical_cast_vc8_bug_test.cpp.
[SVN r56229]
This commit is contained in:
@@ -533,14 +533,26 @@ void test_conversion_from_string_to_integral(CharT)
|
|||||||
BOOST_CHECK_EQUAL(lexical_cast<T>(s), min_val);
|
BOOST_CHECK_EQUAL(lexical_cast<T>(s), min_val);
|
||||||
if(limits::is_signed)
|
if(limits::is_signed)
|
||||||
{
|
{
|
||||||
BOOST_CHECK_THROW(lexical_cast<T>(s + zero), bad_lexical_cast);
|
#if defined(BOOST_MSVC) && BOOST_MSVC == 1400
|
||||||
BOOST_CHECK_THROW(lexical_cast<T>(s + nine), bad_lexical_cast);
|
// 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);
|
s = to_str<CharT>(max_val);
|
||||||
BOOST_CHECK_EQUAL(lexical_cast<T>(s), max_val);
|
BOOST_CHECK_EQUAL(lexical_cast<T>(s), max_val);
|
||||||
BOOST_CHECK_THROW(lexical_cast<T>(s + zero), bad_lexical_cast);
|
#if defined(BOOST_MSVC) && BOOST_MSVC == 1400
|
||||||
BOOST_CHECK_THROW(lexical_cast<T>(s + nine), bad_lexical_cast);
|
// 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)
|
if(limits::digits <= 16 && lcast_test_small_integral_types_completely)
|
||||||
// min and max have already been tested.
|
// min and max have already been tested.
|
||||||
|
@@ -24,6 +24,7 @@ test-suite conversion
|
|||||||
[ run lexical_cast_loopback_test.cpp ../../test/build//boost_unit_test_framework/<link>static ]
|
[ 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_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_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 ]
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
53
test/lexical_cast_vc8_bug_test.cpp
Normal file
53
test/lexical_cast_vc8_bug_test.cpp
Normal file
@@ -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;
|
||||||
|
}
|
Reference in New Issue
Block a user