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