mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 05:59:32 +01:00 
			
		
		
		
	Replaced currentSectionInfo and m_rootSection with m_sectionStack
This commit is contained in:
		@@ -58,8 +58,6 @@ namespace Catch {
 | 
			
		||||
    TestCaseStats::~TestCaseStats() {}
 | 
			
		||||
    TestGroupStats::~TestGroupStats() {}
 | 
			
		||||
    TestRunStats::~TestRunStats() {}
 | 
			
		||||
    TestGroupNode::~TestGroupNode() {}
 | 
			
		||||
    TestRunNode::~TestRunNode() {}
 | 
			
		||||
 | 
			
		||||
    BasicReporter::~BasicReporter() {}
 | 
			
		||||
    StreamingReporterBase::~StreamingReporterBase() {}
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ namespace Catch
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    template<typename T>
 | 
			
		||||
    template<typename T, typename ChildT=T>
 | 
			
		||||
    struct Node : SharedImpl<> {
 | 
			
		||||
        Node( T const& _value, Node* _parent = NULL )
 | 
			
		||||
        :   value( _value ),
 | 
			
		||||
@@ -223,6 +223,8 @@ namespace Catch
 | 
			
		||||
 | 
			
		||||
    struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
 | 
			
		||||
 | 
			
		||||
        typedef Ptr<Node<SectionInfo> > 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<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _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> testRunInfo;
 | 
			
		||||
        Option<GroupInfo> unusedGroupInfo;
 | 
			
		||||
        Option<TestCaseInfo> unusedTestCaseInfo;
 | 
			
		||||
        Ptr<Node<SectionInfo> > currentSectionInfo;
 | 
			
		||||
        std::ostream& stream;
 | 
			
		||||
 | 
			
		||||
        // !TBD: This should really go in the TestCaseStats class
 | 
			
		||||
        std::vector<Ptr<Node<SectionInfo> > > m_rootSections;
 | 
			
		||||
        std::vector<SectionInfoNode> 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<TestGroupNode> groups;
 | 
			
		||||
        std::vector<Ptr<Node<TestGroupStats> > > 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 ) : "";
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Node<SectionInfo>*> sections;
 | 
			
		||||
                for(    Node<SectionInfo>* section = currentSectionInfo.get();
 | 
			
		||||
                        section;
 | 
			
		||||
                        section = section->parent )
 | 
			
		||||
                    sections.push_back( section );
 | 
			
		||||
 | 
			
		||||
                // Sections
 | 
			
		||||
                std::vector<Node<SectionInfo>*>::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<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 );
 | 
			
		||||
            }
 | 
			
		||||
            SourceLineInfo lineInfo = currentSectionInfo
 | 
			
		||||
                                    ? currentSectionInfo->value.lineInfo
 | 
			
		||||
                                    : unusedTestCaseInfo->lineInfo;
 | 
			
		||||
 | 
			
		||||
            SourceLineInfo lineInfo = m_sectionStack.front()->value.lineInfo;
 | 
			
		||||
 | 
			
		||||
            if( !lineInfo.empty() ){
 | 
			
		||||
                stream << getDashes() << "\n";
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
<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/epsilon" time="0"/>
 | 
			
		||||
    <testcase classname="global" name="./succeeding/Approx/float" time="0"/>
 | 
			
		||||
@@ -7639,12 +7624,6 @@ MiscTests.cpp
 | 
			
		||||
MiscTests.cpp
 | 
			
		||||
      </failure>
 | 
			
		||||
    </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">
 | 
			
		||||
      <system-out>
 | 
			
		||||
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
 | 
			
		||||
      </Failure>
 | 
			
		||||
      <OverallResult success="false"/>
 | 
			
		||||
    </TestCase>
 | 
			
		||||
    <TestCase name="Timer">
 | 
			
		||||
      <OverallResult success="true"/>
 | 
			
		||||
    </TestCase>
 | 
			
		||||
    <TestCase name="selftest/main">
 | 
			
		||||
      <Section name="selftest/expected result" description="Tests do what they claim">
 | 
			
		||||
        <OverallResults successes="0" failures="0"/>
 | 
			
		||||
@@ -14096,7 +14069,7 @@ there"
 | 
			
		||||
      </Section>
 | 
			
		||||
      <OverallResult success="true"/>
 | 
			
		||||
    </TestCase>
 | 
			
		||||
    <OverallResults successes="648" failures="109"/>
 | 
			
		||||
    <OverallResults successes="647" failures="109"/>
 | 
			
		||||
  </Group>
 | 
			
		||||
  <OverallResults successes="648" failures="109"/>
 | 
			
		||||
  <OverallResults successes="647" failures="109"/>
 | 
			
		||||
</Catch>
 | 
			
		||||
 
 | 
			
		||||
@@ -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");
 | 
			
		||||
//    
 | 
			
		||||
//}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user