source: git/libpolys/tests/cxxtest/Mock.h

spielwiese
Last change on this file was 4aa8610, checked in by Mohamed Barakat <mohamed.barakat@…>, 13 years ago
created libpolys/tests and set up the beginning of a test-suite using cxxtest
  • Property mode set to 100644
File size: 11.2 KB
Line 
1#ifndef __cxxtest__Mock_h__
2#define __cxxtest__Mock_h__
3
4//
5// The default namespace is T::
6//
7#ifndef CXXTEST_MOCK_NAMESPACE
8#   define CXXTEST_MOCK_NAMESPACE T
9#endif // CXXTEST_MOCK_NAMESPACE
10
11//
12// MockTraits: What to return when no mock object has been created
13//
14#define __CXXTEST_MOCK__TRAITS \
15    namespace CXXTEST_MOCK_NAMESPACE \
16    { \
17        template<class T> \
18        class MockTraits \
19        { \
20        public: \
21            static T defaultValue() { return 0; } \
22        }; \
23    };
24
25//
26// extern "C" when needed
27//
28#ifdef __cplusplus
29#   define CXXTEST_EXTERN_C extern "C"
30#else
31#   define CXXTEST_EXTERN_C
32#endif // __cplusplus
33
34//
35// Prototypes: For "normal" headers
36//
37#define __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
38    namespace CXXTEST_MOCK_NAMESPACE { TYPE NAME ARGS; }
39
40#define __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
41    __CXXTEST_MOCK__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
42
43#define __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
44    TYPE REAL ARGS;
45
46#define __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
47    __CXXTEST_SUPPLY__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
48
49//
50// Class declarations: For test files
51//
52#define __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
53    namespace CXXTEST_MOCK_NAMESPACE { \
54        class Base_##MOCK : public CxxTest::Link \
55        { \
56        public: \
57            Base_##MOCK(); \
58            ~Base_##MOCK(); \
59            bool setUp(); \
60            bool tearDown(); \
61         \
62            static Base_##MOCK &current(); \
63         \
64            virtual TYPE NAME ARGS = 0; \
65         \
66        private: \
67            static CxxTest::List _list; \
68        }; \
69         \
70        class Real_##MOCK  : public Base_##MOCK \
71        { \
72        public: \
73            TYPE NAME ARGS; \
74        }; \
75         \
76        class _Unimplemented_##MOCK  : public Base_##MOCK \
77        { \
78        public: \
79            TYPE NAME ARGS; \
80        }; \
81    }
82
83#define __CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
84    __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
85
86#define __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
87    namespace CXXTEST_MOCK_NAMESPACE { \
88        class Base_##MOCK : public CxxTest::Link \
89        { \
90        public: \
91            Base_##MOCK(); \
92            ~Base_##MOCK(); \
93            bool setUp(); \
94            bool tearDown(); \
95         \
96            static Base_##MOCK &current(); \
97         \
98            virtual TYPE NAME ARGS = 0; \
99         \
100        private: \
101            static CxxTest::List _list; \
102        }; \
103         \
104        class _Unimplemented_##MOCK  : public Base_##MOCK \
105        { \
106        public: \
107            TYPE NAME ARGS; \
108        }; \
109    }
110
111#define __CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
112    __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
113
114//
115// Class implementation: For test source files
116//
117#define __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
118    namespace CXXTEST_MOCK_NAMESPACE { \
119         \
120        CxxTest::List Base_##MOCK::_list = { 0, 0 }; \
121         \
122        Base_##MOCK::Base_##MOCK() { attach( _list ); } \
123        Base_##MOCK::~Base_##MOCK() { detach( _list ); } \
124        bool Base_##MOCK::setUp() { return true; } \
125        bool Base_##MOCK::tearDown() { return true; } \
126         \
127        Base_##MOCK &Base_##MOCK::current() \
128        { \
129            if ( _list.empty() ) \
130                static _Unimplemented_##MOCK unimplemented; \
131            return *(Base_##MOCK *)_list.tail(); \
132        } \
133    }
134
135#define __CXXTEST_MOCK__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
136    __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
137    namespace CXXTEST_MOCK_NAMESPACE { \
138        TYPE Real_##MOCK::NAME ARGS \
139        { \
140            return REAL CALL; \
141        } \
142         \
143        TYPE _Unimplemented_##MOCK::NAME ARGS \
144        { \
145            while ( false ) \
146                return NAME CALL; \
147            __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
148            return MockTraits<TYPE>::defaultValue(); \
149        } \
150         \
151        TYPE NAME ARGS \
152        { \
153            return Base_##MOCK::current().NAME CALL; \
154        } \
155    }
156
157#define __CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL ) \
158    __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
159    namespace CXXTEST_MOCK_NAMESPACE { \
160        void Real_##MOCK::NAME ARGS \
161        { \
162            REAL CALL; \
163        } \
164         \
165        void _Unimplemented_##MOCK::NAME ARGS \
166        { \
167            while ( false ) \
168                NAME CALL; \
169            __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
170        } \
171         \
172        void NAME ARGS \
173        { \
174            Base_##MOCK::current().NAME CALL; \
175        } \
176    }
177
178#define __CXXTEST_SUPPLY__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
179    __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
180    namespace CXXTEST_MOCK_NAMESPACE { \
181        TYPE _Unimplemented_##MOCK::NAME ARGS \
182        { \
183            while ( false ) \
184                return NAME CALL; \
185            __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
186            return MockTraits<TYPE>::defaultValue(); \
187        } \
188    } \
189     \
190    TYPE REAL ARGS \
191    { \
192        return CXXTEST_MOCK_NAMESPACE::Base_##MOCK::current().NAME CALL; \
193    }
194
195#define __CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL ) \
196    __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
197    namespace CXXTEST_MOCK_NAMESPACE { \
198        void _Unimplemented_##MOCK::NAME ARGS \
199        { \
200            while ( false ) \
201                NAME CALL; \
202            __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
203        } \
204    } \
205     \
206    void REAL ARGS \
207    { \
208        CXXTEST_MOCK_NAMESPACE::Base_##MOCK::current().NAME CALL; \
209    } \
210
211//
212// Error for calling mock function w/o object
213//
214#define __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ) \
215    TS_FAIL( CXXTEST_MOCK_NAMESPACE_STR #NAME #ARGS " called with no " \
216             CXXTEST_MOCK_NAMESPACE_STR "Base_" #NAME " object" ); \
217
218#define CXXTEST_MOCK_NAMESPACE_STR __CXXTEST_STR(CXXTEST_MOCK_NAMESPACE) "::"
219#define __CXXTEST_STR(X) __CXXTEST_XSTR(X)
220#define __CXXTEST_XSTR(X) #X
221
222#if defined(CXXTEST_MOCK_TEST_SOURCE_FILE)
223//
224// Test source file: Prototypes, class declarations and implementation
225//
226#include <cxxtest/TestSuite.h>
227
228__CXXTEST_MOCK__TRAITS;
229
230#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
231    __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
232    __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
233    __CXXTEST_MOCK__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
234
235#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
236    __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
237    __CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
238    __CXXTEST_MOCK_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL )
239
240#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
241    __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
242    __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
243    __CXXTEST_SUPPLY__CLASS_IMPLEMENTATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
244
245#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
246    __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
247    __CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
248    __CXXTEST_SUPPLY_VOID__CLASS_IMPLEMENTATION( MOCK, NAME, ARGS, REAL, CALL )
249
250#elif defined(CXXTEST_FLAGS) || defined(CXXTEST_RUNNING)
251//
252// Test file other than source: Prototypes and class declarations
253//
254#include <cxxtest/TestSuite.h>
255
256__CXXTEST_MOCK__TRAITS;
257
258#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
259    __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
260    __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
261
262#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
263    __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
264    __CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL )
265
266#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
267    __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
268    __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL )
269
270#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
271    __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
272    __CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL )
273
274#elif defined(CXXTEST_MOCK_REAL_SOURCE_FILE)
275//
276// Real source file: "Real" implementations
277//
278#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
279    namespace CXXTEST_MOCK_NAMESPACE { TYPE NAME ARGS { return REAL CALL; } }
280
281#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
282    namespace CXXTEST_MOCK_NAMESPACE { void NAME ARGS { REAL CALL; } }
283
284#else
285//
286// Ordinary header file: Just prototypes
287//
288
289#define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
290    __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL )
291
292#define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
293    __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL )
294
295#define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
296    __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL )
297
298#define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
299    __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL )
300
301#endif // Ordinary header file
302
303//
304// How to supply extern "C" functions
305//
306#define CXXTEST_SUPPLY_C( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
307    CXXTEST_EXTERN_C __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
308    CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL )
309
310#define CXXTEST_SUPPLY_VOID_C( MOCK, NAME, ARGS, REAL, CALL ) \
311    CXXTEST_EXTERN_C __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
312    CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL )
313
314//
315// Usually we mean the global namespace
316//
317#define CXXTEST_MOCK_GLOBAL( TYPE, NAME, ARGS, CALL ) \
318    CXXTEST_MOCK( NAME, TYPE, NAME, ARGS, ::NAME, CALL )
319
320#define CXXTEST_MOCK_VOID_GLOBAL( NAME, ARGS, CALL ) \
321    CXXTEST_MOCK_VOID( NAME, NAME, ARGS, ::NAME, CALL )
322
323#define CXXTEST_SUPPLY_GLOBAL( TYPE, NAME, ARGS, CALL ) \
324    CXXTEST_SUPPLY( NAME, TYPE, NAME, ARGS, NAME, CALL )
325
326#define CXXTEST_SUPPLY_VOID_GLOBAL( NAME, ARGS, CALL ) \
327    CXXTEST_SUPPLY_VOID( NAME, NAME, ARGS, NAME, CALL )
328
329#define CXXTEST_SUPPLY_GLOBAL_C( TYPE, NAME, ARGS, CALL ) \
330    CXXTEST_SUPPLY_C( NAME, TYPE, NAME, ARGS, NAME, CALL )
331
332#define CXXTEST_SUPPLY_VOID_GLOBAL_C( NAME, ARGS, CALL ) \
333    CXXTEST_SUPPLY_VOID_C( NAME, NAME, ARGS, NAME, CALL )
334
335//
336// What to return when no mock object has been created.
337// The default value of 0 usually works, but some cases may need this.
338//
339#define CXXTEST_MOCK_DEFAULT_VALUE( TYPE, VALUE ) \
340    namespace CXXTEST_MOCK_NAMESPACE \
341    { \
342        template<> \
343        class MockTraits<TYPE> \
344        { \
345        public: \
346            static TYPE defaultValue() { return VALUE; } \
347        }; \
348    }
349
350#endif // __cxxtest__Mock_h__
Note: See TracBrowser for help on using the repository browser.