1 // Unit test for boost::lexical_cast.
3 // See http://www.boost.org for most recent version, including documentation.
5 // Copyright Antony Polukhin, 2012-2020.
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).
11 #include <boost/config.hpp>
13 #include <boost/lexical_cast/detail/converter_lexical.hpp>
15 #include <boost/test/unit_test.hpp>
18 static void test_optimized_types_to_string_const()
20 namespace de
= boost::detail
;
21 typedef de::lexical_cast_stream_traits
<T
, std::string
> trait_1
;
22 BOOST_CHECK(!trait_1::is_source_input_not_optimized_t::value
);
23 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_1::src_char_t
, char>::value
));
24 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_1::target_char_t
, char>::value
));
25 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_1::char_type
, char>::value
));
26 BOOST_CHECK(!trait_1::is_string_widening_required_t::value
);
27 BOOST_CHECK(!trait_1::is_source_input_not_optimized_t::value
);
29 typedef de::lexical_cast_stream_traits
<const T
, std::string
> trait_2
;
30 BOOST_CHECK(!trait_2::is_source_input_not_optimized_t::value
);
31 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_2::src_char_t
, char>::value
));
32 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_2::target_char_t
, char>::value
));
33 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_2::char_type
, char>::value
));
34 BOOST_CHECK(!trait_2::is_string_widening_required_t::value
);
35 BOOST_CHECK(!trait_2::is_source_input_not_optimized_t::value
);
37 typedef de::lexical_cast_stream_traits
<T
, std::wstring
> trait_3
;
38 BOOST_CHECK(!trait_3::is_source_input_not_optimized_t::value
);
39 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_3::src_char_t
, char>::value
));
40 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_3::target_char_t
, wchar_t>::value
));
41 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_3::char_type
, wchar_t>::value
));
43 BOOST_CHECK((boost::detail::is_character
<BOOST_DEDUCED_TYPENAME
trait_3::no_cv_src
>::value
!= trait_3::is_string_widening_required_t::value
));
45 BOOST_CHECK(!trait_3::is_source_input_not_optimized_t::value
);
50 static void test_optimized_types_to_string()
52 test_optimized_types_to_string_const
<T
>();
54 namespace de
= boost::detail
;
55 typedef de::lexical_cast_stream_traits
<std::string
, T
> trait_4
;
56 BOOST_CHECK(!trait_4::is_source_input_not_optimized_t::value
);
57 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_4::src_char_t
, char>::value
));
58 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_4::target_char_t
, char>::value
));
59 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_4::char_type
, char>::value
));
60 BOOST_CHECK(!trait_4::is_string_widening_required_t::value
);
61 BOOST_CHECK(!trait_4::is_source_input_not_optimized_t::value
);
63 typedef de::lexical_cast_stream_traits
<const std::string
, T
> trait_5
;
64 BOOST_CHECK(!trait_5::is_source_input_not_optimized_t::value
);
65 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_5::src_char_t
, char>::value
));
66 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_5::target_char_t
, char>::value
));
67 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_5::char_type
, char>::value
));
68 BOOST_CHECK(!trait_5::is_string_widening_required_t::value
);
69 BOOST_CHECK(!trait_5::is_source_input_not_optimized_t::value
);
71 typedef de::lexical_cast_stream_traits
<const std::wstring
, T
> trait_6
;
72 BOOST_CHECK(!trait_6::is_source_input_not_optimized_t::value
);
73 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_6::src_char_t
, wchar_t>::value
));
74 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_6::target_char_t
, char>::value
));
75 BOOST_CHECK((boost::is_same
<BOOST_DEDUCED_TYPENAME
trait_6::char_type
, wchar_t>::value
));
76 BOOST_CHECK(!trait_6::is_string_widening_required_t::value
);
79 void test_metafunctions()
81 test_optimized_types_to_string
<bool>();
82 test_optimized_types_to_string
<char>();
83 test_optimized_types_to_string
<unsigned char>();
84 test_optimized_types_to_string
<signed char>();
85 test_optimized_types_to_string
<short>();
86 test_optimized_types_to_string
<unsigned short>();
87 test_optimized_types_to_string
<int>();
88 test_optimized_types_to_string
<unsigned int>();
89 test_optimized_types_to_string
<long>();
90 test_optimized_types_to_string
<unsigned long>();
92 #if defined(BOOST_HAS_LONG_LONG)
93 test_optimized_types_to_string
<boost::ulong_long_type
>();
94 test_optimized_types_to_string
<boost::long_long_type
>();
95 #elif defined(BOOST_HAS_MS_INT64)
96 test_optimized_types_to_string
<unsigned __int64
>();
97 test_optimized_types_to_string
<__int64
>();
100 test_optimized_types_to_string
<std::string
>();
101 test_optimized_types_to_string
<char*>();
102 //test_optimized_types_to_string<char[5]>();
103 //test_optimized_types_to_string<char[1]>();
104 test_optimized_types_to_string
<unsigned char*>();
105 //test_optimized_types_to_string<unsigned char[5]>();
106 //test_optimized_types_to_string<unsigned char[1]>();
107 test_optimized_types_to_string
<signed char*>();
108 //test_optimized_types_to_string<signed char[5]>();
109 //test_optimized_types_to_string<signed char[1]>();
110 test_optimized_types_to_string
<boost::array
<char, 1> >();
111 test_optimized_types_to_string
<boost::array
<char, 5> >();
112 test_optimized_types_to_string
<boost::array
<unsigned char, 1> >();
113 test_optimized_types_to_string
<boost::array
<unsigned char, 5> >();
114 test_optimized_types_to_string
<boost::array
<signed char, 1> >();
115 test_optimized_types_to_string
<boost::array
<signed char, 5> >();
116 test_optimized_types_to_string
<boost::iterator_range
<char*> >();
117 test_optimized_types_to_string
<boost::iterator_range
<unsigned char*> >();
118 test_optimized_types_to_string
<boost::iterator_range
<signed char*> >();
120 test_optimized_types_to_string_const
<boost::array
<const char, 1> >();
121 test_optimized_types_to_string_const
<boost::array
<const char, 5> >();
122 test_optimized_types_to_string_const
<boost::array
<const unsigned char, 1> >();
123 test_optimized_types_to_string_const
<boost::array
<const unsigned char, 5> >();
124 test_optimized_types_to_string_const
<boost::array
<const signed char, 1> >();
125 test_optimized_types_to_string_const
<boost::array
<const signed char, 5> >();
126 test_optimized_types_to_string_const
<boost::iterator_range
<const char*> >();
127 test_optimized_types_to_string_const
<boost::iterator_range
<const unsigned char*> >();
128 test_optimized_types_to_string_const
<boost::iterator_range
<const signed char*> >();
130 #ifndef BOOST_NO_CXX11_HDR_ARRAY
131 test_optimized_types_to_string
<std::array
<char, 1> >();
132 test_optimized_types_to_string
<std::array
<char, 5> >();
133 test_optimized_types_to_string
<std::array
<unsigned char, 1> >();
134 test_optimized_types_to_string
<std::array
<unsigned char, 5> >();
135 test_optimized_types_to_string
<std::array
<signed char, 1> >();
136 test_optimized_types_to_string
<std::array
<signed char, 5> >();
138 test_optimized_types_to_string_const
<std::array
<const char, 1> >();
139 test_optimized_types_to_string_const
<std::array
<const char, 5> >();
140 test_optimized_types_to_string_const
<std::array
<const unsigned char, 1> >();
141 test_optimized_types_to_string_const
<std::array
<const unsigned char, 5> >();
142 test_optimized_types_to_string_const
<std::array
<const signed char, 1> >();
143 test_optimized_types_to_string_const
<std::array
<const signed char, 5> >();
147 boost::unit_test::test_suite
*init_unit_test_suite(int, char *[])
149 boost::unit_test::test_suite
*suite
=
150 BOOST_TEST_SUITE("lexical_cast traits tests");
151 suite
->add(BOOST_TEST_CASE(&test_metafunctions
));