00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #define GETTEXT_DOMAIN "wesnoth-test"
00017
00018 #include "lexical_cast.hpp"
00019
00020 #include <boost/test/unit_test.hpp>
00021
00022 #include <boost/mpl/vector.hpp>
00023 #include <boost/mpl/copy.hpp>
00024 #include <boost/mpl/back_inserter.hpp>
00025 #include <boost/mpl/contains.hpp>
00026 #include <boost/test/test_case_template.hpp>
00027
00028 #include <iostream>
00029
00030 namespace test_throw {
00031
00032 #ifdef _MSC_VER
00033 #pragma warning(push)
00034 #pragma warning(disable:4702)
00035 #endif
00036
00037 #define LEXICAL_CAST_DEBUG
00038 #include "lexical_cast.hpp"
00039
00040 #ifdef _MSC_VER
00041 #pragma warning(pop)
00042 #endif
00043
00044 typedef boost::mpl::vector<
00045
00046
00047 bool,
00048
00049
00050
00051
00052
00053
00054 char, signed char, unsigned char,
00055 short, int, long, long long,
00056 unsigned short, unsigned int, unsigned long, unsigned long long
00057 > test_match_types;
00058
00059 typedef boost::mpl::vector<
00060 float, double, long double
00061 > test_nomatch_types;
00062
00063 typedef boost::mpl::copy<
00064 test_nomatch_types,
00065 boost::mpl::back_inserter<test_match_types>
00066 >::type test_types;
00067
00068
00069 namespace {
00070
00071 std::string result;
00072
00073 bool validate(const char* str)
00074 {
00075 if(str != result) {
00076 std::cerr << "Received " << str << '\n'
00077 << "Expected " << result << '\n';
00078 return false;
00079 } else {
00080 return true;
00081 }
00082 }
00083
00084 }
00085
00086 #define TEST_CASE(type_send, initializer) \
00087 { \
00088 type_send val = initializer value; \
00089 \
00090 BOOST_CHECK_EXCEPTION( \
00091 lexical_cast<std::string>(val), const char*, validate); \
00092 }
00093
00094 BOOST_AUTO_TEST_CASE_TEMPLATE(test_lexical_cast_throw, T, test_types)
00095 {
00096 T value = T();
00097
00098 typedef typename boost::mpl::contains<test_match_types, T>::type test;
00099 typedef typename boost::mpl::contains<test_match_types, int >::type match;
00100
00101 result = typeid(test) == typeid(match)
00102 ? "specialized - To std::string - From integral (pointer)"
00103 : "generic";
00104
00105 TEST_CASE(T, );
00106 TEST_CASE(const T, );
00107
00108 TEST_CASE(T&, );
00109 TEST_CASE(const T&, );
00110
00111 TEST_CASE(T*, &);
00112 TEST_CASE(const T*, &);
00113
00114 TEST_CASE(T* const, &);
00115 TEST_CASE(const T* const, &);
00116 }
00117
00118 #undef TEST_CASE
00119
00120 typedef boost::mpl::vector<
00121 signed char
00122 , short
00123 , int
00124 , long> test_lexical_cast_signed_types;
00125
00126 BOOST_AUTO_TEST_CASE_TEMPLATE(
00127 test_lexical_cast_signed, T, test_lexical_cast_signed_types)
00128 {
00129 result = "specialized - To signed - From (const) char*";
00130
00131 const char* value = "test";
00132 BOOST_CHECK_EXCEPTION(lexical_cast<T>(
00133 value), const char*, validate);
00134 BOOST_CHECK_EXCEPTION(lexical_cast<T>(
00135 const_cast<char*>(value)), const char*, validate);
00136
00137 result = "specialized - To signed - From std::string";
00138
00139 BOOST_CHECK_EXCEPTION(lexical_cast<T>(
00140 std::string(value)), const char*, validate);
00141 }
00142
00143 BOOST_AUTO_TEST_CASE(test_lexical_cast_long_long)
00144 {
00145 result = "specialized - To long long - From (const) char*";
00146
00147 const char* value = "test";
00148 BOOST_CHECK_EXCEPTION(lexical_cast<long long>(
00149 value), const char*, validate);
00150 BOOST_CHECK_EXCEPTION(lexical_cast<long long>(
00151 const_cast<char*>(value)), const char*, validate);
00152
00153 result = "specialized - To long long - From std::string";
00154
00155 BOOST_CHECK_EXCEPTION(lexical_cast<long long>(
00156 std::string(value)), const char*, validate);
00157 }
00158
00159 typedef boost::mpl::vector<
00160 bool
00161 , unsigned char
00162 , unsigned short
00163 , unsigned int
00164 , unsigned long> test_lexical_cast_unsigned_types;
00165
00166 BOOST_AUTO_TEST_CASE_TEMPLATE(
00167 test_lexical_cast_unsigned, T, test_lexical_cast_unsigned_types)
00168 {
00169 result = "specialized - To unsigned - From (const) char*";
00170
00171 const char* value = "test";
00172 BOOST_CHECK_EXCEPTION(lexical_cast<T>(
00173 value), const char*, validate);
00174 BOOST_CHECK_EXCEPTION(lexical_cast<T>(
00175 const_cast<char*>(value)), const char*, validate);
00176
00177 result = "specialized - To unsigned - From std::string";
00178
00179 BOOST_CHECK_EXCEPTION(lexical_cast<T>(
00180 std::string(value)), const char*, validate);
00181
00182 }
00183
00184 BOOST_AUTO_TEST_CASE(test_lexical_cast_unsigned_long_long)
00185 {
00186 result = "specialized - To unsigned long long - From (const) char*";
00187
00188 const char* value = "test";
00189 BOOST_CHECK_EXCEPTION(lexical_cast<unsigned long long>(
00190 value), const char*, validate);
00191 BOOST_CHECK_EXCEPTION(lexical_cast<unsigned long long>(
00192 const_cast<char*>(value)), const char*, validate);
00193
00194 result = "specialized - To unsigned long long - From std::string";
00195
00196 BOOST_CHECK_EXCEPTION(lexical_cast<unsigned long long>(
00197 std::string(value)), const char*, validate);
00198 }
00199
00200 }
00201
00202 BOOST_AUTO_TEST_CASE(test_lexical_cast_result)
00203 {
00204 BOOST_CHECK_EQUAL(lexical_cast<std::string>(true), "1");
00205 BOOST_CHECK_EQUAL(lexical_cast<std::string>(false), "0");
00206
00207 BOOST_CHECK_EQUAL(lexical_cast<std::string>(1), "1");
00208 BOOST_CHECK_EQUAL(lexical_cast<std::string>(1u), "1");
00209
00210 BOOST_CHECK_EQUAL(lexical_cast<std::string>(1.2f), "1.2");
00211 BOOST_CHECK_EQUAL(lexical_cast<std::string>(1.2), "1.2");
00212
00213 BOOST_CHECK_EQUAL(lexical_cast<int>("1"), 1);
00214 BOOST_CHECK_EQUAL(lexical_cast<int>("-1"), -1);
00215 BOOST_CHECK_EQUAL(lexical_cast<unsigned>("1"), 1);
00216 }