diff --git a/include/internal/catch_impl.hpp b/include/internal/catch_impl.hpp index c4959026..f01fe457 100644 --- a/include/internal/catch_impl.hpp +++ b/include/internal/catch_impl.hpp @@ -58,8 +58,6 @@ namespace Catch { TestCaseStats::~TestCaseStats() {} TestGroupStats::~TestGroupStats() {} TestRunStats::~TestRunStats() {} - TestGroupNode::~TestGroupNode() {} - TestRunNode::~TestRunNode() {} BasicReporter::~BasicReporter() {} StreamingReporterBase::~StreamingReporterBase() {} diff --git a/include/internal/catch_interfaces_reporter.h b/include/internal/catch_interfaces_reporter.h index 057eef94..488397a2 100644 --- a/include/internal/catch_interfaces_reporter.h +++ b/include/internal/catch_interfaces_reporter.h @@ -47,7 +47,7 @@ namespace Catch }; - template + template struct Node : SharedImpl<> { Node( T const& _value, Node* _parent = NULL ) : value( _value ), @@ -223,6 +223,8 @@ namespace Catch struct StreamingReporterBase : SharedImpl { + typedef Ptr > SectionInfoNode; + StreamingReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) @@ -244,28 +246,20 @@ namespace Catch } virtual void sectionStarting( SectionInfo const& _sectionInfo ) { Ptr > sectionInfo = new Node( _sectionInfo ); - if( !currentSectionInfo ) { - currentSectionInfo = sectionInfo; - m_rootSections.push_back( currentSectionInfo ); - } - else { - currentSectionInfo->children.push_back( sectionInfo ); - sectionInfo->parent = currentSectionInfo.get(); - currentSectionInfo = sectionInfo; - } + m_sectionStack.push_back( sectionInfo ); } virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { - currentSectionInfo = currentSectionInfo->parent; + m_sectionStack.pop_back(); } virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { unusedTestCaseInfo.reset(); + assert( m_sectionStack.empty() ); } virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { unusedGroupInfo.reset(); } virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { - currentSectionInfo.reset(); unusedTestCaseInfo.reset(); unusedGroupInfo.reset(); testRunInfo.reset(); @@ -275,26 +269,27 @@ namespace Catch Option testRunInfo; Option unusedGroupInfo; Option unusedTestCaseInfo; - Ptr > currentSectionInfo; std::ostream& stream; - // !TBD: This should really go in the TestCaseStats class - std::vector > > m_rootSections; + std::vector m_sectionStack; }; - struct TestGroupNode : TestGroupStats { - TestGroupNode( TestGroupStats const& _stats ) : TestGroupStats( _stats ) {} -// TestGroupNode( GroupInfo const& _info ) : TestGroupStats( _stats ) {} - ~TestGroupNode(); + struct CumulativeReporterBase : StreamingReporterBase { + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; + virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; - }; + 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 ) {} - ~TestRunNode(); + virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + 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 groups; + std::vector > > m_groups; }; // Deprecated @@ -333,8 +328,9 @@ namespace Catch }; inline std::string trim( std::string const& str ) { - std::string::size_type start = str.find_first_not_of( "\n\r\t " ); - std::string::size_type end = str.find_last_not_of( "\n\r\t " ); + static char const* whitespaceChars = "\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 ) : ""; } diff --git a/include/reporters/catch_reporter_console.hpp b/include/reporters/catch_reporter_console.hpp index d750f3e4..2bb93e42 100644 --- a/include/reporters/catch_reporter_console.hpp +++ b/include/reporters/catch_reporter_console.hpp @@ -62,7 +62,7 @@ namespace Catch { if( _sectionStats.missingAssertions ) { lazyPrint(); Colour colour( Colour::ResultError ); - if( currentSectionInfo->parent ) + if( m_sectionStack.size() > 1 ) stream << "\nNo assertions in section"; else stream << "\nNo assertions in test case"; @@ -261,25 +261,20 @@ namespace Catch { } } void printTestCaseAndSectionHeader() { + assert( !m_sectionStack.empty() ); printOpenHeader( unusedTestCaseInfo->name ); - assert( currentSectionInfo ); - if( currentSectionInfo ) { - Colour colourGuard( Colour::Headers ); - std::vector*> sections; - for( Node* section = currentSectionInfo.get(); - section; - section = section->parent ) - sections.push_back( section ); - // Sections - std::vector*>::const_reverse_iterator - it = sections.rbegin(), itEnd = sections.rend(); - for( ++it; it != itEnd; ++it ) // Skip first section (test case) + if( m_sectionStack.size() > 1 ) { + Colour colourGuard( Colour::Headers ); + + std::vector::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 ); } - SourceLineInfo lineInfo = currentSectionInfo - ? currentSectionInfo->value.lineInfo - : unusedTestCaseInfo->lineInfo; + + SourceLineInfo lineInfo = m_sectionStack.front()->value.lineInfo; if( !lineInfo.empty() ){ stream << getDashes() << "\n"; diff --git a/projects/SelfTest/Baselines/approvedResults.txt b/projects/SelfTest/Baselines/approvedResults.txt index 280a04e6..939fb859 100644 --- a/projects/SelfTest/Baselines/approvedResults.txt +++ b/projects/SelfTest/Baselines/approvedResults.txt @@ -670,8 +670,6 @@ MiscTests.cpp: FAILED: explicitly with message: to infinity and beyond -starting... -finished in 0.322593 Message from section one Message from section two Some information @@ -710,7 +708,7 @@ with expansion: "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: to infinity and beyond -starting... -finished in 0.323247 -------------------------------------------------------------------------------- -Timer -------------------------------------------------------------------------------- -MiscTests.cpp -............................................................................... - -MiscTests.cpp: -PASSED: -with message: - yay - ------------------------------------------------------------------------------- selftest/main selftest/expected result @@ -7184,13 +7169,13 @@ with expansion: 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 tests ran - + @@ -7639,12 +7624,6 @@ MiscTests.cpp MiscTests.cpp - - -starting... -finished in 0.322247 - - Message from section one @@ -7728,9 +7707,6 @@ Message from section two Some information -starting... -finished in 0.322247 - Message from section one Message from section two Some information @@ -11438,9 +11414,6 @@ An error - - -
@@ -14096,7 +14069,7 @@ there"
- + - + diff --git a/projects/SelfTest/MiscTests.cpp b/projects/SelfTest/MiscTests.cpp index 3f8f9cc2..ad3b239c 100644 --- a/projects/SelfTest/MiscTests.cpp +++ b/projects/SelfTest/MiscTests.cpp @@ -343,24 +343,24 @@ TEST_CASE("./failing/CatchSectionInfiniteLoop", "") } -#include "internal/catch_timer.h" - -TEST_CASE( "Timer", "[work-in-progress]" ) -{ - Catch::Timer t; - t.start(); - - std::cout << "starting..." << std::endl; - - double d = 0; - for( int i = 0; i < 100000; ++i ) - for( int j = 0; j < 1000; ++j ) - d += (double)i*(double)j; - - double duration = t.getElapsedSeconds(); - - std::cout << "finished in " << duration << std::endl; - - SUCCEED("yay"); - -} +//#include "internal/catch_timer.h" +// +//TEST_CASE( "Timer", "[work-in-progress]" ) +//{ +// Catch::Timer t; +// t.start(); +// +// std::cout << "starting..." << std::endl; +// +// double d = 0; +// for( int i = 0; i < 100000; ++i ) +// for( int j = 0; j < 1000; ++j ) +// d += (double)i*(double)j; +// +// double duration = t.getElapsedSeconds(); +// +// std::cout << "finished in " << duration << std::endl; +// +// SUCCEED("yay"); +// +//}