1 #ifndef __cxxtest__Mock_h__
2 #define __cxxtest__Mock_h__
7 #ifndef CXXTEST_MOCK_NAMESPACE
8 # define CXXTEST_MOCK_NAMESPACE T
9 #endif // CXXTEST_MOCK_NAMESPACE
14 #define __CXXTEST_MOCK__TRAITS \
15 namespace CXXTEST_MOCK_NAMESPACE \
21 static T defaultValue() { return 0; } \
29 # define CXXTEST_EXTERN_C extern "C"
31 # define CXXTEST_EXTERN_C
37 #define __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
38 namespace CXXTEST_MOCK_NAMESPACE { TYPE NAME ARGS; }
40 #define __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
41 __CXXTEST_MOCK__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
43 #define __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
46 #define __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
47 __CXXTEST_SUPPLY__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
52 #define __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
53 namespace CXXTEST_MOCK_NAMESPACE { \
54 class Base_##MOCK : public CxxTest::Link \
62 static Base_##MOCK ¤t(); \
64 virtual TYPE NAME ARGS = 0; \
67 static CxxTest::List _list; \
70 class Real_##MOCK : public Base_##MOCK \
76 class _Unimplemented_##MOCK : public Base_##MOCK \
83 #define __CXXTEST_MOCK_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
84 __CXXTEST_MOCK__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
86 #define __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
87 namespace CXXTEST_MOCK_NAMESPACE { \
88 class Base_##MOCK : public CxxTest::Link \
96 static Base_##MOCK ¤t(); \
98 virtual TYPE NAME ARGS = 0; \
101 static CxxTest::List _list; \
104 class _Unimplemented_##MOCK : public Base_##MOCK \
111 #define __CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
112 __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
117 #define __CXXTEST_MOCK__COMMON_CLASS_IMPLEMENTATION( MOCK, NAME ) \
118 namespace CXXTEST_MOCK_NAMESPACE { \
120 CxxTest::List Base_##MOCK::_list = { 0, 0 }; \
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; } \
127 Base_##MOCK &Base_##MOCK::current() \
129 if ( _list.empty() ) \
130 static _Unimplemented_##MOCK unimplemented; \
131 return *(Base_##MOCK *)_list.tail(); \
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 \
143 TYPE _Unimplemented_##MOCK::NAME ARGS \
147 __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
148 return MockTraits<TYPE>::defaultValue(); \
153 return Base_##MOCK::current().NAME CALL; \
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 \
165 void _Unimplemented_##MOCK::NAME ARGS \
169 __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
174 Base_##MOCK::current().NAME CALL; \
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 \
185 __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
186 return MockTraits<TYPE>::defaultValue(); \
192 return CXXTEST_MOCK_NAMESPACE::Base_##MOCK::current().NAME CALL; \
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 \
202 __CXXTEST_MOCK_UNIMPLEMENTED( NAME, ARGS ); \
208 CXXTEST_MOCK_NAMESPACE::Base_##MOCK::current().NAME CALL; \
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" ); \
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
222 #if defined(CXXTEST_MOCK_TEST_SOURCE_FILE)
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 )
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 )
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 )
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 )
250 #elif defined(CXXTEST_FLAGS) || defined(CXXTEST_RUNNING)
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 )
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 )
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 )
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 )
274 #elif defined(CXXTEST_MOCK_REAL_SOURCE_FILE)
278 #define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
279 namespace CXXTEST_MOCK_NAMESPACE { TYPE NAME ARGS { return REAL CALL; } }
281 #define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
282 namespace CXXTEST_MOCK_NAMESPACE { void NAME ARGS { REAL CALL; } }
289 #define CXXTEST_MOCK( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
290 __CXXTEST_MOCK__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL )
292 #define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
293 __CXXTEST_MOCK_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL )
295 #define CXXTEST_SUPPLY( MOCK, TYPE, NAME, ARGS, REAL, CALL ) \
296 __CXXTEST_SUPPLY__PROTOTYPE( MOCK, TYPE, NAME, ARGS, REAL, CALL )
298 #define CXXTEST_SUPPLY_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
299 __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL )
301 #endif // Ordinary header file
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 )
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 )
317 #define CXXTEST_MOCK_GLOBAL( TYPE, NAME, ARGS, CALL ) \
318 CXXTEST_MOCK( NAME, TYPE, NAME, ARGS, ::NAME, CALL )
320 #define CXXTEST_MOCK_VOID_GLOBAL( NAME, ARGS, CALL ) \
321 CXXTEST_MOCK_VOID( NAME, NAME, ARGS, ::NAME, CALL )
323 #define CXXTEST_SUPPLY_GLOBAL( TYPE, NAME, ARGS, CALL ) \
324 CXXTEST_SUPPLY( NAME, TYPE, NAME, ARGS, NAME, CALL )
326 #define CXXTEST_SUPPLY_VOID_GLOBAL( NAME, ARGS, CALL ) \
327 CXXTEST_SUPPLY_VOID( NAME, NAME, ARGS, NAME, CALL )
329 #define CXXTEST_SUPPLY_GLOBAL_C( TYPE, NAME, ARGS, CALL ) \
330 CXXTEST_SUPPLY_C( NAME, TYPE, NAME, ARGS, NAME, CALL )
332 #define CXXTEST_SUPPLY_VOID_GLOBAL_C( NAME, ARGS, CALL ) \
333 CXXTEST_SUPPLY_VOID_C( NAME, NAME, ARGS, NAME, CALL )
339 #define CXXTEST_MOCK_DEFAULT_VALUE( TYPE, VALUE ) \
340 namespace CXXTEST_MOCK_NAMESPACE \
343 class MockTraits<TYPE> \
346 static TYPE defaultValue() { return VALUE; } \
350 #endif // __cxxtest__Mock_h__
#define __CXXTEST_MOCK__TRAITS