1#ifndef __cxxtest__Mock_h__
2#define __cxxtest__Mock_h__
7#ifndef CXXTEST_MOCK_NAMESPACE
8# define CXXTEST_MOCK_NAMESPACE T
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 )
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; } \
#define __CXXTEST_MOCK__TRAITS