os/ossrv/ossrv_pub/boost_apis/boost/test/mock_object.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200 (2014-06-10)
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
//  (C) Copyright Gennadiy Rozental 2005.
sl@0
     2
//  Distributed under the Boost Software License, Version 1.0.
sl@0
     3
//  (See accompanying file LICENSE_1_0.txt or copy at
sl@0
     4
//  http://www.boost.org/LICENSE_1_0.txt)
sl@0
     5
sl@0
     6
//  See http://www.boost.org/libs/test for the library home page.
sl@0
     7
//
sl@0
     8
//  File        : $RCSfile: mock_object.hpp,v $
sl@0
     9
//
sl@0
    10
//  Version     : $Revision: 1.3 $
sl@0
    11
//
sl@0
    12
//  Description : Facilities to perform exception safety_tests
sl@0
    13
// ***************************************************************************
sl@0
    14
sl@0
    15
#ifndef BOOST_TEST_MOCK_OBJECT_HPP_112205GER
sl@0
    16
#define BOOST_TEST_MOCK_OBJECT_HPP_112205GER
sl@0
    17
sl@0
    18
// Boost.Test
sl@0
    19
#include <boost/test/detail/config.hpp>
sl@0
    20
#include <boost/test/interaction_based.hpp>
sl@0
    21
sl@0
    22
// Boost
sl@0
    23
#include <boost/preprocessor/punctuation/comma.hpp>
sl@0
    24
sl@0
    25
#include <boost/test/detail/suppress_warnings.hpp>
sl@0
    26
sl@0
    27
//____________________________________________________________________________//
sl@0
    28
sl@0
    29
namespace boost {
sl@0
    30
sl@0
    31
namespace itest {
sl@0
    32
sl@0
    33
// ************************************************************************** //
sl@0
    34
// **************                mock_object_base              ************** //
sl@0
    35
// ************************************************************************** //
sl@0
    36
sl@0
    37
class mock_object_base {
sl@0
    38
public:
sl@0
    39
    mock_object_base() {}
sl@0
    40
sl@0
    41
    template<typename T1>
sl@0
    42
    mock_object_base( T1 const& ) {}
sl@0
    43
sl@0
    44
    template<typename T1, typename T2>
sl@0
    45
    mock_object_base( T1 const&, T2 const& ) {}
sl@0
    46
sl@0
    47
    template<typename T1, typename T2, typename T3>
sl@0
    48
    mock_object_base( T1 const&, T2 const&, T3 const& ) {}
sl@0
    49
sl@0
    50
    template<typename T1, typename T2, typename T3, typename T4>
sl@0
    51
    mock_object_base( T1 const&, T2 const&, T3 const&, T4 const& ) {}
sl@0
    52
sl@0
    53
    template<typename T1, typename T2, typename T3, typename T4, typename T5>
sl@0
    54
    mock_object_base( T1 const&, T2 const&, T3 const&, T4 const&, T5 const& ) {}
sl@0
    55
};
sl@0
    56
sl@0
    57
// ************************************************************************** //
sl@0
    58
// **************      mock_object implementation helpers      ************** //
sl@0
    59
// ************************************************************************** //
sl@0
    60
sl@0
    61
#define MO_OP_IMPL( op, descr, ret )                        \
sl@0
    62
    BOOST_ITEST_SCOPE( mock_object::operator op );          \
sl@0
    63
    BOOST_ITEST_EPOINT( descr );                            \
sl@0
    64
    return ret                                              \
sl@0
    65
/**/
sl@0
    66
sl@0
    67
#define MO_UNARY_OP( op, descr )                            \
sl@0
    68
self_type const& operator op() const                        \
sl@0
    69
{                                                           \
sl@0
    70
    MO_OP_IMPL( op, descr, prototype() );                   \
sl@0
    71
}                                                           \
sl@0
    72
/**/
sl@0
    73
sl@0
    74
#define MO_UNARY_BOOL_OP( op, descr )                       \
sl@0
    75
bool operator op() const                                    \
sl@0
    76
{                                                           \
sl@0
    77
    MO_OP_IMPL( op, descr, (!!BOOST_ITEST_DPOINT()) );      \
sl@0
    78
}                                                           \
sl@0
    79
/**/
sl@0
    80
sl@0
    81
#define MO_BINARY_OP( op, descr )                           \
sl@0
    82
template<int i1, typename Base1,int i2, typename Base2>     \
sl@0
    83
inline mock_object<i1,Base1> const&                         \
sl@0
    84
operator op( mock_object<i1,Base1> const& mo,               \
sl@0
    85
             mock_object<i2,Base2> const& )                 \
sl@0
    86
{                                                           \
sl@0
    87
    MO_OP_IMPL( op, descr, mo );                            \
sl@0
    88
}                                                           \
sl@0
    89
                                                            \
sl@0
    90
template<int i, typename Base, typename T>                  \
sl@0
    91
inline mock_object<i,Base> const&                           \
sl@0
    92
operator op( mock_object<i,Base> const& mo, T const& )      \
sl@0
    93
{                                                           \
sl@0
    94
    MO_OP_IMPL( op, descr, mo );                            \
sl@0
    95
}                                                           \
sl@0
    96
                                                            \
sl@0
    97
template<int i, typename Base, typename T>                  \
sl@0
    98
inline mock_object<i,Base> const&                           \
sl@0
    99
operator op( T const&, mock_object<i,Base> const& mo )      \
sl@0
   100
{                                                           \
sl@0
   101
    MO_OP_IMPL( op, descr, mo );                            \
sl@0
   102
}                                                           \
sl@0
   103
/**/
sl@0
   104
sl@0
   105
#define MO_BINARY_BOOL_OP( op, descr )                      \
sl@0
   106
template<int i1, typename Base1,int i2, typename Base2>     \
sl@0
   107
inline bool                                                 \
sl@0
   108
operator op( mock_object<i1,Base1> const&,                  \
sl@0
   109
             mock_object<i2,Base2> const& )                 \
sl@0
   110
{                                                           \
sl@0
   111
    MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() );          \
sl@0
   112
}                                                           \
sl@0
   113
                                                            \
sl@0
   114
template<int i, typename Base, typename T>                  \
sl@0
   115
inline bool                                                 \
sl@0
   116
operator op( mock_object<i,Base> const&, T const& )         \
sl@0
   117
{                                                           \
sl@0
   118
    MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() );          \
sl@0
   119
}                                                           \
sl@0
   120
                                                            \
