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

View File

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

View File

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