forked from boostorg/conversion
https://svn.boost.org/svn/boost/trunk ........ r41270 | dgregor | 2007-11-20 21:50:21 -0800 (Tue, 20 Nov 2007) | 1 line Fixes #1456 ........ r41271 | johnmaddock | 2007-11-21 01:39:00 -0800 (Wed, 21 Nov 2007) | 1 line Added super/subscript styling as per boost-docs mailing list discussion. ........ r41272 | johnmaddock | 2007-11-21 01:46:36 -0800 (Wed, 21 Nov 2007) | 1 line Fix << iostream operator for the NTL bindings. ........ r41273 | anthonyw | 2007-11-21 02:44:22 -0800 (Wed, 21 Nov 2007) | 1 line changed platform split to allow bjam to track includes and check dependencies ........ r41274 | schoepflin | 2007-11-21 03:00:18 -0800 (Wed, 21 Nov 2007) | 2 lines Added myself to the platform maintainers file. ........ r41276 | bgubenko | 2007-11-21 03:43:00 -0800 (Wed, 21 Nov 2007) | 1 line fix typo in the marking of function_types library tests ........ r41277 | johnmaddock | 2007-11-21 04:09:28 -0800 (Wed, 21 Nov 2007) | 1 line Change warning suppression, to suppress warnings for VC8 as well. ........ r41278 | johnmaddock | 2007-11-21 06:03:16 -0800 (Wed, 21 Nov 2007) | 1 line Apply warning fix for VC8 and later only: earlier versions warn about the warning suppression :-( ........ r41279 | schoepflin | 2007-11-21 07:21:53 -0800 (Wed, 21 Nov 2007) | 2 lines Marked function_types failures depending on stdcall as expected on Tru64/CXX. ........ r41280 | igaztanaga | 2007-11-21 08:18:29 -0800 (Wed, 21 Nov 2007) | 1 line Added offset_ptr test ........ r41281 | igaztanaga | 2007-11-21 08:19:19 -0800 (Wed, 21 Nov 2007) | 1 line Fixed offset_ptr issues with volatile values. ........ r41282 | igaztanaga | 2007-11-21 08:39:48 -0800 (Wed, 21 Nov 2007) | 1 line Changed precalculated sqrt(2) values selection to use enable_if. ........ r41284 | igaztanaga | 2007-11-21 09:32:20 -0800 (Wed, 21 Nov 2007) | 1 line Added performance Jamfile to the project ........ r41285 | hkaiser | 2007-11-21 09:53:37 -0800 (Wed, 21 Nov 2007) | 1 line Wave: Fixed #line statements in generated files not to contain Windows paths anymore. ........ r41286 | marshall | 2007-11-21 11:20:15 -0800 (Wed, 21 Nov 2007) | 1 line Bug fixes #284, #836, #991 ........ r41287 | grafik | 2007-11-21 11:29:55 -0800 (Wed, 21 Nov 2007) | 1 line Fix search for Boost.Build so that it only finds the approved version. ........ r41288 | djowel | 2007-11-21 14:24:37 -0800 (Wed, 21 Nov 2007) | 1 line updated the master css ........ r41289 | matias | 2007-11-21 20:55:54 -0800 (Wed, 21 Nov 2007) | 1 line Explicit failure markup for Bimap ........ r41290 | matias | 2007-11-21 21:18:38 -0800 (Wed, 21 Nov 2007) | 1 line remove wrong placed typename ........ r41297 | joaquin | 2007-11-21 23:59:28 -0800 (Wed, 21 Nov 2007) | 1 line included an exe filename modifying rule to avoid interference problems with Vista UAC (fixes #1429) ........ r41299 | djowel | 2007-11-22 00:39:46 -0800 (Thu, 22 Nov 2007) | 1 line bug fix ........ r41300 | schoepflin | 2007-11-22 01:32:15 -0800 (Thu, 22 Nov 2007) | 3 lines Marked failures for kolmogorov_max_flow_test and max_flow_test in the graph library as expected for cxx and acc. ........ r41301 | johnmaddock | 2007-11-22 01:59:38 -0800 (Thu, 22 Nov 2007) | 1 line Added try...catch around TSS initialisation. ........ r41302 | johnmaddock | 2007-11-22 02:38:48 -0800 (Thu, 22 Nov 2007) | 1 line Fixes #501 #1334. ........ r41303 | bgubenko | 2007-11-22 03:33:09 -0800 (Thu, 22 Nov 2007) | 1 line fix typo in r41302 causing validation error ........ r41304 | rogeeff | 2007-11-22 11:44:12 -0800 (Thu, 22 Nov 2007) | 1 line Try to make it work in release build ........ r41305 | rogeeff | 2007-11-22 11:56:58 -0800 (Thu, 22 Nov 2007) | 1 line new file ........ r41308 | rogeeff | 2007-11-22 12:56:07 -0800 (Thu, 22 Nov 2007) | 2 lines negative chars test added some statements added to the online_test ........ r41310 | rogeeff | 2007-11-22 13:57:16 -0800 (Thu, 22 Nov 2007) | 1 line issue with class base test cases addressed ........ r41311 | anthonyw | 2007-11-22 14:01:30 -0800 (Thu, 22 Nov 2007) | 1 line Removed thread::self in favour of allowing interruption through a thread::id; no longer requires DuplicateHandle ........ r41312 | rogeeff | 2007-11-22 14:06:59 -0800 (Thu, 22 Nov 2007) | 1 line comments cleanup ........ r41313 | grafik | 2007-11-22 18:57:42 -0800 (Thu, 22 Nov 2007) | 1 line Produce less regression reports to reduce the cycle time for test reporting. ........ r41314 | grafik | 2007-11-22 18:58:14 -0800 (Thu, 22 Nov 2007) | 1 line Produce less regression reports to reduce the cycle time for test reporting. ........ r41315 | joaquin | 2007-11-22 23:57:15 -0800 (Thu, 22 Nov 2007) | 1 line added .exe suffix missing at rev 41297 ........ r41317 | johnmaddock | 2007-11-23 09:05:25 -0800 (Fri, 23 Nov 2007) | 1 line Remove the log files, we don't need these in SVN Trunk. ........ r41318 | grafik | 2007-11-23 12:43:38 -0800 (Fri, 23 Nov 2007) | 1 line Add --skip-script-download option to run.py to avoid repeated regression script downloads. Thanks to _m_ for the changes. ........ r41319 | bemandawes | 2007-11-23 14:55:48 -0800 (Fri, 23 Nov 2007) | 1 line Add the instructions formerly in the (now deleted) runner sub-directory ........ r41320 | anthonyw | 2007-11-23 15:09:36 -0800 (Fri, 23 Nov 2007) | 1 line Integrate TSS with thread data; test to ensure cleanup done for native threads as well as boost::thread-launched threads now runs for pthread API as well as win32 API ........ r41324 | grafik | 2007-11-23 18:16:50 -0800 (Fri, 23 Nov 2007) | 1 line Allow use of "conditional" to multiply a condition that already has the full condition in it. ........ r41325 | igaztanaga | 2007-11-24 01:44:30 -0800 (Sat, 24 Nov 2007) | 1 line Marked msvc-8.0-wm5 as unusable ........ r41326 | niels_dekker | 2007-11-24 03:51:03 -0800 (Sat, 24 Nov 2007) | 1 line Checked the result of value_init test function, hoping to pinpoint exactly for what particular type T value_initialized<T> might fail, on some platforms ........ r41327 | johnmaddock | 2007-11-24 04:25:25 -0800 (Sat, 24 Nov 2007) | 1 line Apply patches for building regex on WinCE see: http://lists.boost.org/Archives/boost/2007/11/130839.php ........ r41328 | bemandawes | 2007-11-24 05:15:03 -0800 (Sat, 24 Nov 2007) | 1 line Bring required compilers list closer into sync with actual testers and list discussion ........ r41330 | bemandawes | 2007-11-24 06:59:08 -0800 (Sat, 24 Nov 2007) | 1 line Remove mingw plus some compilers no longer being tested from required list ........ r41331 | nasonov | 2007-11-24 07:22:52 -0800 (Sat, 24 Nov 2007) | 1 line minor changes ........ r41333 | bemandawes | 2007-11-24 08:39:30 -0800 (Sat, 24 Nov 2007) | 1 line Change long name inspection to follow ISO 9660:1997, thus replacing all length requirements with a single 207 maximum path length requirement. ........ r41338 | garcia | 2007-11-24 10:19:22 -0800 (Sat, 24 Nov 2007) | 2 lines A bunch of review dates have been added. ........ r41339 | johnmaddock | 2007-11-24 10:34:17 -0800 (Sat, 24 Nov 2007) | 1 line Changed meaning of "at_end" needs copy-constructor fix. ........ r41341 | noel_belcourt | 2007-11-24 11:09:56 -0800 (Sat, 24 Nov 2007) | 6 lines Replace mpi wrappers with native pathscale compilers. Fixed how we invoke f77 (pathf90 -f77). Thanks to Alain Miniussi for reporting this. ........ r41342 | igaztanaga | 2007-11-24 11:47:58 -0800 (Sat, 24 Nov 2007) | 1 line Added workaround for systems without SEM_FAILED and semaphores based on filesystem ........ r41343 | rogeeff | 2007-11-24 11:49:24 -0800 (Sat, 24 Nov 2007) | 5 lines switch to nasic_cstring.hpp instead of fwd header added failed expression to the system error system_error is caught and reported in cpp_main.ipp 64 bit compatibility issue in debug.ipp fixed missing headers in algorithm.hpp added ........ r41344 | davedeakins | 2007-11-24 12:30:50 -0800 (Sat, 24 Nov 2007) | 1 line Define the BOOST_NO_SWPRINTF macro for WinCE. WinCE's CRT does not have a conforming swprintf signature. ........ r41348 | igaztanaga | 2007-11-24 16:55:14 -0800 (Sat, 24 Nov 2007) | 1 line Marked pathscale and vacpp as unusable for Interprocess/Intrusive ........ r41350 | davedeakins | 2007-11-24 20:30:02 -0800 (Sat, 24 Nov 2007) | 1 line A few corrections to the WinCE patches ........ r41352 | dave | 2007-11-25 01:02:01 -0800 (Sun, 25 Nov 2007) | 2 lines Attempt SunPro workaround ........ r41353 | guwi17 | 2007-11-25 05:34:20 -0800 (Sun, 25 Nov 2007) | 6 lines - fix and close #1237 - symmetric resize used wrong internal resize method -- Dese und die folgenden Zeilen werden ignoriert -- M symmetric.hpp ........ r41355 | bemandawes | 2007-11-25 05:56:09 -0800 (Sun, 25 Nov 2007) | 1 line Remove extra ) from prior commit ........ r41356 | danieljames | 2007-11-25 06:10:05 -0800 (Sun, 25 Nov 2007) | 2 lines Deleting the BoostCon* files. Fixes #1256 ........ r41357 | bemandawes | 2007-11-25 07:08:28 -0800 (Sun, 25 Nov 2007) | 1 line clear # 1230, mbstate uninitialized ........ r41358 | igaztanaga | 2007-11-25 07:18:04 -0800 (Sun, 25 Nov 2007) | 1 line Marked intel-linux-8.* as unusable for Interprocess and Intrusive ........ r41359 | johnmaddock | 2007-11-25 07:47:58 -0800 (Sun, 25 Nov 2007) | 1 line Oops, previous commit messed up POSIX timing code, now fixed. ........ r41361 | johnmaddock | 2007-11-25 08:26:36 -0800 (Sun, 25 Nov 2007) | 1 line Redirection file. ........ r41362 | grafik | 2007-11-25 09:06:17 -0800 (Sun, 25 Nov 2007) | 1 line Move buildbot support to sandbox until we decide what to do with it. ........ r41363 | grafik | 2007-11-25 09:12:42 -0800 (Sun, 25 Nov 2007) | 1 line Some cleanup of tools documentation. Add boostbook redir file. Delete duplicate time_string.hpp. Repoint regression instructions to web site. ........ r41364 | johnmaddock | 2007-11-25 09:23:25 -0800 (Sun, 25 Nov 2007) | 1 line Fix date. ........ r41378 | bemandawes | 2007-11-25 11:56:10 -0800 (Sun, 25 Nov 2007) | 1 line remove hp_cxx-71_006_tru64 as required. ........ r41380 | grafik | 2007-11-25 12:10:10 -0800 (Sun, 25 Nov 2007) | 1 line Add --build-type option to root build. Two choices possible at the moment "minimal" and "complete". With minimal as the default we only build the common release variant. The old behavior of building many variants is available with "complete". ........ r41381 | fcacciola | 2007-11-25 12:26:14 -0800 (Sun, 25 Nov 2007) | 1 line Cast to base added to avoid a call to the convertir constructor/assignment (see Tickes 1419 and 1420) ........ r41383 | burbelgruff | 2007-11-25 13:16:46 -0800 (Sun, 25 Nov 2007) | 1 line Revert to old sizeof based solution for retrieving the type from a typeof hack. This is in order to overcome problems with the code analysis module introduced in Visual Studio 2005. ........ r41384 | davedeakins | 2007-11-25 13:53:26 -0800 (Sun, 25 Nov 2007) | 1 line Added a primitive tmpnam function for WinCE (which does not supply any kind of tmpnam in its CRT) ........ r41385 | nasonov | 2007-11-25 14:28:16 -0800 (Sun, 25 Nov 2007) | 3 lines Pass unsigned type to lcast_put_unsigned. ........ r41387 | nasonov | 2007-11-25 15:08:50 -0800 (Sun, 25 Nov 2007) | 2 lines Support for string with non-default char_traits and allocator. ........ r41391 | davedeakins | 2007-11-25 22:36:55 -0800 (Sun, 25 Nov 2007) | 1 line Nearly all test for the intrusive library pass on the MSVC8/WM5 platform. ........ r41394 | joaquin | 2007-11-26 03:52:03 -0800 (Mon, 26 Nov 2007) | 1 line added missing traits template arg to a lexical_stream instantiation ........ r41395 | anthonyw | 2007-11-26 04:17:45 -0800 (Mon, 26 Nov 2007) | 1 line workaround for Borland compiler ........ r41396 | anthonyw | 2007-11-26 05:29:15 -0800 (Mon, 26 Nov 2007) | 1 line Don't compare native_handle_t against 0 --- do appropriate checks in create_native_thread for platforms where pthread_t is not comparable ........ r41397 | joaquin | 2007-11-26 05:48:36 -0800 (Mon, 26 Nov 2007) | 1 line ADL-based swap call moved to an utility function (after mistaken attempt at rev 41220 to solve name-hiding issues) ........ r41398 | anthonyw | 2007-11-26 07:44:07 -0800 (Mon, 26 Nov 2007) | 1 line fixed import/export declarations so new once code works with pthread-win32 ........ [SVN r41399]
752 lines
26 KiB
C++
752 lines
26 KiB
C++
// Unit test for boost::lexical_cast.
|
|
//
|
|
// See http://www.boost.org for most recent version, including documentation.
|
|
//
|
|
// Copyright Terje Slettebø and Kevlin Henney, 2005.
|
|
// Copyright Alexander Nasonov, 2006.
|
|
//
|
|
// 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).
|
|
//
|
|
// Note: The unit test no longer compile on MSVC 6, but lexical_cast itself works for it.
|
|
|
|
#include <boost/config.hpp>
|
|
|
|
#if defined(__INTEL_COMPILER)
|
|
#pragma warning(disable: 193 383 488 981 1418 1419)
|
|
#elif defined(BOOST_MSVC)
|
|
#pragma warning(disable: 4097 4100 4121 4127 4146 4244 4245 4511 4512 4701 4800)
|
|
#endif
|
|
|
|
#include <boost/lexical_cast.hpp>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
#include <boost/test/floating_point_comparison.hpp>
|
|
|
|
#include <string>
|
|
#include <memory>
|
|
|
|
#if defined(BOOST_NO_STRINGSTREAM) || \
|
|
defined(BOOST_NO_STD_WSTRING) || \
|
|
defined(BOOST_NO_STD_LOCALE)
|
|
#define DISABLE_WIDE_CHAR_SUPPORT
|
|
#endif
|
|
|
|
#if (defined(BOOST_HAS_LONG_LONG) || defined(BOOST_HAS_MS_INT64)) \
|
|
&& !(defined(BOOST_MSVC) && BOOST_MSVC < 1300)
|
|
#define LCAST_TEST_LONGLONG
|
|
#endif
|
|
|
|
template<class CharT>
|
|
struct my_traits : std::char_traits<CharT>
|
|
{
|
|
};
|
|
|
|
template<class CharT>
|
|
struct my_allocator : std::allocator<CharT>
|
|
{
|
|
};
|
|
|
|
// Test all 65536 values if true:
|
|
bool const lcast_test_small_integral_types_completely = false;
|
|
|
|
// lcast_integral_test_counter: use when testing all values of an integral
|
|
// types is not possible. Max. portable value is 32767.
|
|
int const lcast_integral_test_counter=1000;
|
|
|
|
using namespace boost;
|
|
|
|
void test_conversion_to_char();
|
|
void test_conversion_to_int();
|
|
void test_conversion_to_double();
|
|
void test_conversion_to_bool();
|
|
void test_conversion_to_string();
|
|
void test_conversion_from_to_wchar_t_alias();
|
|
void test_conversion_to_pointer();
|
|
void test_conversion_from_wchar_t();
|
|
void test_conversion_to_wchar_t();
|
|
void test_conversion_from_wstring();
|
|
void test_conversion_to_wstring();
|
|
void test_bad_lexical_cast();
|
|
void test_no_whitespace_stripping();
|
|
void test_conversion_from_to_short();
|
|
void test_conversion_from_to_ushort();
|
|
void test_conversion_from_to_int();
|
|
void test_conversion_from_to_uint();
|
|
void test_conversion_from_to_long();
|
|
void test_conversion_from_to_ulong();
|
|
#ifdef LCAST_TEST_LONGLONG
|
|
void test_conversion_from_to_longlong();
|
|
void test_conversion_from_to_ulonglong();
|
|
#endif
|
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
void test_traits();
|
|
void test_wtraits();
|
|
void test_allocator();
|
|
void test_wallocator();
|
|
#endif
|
|
|
|
unit_test::test_suite *init_unit_test_suite(int, char *[])
|
|
{
|
|
unit_test_framework::test_suite *suite =
|
|
BOOST_TEST_SUITE("lexical_cast unit test");
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_char));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_int));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_double));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_bool));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_from_to_wchar_t_alias));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_pointer));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_string));
|
|
#ifndef DISABLE_WIDE_CHAR_SUPPORT
|
|
suite->add(BOOST_TEST_CASE(test_conversion_from_wchar_t));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_wchar_t));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_from_wstring));
|
|
suite->add(BOOST_TEST_CASE(test_conversion_to_wstring));
|
|
#endif
|
|
suite->add(BOOST_TEST_CASE(test_bad_lexical_cast));
|
|
suite->add(BOOST_TEST_CASE(test_no_whitespace_stripping));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_short));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_ushort));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_int));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_uint));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_ulong));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_long));
|
|
#ifdef LCAST_TEST_LONGLONG
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_longlong));
|
|
suite->add(BOOST_TEST_CASE(&test_conversion_from_to_ulonglong));
|
|
#endif
|
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
suite->add(BOOST_TEST_CASE(&test_traits));
|
|
suite->add(BOOST_TEST_CASE(&test_wtraits));
|
|
suite->add(BOOST_TEST_CASE(&test_allocator));
|
|
suite->add(BOOST_TEST_CASE(&test_wallocator));
|
|
#endif
|
|
|
|
return suite;
|
|
}
|
|
|
|
void test_conversion_to_char()
|
|
{
|
|
BOOST_CHECK_EQUAL('A', lexical_cast<char>('A'));
|
|
BOOST_CHECK_EQUAL(' ', lexical_cast<char>(' '));
|
|
BOOST_CHECK_EQUAL('1', lexical_cast<char>(1));
|
|
BOOST_CHECK_EQUAL('0', lexical_cast<char>(0));
|
|
BOOST_CHECK_THROW(lexical_cast<char>(123), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL('1', lexical_cast<char>(1.0));
|
|
BOOST_CHECK_EQUAL('1', lexical_cast<char>(true));
|
|
BOOST_CHECK_EQUAL('0', lexical_cast<char>(false));
|
|
BOOST_CHECK_EQUAL('A', lexical_cast<char>("A"));
|
|
BOOST_CHECK_EQUAL(' ', lexical_cast<char>(" "));
|
|
BOOST_CHECK_THROW(lexical_cast<char>(""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<char>("Test"), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL('A', lexical_cast<char>(std::string("A")));
|
|
BOOST_CHECK_EQUAL(' ', lexical_cast<char>(std::string(" ")));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<char>(std::string("")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<char>(std::string("Test")), bad_lexical_cast);
|
|
}
|
|
|
|
void test_conversion_to_int()
|
|
{
|
|
BOOST_CHECK_EQUAL(1, lexical_cast<int>('1'));
|
|
BOOST_CHECK_EQUAL(0, lexical_cast<int>('0'));
|
|
BOOST_CHECK_THROW(lexical_cast<int>('A'), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(1, lexical_cast<int>(1));
|
|
BOOST_CHECK_EQUAL(1, lexical_cast<int>(1.0));
|
|
|
|
BOOST_CHECK_EQUAL(
|
|
(std::numeric_limits<int>::max)(),
|
|
lexical_cast<int>((std::numeric_limits<int>::max)()));
|
|
|
|
BOOST_CHECK_EQUAL(
|
|
(std::numeric_limits<int>::min)(),
|
|
lexical_cast<int>((std::numeric_limits<int>::min)()));
|
|
|
|
BOOST_CHECK_THROW(lexical_cast<int>(1.23), bad_lexical_cast);
|
|
|
|
BOOST_CHECK_THROW(lexical_cast<int>(1e20), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(1, lexical_cast<int>(true));
|
|
BOOST_CHECK_EQUAL(0, lexical_cast<int>(false));
|
|
BOOST_CHECK_EQUAL(123, lexical_cast<int>("123"));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<int>(" 123"), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<int>(""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<int>("Test"), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(123, lexical_cast<int>("123"));
|
|
BOOST_CHECK_EQUAL(123, lexical_cast<int>(std::string("123")));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<int>(std::string(" 123")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<int>(std::string("")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<int>(std::string("Test")), bad_lexical_cast);
|
|
}
|
|
|
|
void test_conversion_to_double()
|
|
{
|
|
BOOST_CHECK_CLOSE(1.0, lexical_cast<double>('1'), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_THROW(lexical_cast<double>('A'), bad_lexical_cast);
|
|
BOOST_CHECK_CLOSE(1.0, lexical_cast<double>(1), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_CLOSE(1.23, lexical_cast<double>(1.23), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_CLOSE(1.234567890, 1.234567890, std::numeric_limits<double>::epsilon());
|
|
BOOST_CHECK_CLOSE(1.0, lexical_cast<double>(true), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_CLOSE(0.0, lexical_cast<double>(false), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_CLOSE(1.23, lexical_cast<double>("1.23"), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_THROW(lexical_cast<double>(""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<double>("Test"), bad_lexical_cast);
|
|
BOOST_CHECK_CLOSE(1.23, lexical_cast<double>(std::string("1.23")), (std::numeric_limits<double>::epsilon()));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<double>(std::string("")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<double>(std::string("Test")), bad_lexical_cast);
|
|
}
|
|
|
|
void test_conversion_to_bool()
|
|
{
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>('1'));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>('0'));
|
|
BOOST_CHECK_THROW(lexical_cast<bool>('A'), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(1));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(0));
|
|
BOOST_CHECK_THROW(lexical_cast<bool>(123), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(1.0));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(0.0));
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(true));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(false));
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>("1"));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>("0"));
|
|
BOOST_CHECK_THROW(lexical_cast<bool>(""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<bool>("Test"), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>("1"));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>("0"));
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(std::string("1")));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(std::string("0")));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<bool>(std::string("")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<bool>(std::string("Test")), bad_lexical_cast);
|
|
}
|
|
|
|
void test_conversion_to_string()
|
|
{
|
|
char buf[] = "hello";
|
|
char* str = buf;
|
|
BOOST_CHECK_EQUAL(str, lexical_cast<std::string>(str));
|
|
BOOST_CHECK_EQUAL("A", lexical_cast<std::string>('A'));
|
|
BOOST_CHECK_EQUAL(" ", lexical_cast<std::string>(' '));
|
|
BOOST_CHECK_EQUAL("123", lexical_cast<std::string>(123));
|
|
BOOST_CHECK_EQUAL("1.23", lexical_cast<std::string>(1.23));
|
|
BOOST_CHECK_EQUAL("1.111111111", lexical_cast<std::string>(1.111111111));
|
|
BOOST_CHECK_EQUAL("1", lexical_cast<std::string>(true));
|
|
BOOST_CHECK_EQUAL("0", lexical_cast<std::string>(false));
|
|
BOOST_CHECK_EQUAL("Test", lexical_cast<std::string>("Test"));
|
|
BOOST_CHECK_EQUAL(" ", lexical_cast<std::string>(" "));
|
|
BOOST_CHECK_EQUAL("", lexical_cast<std::string>(""));
|
|
BOOST_CHECK_EQUAL("Test", lexical_cast<std::string>(std::string("Test")));
|
|
BOOST_CHECK_EQUAL(" ", lexical_cast<std::string>(std::string(" ")));
|
|
BOOST_CHECK_EQUAL("", lexical_cast<std::string>(std::string("")));
|
|
}
|
|
|
|
void test_conversion_from_to_wchar_t_alias()
|
|
{
|
|
BOOST_CHECK_EQUAL(123u, lexical_cast<unsigned short>("123"));
|
|
BOOST_CHECK_EQUAL(123u, lexical_cast<unsigned int>("123"));
|
|
BOOST_CHECK_EQUAL(123u, lexical_cast<unsigned long>("123"));
|
|
BOOST_CHECK_EQUAL(std::string("123"),
|
|
lexical_cast<std::string>(static_cast<unsigned short>(123)));
|
|
BOOST_CHECK_EQUAL(std::string("123"), lexical_cast<std::string>(123u));
|
|
BOOST_CHECK_EQUAL(std::string("123"), lexical_cast<std::string>(123ul));
|
|
}
|
|
|
|
void test_conversion_to_pointer()
|
|
{
|
|
BOOST_CHECK_THROW(lexical_cast<char *>("Test"), bad_lexical_cast);
|
|
#ifndef DISABLE_WIDE_CHAR_SUPPORT
|
|
BOOST_CHECK_THROW(lexical_cast<wchar_t *>("Test"), bad_lexical_cast);
|
|
#endif
|
|
}
|
|
|
|
void test_conversion_from_wchar_t()
|
|
{
|
|
#ifndef DISABLE_WIDE_CHAR_SUPPORT
|
|
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
BOOST_CHECK_EQUAL(1, lexical_cast<int>(L'1'));
|
|
BOOST_CHECK_THROW(lexical_cast<int>(L'A'), bad_lexical_cast);
|
|
#endif
|
|
|
|
BOOST_CHECK_EQUAL(123, lexical_cast<int>(L"123"));
|
|
BOOST_CHECK_THROW(lexical_cast<int>(L""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<int>(L"Test"), bad_lexical_cast);
|
|
|
|
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
BOOST_CHECK_EQUAL(1.0, lexical_cast<double>(L'1'));
|
|
BOOST_CHECK_THROW(lexical_cast<double>(L'A'), bad_lexical_cast);
|
|
#endif
|
|
|
|
BOOST_CHECK_EQUAL(1.23, lexical_cast<double>(L"1.23"));
|
|
BOOST_CHECK_THROW(lexical_cast<double>(L""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<double>(L"Test"), bad_lexical_cast);
|
|
|
|
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(L'1'));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(L'0'));
|
|
BOOST_CHECK_THROW(lexical_cast<bool>(L'A'), bad_lexical_cast);
|
|
#endif
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(L"1"));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(L"0"));
|
|
BOOST_CHECK_THROW(lexical_cast<bool>(L""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<bool>(L"Test"), bad_lexical_cast);
|
|
#endif
|
|
}
|
|
|
|
void test_conversion_to_wchar_t()
|
|
{
|
|
#if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
BOOST_CHECK_EQUAL(L'1', lexical_cast<wchar_t>(1));
|
|
BOOST_CHECK_EQUAL(L'0', lexical_cast<wchar_t>(0));
|
|
BOOST_CHECK_EQUAL(L'1', lexical_cast<wchar_t>('1'));
|
|
BOOST_CHECK_EQUAL(L'0', lexical_cast<wchar_t>('0'));
|
|
BOOST_CHECK_THROW(lexical_cast<wchar_t>(123), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(L'1', lexical_cast<wchar_t>(1.0));
|
|
BOOST_CHECK_EQUAL(L'0', lexical_cast<wchar_t>(0.0));
|
|
BOOST_CHECK_EQUAL(L'1', lexical_cast<wchar_t>(true));
|
|
BOOST_CHECK_EQUAL(L'0', lexical_cast<wchar_t>(false));
|
|
BOOST_CHECK_EQUAL(L'A', lexical_cast<wchar_t>(L'A'));
|
|
BOOST_CHECK_EQUAL(L' ', lexical_cast<wchar_t>(L' '));
|
|
BOOST_CHECK_EQUAL(L'A', lexical_cast<wchar_t>(L"A"));
|
|
BOOST_CHECK_EQUAL(L' ', lexical_cast<wchar_t>(L" "));
|
|
BOOST_CHECK_THROW(lexical_cast<wchar_t>(L""), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<wchar_t>(L"Test"), bad_lexical_cast);
|
|
BOOST_CHECK_EQUAL(L'A', lexical_cast<wchar_t>(std::wstring(L"A")));
|
|
BOOST_CHECK_EQUAL(L' ', lexical_cast<wchar_t>(std::wstring(L" ")));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<wchar_t>(std::wstring(L"")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<wchar_t>(std::wstring(L"Test")), bad_lexical_cast);
|
|
#endif
|
|
}
|
|
|
|
void test_conversion_from_wstring()
|
|
{
|
|
#ifndef DISABLE_WIDE_CHAR_SUPPORT
|
|
BOOST_CHECK_EQUAL(123, lexical_cast<int>(std::wstring(L"123")));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<int>(std::wstring(L"")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<int>(std::wstring(L"Test")), bad_lexical_cast);
|
|
|
|
BOOST_CHECK_EQUAL(true, lexical_cast<bool>(std::wstring(L"1")));
|
|
BOOST_CHECK_EQUAL(false, lexical_cast<bool>(std::wstring(L"0")));
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<bool>(std::wstring(L"")), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(
|
|
lexical_cast<bool>(std::wstring(L"Test")), bad_lexical_cast);
|
|
#endif
|
|
}
|
|
|
|
void test_conversion_to_wstring()
|
|
{
|
|
#ifndef DISABLE_WIDE_CHAR_SUPPORT
|
|
wchar_t buf[] = L"hello";
|
|
wchar_t* str = buf;
|
|
BOOST_CHECK(str == lexical_cast<std::wstring>(str));
|
|
BOOST_CHECK(L"123" == lexical_cast<std::wstring>(123));
|
|
BOOST_CHECK(L"1.23" == lexical_cast<std::wstring>(1.23));
|
|
BOOST_CHECK(L"1.111111111" == lexical_cast<std::wstring>(1.111111111));
|
|
BOOST_CHECK(L"1" == lexical_cast<std::wstring>(true));
|
|
BOOST_CHECK(L"0" == lexical_cast<std::wstring>(false));
|
|
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
BOOST_CHECK(L"A" == lexical_cast<std::wstring>(L'A'));
|
|
BOOST_CHECK(L" " == lexical_cast<std::wstring>(L' '));
|
|
BOOST_CHECK(L"A" == lexical_cast<std::wstring>('A'));
|
|
#endif
|
|
BOOST_CHECK(L"Test" == lexical_cast<std::wstring>(L"Test"));
|
|
BOOST_CHECK(L" " == lexical_cast<std::wstring>(L" "));
|
|
BOOST_CHECK(L"" == lexical_cast<std::wstring>(L""));
|
|
BOOST_CHECK(L"Test" == lexical_cast<std::wstring>(std::wstring(L"Test")));
|
|
BOOST_CHECK(L" " == lexical_cast<std::wstring>(std::wstring(L" ")));
|
|
BOOST_CHECK(L"" == lexical_cast<std::wstring>(std::wstring(L"")));
|
|
#endif
|
|
}
|
|
|
|
void test_bad_lexical_cast()
|
|
{
|
|
try
|
|
{
|
|
lexical_cast<int>(std::string("Test"));
|
|
|
|
BOOST_CHECK(false); // Exception expected
|
|
}
|
|
catch(const bad_lexical_cast &e)
|
|
{
|
|
BOOST_CHECK(e.source_type() == typeid(std::string));
|
|
BOOST_CHECK(e.target_type() == typeid(int));
|
|
}
|
|
}
|
|
|
|
void test_no_whitespace_stripping()
|
|
{
|
|
BOOST_CHECK_THROW(lexical_cast<int>(" 123"), bad_lexical_cast);
|
|
BOOST_CHECK_THROW(lexical_cast<int>("123 "), bad_lexical_cast);
|
|
}
|
|
|
|
// Replace "-,999" with "-999".
|
|
template<class CharT>
|
|
std::basic_string<CharT> to_str_gcc_workaround(std::basic_string<CharT> str)
|
|
{
|
|
std::locale loc;
|
|
std::numpunct<CharT> const& np = BOOST_USE_FACET(std::numpunct<CharT>, loc);
|
|
std::ctype<CharT> const& ct = BOOST_USE_FACET(std::ctype<CharT>, loc);
|
|
|
|
if(np.grouping().empty())
|
|
return str;
|
|
|
|
CharT prefix[3] = { ct.widen('-'), np.thousands_sep(), CharT() };
|
|
|
|
if(str.find(prefix) != 0)
|
|
return str;
|
|
|
|
prefix[1] = CharT();
|
|
str.replace(0, 2, prefix);
|
|
return str;
|
|
}
|
|
|
|
template<class CharT, class T>
|
|
std::basic_string<CharT> to_str(T t)
|
|
{
|
|
std::basic_ostringstream<CharT> o;
|
|
o << t;
|
|
return to_str_gcc_workaround(o.str());
|
|
}
|
|
|
|
template<class T, class CharT>
|
|
void test_conversion_from_integral_to_char(CharT zero)
|
|
{
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(0)) == zero + 0);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(1)) == zero + 1);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(2)) == zero + 2);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(3)) == zero + 3);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(4)) == zero + 4);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(5)) == zero + 5);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(6)) == zero + 6);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(7)) == zero + 7);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(8)) == zero + 8);
|
|
BOOST_CHECK(lexical_cast<CharT>(static_cast<T>(9)) == zero + 9);
|
|
|
|
BOOST_CHECK_THROW(lexical_cast<CharT>(static_cast<T>(10)), bad_lexical_cast);
|
|
|
|
T t = (std::numeric_limits<T>::max)();
|
|
BOOST_CHECK_THROW(lexical_cast<CharT>(t), bad_lexical_cast);
|
|
}
|
|
|
|
template<class T>
|
|
void test_conversion_from_integral_to_integral()
|
|
{
|
|
T t = 0;
|
|
BOOST_CHECK(lexical_cast<T>(t) == t);
|
|
|
|
// Next two variables are used to supress warnings.
|
|
int st = 32767; unsigned int ut = st;
|
|
t = st;
|
|
BOOST_CHECK(lexical_cast<short>(t) == st);
|
|
BOOST_CHECK(lexical_cast<unsigned short>(t) == ut);
|
|
BOOST_CHECK(lexical_cast<int>(t) == st);
|
|
BOOST_CHECK(lexical_cast<unsigned int>(t) == ut);
|
|
BOOST_CHECK(lexical_cast<long>(t) == st);
|
|
BOOST_CHECK(lexical_cast<unsigned long>(t) == ut);
|
|
|
|
t = (std::numeric_limits<T>::max)();
|
|
BOOST_CHECK(lexical_cast<T>(t) == t);
|
|
|
|
t = (std::numeric_limits<T>::min)();
|
|
BOOST_CHECK(lexical_cast<T>(t) == t);
|
|
}
|
|
|
|
template<class T, class CharT>
|
|
void test_conversion_from_integral_to_string(CharT)
|
|
{
|
|
typedef std::numeric_limits<T> limits;
|
|
typedef std::basic_string<CharT> string_type;
|
|
|
|
T t;
|
|
|
|
t = (limits::min)();
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
|
|
t = (limits::max)();
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
|
|
if(limits::digits <= 16 && lcast_test_small_integral_types_completely)
|
|
// min and max have already been tested.
|
|
for(t = 1 + (limits::min)(); t != (limits::max)(); ++t)
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
else
|
|
{
|
|
T const min_val = (limits::min)();
|
|
T const max_val = (limits::max)();
|
|
T const half_max_val = max_val / 2;
|
|
T const cnt = lcast_integral_test_counter; // to supress warnings
|
|
unsigned int const counter = cnt < half_max_val ? cnt : half_max_val;
|
|
|
|
unsigned int i;
|
|
|
|
// Test values around min:
|
|
t = min_val;
|
|
for(i = 0; i < counter; ++i, ++t)
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
|
|
// Test values around max:
|
|
t = max_val;
|
|
for(i = 0; i < counter; ++i, --t)
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
|
|
// Test values around zero:
|
|
if(limits::is_signed)
|
|
for(t = -counter; t < static_cast<T>(counter); ++t)
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
|
|
// Test values around 100, 1000, 10000, ...
|
|
T ten_power = 100;
|
|
for(int e = 2; e <= limits::digits10; ++e, ten_power *= 10)
|
|
{
|
|
// ten_power + 100 probably never overflows
|
|
for(t = ten_power - 100; t != ten_power + 100; ++t)
|
|
BOOST_CHECK(lexical_cast<string_type>(t) == to_str<CharT>(t));
|
|
}
|
|
}
|
|
}
|
|
|
|
template<class T, class CharT>
|
|
void test_conversion_from_string_to_integral(CharT)
|
|
{
|
|
typedef std::numeric_limits<T> limits;
|
|
|
|
T t;
|
|
|
|
t = (limits::min)();
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
|
|
t = (limits::max)();
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
|
|
if(limits::digits <= 16 && lcast_test_small_integral_types_completely)
|
|
// min and max have already been tested.
|
|
for(t = 1 + (limits::min)(); t != (limits::max)(); ++t)
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
else
|
|
{
|
|
T const min_val = (limits::min)();
|
|
T const max_val = (limits::max)();
|
|
T const half_max_val = max_val / 2;
|
|
T const cnt = lcast_integral_test_counter; // to supress warnings
|
|
unsigned int const counter = cnt < half_max_val ? cnt : half_max_val;
|
|
|
|
unsigned int i;
|
|
|
|
// Test values around min:
|
|
t = min_val;
|
|
for(i = 0; i < counter; ++i, ++t)
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
|
|
// Test values around max:
|
|
t = max_val;
|
|
for(i = 0; i < counter; ++i, --t)
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
|
|
// Test values around zero:
|
|
if(limits::is_signed)
|
|
for(t = -counter; t < static_cast<T>(counter); ++t)
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
|
|
// Test values around 100, 1000, 10000, ...
|
|
T ten_power = 100;
|
|
for(int e = 2; e <= limits::digits10; ++e, ten_power *= 10)
|
|
{
|
|
// ten_power + 100 probably never overflows
|
|
for(t = ten_power - 100; t != ten_power + 100; ++t)
|
|
BOOST_CHECK(lexical_cast<T>(to_str<CharT>(t)) == t);
|
|
}
|
|
}
|
|
}
|
|
|
|
template<class T>
|
|
void test_conversion_from_to_integral_for_locale()
|
|
{
|
|
test_conversion_from_integral_to_integral<T>();
|
|
test_conversion_from_integral_to_string<T>('0');
|
|
test_conversion_from_string_to_integral<T>('0');
|
|
#if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
test_conversion_from_integral_to_string<T>(L'0');
|
|
test_conversion_from_string_to_integral<T>(L'0');
|
|
#endif
|
|
}
|
|
|
|
struct restore_oldloc
|
|
{
|
|
std::locale oldloc;
|
|
~restore_oldloc() { std::locale::global(oldloc); }
|
|
};
|
|
|
|
template<class T>
|
|
void test_conversion_from_to_integral()
|
|
{
|
|
char const zero = '0';
|
|
signed char const szero = '0';
|
|
unsigned char const uzero = '0';
|
|
test_conversion_from_integral_to_char<T>(zero);
|
|
test_conversion_from_integral_to_char<T>(szero);
|
|
test_conversion_from_integral_to_char<T>(uzero);
|
|
#if !defined(DISABLE_WIDE_CHAR_SUPPORT) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
|
|
wchar_t const wzero = L'0';
|
|
test_conversion_from_integral_to_char<T>(wzero);
|
|
#endif
|
|
|
|
// test_conversion_from_to_integral_for_locale
|
|
|
|
typedef std::numpunct<char> numpunct;
|
|
|
|
restore_oldloc guard;
|
|
std::locale const& oldloc = guard.oldloc;
|
|
|
|
std::string grouping1 = BOOST_USE_FACET(numpunct, oldloc).grouping();
|
|
std::string grouping2(grouping1);
|
|
|
|
test_conversion_from_to_integral_for_locale<T>();
|
|
|
|
try
|
|
{
|
|
std::locale newloc("");
|
|
std::locale::global(newloc);
|
|
|
|
grouping2 = BOOST_USE_FACET(numpunct, newloc).grouping();
|
|
}
|
|
catch(std::exception const& ex)
|
|
{
|
|
std::string msg("Failed to set system locale: ");
|
|
msg += ex.what();
|
|
BOOST_TEST_MESSAGE(msg);
|
|
}
|
|
|
|
if(grouping1 != grouping2)
|
|
test_conversion_from_to_integral_for_locale<T>();
|
|
|
|
if(grouping1.empty() && grouping2.empty())
|
|
BOOST_TEST_MESSAGE("Formatting with thousands_sep has not been tested");
|
|
}
|
|
|
|
void test_conversion_from_to_short()
|
|
{
|
|
test_conversion_from_to_integral<short>();
|
|
}
|
|
|
|
void test_conversion_from_to_ushort()
|
|
{
|
|
test_conversion_from_to_integral<unsigned short>();
|
|
}
|
|
|
|
void test_conversion_from_to_int()
|
|
{
|
|
test_conversion_from_to_integral<int>();
|
|
}
|
|
|
|
void test_conversion_from_to_uint()
|
|
{
|
|
test_conversion_from_to_integral<unsigned int>();
|
|
}
|
|
|
|
void test_conversion_from_to_ulong()
|
|
{
|
|
test_conversion_from_to_integral<unsigned long>();
|
|
}
|
|
|
|
void test_conversion_from_to_long()
|
|
{
|
|
test_conversion_from_to_integral<long>();
|
|
}
|
|
|
|
#if defined(BOOST_HAS_LONG_LONG)
|
|
|
|
void test_conversion_from_to_longlong()
|
|
{
|
|
test_conversion_from_to_integral<boost::long_long_type>();
|
|
}
|
|
|
|
void test_conversion_from_to_ulonglong()
|
|
{
|
|
test_conversion_from_to_integral<boost::ulong_long_type>();
|
|
}
|
|
|
|
#elif defined(LCAST_TEST_LONGLONG)
|
|
|
|
void test_conversion_from_to_longlong()
|
|
{
|
|
test_conversion_from_to_integral<__int64>();
|
|
}
|
|
|
|
void test_conversion_from_to_ulonglong()
|
|
{
|
|
test_conversion_from_to_integral<unsigned __int64>();
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
|
void test_traits()
|
|
{
|
|
typedef std::basic_string<char, my_traits<char> > my_string;
|
|
|
|
my_string const s("s");
|
|
BOOST_CHECK(boost::lexical_cast<char>(s) == s[0]);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(s) == s);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(-1) == "-1");
|
|
}
|
|
|
|
void test_wtraits()
|
|
{
|
|
typedef std::basic_string<wchar_t, my_traits<wchar_t> > my_string;
|
|
|
|
my_string const s(L"s");
|
|
BOOST_CHECK(boost::lexical_cast<wchar_t>(s) == s[0]);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(s) == s);
|
|
//BOOST_CHECK(boost::lexical_cast<my_string>(-1) == L"-1");
|
|
// Commented out because gcc 3.3 doesn't support this:
|
|
// basic_ostream<wchar_t, my_traits<wchar_t> > o; o << -1;
|
|
}
|
|
|
|
void test_allocator()
|
|
{
|
|
typedef std::basic_string< char
|
|
, std::char_traits<char>
|
|
, my_allocator<char>
|
|
> my_string;
|
|
|
|
my_string s("s");
|
|
BOOST_CHECK(boost::lexical_cast<char>(s) == s[0]);
|
|
BOOST_CHECK(boost::lexical_cast<std::string>(s) == "s");
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(s) == s);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(1) == "1");
|
|
BOOST_CHECK(boost::lexical_cast<my_string>("s") == s);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(std::string("s")) == s);
|
|
}
|
|
|
|
void test_wallocator()
|
|
{
|
|
typedef std::basic_string< wchar_t
|
|
, std::char_traits<wchar_t>
|
|
, my_allocator<wchar_t>
|
|
> my_string;
|
|
|
|
my_string s(L"s");
|
|
BOOST_CHECK(boost::lexical_cast<wchar_t>(s) == s[0]);
|
|
BOOST_CHECK(boost::lexical_cast<std::wstring>(s) == L"s");
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(s) == s);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(1) == L"1");
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(L"s") == s);
|
|
BOOST_CHECK(boost::lexical_cast<my_string>(std::wstring(L"s")) == s);
|
|
}
|
|
|
|
#endif
|
|
|