1 #ifndef __cxxtest__Mock_h__
2 #define __cxxtest__Mock_h__
4 //
5 // The default namespace is T::
6 //
7 #ifndef CXXTEST_MOCK_NAMESPACE
8 # define CXXTEST_MOCK_NAMESPACE T
9 #endif // CXXTEST_MOCK_NAMESPACE
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 };
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
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; }
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 ) \
44 TYPE REAL ARGS;
46 #define __CXXTEST_SUPPLY_VOID__PROTOTYPE( MOCK, NAME, ARGS, REAL, CALL ) \
47 __CXXTEST_SUPPLY__PROTOTYPE( MOCK, void, NAME, ARGS, REAL, CALL )
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 ¤t(); \
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 }
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 \
89 { \
90 public: \
91 Base_##MOCK(); \
92 ~Base_##MOCK(); \
93 bool setUp(); \
94 bool tearDown(); \
95 \
96 static Base_##MOCK ¤t(); \
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 }
111 #define __CXXTEST_SUPPLY_VOID__CLASS_DECLARATION( MOCK, NAME, ARGS, REAL, CALL ) \
112 __CXXTEST_SUPPLY__CLASS_DECLARATION( MOCK, void, NAME, ARGS, REAL, CALL )
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 }
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 }
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 }
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 }
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 } \
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" ); \
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)
223 //
224 // Test source file: Prototypes, class declarations and implementation
225 //
226 #include <cxxtest/TestSuite.h>
228 __CXXTEST_MOCK__TRAITS;
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)
251 //
252 // Test file other than source: Prototypes and class declarations
253 //
254 #include <cxxtest/TestSuite.h>
256 __CXXTEST_MOCK__TRAITS;
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)
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; } }
281 #define CXXTEST_MOCK_VOID( MOCK, NAME, ARGS, REAL, CALL ) \
282 namespace CXXTEST_MOCK_NAMESPACE { void NAME ARGS { REAL CALL; } }
284 #else
285 //
286 // Ordinary header file: Just prototypes
287 //
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
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 )
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 )
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 )
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 )
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 }
350 #endif // __cxxtest__Mock_h__