/*
 *  iTchRunnerReporter.h
 *  iTchRunner
 *
 *  Created by Phil on 07/02/2011.
 *  Copyright 2011 Two Blue Cubes Ltd. All rights reserved.
 *
 */
#ifndef TWOBLUECUBES_ITCHRUNNERREPORTER_H_INCLUDED
#define TWOBLUECUBES_ITCHRUNNERREPORTER_H_INCLUDED

#include "catch.hpp"

@protocol iTchRunnerDelegate

-(void) testWasRun: (const Catch::AssertionResult*) result;    

@end

namespace Catch
{
    class iTchRunnerReporter : public SharedImpl<IReporter>
    {
    public:
        ///////////////////////////////////////////////////////////////////////////
        iTchRunnerReporter
        (
            id<iTchRunnerDelegate> delegate
        )
        :   m_delegate( delegate )
        {
        }

        ///////////////////////////////////////////////////////////////////////////
        virtual bool shouldRedirectStdout
        ()
        const
        {
            return true;
        }
        
        ///////////////////////////////////////////////////////////////////////////
        static std::string getDescription
        ()
        {
            return "Captures results for iOS runner";
        }
        
        ///////////////////////////////////////////////////////////////////////////
        size_t getSucceeded
        ()
        const
        {
            return m_totals.assertions.passed;
        }
        
        ///////////////////////////////////////////////////////////////////////////
        size_t getFailed
        ()
        const
        {
            return m_totals.assertions.failed;
        }
        
        ///////////////////////////////////////////////////////////////////////////
        void reset()
        {
            m_totals = Totals();
        }
        
    private: // IReporter
        
        ///////////////////////////////////////////////////////////////////////////
        virtual void StartTesting
        ()
        {}
        
        ///////////////////////////////////////////////////////////////////////////
        virtual void EndTesting
        (
            const Totals& totals
        )
        {
            m_totals = totals;
        }
        
        ///////////////////////////////////////////////////////////////////////////
        virtual void Result
        (
            const AssertionResult& result
        )
        {
            [m_delegate testWasRun: &result];
        }
        
        ///////////////////////////////////////////////////////////////////////////
        // Deliberately unimplemented:
        virtual void StartGroup( const std::string& ){}
        virtual void EndGroup( const std::string&, const Totals& ){}
        virtual void StartTestCase( const TestCaseInfo& ){}
        virtual void StartSection( const std::string& sectionName, const std::string& description ) {}
        virtual void EndSection( const std::string&, const Counts& ){}
        virtual void EndTestCase( const TestCaseInfo&, const Totals&, const std::string&, const std::string& ){}
        virtual void Aborted() {}
        virtual void NoAssertionsInSection( std::string const& sectionName ) {}
        virtual void NoAssertionsInTestCase( std::string const& testName ) {}

    private:
        Totals m_totals;
        
        id<iTchRunnerDelegate> m_delegate;
    };
}

#endif // TWOBLUECUBES_ITCHRUNNERREPORTER_H_INCLUDED