sl@0
   121
template<int i, typename Base, typename T>                  \
sl@0
   122
inline bool                                                 \
sl@0
   123
operator op( T const&, mock_object<i,Base> const& )         \
sl@0
   124
{                                                           \
sl@0
   125
    MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() );          \
sl@0
   126
}                                                           \
sl@0
   127
/**/
sl@0
   128
sl@0
   129
// ************************************************************************** //
sl@0
   130
// **************                  mock_object                 ************** //
sl@0
   131
// ************************************************************************** //
sl@0
   132
sl@0
   133
template<int i = 0, typename Base=mock_object_base>
sl@0
   134
class mock_object;
sl@0
   135
sl@0
   136
template<int i, typename Base>
sl@0
   137
class mock_object : public Base {
sl@0
   138
    // Private typeefs
sl@0
   139
    typedef mock_object<i,Base> self_type;
sl@0
   140
    struct dummy { void nonnull() {}; };
sl@0
   141
    typedef void (dummy::*safe_bool)();
sl@0
   142
sl@0
   143
    // prototype constructor
sl@0
   144
    mock_object( dummy* ) {}
sl@0
   145
sl@0
   146
public:
sl@0
   147
    static mock_object& prototype()
sl@0
   148
    {
sl@0
   149
        static mock_object p( (dummy*)0 ); 
sl@0
   150
        return p;
sl@0
   151
    }
sl@0
   152
sl@0
   153
    // Constructors
sl@0
   154
    mock_object()
sl@0
   155
    {
sl@0
   156
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   157
        BOOST_ITEST_EPOINT( "Mock object default constructor" );
sl@0
   158
    }
sl@0
   159
sl@0
   160
    template<typename T1>
sl@0
   161
    mock_object( T1 const& arg1 )
sl@0
   162
    : mock_object_base( arg1 )
sl@0
   163
    {
sl@0
   164
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   165
        BOOST_ITEST_EPOINT( "Mock object constructor" );
sl@0
   166
    }
sl@0
   167
sl@0
   168
    template<typename T1, typename T2>
sl@0
   169
    mock_object( T1 const& arg1, T2 const& arg2 )
sl@0
   170
    : mock_object_base( arg1, arg2 )
sl@0
   171
    {
sl@0
   172
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   173
        BOOST_ITEST_EPOINT( "Mock object constructor" );
sl@0
   174
    }
sl@0
   175
sl@0
   176
    template<typename T1, typename T2, typename T3>
sl@0
   177
    mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3 )
sl@0
   178
    : mock_object_base( arg1, arg2, arg3 )
sl@0
   179
    {
sl@0
   180
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   181
        BOOST_ITEST_EPOINT( "Mock object constructor" );
sl@0
   182
    }
sl@0
   183
sl@0
   184
    template<typename T1, typename T2, typename T3, typename T4>
sl@0
   185
    mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3, T4 const& arg4 )
