Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/test/mock_object.hpp @ 29

Last change on this file since 29 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

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