Replaced currentSectionInfo and m_rootSection with m_sectionStack

This commit is contained in:
Phil Nash 2013-08-08 08:05:19 +01:00
parent 6339254cb2
commit 29ccaa67ad
5 changed files with 59 additions and 97 deletions

View File

@ -58,8 +58,6 @@ namespace Catch {
TestCaseStats::~TestCaseStats() {} TestCaseStats::~TestCaseStats() {}
TestGroupStats::~TestGroupStats() {} TestGroupStats::~TestGroupStats() {}
TestRunStats::~TestRunStats() {} TestRunStats::~TestRunStats() {}
TestGroupNode::~TestGroupNode() {}
TestRunNode::~TestRunNode() {}
BasicReporter::~BasicReporter() {} BasicReporter::~BasicReporter() {}
StreamingReporterBase::~StreamingReporterBase() {} StreamingReporterBase::~StreamingReporterBase() {}

View File

@ -47,7 +47,7 @@ namespace Catch
}; };
template<typename T> template<typename T, typename ChildT=T>
struct Node : SharedImpl<> { struct Node : SharedImpl<> {
Node( T const& _value, Node* _parent = NULL ) Node( T const& _value, Node* _parent = NULL )
: value( _value ), : value( _value ),
@ -223,6 +223,8 @@ namespace Catch
struct StreamingReporterBase : SharedImpl<IStreamingReporter> { struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
typedef Ptr<Node<SectionInfo> > SectionInfoNode;
StreamingReporterBase( ReporterConfig const& _config ) StreamingReporterBase( ReporterConfig const& _config )
: m_config( _config.fullConfig() ), : m_config( _config.fullConfig() ),
stream( _config.stream() ) stream( _config.stream() )
@ -244,28 +246,20 @@ namespace Catch
} }
virtual void sectionStarting( SectionInfo const& _sectionInfo ) { virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
Ptr<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _sectionInfo ); Ptr<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _sectionInfo );
if( !currentSectionInfo ) { m_sectionStack.push_back( sectionInfo );
currentSectionInfo = sectionInfo;
m_rootSections.push_back( currentSectionInfo );
}
else {
currentSectionInfo->children.push_back( sectionInfo );
sectionInfo->parent = currentSectionInfo.get();
currentSectionInfo = sectionInfo;
}
} }
virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) {
currentSectionInfo = currentSectionInfo->parent; m_sectionStack.pop_back();
} }
virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) {
unusedTestCaseInfo.reset(); unusedTestCaseInfo.reset();
assert( m_sectionStack.empty() );
} }
virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) {
unusedGroupInfo.reset(); unusedGroupInfo.reset();
} }
virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) {
currentSectionInfo.reset();
unusedTestCaseInfo.reset(); unusedTestCaseInfo.reset();
unusedGroupInfo.reset(); unusedGroupInfo.reset();
testRunInfo.reset(); testRunInfo.reset();
@ -275,26 +269,27 @@ namespace Catch
Option<TestRunInfo> testRunInfo; Option<TestRunInfo> testRunInfo;
Option<GroupInfo> unusedGroupInfo; Option<GroupInfo> unusedGroupInfo;
Option<TestCaseInfo> unusedTestCaseInfo; Option<TestCaseInfo> unusedTestCaseInfo;
Ptr<Node<SectionInfo> > currentSectionInfo;
std::ostream& stream; std::ostream& stream;
// !TBD: This should really go in the TestCaseStats class std::vector<SectionInfoNode> m_sectionStack;
std::vector<Ptr<Node<SectionInfo> > > m_rootSections;
}; };
struct TestGroupNode : TestGroupStats { struct CumulativeReporterBase : StreamingReporterBase {
TestGroupNode( TestGroupStats const& _stats ) : TestGroupStats( _stats ) {} virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
// TestGroupNode( GroupInfo const& _info ) : TestGroupStats( _stats ) {} virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
~TestGroupNode();
}; virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
struct TestRunNode : TestRunStats { virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
TestRunNode( TestRunStats const& _stats ) : TestRunStats( _stats ) {} virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;
~TestRunNode(); virtual void sectionEnded( SectionStats const& sectionStats ) = 0;
virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;
virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;
virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
std::vector<TestGroupNode> groups; std::vector<Ptr<Node<TestGroupStats> > > m_groups;
}; };
// Deprecated // Deprecated
@ -333,8 +328,9 @@ namespace Catch
}; };
inline std::string trim( std::string const& str ) { inline std::string trim( std::string const& str ) {
std::string::size_type start = str.find_first_not_of( "\n\r\t " ); static char const* whitespaceChars = "\n\r\t ";
std::string::size_type end = str.find_last_not_of( "\n\r\t " ); std::string::size_type start = str.find_first_not_of( whitespaceChars );
std::string::size_type end = str.find_last_not_of( whitespaceChars );
return start != std::string::npos ? str.substr( start, 1+end-start ) : ""; return start != std::string::npos ? str.substr( start, 1+end-start ) : "";
} }