sl@0
   186
    : mock_object_base( arg1, arg2, arg3, arg4 )
sl@0
   187
    {
sl@0
   188
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   189
        BOOST_ITEST_EPOINT( "Mock object constructor" );
sl@0
   190
    }
sl@0
   191
sl@0
   192
    template<typename T1, typename T2, typename T3, typename T4, typename T5>
sl@0
   193
    mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3, T4 const& arg4, T5 const& arg5 )
sl@0
   194
    : mock_object_base( arg1, arg2, arg3, arg4, arg5 )
sl@0
   195
    {
sl@0
   196
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   197
        BOOST_ITEST_EPOINT( "Mock object constructor" );
sl@0
   198
    }
sl@0
   199
sl@0
   200
    mock_object( mock_object const& )
sl@0
   201
    {
sl@0
   202
        BOOST_ITEST_SCOPE( mock_object::mock_object );
sl@0
   203
        BOOST_ITEST_EPOINT( "Mock object copy constructor" );
sl@0
   204
    }
sl@0
   205
sl@0
   206
    // assignment
sl@0
   207
    self_type const&    operator =( mock_object const& ) const
sl@0
   208
    {
sl@0
   209
        MO_OP_IMPL( =, "Copy assignment", prototype() );
sl@0
   210
    }
sl@0
   211
sl@0
   212
    template <typename T>
sl@0
   213
    self_type const&    operator =( T const& ) const
sl@0
   214
    {
sl@0
   215
        MO_OP_IMPL( =, "Copy assignment", prototype() );
sl@0
   216
    }
sl@0
   217
sl@0
   218
    // Unary operators
sl@0
   219
    MO_UNARY_BOOL_OP( !, "Logical NOT operator" )
sl@0
   220
    MO_UNARY_OP( &, "Address-of operator" )
sl@0
   221
    MO_UNARY_OP( ~, "One's complement operator" )
sl@0
   222
    MO_UNARY_OP( *, "Pointer dereference" )
sl@0
   223
    MO_UNARY_OP( +, "Unary plus" )
sl@0
   224
sl@0
   225
    // Increment and Decrement
sl@0
   226
    MO_UNARY_OP( ++, "Prefix increment" )
sl@0
   227
    MO_UNARY_OP( --, "Prefix decrement" )
sl@0
   228
    self_type const&    operator ++(int) const
sl@0
   229
    {
sl@0
   230
        MO_OP_IMPL( ++, "Postfix increment", prototype() );
sl@0
   231
    }
sl@0
   232
    self_type const&    operator --(int) const
sl@0
   233
    {
sl@0
   234
        MO_OP_IMPL( --, "Postfix decrement", prototype() );
sl@0
   235
    }
sl@0
   236
sl@0
   237
    // Bool context convertion
sl@0
   238
    operator safe_bool() const
sl@0
   239
    {
sl@0
   240
        MO_OP_IMPL( safe_bool, "Bool context conversion",
sl@0
   241
                    (BOOST_ITEST_DPOINT() ? 0 : &dummy::nonnull) );
sl@0
   242
    }
sl@0
   243
sl@0
   244
    // Function-call operators
sl@0
   245
    self_type const&    operator ()() const
sl@0
   246
    {
sl@0
   247
        MO_OP_IMPL( (), "0-arity function-call", prototype() );
sl@0
   248
    }
sl@0
   249
    template<typename T1>
sl@0
   250
    self_type const&    operator ()( T1 const& arg1 ) const
sl@0
   251
    {
sl@0
   252
        MO_OP_IMPL( (), "1-arity function-call", prototype() );
sl@0
   253
    }
sl@0
   254
    template<typename T1, typename T2>
sl@0
   255
    self_type const&    operator ()( T1 const&, T2 const& ) const
sl@0
   256
    {
sl@0
   257
        MO_OP_IMPL( (), "2-arity function-call", prototype() );
sl@0
   258
    }
sl@0
   259
    template<typename T1, typename T2, typename T3>
sl@0
   260
    self_type const&    operator ()( T1 const&, T2 const&, T3 const& ) const
sl@0
   261
    {
sl@0
   262
        MO_OP_IMPL( (), "3-arity function-call", prototype() );
sl@0
   263
    }
sl@0
   264
    template<typename T1, typename T2, typename T3, typename T4>
sl@0
   265
    self_type const&    operator ()( T1 const&, T2 const&, T3 const&, T4 const& ) const
sl@0
   266
    {
sl@0
   267
        MO_OP_IMPL( (), "4-arity function-call", prototype() );
sl@0
   268
    }
sl@0
   269
    template<typename T1, typename T2, typename T3, typename T4, typename T5>
