/*
 *  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"
#include "catch_runner_impl.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;
    };
}

#endif // TWOBLUECUBES_CATCH_SELF_TEST_HPP_INCLUDED