311 lines
10 KiB
C++
311 lines
10 KiB
C++
#ifndef __cxxtest__RealDescriptions_cpp__
|
|
#define __cxxtest__RealDescriptions_cpp__
|
|
|
|
//
|
|
// NOTE: If an error occur during world construction/deletion, CxxTest cannot
|
|
// know where the error originated.
|
|
//
|
|
|
|
#include <cxxtest/RealDescriptions.h>
|
|
|
|
namespace CxxTest
|
|
{
|
|
RealTestDescription::RealTestDescription()
|
|
{
|
|
}
|
|
|
|
RealTestDescription::RealTestDescription( List &argList,
|
|
SuiteDescription &argSuite,
|
|
unsigned argLine,
|
|
const char *argTestName )
|
|
{
|
|
initialize( argList, argSuite, argLine, argTestName );
|
|
}
|
|
|
|
void RealTestDescription::initialize( List &argList,
|
|
SuiteDescription &argSuite,
|
|
unsigned argLine,
|
|
const char *argTestName )
|
|
{
|
|
_suite = &argSuite;
|
|
_line = argLine;
|
|
_testName = argTestName;
|
|
attach( argList );
|
|
}
|
|
|
|
bool RealTestDescription::setUp()
|
|
{
|
|
if ( !suite() )
|
|
return false;
|
|
|
|
for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) {
|
|
bool ok;
|
|
_TS_TRY { ok = gf->setUp(); }
|
|
_TS_LAST_CATCH( { ok = false; } );
|
|
|
|
if ( !ok ) {
|
|
doFailTest( file(), line(), "Error in GlobalFixture::setUp()" );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
_TS_TRY {
|
|
_TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from setUp()", suite()->setUp() );
|
|
}
|
|
_TS_CATCH_ABORT( { return false; } );
|
|
|
|
return true;
|
|
}
|
|
|
|
bool RealTestDescription::tearDown()
|
|
{
|
|
if ( !suite() )
|
|
return false;
|
|
|
|
_TS_TRY {
|
|
_TSM_ASSERT_THROWS_NOTHING( file(), line(), "Exception thrown from tearDown()", suite()->tearDown() );
|
|
}
|
|
_TS_CATCH_ABORT( { return false; } );
|
|
|
|
for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) {
|
|
bool ok;
|
|
_TS_TRY { ok = gf->tearDown(); }
|
|
_TS_LAST_CATCH( { ok = false; } );
|
|
|
|
if ( !ok ) {
|
|
doFailTest( file(), line(), "Error in GlobalFixture::tearDown()" );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const char *RealTestDescription::file() const { return _suite->file(); }
|
|
unsigned RealTestDescription::line() const { return _line; }
|
|
const char *RealTestDescription::testName() const { return _testName; }
|
|
const char *RealTestDescription::suiteName() const { return _suite->suiteName(); }
|
|
|
|
TestDescription *RealTestDescription::next() { return (RealTestDescription *)Link::next(); }
|
|
const TestDescription *RealTestDescription::next() const { return (const RealTestDescription *)Link::next(); }
|
|
|
|
TestSuite *RealTestDescription::suite() const { return _suite->suite(); }
|
|
|
|
void RealTestDescription::run()
|
|
{
|
|
_TS_TRY { runTest(); }
|
|
_TS_CATCH_ABORT( {} )
|
|
___TSM_CATCH( file(), line(), "Exception thrown from test" );
|
|
}
|
|
|
|
RealSuiteDescription::RealSuiteDescription() {}
|
|
RealSuiteDescription::RealSuiteDescription( const char *argFile,
|
|
unsigned argLine,
|
|
const char *argSuiteName,
|
|
List &argTests )
|
|
{
|
|
initialize( argFile, argLine, argSuiteName, argTests );
|
|
}
|
|
|
|
void RealSuiteDescription::initialize( const char *argFile,
|
|
unsigned argLine,
|
|
const char *argSuiteName,
|
|
List &argTests )
|
|
{
|
|
_file = argFile;
|
|
_line = argLine;
|
|
_suiteName = argSuiteName;
|
|
_tests = &argTests;
|
|
|
|
attach( _suites );
|
|
}
|
|
|
|
const char *RealSuiteDescription::file() const { return _file; }
|
|
unsigned RealSuiteDescription::line() const { return _line; }
|
|
const char *RealSuiteDescription::suiteName() const { return _suiteName; }
|
|
|
|
TestDescription *RealSuiteDescription::firstTest() { return (RealTestDescription *)_tests->head(); }
|
|
const TestDescription *RealSuiteDescription::firstTest() const { return (const RealTestDescription *)_tests->head(); }
|
|
SuiteDescription *RealSuiteDescription::next() { return (RealSuiteDescription *)Link::next(); }
|
|
const SuiteDescription *RealSuiteDescription::next() const { return (const RealSuiteDescription *)Link::next(); }
|
|
|
|
unsigned RealSuiteDescription::numTests() const { return _tests->size(); }
|
|
|
|
const TestDescription &RealSuiteDescription::testDescription( unsigned i ) const
|
|
{
|
|
return *(RealTestDescription *)_tests->nth( i );
|
|
}
|
|
|
|
void RealSuiteDescription::activateAllTests()
|
|
{
|
|
_tests->activateAll();
|
|
}
|
|
|
|
bool RealSuiteDescription::leaveOnly( const char *testName )
|
|
{
|
|
for ( TestDescription *td = firstTest(); td != 0; td = td->next() ) {
|
|
if ( stringsEqual( td->testName(), testName ) ) {
|
|
_tests->leaveOnly( *td );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
StaticSuiteDescription::StaticSuiteDescription() {}
|
|
StaticSuiteDescription::StaticSuiteDescription( const char *argFile, unsigned argLine,
|
|
const char *argSuiteName, TestSuite &argSuite,
|
|
List &argTests ) :
|
|
RealSuiteDescription( argFile, argLine, argSuiteName, argTests )
|
|
{
|
|
doInitialize( argSuite );
|
|
}
|
|
|
|
void StaticSuiteDescription::initialize( const char *argFile, unsigned argLine,
|
|
const char *argSuiteName, TestSuite &argSuite,
|
|
List &argTests )
|
|
{
|
|
RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests );
|
|
doInitialize( argSuite );
|
|
}
|
|
|
|
void StaticSuiteDescription::doInitialize( TestSuite &argSuite )
|
|
{
|
|
_suite = &argSuite;
|
|
}
|
|
|
|
TestSuite *StaticSuiteDescription::suite() const
|
|
{
|
|
return _suite;
|
|
}
|
|
|
|
bool StaticSuiteDescription::setUp() { return true; }
|
|
bool StaticSuiteDescription::tearDown() { return true; }
|
|
|
|
CommonDynamicSuiteDescription::CommonDynamicSuiteDescription() {}
|
|
CommonDynamicSuiteDescription::CommonDynamicSuiteDescription( const char *argFile, unsigned argLine,
|
|
const char *argSuiteName, List &argTests,
|
|
unsigned argCreateLine, unsigned argDestroyLine ) :
|
|
RealSuiteDescription( argFile, argLine, argSuiteName, argTests )
|
|
{
|
|
doInitialize( argCreateLine, argDestroyLine );
|
|
}
|
|
|
|
void CommonDynamicSuiteDescription::initialize( const char *argFile, unsigned argLine,
|
|
const char *argSuiteName, List &argTests,
|
|
unsigned argCreateLine, unsigned argDestroyLine )
|
|
{
|
|
RealSuiteDescription::initialize( argFile, argLine, argSuiteName, argTests );
|
|
doInitialize( argCreateLine, argDestroyLine );
|
|
}
|
|
|
|
void CommonDynamicSuiteDescription::doInitialize( unsigned argCreateLine, unsigned argDestroyLine )
|
|
{
|
|
_createLine = argCreateLine;
|
|
_destroyLine = argDestroyLine;
|
|
}
|
|
|
|
List &RealWorldDescription::suites()
|
|
{
|
|
return RealSuiteDescription::_suites;
|
|
}
|
|
|
|
unsigned RealWorldDescription::numSuites( void ) const
|
|
{
|
|
return suites().size();
|
|
}
|
|
|
|
unsigned RealWorldDescription::numTotalTests( void ) const
|
|
{
|
|
unsigned count = 0;
|
|
for ( const SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() )
|
|
count += sd->numTests();
|
|
return count;
|
|
}
|
|
|
|
SuiteDescription *RealWorldDescription::firstSuite()
|
|
{
|
|
return (RealSuiteDescription *)suites().head();
|
|
}
|
|
|
|
const SuiteDescription *RealWorldDescription::firstSuite() const
|
|
{
|
|
return (const RealSuiteDescription *)suites().head();
|
|
}
|
|
|
|
const SuiteDescription &RealWorldDescription::suiteDescription( unsigned i ) const
|
|
{
|
|
return *(const RealSuiteDescription *)suites().nth( i );
|
|
}
|
|
|
|
void RealWorldDescription::activateAllTests()
|
|
{
|
|
suites().activateAll();
|
|
for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() )
|
|
sd->activateAllTests();
|
|
}
|
|
|
|
bool RealWorldDescription::leaveOnly( const char *suiteName, const char *testName )
|
|
{
|
|
for ( SuiteDescription *sd = firstSuite(); sd != 0; sd = sd->next() ) {
|
|
if ( stringsEqual( sd->suiteName(), suiteName ) ) {
|
|
if ( testName )
|
|
if ( !sd->leaveOnly( testName ) )
|
|
return false;
|
|
suites().leaveOnly( *sd );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool RealWorldDescription::setUp()
|
|
{
|
|
for ( GlobalFixture *gf = GlobalFixture::firstGlobalFixture(); gf != 0; gf = gf->nextGlobalFixture() ) {
|
|
bool ok;
|
|
_TS_TRY { ok = gf->setUpWorld(); }
|
|
_TS_LAST_CATCH( { ok = false; } );
|
|
|
|
if ( !ok ) {
|
|
reportError( "Error setting up world" );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool RealWorldDescription::tearDown()
|
|
{
|
|
for ( GlobalFixture *gf = GlobalFixture::lastGlobalFixture(); gf != 0; gf = gf->prevGlobalFixture() ) {
|
|
bool ok;
|
|
_TS_TRY { ok = gf->tearDownWorld(); }
|
|
_TS_LAST_CATCH( { ok = false; } );
|
|
|
|
if ( !ok ) {
|
|
reportError( "Error tearing down world" );
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void RealWorldDescription::reportError( const char *message )
|
|
{
|
|
doWarn( __FILE__, 5, message );
|
|
}
|
|
|
|
void activateAllTests()
|
|
{
|
|
RealWorldDescription().activateAllTests();
|
|
}
|
|
|
|
bool leaveOnly( const char *suiteName, const char *testName )
|
|
{
|
|
return RealWorldDescription().leaveOnly( suiteName, testName );
|
|
}
|
|
}
|
|
|
|
#endif // __cxxtest__RealDescriptions_cpp__
|