sl@0
   270
    self_type const&    operator ()( T1 const&, T2 const&, T3 const&, T4 const&, T5 const& ) const
sl@0
   271
    {
sl@0
   272
        MO_OP_IMPL( (), "5-arity function-call", prototype() );
sl@0
   273
    }
sl@0
   274
sl@0
   275
    // Substripting
sl@0
   276
    template<typename T>
sl@0
   277
    self_type const&    operator []( T const& ) const
sl@0
   278
    {
sl@0
   279
        MO_OP_IMPL( [], "Substripting", prototype() );
sl@0
   280
    }
sl@0
   281
sl@0
   282
    // Class member access
sl@0
   283
    self_type const*    operator->() const
sl@0
   284
    {
sl@0
   285
        MO_OP_IMPL( ->, "Class member access", this );
sl@0
   286
    }
sl@0
   287
};
sl@0
   288
sl@0
   289
// !! MO_BINARY_OP( BOOST_PP_COMMA(), "Comma operator" )
sl@0
   290
sl@0
   291
MO_BINARY_BOOL_OP( !=, "Inequality" )
sl@0
   292
MO_BINARY_OP( %, "Modulus" )
sl@0
   293
MO_BINARY_OP( %=, "Modulus/assignment" )
sl@0
   294
MO_BINARY_OP( &, "Bitwise AND" )
sl@0
   295
MO_BINARY_BOOL_OP( &&, "Logical AND" )
sl@0
   296
MO_BINARY_OP( &=, "Bitwise AND/assignment" )
sl@0
   297
MO_BINARY_OP( *, "Multiplication" )
sl@0
   298
MO_BINARY_OP( *=, "Multiplication/assignment" )
sl@0
   299
MO_BINARY_OP( +, "Addition" )
sl@0
   300
MO_BINARY_OP( +=, "Addition/assignment" )
sl@0
   301
//MO_BINARY_OP( -, "Subtraction" )
sl@0
   302
MO_BINARY_OP( -=, "Subtraction/assignment" )
sl@0
   303
MO_BINARY_OP( ->*, "Pointer-to-member selection" )
sl@0
   304
MO_BINARY_OP( /, "Division" )
sl@0
   305
MO_BINARY_OP( /=, "Division/assignment" )
sl@0
   306
MO_BINARY_BOOL_OP( <, "Less than" )
sl@0
   307
MO_BINARY_OP( <<=, "Left shift/assignment" )
sl@0
   308
MO_BINARY_BOOL_OP( <=, "Less than or equal to" )
sl@0
   309
MO_BINARY_BOOL_OP( ==, "Equality" )
sl@0
   310
MO_BINARY_BOOL_OP( >, "Greater than" )
sl@0
   311
MO_BINARY_BOOL_OP( >=, "Greater than or equal to" )
sl@0
   312
MO_BINARY_OP( >>=, "Right shift/assignment" )
sl@0
   313
MO_BINARY_OP( ^, "Exclusive OR" )
sl@0
   314
MO_BINARY_OP( ^=, "Exclusive OR/assignment" )
sl@0
   315
MO_BINARY_OP( |, "Bitwise inclusive OR" )
sl@0
   316
MO_BINARY_OP( |=, "Bitwise inclusive OR/assignment" )
sl@0
   317
MO_BINARY_BOOL_OP( ||, "Logical OR" )
sl@0
   318
sl@0
   319
MO_BINARY_OP( <<, "Left shift" )
sl@0
   320
MO_BINARY_OP( >>, "Right shift" )
sl@0
   321
sl@0
   322
} // namespace itest
sl@0
   323
sl@0
   324
} // namespace boost
sl@0
   325
sl@0
   326
#include <boost/test/detail/enable_warnings.hpp>
sl@0
   327
sl@0
   328
// ***************************************************************************
sl@0
   329
//  Revision History :
sl@0
   330
//
sl@0
   331
//  $Log: mock_object.hpp,v $
sl@0
   332
//  Revision 1.3  2006/03/19 07:27:52  rogeeff
sl@0
   333
//  streamline test setup error message
sl@0
   334
//
sl@0
   335
//  Revision 1.2  2006/01/15 11:14:39  rogeeff
sl@0
   336
//  simpl_mock -> mock_object<>::prototype()
sl@0
   337
//  operator new need to be rethinked
sl@0
   338
//
sl@0
   339
//  Revision 1.1  2005/12/14 05:09:21  rogeeff
sl@0
   340
//  interraction based testing is introdused
sl@0
   341
//
sl@0
   342
// ***************************************************************************
sl@0
   343
sl@0
   344
#endif // BOOST_TEST_MOCK_OBJECT_HPP_112205GER