lexical_cast_stream_traits_test.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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-2014.
  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. #include <boost/config.hpp>
  11. #include <boost/lexical_cast/detail/converter_lexical.hpp>
  12. #include <boost/test/unit_test.hpp>
  13. template <class T>
  14. static void test_optimized_types_to_string_const()
  15. {
  16. namespace de = boost::detail;
  17. typedef de::lexical_cast_stream_traits<T, std::string> trait_1;
  18. BOOST_CHECK(!trait_1::is_source_input_not_optimized_t::value);
  19. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_1::src_char_t, char>::value));
  20. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_1::target_char_t, char>::value));
  21. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_1::char_type, char>::value));
  22. BOOST_CHECK(!trait_1::is_string_widening_required_t::value);
  23. BOOST_CHECK(!trait_1::is_source_input_not_optimized_t::value);
  24. typedef de::lexical_cast_stream_traits<const T, std::string> trait_2;
  25. BOOST_CHECK(!trait_2::is_source_input_not_optimized_t::value);
  26. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_2::src_char_t, char>::value));
  27. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_2::target_char_t, char>::value));
  28. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_2::char_type, char>::value));
  29. BOOST_CHECK(!trait_2::is_string_widening_required_t::value);
  30. BOOST_CHECK(!trait_2::is_source_input_not_optimized_t::value);
  31. typedef de::lexical_cast_stream_traits<T, std::wstring> trait_3;
  32. BOOST_CHECK(!trait_3::is_source_input_not_optimized_t::value);
  33. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_3::src_char_t, char>::value));
  34. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_3::target_char_t, wchar_t>::value));
  35. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_3::char_type, wchar_t>::value));
  36. BOOST_CHECK((boost::detail::is_character<BOOST_DEDUCED_TYPENAME trait_3::no_cv_src>::value != trait_3::is_string_widening_required_t::value));
  37. BOOST_CHECK(!trait_3::is_source_input_not_optimized_t::value);
  38. }
  39. template <class T>
  40. static void test_optimized_types_to_string()
  41. {
  42. test_optimized_types_to_string_const<T>();
  43. namespace de = boost::detail;
  44. typedef de::lexical_cast_stream_traits<std::string, T> trait_4;
  45. BOOST_CHECK(!trait_4::is_source_input_not_optimized_t::value);
  46. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_4::src_char_t, char>::value));
  47. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_4::target_char_t, char>::value));
  48. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_4::char_type, char>::value));
  49. BOOST_CHECK(!trait_4::is_string_widening_required_t::value);
  50. BOOST_CHECK(!trait_4::is_source_input_not_optimized_t::value);
  51. typedef de::lexical_cast_stream_traits<const std::string, T> trait_5;
  52. BOOST_CHECK(!trait_5::is_source_input_not_optimized_t::value);
  53. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_5::src_char_t, char>::value));
  54. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_5::target_char_t, char>::value));
  55. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_5::char_type, char>::value));
  56. BOOST_CHECK(!trait_5::is_string_widening_required_t::value);
  57. BOOST_CHECK(!trait_5::is_source_input_not_optimized_t::value);
  58. typedef de::lexical_cast_stream_traits<const std::wstring, T> trait_6;
  59. BOOST_CHECK(!trait_6::is_source_input_not_optimized_t::value);
  60. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_6::src_char_t, wchar_t>::value));
  61. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_6::target_char_t, char>::value));
  62. BOOST_CHECK((boost::is_same<BOOST_DEDUCED_TYPENAME trait_6::char_type, wchar_t>::value));
  63. BOOST_CHECK(!trait_6::is_string_widening_required_t::value);
  64. }
  65. void test_metafunctions()
  66. {
  67. test_optimized_types_to_string<bool>();
  68. test_optimized_types_to_string<char>();
  69. test_optimized_types_to_string<unsigned char>();
  70. test_optimized_types_to_string<signed char>();
  71. test_optimized_types_to_string<short>();
  72. test_optimized_types_to_string<unsigned short>();
  73. test_optimized_types_to_string<int>();
  74. test_optimized_types_to_string<unsigned int>();
  75. test_optimized_types_to_string<long>();
  76. test_optimized_types_to_string<unsigned long>();
  77. #if defined(BOOST_HAS_LONG_LONG)
  78. test_optimized_types_to_string<boost::ulong_long_type>();
  79. test_optimized_types_to_string<boost::long_long_type>();
  80. #elif defined(BOOST_HAS_MS_INT64)
  81. test_optimized_types_to_string<unsigned __int64>();
  82. test_optimized_types_to_string<__int64>();
  83. #endif
  84. test_optimized_types_to_string<std::string>();
  85. test_optimized_types_to_string<char*>();
  86. //test_optimized_types_to_string<char[5]>();
  87. //test_optimized_types_to_string<char[1]>();
  88. test_optimized_types_to_string<unsigned char*>();
  89. //test_optimized_types_to_string<unsigned char[5]>();
  90. //test_optimized_types_to_string<unsigned char[1]>();
  91. test_optimized_types_to_string<signed char*>();
  92. //test_optimized_types_to_string<signed char[5]>();
  93. //test_optimized_types_to_string<signed char[1]>();
  94. test_optimized_types_to_string<boost::array<char, 1> >();
  95. test_optimized_types_to_string<boost::array<char, 5> >();
  96. test_optimized_types_to_string<boost::array<unsigned char, 1> >();
  97. test_optimized_types_to_string<boost::array<unsigned char, 5> >();
  98. test_optimized_types_to_string<boost::array<signed char, 1> >();
  99. test_optimized_types_to_string<boost::array<signed char, 5> >();
  100. test_optimized_types_to_string<boost::iterator_range<char*> >();
  101. test_optimized_types_to_string<boost::iterator_range<unsigned char*> >();
  102. test_optimized_types_to_string<boost::iterator_range<signed char*> >();
  103. test_optimized_types_to_string_const<boost::array<const char, 1> >();
  104. test_optimized_types_to_string_const<boost::array<const char, 5> >();
  105. test_optimized_types_to_string_const<boost::array<const unsigned char, 1> >();
  106. test_optimized_types_to_string_const<boost::array<const unsigned char, 5> >();
  107. test_optimized_types_to_string_const<boost::array<const signed char, 1> >();
  108. test_optimized_types_to_string_const<boost::array<const signed char, 5> >();
  109. test_optimized_types_to_string_const<boost::iterator_range<const char*> >();
  110. test_optimized_types_to_string_const<boost::iterator_range<const unsigned char*> >();
  111. test_optimized_types_to_string_const<boost::iterator_range<const signed char*> >();
  112. #ifndef BOOST_NO_CXX11_HDR_ARRAY
  113. test_optimized_types_to_string<std::array<char, 1> >();
  114. test_optimized_types_to_string<std::array<char, 5> >();
  115. test_optimized_types_to_string<std::array<unsigned char, 1> >();
  116. test_optimized_types_to_string<std::array<unsigned char, 5> >();
  117. test_optimized_types_to_string<std::array<signed char, 1> >();
  118. test_optimized_types_to_string<std::array<signed char, 5> >();
  119. test_optimized_types_to_string_const<std::array<const char, 1> >();
  120. test_optimized_types_to_string_const<std::array<const char, 5> >();
  121. test_optimized_types_to_string_const<std::array<const unsigned char, 1> >();
  122. test_optimized_types_to_string_const<std::array<const unsigned char, 5> >();
  123. test_optimized_types_to_string_const<std::array<const signed char, 1> >();
  124. test_optimized_types_to_string_const<std::array<const signed char, 5> >();
  125. #endif
  126. }
  127. boost::unit_test::test_suite *init_unit_test_suite(int, char *[])
  128. {
  129. boost::unit_test::test_suite *suite =
  130. BOOST_TEST_SUITE("lexical_cast traits tests");
  131. suite->add(BOOST_TEST_CASE(&test_metafunctions));
  132. return suite;
  133. }