1 // Unit test for boost::lexical_cast.
3 // See http://www.boost.org for most recent version, including documentation.
5 // Copyright Terje Sletteb and Kevlin Henney, 2005.
6 // Copyright Alexander Nasonov, 2006.
7 // Copyright Antony Polukhin, 2011-2022.
9 // Distributed under the Boost
10 // Software License, Version 1.0. (See accompanying file
11 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt).
13 // Note: The unit test no longer compile on MSVC 6, but lexical_cast itself works for it.
16 // We need this #define before any #includes: otherwise msvc will emit warnings
17 // deep within std::string, resulting from our (perfectly legal) use of basic_string
18 // with a custom traits class:
20 #define _SCL_SECURE_NO_WARNINGS
22 #include <boost/config.hpp>
24 #if defined(__INTEL_COMPILER)
25 #pragma warning(disable: 193 383 488 981 1418 1419)
26 #elif defined(BOOST_MSVC)
27 #pragma warning(disable: 4097 4100 4121 4127 4146 4244 4245 4511 4512 4701 4800)
30 #include <boost/lexical_cast.hpp>
32 #include <boost/cstdint.hpp>
33 #include <boost/test/unit_test.hpp>
34 #include <boost/test/tools/floating_point_comparison.hpp>
36 #include <boost/type_traits/integral_promotion.hpp>
37 #include <boost/type_traits/make_unsigned.hpp>
42 #if (defined(BOOST_HAS_LONG_LONG) || defined(BOOST_HAS_MS_INT64)) \
43 && !(defined(BOOST_MSVC) && BOOST_MSVC < 1300)
44 #define LCAST_TEST_LONGLONG
47 #if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
48 #define BOOST_LCAST_NO_WCHAR_T
51 #if defined(BOOST_HAS_INT128) && !defined(BOOST_LEXICAL_CAST_TEST_NO_128_INTS)
52 # define BOOST_LCAST_TEST_128 1
55 // Test all 65536 values if true:
56 bool const lcast_test_small_integral_types_completely
= false;
58 // lcast_integral_test_counter: use when testing all values of an integral
59 // types is not possible. Max. portable value is 32767.
60 int const lcast_integral_test_counter
=500;
62 using namespace boost
;
66 void test_conversion_from_to_short();
67 void test_conversion_from_to_ushort();
68 void test_conversion_from_to_int();
69 void test_conversion_from_to_uint();
70 void test_conversion_from_to_long();
71 void test_conversion_from_to_ulong();
72 void test_conversion_from_to_intmax_t();
73 void test_conversion_from_to_uintmax_t();
74 #ifdef LCAST_TEST_LONGLONG
75 void test_conversion_from_to_longlong();
76 void test_conversion_from_to_ulonglong();
78 #ifdef BOOST_LCAST_TEST_128
79 void test_conversion_from_to_int128();
80 void test_conversion_from_to_uint128();
82 void test_integral_conversions_on_min_max();
85 unit_test::test_suite
*init_unit_test_suite(int, char *[])
87 unit_test::test_suite
*suite
=
88 BOOST_TEST_SUITE("lexical_cast unit test on integral types");
90 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_short
));
91 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_ushort
));
92 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_int
));
93 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_uint
));
94 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_long
));
95 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_ulong
));
96 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_intmax_t
));
97 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_uintmax_t
));
98 #ifdef LCAST_TEST_LONGLONG
99 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_longlong
));
100 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_ulonglong
));
102 #ifdef BOOST_LCAST_TEST_128
103 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_int128
));
104 suite
->add(BOOST_TEST_CASE(&test_conversion_from_to_uint128
));
106 suite
->add(BOOST_TEST_CASE(&test_integral_conversions_on_min_max
));
111 template<class T
, class CharT
>
112 void test_conversion_from_integral_to_char(CharT zero
)
114 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(0)) == zero
+ 0);
115 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(1)) == zero
+ 1);
116 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(2)) == zero
+ 2);
117 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(3)) == zero
+ 3);
118 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(4)) == zero
+ 4);
119 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(5)) == zero
+ 5);
120 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(6)) == zero
+ 6);
121 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(7)) == zero
+ 7);
122 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(8)) == zero
+ 8);
123 BOOST_CHECK(lexical_cast
<CharT
>(static_cast<T
>(9)) == zero
+ 9);
125 BOOST_CHECK_THROW(lexical_cast
<CharT
>(static_cast<T
>(10)), bad_lexical_cast
);
127 T t
= (std::numeric_limits
<T
>::max
)();
128 BOOST_CHECK_THROW(lexical_cast
<CharT
>(t
), bad_lexical_cast
);
131 template<class T
, class CharT
>
132 void test_conversion_from_char_to_integral(CharT zero
)
134 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 0)) == static_cast<T
>(0) );
135 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 1)) == static_cast<T
>(1) );
136 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 2)) == static_cast<T
>(2) );
137 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 3)) == static_cast<T
>(3) );
138 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 4)) == static_cast<T
>(4) );
139 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 5)) == static_cast<T
>(5) );
140 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 6)) == static_cast<T
>(6) );
141 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 7)) == static_cast<T
>(7) );
142 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 8)) == static_cast<T
>(8) );
143 BOOST_CHECK(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 9)) == static_cast<T
>(9) );
145 BOOST_CHECK_THROW(lexical_cast
<T
>( static_cast<CharT
>(zero
+ 10)), bad_lexical_cast
);
146 BOOST_CHECK_THROW(lexical_cast
<T
>( static_cast<CharT
>(zero
- 1)), bad_lexical_cast
);
150 void test_conversion_from_integral_to_integral()
153 BOOST_CHECK(lexical_cast
<T
>(t
) == t
);
155 // Next two variables are used to suppress warnings.
156 int st
= 32767; unsigned int ut
= st
;
158 BOOST_CHECK(lexical_cast
<short>(t
) == st
);
159 BOOST_CHECK(lexical_cast
<unsigned short>(t
) == ut
);
160 BOOST_CHECK(lexical_cast
<int>(t
) == st
);
161 BOOST_CHECK(lexical_cast
<unsigned int>(t
) == ut
);
162 BOOST_CHECK(lexical_cast
<long>(t
) == st
);
163 BOOST_CHECK(lexical_cast
<unsigned long>(t
) == ut
);
165 t
= (std::numeric_limits
<T
>::max
)();
166 BOOST_CHECK(lexical_cast
<T
>(t
) == t
);
168 t
= (std::numeric_limits
<T
>::min
)();
169 BOOST_CHECK(lexical_cast
<T
>(t
) == t
);
175 // Replace "-,999" with "-999".
176 template<class CharT
>
177 std::basic_string
<CharT
> to_str_gcc_workaround(std::basic_string
<CharT
> str
)
180 std::numpunct
<CharT
> const& np
= BOOST_USE_FACET(std::numpunct
<CharT
>, loc
);
181 std::ctype
<CharT
> const& ct
= BOOST_USE_FACET(std::ctype
<CharT
>, loc
);
183 if(np
.grouping().empty())
186 CharT prefix
[3] = { ct
.widen('-'), np
.thousands_sep(), CharT() };
188 if(str
.find(prefix
) != 0)
192 str
.replace(0, 2, prefix
);
196 template<class CharT
, class T
>
197 std::basic_string
<CharT
> to_str(T t
)
199 std::basic_ostringstream
<CharT
> o
;
201 return to_str_gcc_workaround(o
.str());
205 template<class T
, class CharT
>
206 void test_conversion_from_integral_to_string(CharT
)
208 typedef std::numeric_limits
<T
> limits
;
209 typedef std::basic_string
<CharT
> string_type
;
214 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
217 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
219 if(limits::digits
<= 16 && lcast_test_small_integral_types_completely
)
220 // min and max have already been tested.
221 for(t
= 1 + (limits::min
)(); t
!= (limits::max
)(); ++t
)
222 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
225 T
const min_val
= (limits::min
)();
226 T
const max_val
= (limits::max
)();
227 T
const half_max_val
= max_val
/ 2;
228 T
const cnt
= lcast_integral_test_counter
; // to suppress warnings
229 unsigned int const counter
= cnt
< half_max_val
? cnt
: half_max_val
;
233 // Test values around min:
235 for(i
= 0; i
< counter
; ++i
, ++t
)
236 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
238 // Test values around max:
240 for(i
= 0; i
< counter
; ++i
, --t
)
241 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
243 // Test values around zero:
244 if(limits::is_signed
)
245 for(t
= static_cast<T
>(-counter
); t
< static_cast<T
>(counter
); ++t
)
246 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
248 // Test values around 100, 1000, 10000, ...
250 for(int e
= 2; e
< limits::digits10
; ++e
, ten_power
*= 10)
252 // ten_power + 100 probably never overflows
253 for(t
= ten_power
- 100; t
!= ten_power
+ 100; ++t
)
254 BOOST_CHECK(lexical_cast
<string_type
>(t
) == to_str
<CharT
>(t
));
259 template<class T
, class CharT
>
260 void test_conversion_from_string_to_integral(CharT
)
262 typedef std::numeric_limits
<T
> limits
;
263 typedef std::basic_string
<CharT
> string_type
;
266 string_type
const zero
= to_str
<CharT
>(0);
267 string_type
const nine
= to_str
<CharT
>(9);
268 T
const min_val
= (limits::min
)();
269 T
const max_val
= (limits::max
)();
271 s
= to_str
<CharT
>(min_val
);
272 BOOST_CHECK_EQUAL(lexical_cast
<T
>(s
), min_val
);
273 if(limits::is_signed
)
275 BOOST_CHECK_THROW(lexical_cast
<T
>(s
+ zero
), bad_lexical_cast
);
276 BOOST_CHECK_THROW(lexical_cast
<T
>(s
+ nine
), bad_lexical_cast
);
279 s
= to_str
<CharT
>(max_val
);
280 BOOST_CHECK_EQUAL(lexical_cast
<T
>(s
), max_val
);
282 BOOST_CHECK_THROW(lexical_cast
<T
>(s
+ zero
), bad_lexical_cast
);
283 BOOST_CHECK_THROW(lexical_cast
<T
>(s
+ nine
), bad_lexical_cast
);
285 s
= to_str
<CharT
>(max_val
);
286 for (int i
=1; i
<=10; ++i
) {
288 BOOST_CHECK_THROW(lexical_cast
<T
>( s
), bad_lexical_cast
);
291 s
= to_str
<CharT
>(max_val
);
293 typedef std::numpunct
<char> numpunct
;
294 if ( BOOST_USE_FACET(numpunct
, loc
).grouping().empty() ) {
295 // Following tests work well for locale C
296 BOOST_CHECK_EQUAL(lexical_cast
<T
>(to_str
<CharT
>(0)+s
), max_val
);
297 BOOST_CHECK_EQUAL(lexical_cast
<T
>(to_str
<CharT
>(0)+to_str
<CharT
>(0)+s
), max_val
);
298 BOOST_CHECK_EQUAL(lexical_cast
<T
>(to_str
<CharT
>(0)+to_str
<CharT
>(0)+to_str
<CharT
>(0)+s
), max_val
);
301 for (int i
=1; i
<=256; ++i
) {
302 BOOST_CHECK_THROW(lexical_cast
<T
>( to_str
<CharT
>(i
)+s
), bad_lexical_cast
);
305 typedef BOOST_DEDUCED_TYPENAME
boost::integral_promotion
<T
>::type promoted
;
306 if ( !(boost::is_same
<T
, promoted
>::value
) )
308 promoted prom
= max_val
;
309 s
= to_str
<CharT
>(max_val
);
310 for (int i
=1; i
<=256; ++i
) {
311 BOOST_CHECK_THROW(lexical_cast
<T
>( to_str
<CharT
>(prom
+i
) ), bad_lexical_cast
);
312 BOOST_CHECK_THROW(lexical_cast
<T
>( to_str
<CharT
>(i
)+s
), bad_lexical_cast
);
317 if(limits::digits
<= 16 && lcast_test_small_integral_types_completely
)
318 // min and max have already been tested.
319 for(T t
= 1 + min_val
; t
!= max_val
; ++t
)
320 BOOST_CHECK(lexical_cast
<T
>(to_str
<CharT
>(t
)) == t
);
323 T
const half_max_val
= max_val
/ 2;
324 T
const cnt
= lcast_integral_test_counter
; // to suppress warnings
325 unsigned int const counter
= cnt
< half_max_val
? cnt
: half_max_val
;
330 // Test values around min:
332 for(i
= 0; i
< counter
; ++i
, ++t
)
333 BOOST_CHECK(lexical_cast
<T
>(to_str
<CharT
>(t
)) == t
);
335 // Test values around max:
337 for(i
= 0; i
< counter
; ++i
, --t
)
338 BOOST_CHECK(lexical_cast
<T
>(to_str
<CharT
>(t
)) == t
);
340 // Test values around zero:
341 if(limits::is_signed
)
342 for(t
= static_cast<T
>(-counter
); t
< static_cast<T
>(counter
); ++t
)
343 BOOST_CHECK(lexical_cast
<T
>(to_str
<CharT
>(t
)) == t
);
345 // Test values around 100, 1000, 10000, ...
347 for(int e
= 2; e
< limits::digits10
; ++e
, ten_power
*= 10)
349 // ten_power + 100 probably never overflows
350 for(t
= ten_power
- 100; t
!= ten_power
+ 100; ++t
)
351 BOOST_CHECK(lexical_cast
<T
>(to_str
<CharT
>(t
)) == t
);
357 void test_conversion_from_to_integral_for_locale()
359 std::locale current_locale
;
360 typedef std::numpunct
<char> numpunct
;
361 numpunct
const& np
= BOOST_USE_FACET(numpunct
, current_locale
);
362 if ( !np
.grouping().empty() )
365 lexical_cast
<T
>( std::string("100") + np
.thousands_sep() + np
.thousands_sep() + "0" )
367 BOOST_CHECK_THROW(lexical_cast
<T
>( std::string("100") + np
.thousands_sep() ), bad_lexical_cast
);
368 BOOST_CHECK_THROW(lexical_cast
<T
>( np
.thousands_sep() + std::string("100") ), bad_lexical_cast
);
370 // Exception must not be thrown, when we are using no separators at all
371 BOOST_CHECK( lexical_cast
<T
>("30000") == static_cast<T
>(30000) );
375 test_conversion_from_integral_to_integral
<T
>();
377 // This is a part of test_conversion_from_integral_to_string<T>('0') method,
378 // but with BOOST_CHECK_EQUAL instead of BOOST_CHECK. It is required to see
379 // what is produced by the to_str<char>(t) method in situations when result
380 // is different. BOOST_CHECK does not work with wchar_t.
381 typedef std::numeric_limits
<T
> limits
;
382 T t
= (limits::min
)();
383 BOOST_CHECK_EQUAL(lexical_cast
<std::string
>(t
), to_str
<char>(t
));
385 test_conversion_from_integral_to_string
<T
>('0');
386 test_conversion_from_string_to_integral
<T
>('0');
387 #if !defined(BOOST_LCAST_NO_WCHAR_T)
388 if (lexical_cast
<std::wstring
>(t
) != to_str
<wchar_t>(t
)) {
389 // Something went wrong, and now we are attempting to find and print the
391 std::wstring wstr
= to_str
<wchar_t>(t
);
392 std::string lcast_str
= lexical_cast
<std::string
>(t
);
394 str
.reserve(wstr
.size());
395 for (std::size_t i
= 0; i
< wstr
.size(); ++i
) {
396 str
.push_back(static_cast<char>(wstr
[i
]));
399 BOOST_CHECK_EQUAL(lcast_str
.length(), lexical_cast
<std::wstring
>(t
).length());
400 BOOST_CHECK_EQUAL(to_str
<char>(t
), str
);
401 BOOST_CHECK_EQUAL(lcast_str
, str
);
404 test_conversion_from_integral_to_string
<T
>(L
'0');
405 test_conversion_from_string_to_integral
<T
>(L
'0');
409 struct restore_oldloc
412 ~restore_oldloc() { std::locale::global(oldloc
); }
416 void test_conversion_from_to_integral_minimal()
418 char const zero
= '0';
419 signed char const szero
= '0';
420 unsigned char const uzero
= '0';
421 test_conversion_from_integral_to_char
<T
>(zero
);
422 test_conversion_from_char_to_integral
<T
>(zero
);
423 test_conversion_from_integral_to_char
<T
>(szero
);
424 test_conversion_from_char_to_integral
<T
>(szero
);
425 test_conversion_from_integral_to_char
<T
>(uzero
);
426 test_conversion_from_char_to_integral
<T
>(uzero
);
427 #if !defined(BOOST_LCAST_NO_WCHAR_T) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
428 wchar_t const wzero
= L
'0';
429 test_conversion_from_integral_to_char
<T
>(wzero
);
430 test_conversion_from_char_to_integral
<T
>(wzero
);
432 #if !defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(_LIBCPP_VERSION) && !defined(BOOST_MSVC)
433 char16_t
const u16zero
= u
'0';
434 test_conversion_from_integral_to_char
<T
>(u16zero
);
435 test_conversion_from_char_to_integral
<T
>(u16zero
);
437 #if !defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(_LIBCPP_VERSION) && !defined(BOOST_MSVC)
438 char32_t
const u32zero
= u
'0';
439 test_conversion_from_integral_to_char
<T
>(u32zero
);
440 test_conversion_from_char_to_integral
<T
>(u32zero
);
443 BOOST_CHECK(lexical_cast
<T
>("-1") == static_cast<T
>(-1));
444 BOOST_CHECK(lexical_cast
<T
>("-9") == static_cast<T
>(-9));
445 BOOST_CHECK(lexical_cast
<T
>(-1) == static_cast<T
>(-1));
446 BOOST_CHECK(lexical_cast
<T
>(-9) == static_cast<T
>(-9));
448 BOOST_CHECK_THROW(lexical_cast
<T
>("-1.0"), bad_lexical_cast
);
449 BOOST_CHECK_THROW(lexical_cast
<T
>("-9.0"), bad_lexical_cast
);
450 BOOST_CHECK(lexical_cast
<T
>(-1.0) == static_cast<T
>(-1));
451 BOOST_CHECK(lexical_cast
<T
>(-9.0) == static_cast<T
>(-9));
453 BOOST_CHECK(lexical_cast
<T
>(static_cast<T
>(1)) == static_cast<T
>(1));
454 BOOST_CHECK(lexical_cast
<T
>(static_cast<T
>(9)) == static_cast<T
>(9));
455 BOOST_CHECK_THROW(lexical_cast
<T
>(1.1f
), bad_lexical_cast
);
456 BOOST_CHECK_THROW(lexical_cast
<T
>(1.1), bad_lexical_cast
);
457 BOOST_CHECK_THROW(lexical_cast
<T
>(1.1L), bad_lexical_cast
);
458 BOOST_CHECK_THROW(lexical_cast
<T
>(1.0001f
), bad_lexical_cast
);
459 BOOST_CHECK_THROW(lexical_cast
<T
>(1.0001), bad_lexical_cast
);
460 BOOST_CHECK_THROW(lexical_cast
<T
>(1.0001L), bad_lexical_cast
);
462 BOOST_CHECK(lexical_cast
<T
>("+1") == static_cast<T
>(1) );
463 BOOST_CHECK(lexical_cast
<T
>("+9") == static_cast<T
>(9) );
464 BOOST_CHECK(lexical_cast
<T
>("+10") == static_cast<T
>(10) );
465 BOOST_CHECK(lexical_cast
<T
>("+90") == static_cast<T
>(90) );
466 BOOST_CHECK_THROW(lexical_cast
<T
>("++1"), bad_lexical_cast
);
467 BOOST_CHECK_THROW(lexical_cast
<T
>("-+9"), bad_lexical_cast
);
468 BOOST_CHECK_THROW(lexical_cast
<T
>("--1"), bad_lexical_cast
);
469 BOOST_CHECK_THROW(lexical_cast
<T
>("+-9"), bad_lexical_cast
);
470 // test_conversion_from_to_integral_for_locale
472 // Overflow test case from David W. Birdsall
473 std::string must_owerflow_str
= (sizeof(T
) < 16 ? "160000000000000000000" : "1600000000000000000000000000000000000000");
474 std::string must_owerflow_negative_str
= (sizeof(T
) < 16 ? "-160000000000000000000" : "-1600000000000000000000000000000000000000");
475 for (int i
= 0; i
< 15; ++i
) {
476 BOOST_CHECK_THROW(lexical_cast
<T
>(must_owerflow_str
), bad_lexical_cast
);
477 BOOST_CHECK_THROW(lexical_cast
<T
>(must_owerflow_negative_str
), bad_lexical_cast
);
479 must_owerflow_str
+= '0';
480 must_owerflow_negative_str
+= '0';
485 void test_conversion_from_to_integral()
487 test_conversion_from_to_integral_minimal
<T
>();
488 typedef std::numpunct
<char> numpunct
;
490 restore_oldloc guard
;
491 std::locale
const& oldloc
= guard
.oldloc
;
493 std::string grouping1
= BOOST_USE_FACET(numpunct
, oldloc
).grouping();
494 std::string
grouping2(grouping1
);
496 test_conversion_from_to_integral_for_locale
<T
>();
500 std::locale
newloc("");
501 std::locale::global(newloc
);
503 grouping2
= BOOST_USE_FACET(numpunct
, newloc
).grouping();
505 catch(std::exception
const& ex
)
507 std::string
msg("Failed to set system locale: ");
509 BOOST_TEST_MESSAGE(msg
);
512 if(grouping1
!= grouping2
)
513 test_conversion_from_to_integral_for_locale
<T
>();
515 if(grouping1
.empty() && grouping2
.empty())
516 BOOST_TEST_MESSAGE("Formatting with thousands_sep has not been tested");
519 void test_conversion_from_to_short()
521 test_conversion_from_to_integral
<short>();
524 void test_conversion_from_to_ushort()
526 test_conversion_from_to_integral
<unsigned short>();
529 void test_conversion_from_to_int()
531 test_conversion_from_to_integral
<int>();
534 void test_conversion_from_to_uint()
536 test_conversion_from_to_integral
<unsigned int>();
539 void test_conversion_from_to_long()
541 test_conversion_from_to_integral
<long>();
544 void test_conversion_from_to_ulong()
546 test_conversion_from_to_integral
<unsigned long>();
549 void test_conversion_from_to_intmax_t()
551 test_conversion_from_to_integral
<boost::intmax_t>();
554 void test_conversion_from_to_uintmax_t()
556 test_conversion_from_to_integral
<boost::uintmax_t>();
559 #if defined(BOOST_HAS_LONG_LONG)
561 void test_conversion_from_to_longlong()
563 test_conversion_from_to_integral
<boost::long_long_type
>();
566 void test_conversion_from_to_ulonglong()
568 test_conversion_from_to_integral
<boost::ulong_long_type
>();
571 #elif defined(BOOST_HAS_MS_INT64)
573 void test_conversion_from_to_longlong()
575 test_conversion_from_to_integral
<__int64
>();
578 void test_conversion_from_to_ulonglong()
580 test_conversion_from_to_integral
<unsigned __int64
>();
586 #ifdef BOOST_LCAST_TEST_128
588 template <bool Specialized
, class T
>
589 struct test_if_specialized
{
590 static void test() {}
594 struct test_if_specialized
<true, T
> {
596 test_conversion_from_to_integral_minimal
<T
>();
600 void test_conversion_from_to_int128()
603 std::numeric_limits
<boost::int128_type
>::is_specialized
,
608 void test_conversion_from_to_uint128()
611 std::numeric_limits
<boost::int128_type
>::is_specialized
,
617 template <typename SignedT
>
618 void test_integral_conversions_on_min_max_impl()
620 typedef SignedT signed_t
;
621 typedef BOOST_DEDUCED_TYPENAME
boost::make_unsigned
<signed_t
>::type unsigned_t
;
623 typedef std::numeric_limits
<signed_t
> s_limits
;
624 typedef std::numeric_limits
<unsigned_t
> uns_limits
;
626 BOOST_CHECK_EQUAL(lexical_cast
<unsigned_t
>((uns_limits::max
)()), (uns_limits::max
)());
627 BOOST_CHECK_EQUAL(lexical_cast
<unsigned_t
>((uns_limits::min
)()), (uns_limits::min
)());
629 BOOST_CHECK_EQUAL(lexical_cast
<signed_t
>((s_limits::max
)()), (s_limits::max
)());
630 BOOST_CHECK_EQUAL(lexical_cast
<signed_t
>((uns_limits::min
)()), static_cast<signed_t
>((uns_limits::min
)()));
632 BOOST_CHECK_EQUAL(lexical_cast
<unsigned_t
>((s_limits::max
)()), static_cast<unsigned_t
>((s_limits::max
)()));
633 BOOST_CHECK_EQUAL(lexical_cast
<unsigned_t
>((s_limits::min
)()), static_cast<unsigned_t
>((s_limits::min
)()));
636 void test_integral_conversions_on_min_max()
638 test_integral_conversions_on_min_max_impl
<int>();
639 test_integral_conversions_on_min_max_impl
<short>();
642 test_integral_conversions_on_min_max_impl
<long int>();
644 #if defined(BOOST_HAS_LONG_LONG)
645 test_integral_conversions_on_min_max_impl
<boost::long_long_type
>();
646 #elif defined(BOOST_HAS_MS_INT64)
647 test_integral_conversions_on_min_max_impl
<__int64
>();
650 #ifdef BOOST_LCAST_TEST_128
651 test_integral_conversions_on_min_max_impl
<boost::int128_type
>();