Merged TestCaseTracker and SectionTracker and introduced TestCaseTracker::Guard

This commit is contained in:
Phil Nash 2013-07-25 08:07:55 +01:00
parent ee647f5099
commit 28d3881ff9
3 changed files with 100 additions and 105 deletions

View File

@ -269,7 +269,7 @@ namespace Catch {
m_reporter->sectionStarting( testCaseSection ); m_reporter->sectionStarting( testCaseSection );
try { try {
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
m_testCaseTracker->enter(); TestCaseTracker::Guard guard( *m_testCaseTracker );
if( m_reporter->getPreferences().shouldRedirectStdOut ) { if( m_reporter->getPreferences().shouldRedirectStdOut ) {
StreamRedirect coutRedir( std::cout, redirectedCout ); StreamRedirect coutRedir( std::cout, redirectedCout );
@ -279,14 +279,11 @@ namespace Catch {
else { else {
m_activeTestCase->invoke(); m_activeTestCase->invoke();
} }
m_testCaseTracker->leave();
} }
catch( TestFailureException& ) { catch( TestFailureException& ) {
// This just means the test was aborted due to failure // This just means the test was aborted due to failure
m_testCaseTracker->leave(); // !TBD: RAII
} }
catch(...) { catch(...) {
m_testCaseTracker->leave();
ExpressionResultBuilder exResult( ResultWas::ThrewException ); ExpressionResultBuilder exResult( ResultWas::ThrewException );
exResult << translateActiveException(); exResult << translateActiveException();
actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) ); actOnCurrentResult( exResult.buildResult( m_lastAssertionInfo ) );

View File

@ -69,13 +69,14 @@ namespace SectionTracking {
}; };
class SectionTracker { class TestCaseTracker {
public: public:
SectionTracker( TrackedSection& testCase ) TestCaseTracker( std::string const& testCaseName )
: m_currentSection( &testCase ), : m_testCase( testCaseName, NULL ),
m_currentSection( &m_testCase ),
m_completedASectionThisRun( false ) m_completedASectionThisRun( false )
{} {}
bool enterSection( std::string const& name ) { bool enterSection( std::string const& name ) {
if( m_completedASectionThisRun ) if( m_completedASectionThisRun )
return false; return false;
@ -93,7 +94,6 @@ namespace SectionTracking {
return false; return false;
} }
} }
void leaveSection() { void leaveSection() {
m_currentSection->leave(); m_currentSection->leave();
m_currentSection = m_currentSection->getParent(); m_currentSection = m_currentSection->getParent();
@ -101,49 +101,40 @@ namespace SectionTracking {
m_completedASectionThisRun = true; m_completedASectionThisRun = true;
} }
bool currentSectinHasChildren() const { bool currentSectionHasChildren() const {
return m_currentSection->hasChildren(); return m_currentSection->hasChildren();
} }
private:
TrackedSection* m_currentSection;
bool m_completedASectionThisRun;
};
class TestCaseTracker {
public:
TestCaseTracker( std::string const& testCaseName )
: m_testCase( testCaseName, NULL ),
m_sections( m_testCase )
{}
void enter() {
m_sections = SectionTracker( m_testCase );
m_testCase.enter();
}
void leave() {
m_testCase.leave();
}
bool enterSection( std::string const& name ) {
return m_sections.enterSection( name );
}
void leaveSection() {
m_sections.leaveSection();
}
bool isCompleted() const { bool isCompleted() const {
return m_testCase.runState() == TrackedSection::Completed; return m_testCase.runState() == TrackedSection::Completed;
} }
bool currentSectionHasChildren() const { class Guard {
return m_sections.currentSectinHasChildren(); public:
} Guard( TestCaseTracker& tracker )
: m_tracker( tracker )
{
m_tracker.enterTestCase();
}
~Guard() {
m_tracker.leaveTestCase();
}
private:
TestCaseTracker& m_tracker;
};
private: private:
void enterTestCase() {
m_currentSection = &m_testCase;
m_completedASectionThisRun = false;
m_testCase.enter();
}
void leaveTestCase() {
m_testCase.leave();
}
TrackedSection m_testCase; TrackedSection m_testCase;
SectionTracker m_sections; TrackedSection* m_currentSection;
bool m_completedASectionThisRun;
}; };
} // namespace SectionTracking } // namespace SectionTracking

View File

@ -26,132 +26,139 @@ TEST_CASE( "section tracking" ) {
SECTION( "test case with no sections" ) { SECTION( "test case with no sections" ) {
testCaseTracker.enter(); {
CHECK_FALSE( testCaseTracker.isCompleted() ); TestCaseTracker::Guard guard( testCaseTracker );
CHECK_FALSE( testCaseTracker.isCompleted() );
testCaseTracker.leave(); }
CHECK( testCaseTracker.isCompleted() ); CHECK( testCaseTracker.isCompleted() );
} }
SECTION( "test case with one section" ) { SECTION( "test case with one section" ) {
// Enter test case {
testCaseTracker.enter(); TestCaseTracker::Guard guard( testCaseTracker );
// Enter section? - no, not yet // Enter section? - no, not yet
CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
CHECK_FALSE( testCaseTracker.isCompleted() ); CHECK_FALSE( testCaseTracker.isCompleted() );
// Leave test case - incomplete (still need to visit section) // Leave test case - incomplete (still need to visit section)
testCaseTracker.leave(); }
CHECK_FALSE( testCaseTracker.isCompleted() ); CHECK_FALSE( testCaseTracker.isCompleted() );
// ... // ...
// Enter test case again // Enter test case again
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section? - yes // Enter section? - yes
CHECK( testCaseTracker.enterSection( section1Name ) ); CHECK( testCaseTracker.enterSection( section1Name ) );
// Leave section and test case - now complete // Leave section and test case - now complete
testCaseTracker.leaveSection(); testCaseTracker.leaveSection();
testCaseTracker.leave(); }
CHECK( testCaseTracker.isCompleted() ); CHECK( testCaseTracker.isCompleted() );
} }
SECTION( "test case with two consecutive sections" ) { SECTION( "test case with two consecutive sections" ) {
// Enter test case // Enter test case
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section 1? - no, not yet // Enter section 1? - no, not yet
CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
// Enter section 2? - no, not yet // Enter section 2? - no, not yet
CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section2Name ) );
// Leave test case - incomplete (still need to visit sections) // Leave test case - incomplete (still need to visit sections)
testCaseTracker.leave(); }
CHECK_FALSE( testCaseTracker.isCompleted() ); CHECK_FALSE( testCaseTracker.isCompleted() );
// ... // ...
// Enter test case again // Enter test case again
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section 1? - yes // Enter section 1? - yes
CHECK( testCaseTracker.enterSection( section1Name ) ); CHECK( testCaseTracker.enterSection( section1Name ) );
testCaseTracker.leaveSection(); testCaseTracker.leaveSection();
// Enter section 2? - no, not yet // Enter section 2? - no, not yet
CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section2Name ) );
// Leave test case - incomplete (still need to visit section 2) // Leave test case - incomplete (still need to visit section 2)
testCaseTracker.leave(); }
CHECK_FALSE( testCaseTracker.isCompleted() ); CHECK_FALSE( testCaseTracker.isCompleted() );
// ... // ...
// Enter test case again // Enter test case again
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section 1? - no, already done now // Enter section 1? - no, already done now
CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
// Enter section 2? - yes - finally // Enter section 2? - yes - finally
CHECK( testCaseTracker.enterSection( section2Name ) ); CHECK( testCaseTracker.enterSection( section2Name ) );
testCaseTracker.leaveSection(); testCaseTracker.leaveSection();
// Leave test case - now complete // Leave test case - now complete
testCaseTracker.leave(); }
CHECK( testCaseTracker.isCompleted() ); CHECK( testCaseTracker.isCompleted() );
} }
SECTION( "test case with one section within another" ) { SECTION( "test case with one section within another" ) {
// Enter test case // Enter test case
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section 1? - no, not yet // Enter section 1? - no, not yet
CHECK_FALSE( testCaseTracker.enterSection( section1Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section1Name ) );
// Leave test case - incomplete (still need to visit sections) // Leave test case - incomplete (still need to visit sections)
testCaseTracker.leave(); }
CHECK_FALSE( testCaseTracker.isCompleted() ); CHECK_FALSE( testCaseTracker.isCompleted() );
// ... // ...
// Enter test case again // Enter test case again
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section 1? - yes // Enter section 1? - yes
CHECK( testCaseTracker.enterSection( section1Name ) ); CHECK( testCaseTracker.enterSection( section1Name ) );
// Enter section 2? - no, not yet // Enter section 2? - no, not yet
CHECK_FALSE( testCaseTracker.enterSection( section2Name ) ); CHECK_FALSE( testCaseTracker.enterSection( section2Name ) );
testCaseTracker.leaveSection(); // section 1 - incomplete (section 2) testCaseTracker.leaveSection(); // section 1 - incomplete (section 2)
// Leave test case - incomplete // Leave test case - incomplete
testCaseTracker.leave(); }
CHECK_FALSE( testCaseTracker.isCompleted() ); CHECK_FALSE( testCaseTracker.isCompleted() );
// ... // ...
// Enter test case again // Enter test case again
testCaseTracker.enter(); {
TestCaseTracker::Guard guard( testCaseTracker );
// Enter section 1? - yes - so we can execute section 2 // Enter section 1? - yes - so we can execute section 2
CHECK( testCaseTracker.enterSection( section1Name ) ); CHECK( testCaseTracker.enterSection( section1Name ) );
// Enter section 2? - yes - finally // Enter section 2? - yes - finally
CHECK( testCaseTracker.enterSection( section2Name ) ); CHECK( testCaseTracker.enterSection( section2Name ) );
testCaseTracker.leaveSection(); // section 2 testCaseTracker.leaveSection(); // section 2
testCaseTracker.leaveSection(); // section 1 testCaseTracker.leaveSection(); // section 1
// Leave test case - now complete // Leave test case - now complete
testCaseTracker.leave(); }
CHECK( testCaseTracker.isCompleted() ); CHECK( testCaseTracker.isCompleted() );
} }
} }