1
#ifndef __cxxtest__RealDescriptions_cpp__
2
#define __cxxtest__RealDescriptions_cpp__
5
// NOTE: If an error occur during world construction/deletion, CxxTest cannot
6
// know where the error originated.
9
#include <cxxtest/RealDescriptions.h>
13
RealTestDescription::RealTestDescription()
17
RealTestDescription::RealTestDescription( List &argList,
18
SuiteDescription &argSuite,
20
const char *argTestName )
22
initialize( argList, argSuite, argLine, argTestName );
25
void RealTestDescription::initialize( List &argList,
26
SuiteDescription &argSuite,
28
const char *argTestName )
32
_testName = argTestName;
36
bool RealTestDescription::setUp()
41
for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) {
43
_TS_TRY { ok = gf->setUp(); }
44
_TS_LAST_CATCH( { ok = false; } );
47
doFailTest( file(), line(), "Error in GlobalFixture::setUp()" );
53
_TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from setUp()", suite()->setUp() );
55
_TS_CATCH_ABORT( { return false; } );
60
bool RealTestDescription::tearDown()
66
_TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from tearDown()", suite()->tearDown() );
68
_TS_CATCH_ABORT( { return false; } );
70
for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) {
72
_TS_TRY { ok = gf->tearDown(); }
73
_TS_LAST_CATCH( { ok = false; } );
76
doFailTest( file(), line(), "Error in GlobalFixture::tearDown()" );
84
const char *RealTestDescription::file() const { return _suite->file(); }
85
unsigned RealTestDescription::line() const { return _line; }
86
const char *RealTestDescription::testName() const { return _testName; }
87
const char *RealTestDescription::suiteName() const { return _suite->suiteName(); }
89
TestDescription *RealTestDescription::next() { return (RealTestDescription *)Link::next(); }
90
const TestDescription *RealTestDescription::next() const { return (const RealTestDescription *)Link::next(); }
92
TestSuite *RealTestDescription::suite() const { return _suite->suite(); }
94
void RealTestDescription::run()
96
_TS_TRY { runTest(); }
98
___TSM_CATCH( file(), line(), "Exception thrown from test" );
101
RealSuiteDescription::RealSuiteDescription() {}
102
RealSuiteDescription::RealSuiteDescription( const char *argFile,
104
const char *argSuiteName,
107
initialize( argFile, argLine, argSuiteName, argTests );
110
void RealSuiteDescription::initialize( const char *argFile,
112
const char *argSuiteName,
117
_suiteName = argSuiteName;
123
const char *RealSuiteDescription::file() const { return _file; }
124
unsigned RealSuiteDescription::line() const { return _line; }
125
const char *RealSuiteDescription::suiteName() const { return _suiteName; }
127
TestDescription *RealSuiteDescription::firstTest() { return (RealTestDescription *)_tests->head(); }
128
const TestDescription *RealSuiteDescription::firstTest() const { return (const RealTestDescription *)_tests->head(); }
129
SuiteDescription *RealSuiteDescription::next() { return (RealSuiteDescription *)Link::next(); }
130
const SuiteDescription *RealSuiteDescription::next() const { return (const RealSuiteDescription *)Link::next(); }
132
unsigned RealSuiteDescription::numTests() const { return _tests->size(); }
134
const TestDescription &RealSuiteDescription::testDescription( unsigned i ) const
136
return *(RealTestDescription *)_tests->nth( i );
139
void RealSuiteDescription::activateAllTests()
141
_tests->activateAll();
144
bool RealSuiteDescription::leaveOnly( const char *testName )
146
for ( TestDescription *td = firstTest(); td != 0; td = td->next() ) {
147
if ( stringsEqual( td->testName(), testName ) ) {
148
_tests->leaveOnly( *td );
155
StaticSuiteDescription::StaticSuiteDescription() {}
156
StaticSuiteDescription::StaticSuiteDescription( const char *argFile, unsigned argLine,
157
const char *argSuiteName, TestSuite &argSuite,
159
RealSuiteDescription( argFile, argLine, argSuiteName, argTests )
161
doInitialize( argSuite );
164
void StaticSuiteDescription::initialize( const char *argFile, unsigned argLine,
165
const char *argSuiteName, TestSuite &argSuite,
168
RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests );
169
doInitialize( argSuite );
172
void StaticSuiteDescription::doInitialize( TestSuite &argSuite )
177
TestSuite *StaticSuiteDescription::suite() const
182
bool StaticSuiteDescription::setUp() { return true; }
183
bool StaticSuiteDescription::tearDown() { return true; }
185
CommonDynamicSuiteDescription::CommonDynamicSuiteDescription() {}
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 )
191
doInitialize( argCreateLine, argDestroyLine );
194
void CommonDynamicSuiteDescription::initialize( const char *argFile, unsigned argLine,
195
const char *argSuiteName, List &argTests,
196
unsigned argCreateLine, unsigned argDestroyLine )
198
RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests );
199
doInitialize( argCreateLine, argDestroyLine );
202
void CommonDynamicSuiteDescription::doInitialize( unsigned argCreateLine, unsigned argDestroyLine )
204
_createLine = argCreateLine;
205
_destroyLine = argDestroyLine;
208
List &RealWorldDescription::suites()
210
return RealSuiteDescription::_suites;
213
unsigned RealWorldDescription::numSuites( void ) const
215
return suites().size();
218
unsigned RealWorldDescription::numTotalTests( void ) const
221
for ( const SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() )
222
count += sd->numTests();
226
SuiteDescription *RealWorldDescription::firstSuite()
228
return (RealSuiteDescription *)suites().head();
231
const SuiteDescription *RealWorldDescription::firstSuite() const
233
return (const RealSuiteDescription *)suites().head();
236
const SuiteDescription &RealWorldDescription::suiteDescription( unsigned i ) const
238
return *(const RealSuiteDescription *)suites().nth( i );
241
void RealWorldDescription::activateAllTests()
243
suites().activateAll();
244
for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() )
245
sd->activateAllTests();
248
bool RealWorldDescription::leaveOnly( const char *suiteName, const char *testName )
250
for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() ) {
251
if ( stringsEqual( sd->suiteName(), suiteName ) ) {
253
if ( !sd->leaveOnly( testName ) )
255
suites().leaveOnly( *sd );
262
bool RealWorldDescription::setUp()
264
for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) {
266
_TS_TRY { ok = gf->setUpWorld(); }
267
_TS_LAST_CATCH( { ok = false; } );
270
reportError( "Error setting up world" );
278
bool RealWorldDescription::tearDown()
280
for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) {
282
_TS_TRY { ok = gf->tearDownWorld(); }
283
_TS_LAST_CATCH( { ok = false; } );
286
reportError( "Error tearing down world" );
294
void RealWorldDescription::reportError( const char *message )
296
doWarn( __FILE__, 5, message );
299
void activateAllTests()
301
RealWorldDescription().activateAllTests();
304
bool leaveOnly( const char *suiteName, const char *testName )
306
return RealWorldDescription().leaveOnly( suiteName, testName );
310
#endif // __cxxtest__RealDescriptions_cpp__