1 #ifndef __cxxtest__RealDescriptions_cpp__ 2 #define __cxxtest__RealDescriptions_cpp__ 3 4 // 5 // NOTE: If an error occur during world construction/deletion, CxxTest cannot 6 // know where the error originated. 7 // 8 9 #include <cxxtest/RealDescriptions.h> 10 11 namespace CxxTest 12 { RealTestDescription()13 RealTestDescription::RealTestDescription() 14 { 15 } 16 RealTestDescription(List & argList,SuiteDescription & argSuite,unsigned argLine,const char * argTestName)17 RealTestDescription::RealTestDescription( List &argList, 18 SuiteDescription &argSuite, 19 unsigned argLine, 20 const char *argTestName ) 21 { 22 initialize( argList, argSuite, argLine, argTestName ); 23 } 24 initialize(List & argList,SuiteDescription & argSuite,unsigned argLine,const char * argTestName)25 void RealTestDescription::initialize( List &argList, 26 SuiteDescription &argSuite, 27 unsigned argLine, 28 const char *argTestName ) 29 { 30 _suite = &argSuite; 31 _line = argLine; 32 _testName = argTestName; 33 attach( argList ); 34 } 35 setUp()36 bool RealTestDescription::setUp() 37 { 38 if ( !suite() ) 39 return false; 40 41 for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) { 42 bool ok; 43 _TS_TRY { ok = gf->setUp(); } 44 _TS_LAST_CATCH( { ok = false; } ); 45 46 if ( !ok ) { 47 doFailTest( file(), line(), "Error in GlobalFixture::setUp()" ); 48 return false; 49 } 50 } 51 52 _TS_TRY { 53 _TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from setUp()", suite()->setUp() ); 54 } 55 _TS_CATCH_ABORT( { return false; } ); 56 57 return true; 58 } 59 tearDown()60 bool RealTestDescription::tearDown() 61 { 62 if ( !suite() ) 63 return false; 64 65 _TS_TRY { 66 _TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from tearDown()", suite()->tearDown() ); 67 } 68 _TS_CATCH_ABORT( { return false; } ); 69 70 for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) { 71 bool ok; 72 _TS_TRY { ok = gf->tearDown(); } 73 _TS_LAST_CATCH( { ok = false; } ); 74 75 if ( !ok ) { 76 doFailTest( file(), line(), "Error in GlobalFixture::tearDown()" ); 77 return false; 78 } 79 } 80 81 return true; 82 } 83 file() const84 const char *RealTestDescription::file() const { return _suite->file(); } line() const85 unsigned RealTestDescription::line() const { return _line; } testName() const86 const char *RealTestDescription::testName() const { return _testName; } suiteName() const87 const char *RealTestDescription::suiteName() const { return _suite->suiteName(); } 88 next()89 TestDescription *RealTestDescription::next() { return (RealTestDescription *)Link::next(); } next() const90 const TestDescription *RealTestDescription::next() const { return (const RealTestDescription *)Link::next(); } 91 suite() const92 TestSuite *RealTestDescription::suite() const { return _suite->suite(); } 93 run()94 void RealTestDescription::run() 95 { 96 _TS_TRY { runTest(); } 97 _TS_CATCH_ABORT( {} ) 98 ___TSM_CATCH( file(), line(), "Exception thrown from test" ); 99 } 100 RealSuiteDescription()101 RealSuiteDescription::RealSuiteDescription() {} RealSuiteDescription(const char * argFile,unsigned argLine,const char * argSuiteName,List & argTests)102 RealSuiteDescription::RealSuiteDescription( const char *argFile, 103 unsigned argLine, 104 const char *argSuiteName, 105 List &argTests ) 106 { 107 initialize( argFile, argLine, argSuiteName, argTests ); 108 } 109 initialize(const char * argFile,unsigned argLine,const char * argSuiteName,List & argTests)110 void RealSuiteDescription::initialize( const char *argFile, 111 unsigned argLine, 112 const char *argSuiteName, 113 List &argTests ) 114 { 115 _file = argFile; 116 _line = argLine; 117 _suiteName = argSuiteName; 118 _tests = &argTests; 119 120 attach( _suites ); 121 } 122 file() const123 const char *RealSuiteDescription::file() const { return _file; } line() const124 unsigned RealSuiteDescription::line() const { return _line; } suiteName() const125 const char *RealSuiteDescription::suiteName() const { return _suiteName; } 126 firstTest()127 TestDescription *RealSuiteDescription::firstTest() { return (RealTestDescription *)_tests->head(); } firstTest() const128 const TestDescription *RealSuiteDescription::firstTest() const { return (const RealTestDescription *)_tests->head(); } next()129 SuiteDescription *RealSuiteDescription::next() { return (RealSuiteDescription *)Link::next(); } next() const130 const SuiteDescription *RealSuiteDescription::next() const { return (const RealSuiteDescription *)Link::next(); } 131 numTests() const132 unsigned RealSuiteDescription::numTests() const { return _tests->size(); } 133 testDescription(unsigned i) const134 const TestDescription &RealSuiteDescription::testDescription( unsigned i ) const 135 { 136 return *(RealTestDescription *)_tests->nth( i ); 137 } 138 activateAllTests()139 void RealSuiteDescription::activateAllTests() 140 { 141 _tests->activateAll(); 142 } 143 leaveOnly(const char * testName)144 bool RealSuiteDescription::leaveOnly( const char *testName ) 145 { 146 for ( TestDescription *td = firstTest(); td != 0; td = td->next() ) { 147 if ( stringsEqual( td->testName(), testName ) ) { 148 _tests->leaveOnly( *td ); 149 return true; 150 } 151 } 152 return false; 153 } 154 StaticSuiteDescription()155 StaticSuiteDescription::StaticSuiteDescription() {} StaticSuiteDescription(const char * argFile,unsigned argLine,const char * argSuiteName,TestSuite & argSuite,List & argTests)156 StaticSuiteDescription::StaticSuiteDescription( const char *argFile, unsigned argLine, 157 const char *argSuiteName, TestSuite &argSuite, 158 List &argTests ) : 159 RealSuiteDescription( argFile, argLine, argSuiteName, argTests ) 160 { 161 doInitialize( argSuite ); 162 } 163 initialize(const char * argFile,unsigned argLine,const char * argSuiteName,TestSuite & argSuite,List & argTests)164 void StaticSuiteDescription::initialize( const char *argFile, unsigned argLine, 165 const char *argSuiteName, TestSuite &argSuite, 166 List &argTests ) 167 { 168 RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests ); 169 doInitialize( argSuite ); 170 } 171 doInitialize(TestSuite & argSuite)172 void StaticSuiteDescription::doInitialize( TestSuite &argSuite ) 173 { 174 _suite = &argSuite; 175 } 176 suite() const177 TestSuite *StaticSuiteDescription::suite() const 178 { 179 return _suite; 180 } 181 setUp()182 bool StaticSuiteDescription::setUp() { return true; } tearDown()183 bool StaticSuiteDescription::tearDown() { return true; } 184 CommonDynamicSuiteDescription()185 CommonDynamicSuiteDescription::CommonDynamicSuiteDescription() {} CommonDynamicSuiteDescription(const char * argFile,unsigned argLine,const char * argSuiteName,List & argTests,unsigned argCreateLine,unsigned argDestroyLine)186 CommonDynamicSuiteDescription::CommonDynamicSuiteDescription( const char *argFile, unsigned argLine, 187 const char *argSuiteName, List &argTests, 188 unsigned argCreateLine, unsigned argDestroyLine ) : 189 RealSuiteDescription( argFile, argLine, argSuiteName, argTests ) 190 { 191 doInitialize( argCreateLine, argDestroyLine ); 192 } 193 initialize(const char * argFile,unsigned argLine,const char * argSuiteName,List & argTests,unsigned argCreateLine,unsigned argDestroyLine)194 void CommonDynamicSuiteDescription::initialize( const char *argFile, unsigned argLine, 195 const char *argSuiteName, List &argTests, 196 unsigned argCreateLine, unsigned argDestroyLine ) 197 { 198 RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests ); 199 doInitialize( argCreateLine, argDestroyLine ); 200 } 201 doInitialize(unsigned argCreateLine,unsigned argDestroyLine)202 void CommonDynamicSuiteDescription::doInitialize( unsigned argCreateLine, unsigned argDestroyLine ) 203 { 204 _createLine = argCreateLine; 205 _destroyLine = argDestroyLine; 206 } 207 suites()208 List &RealWorldDescription::suites() 209 { 210 return RealSuiteDescription::_suites; 211 } 212 numSuites(void) const213 unsigned RealWorldDescription::numSuites( void ) const 214 { 215 return suites().size(); 216 } 217 numTotalTests(void) const218 unsigned RealWorldDescription::numTotalTests( void ) const 219 { 220 unsigned count = 0; 221 for ( const SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() ) 222 count += sd->numTests(); 223 return count; 224 } 225 firstSuite()226 SuiteDescription *RealWorldDescription::firstSuite() 227 { 228 return (RealSuiteDescription *)suites().head(); 229 } 230 firstSuite() const231 const SuiteDescription *RealWorldDescription::firstSuite() const 232 { 233 return (const RealSuiteDescription *)suites().head(); 234 } 235 suiteDescription(unsigned i) const236 const SuiteDescription &RealWorldDescription::suiteDescription( unsigned i ) const 237 { 238 return *(const RealSuiteDescription *)suites().nth( i ); 239 } 240 activateAllTests()241 void RealWorldDescription::activateAllTests() 242 { 243 suites().activateAll(); 244 for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() ) 245 sd->activateAllTests(); 246 } 247 leaveOnly(const char * suiteName,const char * testName)248 bool RealWorldDescription::leaveOnly( const char *suiteName, const char *testName ) 249 { 250 for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() ) { 251 if ( stringsEqual( sd->suiteName(), suiteName ) ) { 252 if ( testName ) 253 if ( !sd->leaveOnly( testName ) ) 254 return false; 255 suites().leaveOnly( *sd ); 256 return true; 257 } 258 } 259 return false; 260 } 261 setUp()262 bool RealWorldDescription::setUp() 263 { 264 for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) { 265 bool ok; 266 _TS_TRY { ok = gf->setUpWorld(); } 267 _TS_LAST_CATCH( { ok = false; } ); 268 269 if ( !ok ) { 270 reportError( "Error setting up world" ); 271 return false; 272 } 273 } 274 275 return true; 276 } 277 tearDown()278 bool RealWorldDescription::tearDown() 279 { 280 for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) { 281 bool ok; 282 _TS_TRY { ok = gf->tearDownWorld(); } 283 _TS_LAST_CATCH( { ok = false; } ); 284 285 if ( !ok ) { 286 reportError( "Error tearing down world" ); 287 return false; 288 } 289 } 290 291 return true; 292 } 293 reportError(const char * message)294 void RealWorldDescription::reportError( const char *message ) 295 { 296 doWarn( __FILE__, 5, message ); 297 } 298 activateAllTests()299 void activateAllTests() 300 { 301 RealWorldDescription().activateAllTests(); 302 } 303 leaveOnly(const char * suiteName,const char * testName)304 bool leaveOnly( const char *suiteName, const char *testName ) 305 { 306 return RealWorldDescription().leaveOnly( suiteName, testName ); 307 } 308 } 309 310 #endif // __cxxtest__RealDescriptions_cpp__ 311