Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : Facilities to perform exception safety_tests Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_MOCK_OBJECT_HPP_112205GER Chris@16: #define BOOST_TEST_MOCK_OBJECT_HPP_112205GER Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace itest { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** mock_object_base ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: class mock_object_base { Chris@16: public: Chris@16: mock_object_base() {} Chris@16: Chris@16: template Chris@16: mock_object_base( T1 const& ) {} Chris@16: Chris@16: template Chris@16: mock_object_base( T1 const&, T2 const& ) {} Chris@16: Chris@16: template Chris@16: mock_object_base( T1 const&, T2 const&, T3 const& ) {} Chris@16: Chris@16: template Chris@16: mock_object_base( T1 const&, T2 const&, T3 const&, T4 const& ) {} Chris@16: Chris@16: template Chris@16: mock_object_base( T1 const&, T2 const&, T3 const&, T4 const&, T5 const& ) {} Chris@16: }; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** mock_object implementation helpers ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define MO_OP_IMPL( op, descr, ret ) \ Chris@16: BOOST_ITEST_SCOPE( mock_object::operator op ); \ Chris@16: BOOST_ITEST_EPOINT( descr ); \ Chris@16: return ret \ Chris@16: /**/ Chris@16: Chris@16: #define MO_UNARY_OP( op, descr ) \ Chris@16: self_type const& operator op() const \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, prototype() ); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #define MO_UNARY_BOOL_OP( op, descr ) \ Chris@16: bool operator op() const \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, (!!BOOST_ITEST_DPOINT()) ); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #define MO_BINARY_OP( op, descr ) \ Chris@16: template \ Chris@16: inline mock_object const& \ Chris@16: operator op( mock_object const& mo, \ Chris@16: mock_object const& ) \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, mo ); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: inline mock_object const& \ Chris@16: operator op( mock_object const& mo, T const& ) \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, mo ); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: inline mock_object const& \ Chris@16: operator op( T const&, mock_object const& mo ) \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, mo ); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #define MO_BINARY_BOOL_OP( op, descr ) \ Chris@16: template \ Chris@16: inline bool \ Chris@16: operator op( mock_object const&, \ Chris@16: mock_object const& ) \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() ); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: inline bool \ Chris@16: operator op( mock_object const&, T const& ) \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() ); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: inline bool \ Chris@16: operator op( T const&, mock_object const& ) \ Chris@16: { \ Chris@16: MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() ); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** mock_object ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: template Chris@16: class mock_object; Chris@16: Chris@16: template Chris@16: class mock_object : public Base { Chris@16: // Private typeefs Chris@16: typedef mock_object self_type; Chris@16: struct dummy { void nonnull() {}; }; Chris@16: typedef void (dummy::*safe_bool)(); Chris@16: Chris@16: // prototype constructor Chris@16: mock_object( dummy* ) {} Chris@16: Chris@16: public: Chris@16: static mock_object& prototype() Chris@16: { Chris@16: static mock_object p( reinterpret_cast(0) ); Chris@16: return p; Chris@16: } Chris@16: Chris@16: // Constructors Chris@16: mock_object() Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object default constructor" ); Chris@16: } Chris@16: Chris@16: template Chris@16: mock_object( T1 const& arg1 ) Chris@16: : mock_object_base( arg1 ) Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object constructor" ); Chris@16: } Chris@16: Chris@16: template Chris@16: mock_object( T1 const& arg1, T2 const& arg2 ) Chris@16: : mock_object_base( arg1, arg2 ) Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object constructor" ); Chris@16: } Chris@16: Chris@16: template Chris@16: mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3 ) Chris@16: : mock_object_base( arg1, arg2, arg3 ) Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object constructor" ); Chris@16: } Chris@16: Chris@16: template Chris@16: mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3, T4 const& arg4 ) Chris@16: : mock_object_base( arg1, arg2, arg3, arg4 ) Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object constructor" ); Chris@16: } Chris@16: Chris@16: template Chris@16: mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3, T4 const& arg4, T5 const& arg5 ) Chris@16: : mock_object_base( arg1, arg2, arg3, arg4, arg5 ) Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object constructor" ); Chris@16: } Chris@16: Chris@16: mock_object( mock_object const& ) Chris@16: { Chris@16: BOOST_ITEST_SCOPE( mock_object::mock_object ); Chris@16: BOOST_ITEST_EPOINT( "Mock object copy constructor" ); Chris@16: } Chris@16: Chris@16: // assignment Chris@16: self_type const& operator =( mock_object const& ) const Chris@16: { Chris@16: MO_OP_IMPL( =, "Copy assignment", prototype() ); Chris@16: } Chris@16: Chris@16: template Chris@16: self_type const& operator =( T const& ) const Chris@16: { Chris@16: MO_OP_IMPL( =, "Copy assignment", prototype() ); Chris@16: } Chris@16: Chris@16: // Unary operators Chris@16: MO_UNARY_BOOL_OP( !, "Logical NOT operator" ) Chris@16: MO_UNARY_OP( &, "Address-of operator" ) Chris@16: MO_UNARY_OP( ~, "One's complement operator" ) Chris@16: MO_UNARY_OP( *, "Pointer dereference" ) Chris@16: MO_UNARY_OP( +, "Unary plus" ) Chris@16: Chris@16: // Increment and Decrement Chris@16: MO_UNARY_OP( ++, "Prefix increment" ) Chris@16: MO_UNARY_OP( --, "Prefix decrement" ) Chris@16: self_type const& operator ++(int) const Chris@16: { Chris@16: MO_OP_IMPL( ++, "Postfix increment", prototype() ); Chris@16: } Chris@16: self_type const& operator --(int) const Chris@16: { Chris@16: MO_OP_IMPL( --, "Postfix decrement", prototype() ); Chris@16: } Chris@16: Chris@16: // Bool context convertion Chris@16: operator safe_bool() const Chris@16: { Chris@16: MO_OP_IMPL( safe_bool, "Bool context conversion", Chris@16: (BOOST_ITEST_DPOINT() ? 0 : &dummy::nonnull) ); Chris@16: } Chris@16: Chris@16: // Function-call operators Chris@16: self_type const& operator ()() const Chris@16: { Chris@16: MO_OP_IMPL( (), "0-arity function-call", prototype() ); Chris@16: } Chris@16: template Chris@16: self_type const& operator ()( T1 const& arg1 ) const Chris@16: { Chris@16: MO_OP_IMPL( (), "1-arity function-call", prototype() ); Chris@16: } Chris@16: template Chris@16: self_type const& operator ()( T1 const&, T2 const& ) const Chris@16: { Chris@16: MO_OP_IMPL( (), "2-arity function-call", prototype() ); Chris@16: } Chris@16: template Chris@16: self_type const& operator ()( T1 const&, T2 const&, T3 const& ) const Chris@16: { Chris@16: MO_OP_IMPL( (), "3-arity function-call", prototype() ); Chris@16: } Chris@16: template Chris@16: self_type const& operator ()( T1 const&, T2 const&, T3 const&, T4 const& ) const Chris@16: { Chris@16: MO_OP_IMPL( (), "4-arity function-call", prototype() ); Chris@16: } Chris@16: template Chris@16: self_type const& operator ()( T1 const&, T2 const&, T3 const&, T4 const&, T5 const& ) const Chris@16: { Chris@16: MO_OP_IMPL( (), "5-arity function-call", prototype() ); Chris@16: } Chris@16: Chris@16: // Substripting Chris@16: template Chris@16: self_type const& operator []( T const& ) const Chris@16: { Chris@16: MO_OP_IMPL( [], "Substripting", prototype() ); Chris@16: } Chris@16: Chris@16: // Class member access Chris@16: self_type const* operator->() const Chris@16: { Chris@16: MO_OP_IMPL( ->, "Class member access", this ); Chris@16: } Chris@16: }; Chris@16: Chris@16: // !! MO_BINARY_OP( BOOST_PP_COMMA(), "Comma operator" ) Chris@16: Chris@16: MO_BINARY_BOOL_OP( !=, "Inequality" ) Chris@16: MO_BINARY_OP( %, "Modulus" ) Chris@16: MO_BINARY_OP( %=, "Modulus/assignment" ) Chris@16: MO_BINARY_OP( &, "Bitwise AND" ) Chris@16: MO_BINARY_BOOL_OP( &&, "Logical AND" ) Chris@16: MO_BINARY_OP( &=, "Bitwise AND/assignment" ) Chris@16: MO_BINARY_OP( *, "Multiplication" ) Chris@16: MO_BINARY_OP( *=, "Multiplication/assignment" ) Chris@16: MO_BINARY_OP( +, "Addition" ) Chris@16: MO_BINARY_OP( +=, "Addition/assignment" ) Chris@16: //MO_BINARY_OP( -, "Subtraction" ) Chris@16: MO_BINARY_OP( -=, "Subtraction/assignment" ) Chris@16: MO_BINARY_OP( ->*, "Pointer-to-member selection" ) Chris@16: MO_BINARY_OP( /, "Division" ) Chris@16: MO_BINARY_OP( /=, "Division/assignment" ) Chris@16: MO_BINARY_BOOL_OP( <, "Less than" ) Chris@16: MO_BINARY_OP( <<=, "Left shift/assignment" ) Chris@16: MO_BINARY_BOOL_OP( <=, "Less than or equal to" ) Chris@16: MO_BINARY_BOOL_OP( ==, "Equality" ) Chris@16: MO_BINARY_BOOL_OP( >, "Greater than" ) Chris@16: MO_BINARY_BOOL_OP( >=, "Greater than or equal to" ) Chris@16: MO_BINARY_OP( >>=, "Right shift/assignment" ) Chris@16: MO_BINARY_OP( ^, "Exclusive OR" ) Chris@16: MO_BINARY_OP( ^=, "Exclusive OR/assignment" ) Chris@16: MO_BINARY_OP( |, "Bitwise inclusive OR" ) Chris@16: MO_BINARY_OP( |=, "Bitwise inclusive OR/assignment" ) Chris@16: MO_BINARY_BOOL_OP( ||, "Logical OR" ) Chris@16: Chris@16: MO_BINARY_OP( <<, "Left shift" ) Chris@16: MO_BINARY_OP( >>, "Right shift" ) Chris@16: Chris@16: } // namespace itest Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_TEST_MOCK_OBJECT_HPP_112205GER