• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  Unit test for boost::lexical_cast.
2 //
3 //  See http://www.boost.org for most recent version, including documentation.
4 //
5 //  Copyright Antony Polukhin, 2012-2020.
6 //
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).
10 
11 #include <boost/config.hpp>
12 
13 #include <boost/lexical_cast/detail/converter_lexical.hpp>
14 
15 #include <boost/test/unit_test.hpp>
16 
17 template <class T>
test_optimized_types_to_string_const()18 static void test_optimized_types_to_string_const()
19 {
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);
28 
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);
36 
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));
42 
43     BOOST_CHECK((boost::detail::is_character<BOOST_DEDUCED_TYPENAME trait_3::no_cv_src>::value != trait_3::is_string_widening_required_t::value));
44 
45     BOOST_CHECK(!trait_3::is_source_input_not_optimized_t::value);
46 }
47 
48 
49 template <class T>
test_optimized_types_to_string()50 static void test_optimized_types_to_string()
51 {
52     test_optimized_types_to_string_const<T>();
53 
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);
62 
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);
70 
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);
77 }
78 
test_metafunctions()79 void test_metafunctions()
80 {
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>();
91 
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>();
98 #endif
99 
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*> >();
119 
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*> >();
129 
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> >();
137 
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> >();
144 #endif
145 }
146 
init_unit_test_suite(int,char * [])147 boost::unit_test::test_suite *init_unit_test_suite(int, char *[])
148 {
149     boost::unit_test::test_suite *suite =
150         BOOST_TEST_SUITE("lexical_cast traits tests");
151     suite->add(BOOST_TEST_CASE(&test_metafunctions));
152     return suite;
153 }
154 
155