tests/test_lexical_cast.cpp

Go to the documentation of this file.
00001 /* $Id: test_lexical_cast.cpp 52533 2012-01-07 02:35:17Z shadowmaster $ */
00002 /*
00003    Copyright (C) 2009 - 2012 by Mark de Wever <koraq@xs4all.nl>
00004    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
00005 
00006    This program is free software; you can redistribute it and/or modify
00007    it under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 2 of the License, or
00009    (at your option) any later version.
00010    This program is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY.
00012 
00013    See the COPYING file for more details.
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     /* note Wesnoth's coding style doesn't allow w_char so ignore them. */
00046 
00047     bool,
00048 
00049     /*
00050     * We don't want chars to match since a string cast of a char is
00051     * ambiguous; does the user want it interpreted as a char or as a number?
00052     * But as long as that hasn't been fixed, leave the char.
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 } // namespace
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 } //  namespace test_throw
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated by doxygen 1.7.1 on Fri May 25 2012 01:03:12 for The Battle for Wesnoth
Gna! | Forum | Wiki | CIA | devdocs