View File

@ -62,7 +62,7 @@ namespace Catch {
if( _sectionStats.missingAssertions ) { if( _sectionStats.missingAssertions ) {
lazyPrint(); lazyPrint();
Colour colour( Colour::ResultError ); Colour colour( Colour::ResultError );
if( currentSectionInfo->parent ) if( m_sectionStack.size() > 1 )
stream << "\nNo assertions in section"; stream << "\nNo assertions in section";
else else
stream << "\nNo assertions in test case"; stream << "\nNo assertions in test case";
@ -261,25 +261,20 @@ namespace Catch {
} }
} }
void printTestCaseAndSectionHeader() { void printTestCaseAndSectionHeader() {
assert( !m_sectionStack.empty() );
printOpenHeader( unusedTestCaseInfo->name ); printOpenHeader( unusedTestCaseInfo->name );
assert( currentSectionInfo );
if( currentSectionInfo ) {
Colour colourGuard( Colour::Headers );
std::vector<Node<SectionInfo>*> sections;
for( Node<SectionInfo>* section = currentSectionInfo.get();
section;
section = section->parent )
sections.push_back( section );
// Sections if( m_sectionStack.size() > 1 ) {
std::vector<Node<SectionInfo>*>::const_reverse_iterator Colour colourGuard( Colour::Headers );
it = sections.rbegin(), itEnd = sections.rend();
for( ++it; it != itEnd; ++it ) // Skip first section (test case) std::vector<SectionInfoNode>::const_iterator
it = m_sectionStack.begin()+1, // Skip first section (test case)
itEnd = m_sectionStack.end();
for( ; it != itEnd; ++it )
printHeaderString( (*it)->value.name, 2 ); printHeaderString( (*it)->value.name, 2 );
} }
SourceLineInfo lineInfo = currentSectionInfo
? currentSectionInfo->value.lineInfo SourceLineInfo lineInfo = m_sectionStack.front()->value.lineInfo;
: unusedTestCaseInfo->lineInfo;
if( !lineInfo.empty() ){ if( !lineInfo.empty() ){
stream << getDashes() << "\n"; stream << getDashes() << "\n";

View File

@ -670,8 +670,6 @@ MiscTests.cpp: FAILED:
explicitly with message: explicitly with message:
to infinity and beyond to infinity and beyond
starting...
finished in 0.322593
Message from section one Message from section one
Message from section two Message from section two
Some information Some information
@ -710,7 +708,7 @@ with expansion:
"first" == "second" "first" == "second"
=============================================================================== ===============================================================================
122 test cases - 35 failed (738 assertions - 90 failed) 121 test cases - 35 failed (737 assertions - 90 failed)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -4318,19 +4316,6 @@ MiscTests.cpp: FAILED:
explicitly with message: explicitly with message:
to infinity and beyond to infinity and beyond
starting...
finished in 0.323247
-------------------------------------------------------------------------------
Timer
-------------------------------------------------------------------------------
MiscTests.cpp
...............................................................................
MiscTests.cpp:
PASSED:
with message:
yay
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
selftest/main selftest/main
selftest/expected result selftest/expected result
@ -7184,13 +7169,13 @@ with expansion:
true true
=============================================================================== ===============================================================================
122 test cases - 50 failed (757 assertions - 109 failed) 121 test cases - 50 failed (756 assertions - 109 failed)
No test cases matched '~dummy 4' No test cases matched '~dummy 4'
No tests ran No tests ran
<testsuites> <testsuites>
<testsuite name="~dummy" errors="10" failures="81" tests="757" hostname="tbd" time="" timestamp="tbd"> <testsuite name="~dummy" errors="10" failures="81" tests="756" hostname="tbd" time="" timestamp="tbd">
<testcase classname="global" name="./succeeding/Approx/simple" time="0"/> <testcase classname="global" name="./succeeding/Approx/simple" time="0"/>
<testcase classname="global" name="./succeeding/Approx/epsilon" time="0"/> <testcase classname="global" name="./succeeding/Approx/epsilon" time="0"/>
<testcase classname="global" name="./succeeding/Approx/float" time="0"/> <testcase classname="global" name="./succeeding/Approx/float" time="0"/>
@ -7639,12 +7624,6 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="Timer" time="0">
<system-out>
starting...
finished in 0.322247
</system-out>
</testcase>
<testcase classname="global" name="selftest/main" time="0"> <testcase classname="global" name="selftest/main" time="0">
<system-out> <system-out>
Message from section one Message from section one
@ -7728,9 +7707,6 @@ Message from section two
Some information Some information
starting...
finished in 0.322247
Message from section one Message from section one
Message from section two Message from section two
Some information Some information
@ -11438,9 +11414,6 @@ An error
</Failure> </Failure>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="Timer">
<OverallResult success="true"/>
</TestCase>
<TestCase name="selftest/main"> <TestCase name="selftest/main">
<Section name="selftest/expected result" description="Tests do what they claim"> <Section name="selftest/expected result" description="Tests do what they claim">
<OverallResults successes="0" failures="0"/> <OverallResults successes="0" failures="0"/>
@ -14096,7 +14069,7 @@ there&quot;
</Section> </Section>
<OverallResult success="true"/> <OverallResult success="true"/>
</TestCase> </TestCase>
<OverallResults successes="648" failures="109"/> <OverallResults successes="647" failures="109"/>
</Group> </Group>
<OverallResults successes="648" failures="109"/> <OverallResults successes="647" failures="109"/>
</Catch> </Catch>

View File

@ -343,24 +343,24 @@ TEST_CASE("./failing/CatchSectionInfiniteLoop", "")
} }
#include "internal/catch_timer.h" //#include "internal/catch_timer.h"
//
TEST_CASE( "Timer", "[work-in-progress]" ) //TEST_CASE( "Timer", "[work-in-progress]" )
{ //{
Catch::Timer t; // Catch::Timer t;
t.start(); // t.start();
//
std::cout << "starting..." << std::endl; // std::cout << "starting..." << std::endl;
//
double d = 0; // double d = 0;
for( int i = 0; i < 100000; ++i ) // for( int i = 0; i < 100000; ++i )
for( int j = 0; j < 1000; ++j ) // for( int j = 0; j < 1000; ++j )
d += (double)i*(double)j; // d += (double)i*(double)j;
//
double duration = t.getElapsedSeconds(); // double duration = t.getElapsedSeconds();
//
std::cout << "finished in " << duration << std::endl; // std::cout << "finished in " << duration << std::endl;
//
SUCCEED("yay"); // SUCCEED("yay");
//
} //}