mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 00:51:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*  
 | 
						|
 *  Created by Phil Nash on 4/5/2012
 | 
						|
 *  Copyright 2012 Two Blue Cubes Ltd. All rights reserved.
 | 
						|
 *
 | 
						|
 *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
						|
 *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 */
 | 
						|
#ifndef TWOBLUECUBES_INTERNAL_CATCH_RUNNING_TEST_HPP_INCLUDED
 | 
						|
#define TWOBLUECUBES_INTERNAL_CATCH_RUNNING_TEST_HPP_INCLUDED
 | 
						|
 | 
						|
#include "catch_test_case_info.hpp"
 | 
						|
#include "catch_section_info.hpp"
 | 
						|
 | 
						|
namespace Catch
 | 
						|
{    
 | 
						|
    class RunningTest
 | 
						|
    {
 | 
						|
        enum RunStatus
 | 
						|
        {
 | 
						|
            NothingRun,
 | 
						|
            EncounteredASection,
 | 
						|
            RanAtLeastOneSection,
 | 
						|
            RanToCompletionWithSections,
 | 
						|
            RanToCompletionWithNoSections
 | 
						|
        };
 | 
						|
        
 | 
						|
    public:
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        explicit RunningTest
 | 
						|
        (
 | 
						|
            const TestCaseInfo* info = NULL 
 | 
						|
        )
 | 
						|
        :   m_info( info ),
 | 
						|
            m_runStatus( RanAtLeastOneSection ),
 | 
						|
            m_currentSection( &m_rootSection ),
 | 
						|
            m_changed( false )
 | 
						|
        {
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        bool wasSectionSeen
 | 
						|
        ()
 | 
						|
        const
 | 
						|
        {
 | 
						|
            return  m_runStatus == RanAtLeastOneSection || 
 | 
						|
                    m_runStatus == RanToCompletionWithSections;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        void reset
 | 
						|
        ()
 | 
						|
        {
 | 
						|
            m_runStatus = NothingRun;
 | 
						|
            m_changed = false;
 | 
						|
            m_lastSectionToRun = NULL;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        void ranToCompletion
 | 
						|
        ()
 | 
						|
        {
 | 
						|
            if( m_runStatus == RanAtLeastOneSection ||
 | 
						|
                m_runStatus == EncounteredASection )
 | 
						|
            {
 | 
						|
                m_runStatus = RanToCompletionWithSections;
 | 
						|
                if( m_lastSectionToRun )
 | 
						|
                {
 | 
						|
                    m_lastSectionToRun->ranToCompletion();
 | 
						|
                    m_changed = true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                m_runStatus = RanToCompletionWithNoSections;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        bool addSection
 | 
						|
        (
 | 
						|
            const std::string& name
 | 
						|
        )
 | 
						|
        {
 | 
						|
            if( m_runStatus == NothingRun )
 | 
						|
                m_runStatus = EncounteredASection;
 | 
						|
            
 | 
						|
            SectionInfo* thisSection = m_currentSection->findSubSection( name );
 | 
						|
            if( !thisSection )
 | 
						|
            {
 | 
						|
                thisSection = m_currentSection->addSubSection( name );
 | 
						|
                m_changed = true;
 | 
						|
            }
 | 
						|
            
 | 
						|
            if( !wasSectionSeen() && thisSection->shouldRun() )
 | 
						|
            {
 | 
						|
                m_currentSection = thisSection;
 | 
						|
                m_lastSectionToRun = NULL;
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        void endSection
 | 
						|
        (
 | 
						|
            const std::string&
 | 
						|
        )
 | 
						|
        {
 | 
						|
            if( m_currentSection->ran() )
 | 
						|
            {
 | 
						|
                m_runStatus = RanAtLeastOneSection;
 | 
						|
                m_changed = true;
 | 
						|
            }
 | 
						|
            else if( m_runStatus == EncounteredASection )
 | 
						|
            {
 | 
						|
                m_runStatus = RanAtLeastOneSection;
 | 
						|
                m_lastSectionToRun = m_currentSection;
 | 
						|
            }
 | 
						|
            m_currentSection = m_currentSection->getParent();
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        const TestCaseInfo& getTestCaseInfo
 | 
						|
        ()
 | 
						|
        const
 | 
						|
        {
 | 
						|
            return *m_info;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////        
 | 
						|
        bool hasUntestedSections
 | 
						|
        ()
 | 
						|
        const
 | 
						|
        {
 | 
						|
            return  m_runStatus == RanAtLeastOneSection ||
 | 
						|
                    ( m_rootSection.hasUntestedSections() && m_changed );
 | 
						|
        }
 | 
						|
        
 | 
						|
    private:
 | 
						|
        const TestCaseInfo* m_info;
 | 
						|
        RunStatus m_runStatus;
 | 
						|
        SectionInfo m_rootSection;
 | 
						|
        SectionInfo* m_currentSection;
 | 
						|
        SectionInfo* m_lastSectionToRun;
 | 
						|
        bool m_changed;
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
#endif // TWOBLUECUBES_INTERNAL_CATCH_RUNNING_TEST_HPP_INCLUDED
 |