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