mirror of https://github.com/catchorg/Catch2.git
Merged TestCaseTracker and SectionTracker and introduced TestCaseTracker::Guard
This commit is contained in:
parent
ee647f5099
commit
28d3881ff9
|
@ -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 ) );
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue