📄 test.hpp
字号:
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef TT_TEST_HPP
#define TT_TEST_HPP
#ifdef USE_UNIT_TEST
# include <boost/test/unit_test.hpp>
#endif
#include <boost/utility.hpp>
#include <iostream>
#include <typeinfo>
#ifdef __BORLANDC__
// we have to turn off these warnings overwise we get swamped by the things:
#pragma option -w-8008 -w-8066
#endif
//
// basic configuration:
//
#ifdef TEST_STD
#define tt std::tr1
//#define TYPE_TRAITS(x) <type_traits>
//#define TYPE_COMPARE(x) <type_compare>
//#define TYPE_TRANSFORM(x) <type_transform>
#else
#define tt boost
//#define TYPE_TRAITS(x) BOOST_STRINGIZE(boost/type_traits/x.hpp)
//#define TYPE_COMPARE(x) BOOST_STRINGIZE(boost/type_traits/x.hpp)
//#define TYPE_TRANSFORM(x) BOOST_STRINGIZE(boost/type_traits/x.hpp)
#endif
#ifdef USE_UNIT_TEST
//
// global unit, this is not safe, but until the unit test framework uses
// shared_ptr throughout this is about as good as it gets :-(
//
boost::unit_test_framework::test_suite* get_master_unit(const char* name = 0);
//
// initialisation class:
//
class unit_initialiser
{
public:
unit_initialiser(void (*f)(), const char* name)
{
get_master_unit("Type Traits")->add( BOOST_TEST_CASE(f) );
}
};
#define TT_TEST_BEGIN(trait_name)\
namespace{\
void trait_name();\
unit_initialiser init(trait_name, BOOST_STRINGIZE(trait_name));\
void trait_name(){
#define TT_TEST_END }}
#else
//
// replacements for Unit test macros:
//
int error_count = 0;
#define BOOST_CHECK_MESSAGE(pred, message)\
do{\
if(!(pred))\
{\
std::cerr << __FILE__ << ":" << __LINE__ << ": " << message << std::endl;\
++error_count;\
}\
}while(0)
#define BOOST_WARN_MESSAGE(pred, message)\
do{\
if(!(pred))\
{\
std::cerr << __FILE__ << ":" << __LINE__ << ": " << message << std::endl;\
}\
}while(0)
#define BOOST_MESSAGE(message)\
do{ std::cout << __FILE__ << ":" << __LINE__ << ": " << message << std::endl; }while(0)
#define BOOST_CHECK(pred)\
do{ \
if(!(pred)){\
std::cout << __FILE__ << ":" << __LINE__ << ": Error in " << BOOST_STRINGIZE(pred) << std::endl;\
++error_count;\
} \
}while(0)
#define TT_TEST_BEGIN(trait_name)\
int main(){
#define TT_TEST_END return error_count; }
#endif
#define TRANSFORM_CHECK(name, from_suffix, to_suffix)\
BOOST_CHECK_TYPE(bool to_suffix, name<bool from_suffix>::type);\
BOOST_CHECK_TYPE(char to_suffix, name<char from_suffix>::type);\
BOOST_CHECK_TYPE(wchar_t to_suffix, name<wchar_t from_suffix>::type);\
BOOST_CHECK_TYPE(signed char to_suffix, name<signed char from_suffix>::type);\
BOOST_CHECK_TYPE(unsigned char to_suffix, name<unsigned char from_suffix>::type);\
BOOST_CHECK_TYPE(short to_suffix, name<short from_suffix>::type);\
BOOST_CHECK_TYPE(unsigned short to_suffix, name<unsigned short from_suffix>::type);\
BOOST_CHECK_TYPE(int to_suffix, name<int from_suffix>::type);\
BOOST_CHECK_TYPE(unsigned int to_suffix, name<unsigned int from_suffix>::type);\
BOOST_CHECK_TYPE(long to_suffix, name<long from_suffix>::type);\
BOOST_CHECK_TYPE(unsigned long to_suffix, name<unsigned long from_suffix>::type);\
BOOST_CHECK_TYPE(float to_suffix, name<float from_suffix>::type);\
BOOST_CHECK_TYPE(long double to_suffix, name<long double from_suffix>::type);\
BOOST_CHECK_TYPE(double to_suffix, name<double from_suffix>::type);\
BOOST_CHECK_TYPE(UDT to_suffix, name<UDT from_suffix>::type);\
BOOST_CHECK_TYPE(enum1 to_suffix, name<enum1 from_suffix>::type);
#define BOOST_DUMMY_MACRO_PARAM /**/
#define BOOST_DECL_TRANSFORM_TEST(name, type, from, to)\
void name(){ TRANSFORM_CHECK(type, from, to) }
#define BOOST_DECL_TRANSFORM_TEST3(name, type, from)\
void name(){ TRANSFORM_CHECK(type, from, BOOST_DUMMY_MACRO_PARAM) }
#define BOOST_DECL_TRANSFORM_TEST2(name, type, to)\
void name(){ TRANSFORM_CHECK(type, BOOST_DUMMY_MACRO_PARAM, to) }
#define BOOST_DECL_TRANSFORM_TEST0(name, type)\
void name(){ TRANSFORM_CHECK(type, BOOST_DUMMY_MACRO_PARAM, BOOST_DUMMY_MACRO_PARAM) }
//
// VC++ emits an awful lot of warnings unless we define these:
#ifdef BOOST_MSVC
# pragma warning(disable:4800)
#endif
//
// define some test types:
//
enum enum_UDT{ one, two, three };
struct UDT
{
UDT(){};
~UDT(){};
UDT(const UDT&);
UDT& operator=(const UDT&);
int i;
void f1();
int f2();
int f3(int);
int f4(int, float);
};
typedef void(*f1)();
typedef int(*f2)(int);
typedef int(*f3)(int, bool);
typedef void (UDT::*mf1)();
typedef int (UDT::*mf2)();
typedef int (UDT::*mf3)(int);
typedef int (UDT::*mf4)(int, float);
typedef int (UDT::*mp);
typedef int (UDT::*cmf)(int) const;
// cv-qualifiers applied to reference types should have no effect
// declare these here for later use with is_reference and remove_reference:
# ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable: 4181)
# elif defined(BOOST_INTEL)
# pragma warning(push)
# pragma warning(disable: 21)
# endif
//
// This is intentional:
// r_type and cr_type should be the same type
// but some compilers wrongly apply cv-qualifiers
// to reference types (this may generate a warning
// on some compilers):
//
typedef int& r_type;
typedef const r_type cr_type;
# ifdef BOOST_MSVC
# pragma warning(pop)
# elif defined(BOOST_INTEL)
# pragma warning(pop)
# pragma warning(disable: 985) // identifier truncated in debug information
# endif
struct POD_UDT { int x; };
struct empty_UDT
{
empty_UDT(){};
empty_UDT(const empty_UDT&){};
~empty_UDT(){};
empty_UDT& operator=(const empty_UDT&){ return *this; }
bool operator==(const empty_UDT&)const
{ return true; }
};
struct empty_POD_UDT
{
bool operator==(const empty_POD_UDT&)const
{ return true; }
};
union union_UDT
{
int x;
double y;
~union_UDT(){}
};
union POD_union_UDT
{
int x;
double y;
};
union empty_union_UDT
{
~empty_union_UDT(){}
};
union empty_POD_union_UDT{};
struct nothrow_copy_UDT
{
nothrow_copy_UDT();
nothrow_copy_UDT(const nothrow_copy_UDT&)throw();
~nothrow_copy_UDT(){};
nothrow_copy_UDT& operator=(const nothrow_copy_UDT&){ return *this; }
bool operator==(const nothrow_copy_UDT&)const
{ return true; }
};
struct nothrow_assign_UDT
{
nothrow_assign_UDT();
nothrow_assign_UDT(const nothrow_assign_UDT&);
~nothrow_assign_UDT(){};
nothrow_assign_UDT& operator=(const nothrow_assign_UDT&)throw(){ return *this; }
bool operator==(const nothrow_assign_UDT&)const
{ return true; }
};
struct nothrow_construct_UDT
{
nothrow_construct_UDT()throw();
nothrow_construct_UDT(const nothrow_construct_UDT&);
~nothrow_construct_UDT(){};
nothrow_construct_UDT& operator=(const nothrow_construct_UDT&){ return *this; }
bool operator==(const nothrow_construct_UDT&)const
{ return true; }
};
class Base { };
class Derived : public Base { };
class Derived2 : public Base { };
class MultiBase : public Derived, public Derived2 {};
class PrivateBase : private Base {};
class NonDerived { };
enum enum1
{
one_,two_
};
enum enum2
{
three_,four_
};
struct VB
{
virtual ~VB(){};
};
struct VD : VB
{
~VD(){};
};
//
// struct non_pointer:
// used to verify that is_pointer does not return
// true for class types that implement operator void*()
//
struct non_pointer
{
operator void*(){return this;}
};
struct non_int_pointer
{
int i;
operator int*(){return &i;}
};
struct int_constructible
{
int_constructible(int);
};
struct int_convertible
{
operator int();
};
//
// struct non_empty:
// used to verify that is_empty does not emit
// spurious warnings or errors.
//
struct non_empty : private boost::noncopyable
{
int i;
};
//
// abstract base classes:
struct test_abc1
{
test_abc1();
test_abc1(const test_abc1&);
test_abc1& operator=(const test_abc1&);
virtual void foo() = 0;
virtual void foo2() = 0;
};
struct test_abc2
{
virtual void foo() = 0;
virtual void foo2() = 0;
};
struct test_abc3 : public test_abc1
{
virtual void foo3() = 0;
};
struct incomplete_type;
struct polymorphic_base
{
virtual void method();
};
struct polymorphic_derived1 : polymorphic_base
{
};
struct polymorphic_derived2 : polymorphic_base
{
virtual void method();
};
struct virtual_inherit1 : virtual Base { };
struct virtual_inherit2 : virtual_inherit1 { };
typedef void foo0_t();
typedef void foo1_t(int);
typedef void foo2_t(int&, double);
typedef void foo3_t(int&, bool, int, int);
typedef void foo4_t(int, bool, int*, int[], int, int, int, int, int);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -