summaryrefslogtreecommitdiff
path: root/cxxtest/RealDescriptions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cxxtest/RealDescriptions.cpp')
-rw-r--r--cxxtest/RealDescriptions.cpp311
1 files changed, 311 insertions, 0 deletions
diff --git a/cxxtest/RealDescriptions.cpp b/cxxtest/RealDescriptions.cpp
new file mode 100644
index 0000000..1e21ca7
--- /dev/null
+++ b/cxxtest/RealDescriptions.cpp
@@ -0,0 +1,311 @@
+#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__
+