forked from catchorg/Catch2
		
	Added Python script to generate single header. Added new XCode project that runs self test against single header
		
			
				
	
	
		
			154 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 *  catch_self_test.hpp
 | 
						|
 *  Catch
 | 
						|
 *
 | 
						|
 *  Created by Phil on 14/01/2011.
 | 
						|
 *  Copyright 2011 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_CATCH_SELF_TEST_HPP_INCLUDED
 | 
						|
#define TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED
 | 
						|
 | 
						|
#include "catch.hpp"
 | 
						|
 | 
						|
namespace Catch
 | 
						|
{
 | 
						|
 | 
						|
    class EmbeddedRunner
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        EmbeddedRunner
 | 
						|
        ()
 | 
						|
        {
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        std::size_t runMatching
 | 
						|
        (
 | 
						|
            const std::string& rawTestSpec
 | 
						|
        )
 | 
						|
        {
 | 
						|
            std::ostringstream oss;
 | 
						|
            Config config;
 | 
						|
            config.setStreamBuf( oss.rdbuf() );
 | 
						|
            config.setReporter( "basic" );
 | 
						|
 | 
						|
            std::size_t result;
 | 
						|
            
 | 
						|
            // Scoped because Runner doesn't report EndTesting until its destructor
 | 
						|
            {
 | 
						|
                Runner runner( config );
 | 
						|
                result = runner.runMatching( rawTestSpec );
 | 
						|
                m_successes = runner.getSuccessCount();
 | 
						|
                m_failures = runner.getFailureCount();
 | 
						|
            }
 | 
						|
            m_output = oss.str();
 | 
						|
            return result;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        std::string getOutput
 | 
						|
        ()
 | 
						|
        {
 | 
						|
            return m_output;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        std::size_t getSuccessCount
 | 
						|
        ()
 | 
						|
        const
 | 
						|
        {
 | 
						|
            return m_successes;
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        std:: size_t getFailureCount
 | 
						|
        ()
 | 
						|
        const
 | 
						|
        {
 | 
						|
            return m_failures;
 | 
						|
        }
 | 
						|
 | 
						|
    private:
 | 
						|
        std::size_t m_successes;
 | 
						|
        std::size_t m_failures;
 | 
						|
        std::string m_output;
 | 
						|
    };
 | 
						|
 | 
						|
    class MetaTestRunner
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        struct Expected
 | 
						|
        {
 | 
						|
            enum Result
 | 
						|
            {
 | 
						|
                ToSucceed,
 | 
						|
                ToFail
 | 
						|
            };
 | 
						|
        };
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        static void runMatching
 | 
						|
        (
 | 
						|
            const std::string& testSpec, 
 | 
						|
            Expected::Result expectedResult
 | 
						|
        )
 | 
						|
        {
 | 
						|
            forEach(    Hub::getTestCaseRegistry().getMatchingTestCases( testSpec ), 
 | 
						|
                        MetaTestRunner( expectedResult ) );
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        MetaTestRunner
 | 
						|
        (
 | 
						|
            Expected::Result expectedResult
 | 
						|
        )
 | 
						|
        : m_expectedResult( expectedResult )
 | 
						|
        {        
 | 
						|
        }
 | 
						|
        
 | 
						|
        ///////////////////////////////////////////////////////////////////////////
 | 
						|
        void operator()
 | 
						|
        (
 | 
						|
            const TestCaseInfo& testCase
 | 
						|
        )
 | 
						|
        {
 | 
						|
            EmbeddedRunner runner;
 | 
						|
            runner.runMatching( testCase.getName() );
 | 
						|
            switch( m_expectedResult )
 | 
						|
            {
 | 
						|
                case Expected::ToSucceed:
 | 
						|
                    if( runner.getFailureCount() > 0 )
 | 
						|
                    {
 | 
						|
                        INFO( runner.getOutput() );
 | 
						|
                        FAIL( "Expected test case '" 
 | 
						|
                             << testCase.getName() 
 | 
						|
                             << "' to succeed but there was/ were " 
 | 
						|
                             << runner.getFailureCount() << " failure(s)" );
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
                case Expected::ToFail:
 | 
						|
                    if( runner.getSuccessCount() > 0 )
 | 
						|
                    {
 | 
						|
                        INFO( runner.getOutput() );
 | 
						|
                        FAIL( "Expected test case '" 
 | 
						|
                             << testCase.getName() 
 | 
						|
                             << "' to fail but there was/ were " 
 | 
						|
                             << runner.getSuccessCount() << " success(es)" );
 | 
						|
                    }
 | 
						|
                    break;
 | 
						|
            }        
 | 
						|
        };
 | 
						|
        
 | 
						|
    private:
 | 
						|
        Expected::Result m_expectedResult;
 | 
						|
    };
 | 
						|
    
 | 
						|
}
 | 
						|
 | 
						|
#endif // TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED
 |