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 ¤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 } 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 ¤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 } 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__ 351