mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Added Listeners (programatically provided extra reporters)
This commit is contained in:
		| @@ -43,6 +43,14 @@ namespace Catch { | ||||
|             reporter = addReporter( reporter, createReporter( *it, config ) );         | ||||
|         return reporter; | ||||
|     } | ||||
|     Ptr<IStreamingReporter> addListeners( Ptr<IConfig> const& config, Ptr<IStreamingReporter> reporters ) { | ||||
|         IReporterRegistry::Listeners listeners = getRegistryHub().getReporterRegistry().getListeners(); | ||||
|         for( IReporterRegistry::Listeners::const_iterator it = listeners.begin(), itEnd = listeners.end(); | ||||
|                 it != itEnd; | ||||
|                 ++it ) | ||||
|             reporters = addReporter(reporters, (*it)->create( ReporterConfig( config ) ) ); | ||||
|         return reporters; | ||||
|     } | ||||
|      | ||||
|     void openStreamInto( Ptr<Config> const& config, std::ofstream& ofs ) { | ||||
|         // Open output file, if specified | ||||
| @@ -62,7 +70,8 @@ namespace Catch { | ||||
|         std::ofstream ofs; | ||||
|         openStreamInto( config, ofs ); | ||||
|         Ptr<IStreamingReporter> reporter = makeReporter( config ); | ||||
|  | ||||
|         reporter = addListeners( config.get(), reporter ); | ||||
|          | ||||
|         RunContext context( config.get(), reporter ); | ||||
|  | ||||
|         Totals totals; | ||||
| @@ -208,7 +217,6 @@ namespace Catch { | ||||
|                 m_config = new Config( m_configData ); | ||||
|             return *m_config; | ||||
|         } | ||||
|  | ||||
|     private: | ||||
|         Clara::CommandLine<ConfigData> m_cli; | ||||
|         std::vector<Clara::Parser::Token> m_unusedTokens; | ||||
|   | ||||
| @@ -8,6 +8,8 @@ | ||||
| #ifndef TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_INTERFACES_REGISTRY_HUB_H_INCLUDED | ||||
|  | ||||
| #include <catch_ptr.hpp> | ||||
|  | ||||
| #include <string> | ||||
|  | ||||
| namespace Catch { | ||||
| @@ -29,7 +31,8 @@ namespace Catch { | ||||
|  | ||||
|     struct IMutableRegistryHub { | ||||
|         virtual ~IMutableRegistryHub(); | ||||
|         virtual void registerReporter( std::string const& name, IReporterFactory* factory ) = 0; | ||||
|         virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) = 0; | ||||
|         virtual void registerListener( Ptr<IReporterFactory> const& factory ) = 0; | ||||
|         virtual void registerTest( TestCase const& testInfo ) = 0; | ||||
|         virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; | ||||
|     }; | ||||
|   | ||||
| @@ -240,6 +240,7 @@ namespace Catch | ||||
|  | ||||
|         // The return value indicates if the messages buffer should be cleared: | ||||
|         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; | ||||
| @@ -249,18 +250,20 @@ namespace Catch | ||||
|     }; | ||||
|  | ||||
|  | ||||
|     struct IReporterFactory { | ||||
|     struct IReporterFactory : IShared { | ||||
|         virtual ~IReporterFactory(); | ||||
|         virtual IStreamingReporter* create( ReporterConfig const& config ) const = 0; | ||||
|         virtual std::string getDescription() const = 0; | ||||
|     }; | ||||
|  | ||||
|     struct IReporterRegistry { | ||||
|         typedef std::map<std::string, IReporterFactory*> FactoryMap; | ||||
|         typedef std::map<std::string, Ptr<IReporterFactory> > FactoryMap; | ||||
|         typedef std::vector<Ptr<IReporterFactory> > Listeners; | ||||
|  | ||||
|         virtual ~IReporterRegistry(); | ||||
|         virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const = 0; | ||||
|         virtual FactoryMap const& getFactories() const = 0; | ||||
|         virtual Listeners const& getListeners() const = 0; | ||||
|     }; | ||||
|  | ||||
|     Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ); | ||||
|   | ||||
| @@ -26,24 +26,27 @@ namespace Catch { | ||||
|         public: // IRegistryHub | ||||
|             RegistryHub() { | ||||
|             } | ||||
|             virtual IReporterRegistry const& getReporterRegistry() const { | ||||
|             virtual IReporterRegistry const& getReporterRegistry() const override { | ||||
|                 return m_reporterRegistry; | ||||
|             } | ||||
|             virtual ITestCaseRegistry const& getTestCaseRegistry() const { | ||||
|             virtual ITestCaseRegistry const& getTestCaseRegistry() const override { | ||||
|                 return m_testCaseRegistry; | ||||
|             } | ||||
|             virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() { | ||||
|             virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() override { | ||||
|                 return m_exceptionTranslatorRegistry; | ||||
|             } | ||||
|  | ||||
|         public: // IMutableRegistryHub | ||||
|             virtual void registerReporter( std::string const& name, IReporterFactory* factory ) { | ||||
|             virtual void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) override { | ||||
|                 m_reporterRegistry.registerReporter( name, factory ); | ||||
|             } | ||||
|             virtual void registerTest( TestCase const& testInfo ) { | ||||
|             virtual void registerListener( Ptr<IReporterFactory> const& factory ) override { | ||||
|                 m_reporterRegistry.registerListener( factory ); | ||||
|             } | ||||
|             virtual void registerTest( TestCase const& testInfo ) override { | ||||
|                 m_testCaseRegistry.registerTest( testInfo ); | ||||
|             } | ||||
|             virtual void registerTranslator( const IExceptionTranslator* translator ) { | ||||
|             virtual void registerTranslator( const IExceptionTranslator* translator ) override { | ||||
|                 m_exceptionTranslatorRegistry.registerTranslator( translator ); | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ namespace Catch { | ||||
|     template<typename T> | ||||
|     class ReporterRegistrar { | ||||
|  | ||||
|         class ReporterFactory : public IReporterFactory { | ||||
|         class ReporterFactory : public SharedImpl<IReporterFactory> { | ||||
|  | ||||
|             // *** Please Note ***: | ||||
|             // - If you end up here looking at a compiler error because it's trying to register | ||||
| @@ -64,11 +64,35 @@ namespace Catch { | ||||
|             getMutableRegistryHub().registerReporter( name, new ReporterFactory() ); | ||||
|         } | ||||
|     }; | ||||
|      | ||||
|     template<typename T> | ||||
|     class ListenerRegistrar { | ||||
|          | ||||
|         class ListenerFactory : public SharedImpl<IReporterFactory> { | ||||
|              | ||||
|             virtual IStreamingReporter* create( ReporterConfig const& config ) const { | ||||
|                 return new T( config ); | ||||
|             } | ||||
|             virtual std::string getDescription() const { | ||||
|                 return ""; | ||||
|             } | ||||
|         }; | ||||
|          | ||||
|     public: | ||||
|          | ||||
|         ListenerRegistrar() { | ||||
|             getMutableRegistryHub().registerListener( new ListenerFactory() ); | ||||
|         } | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #define INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( name, reporterType ) \ | ||||
|     namespace{ Catch::LegacyReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } | ||||
|  | ||||
| #define INTERNAL_CATCH_REGISTER_REPORTER( name, reporterType ) \ | ||||
|     namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } | ||||
|  | ||||
| #define INTERNAL_CATCH_REGISTER_LISTENER( listenerType ) \ | ||||
|     namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_REPORTER_REGISTRARS_HPP_INCLUDED | ||||
|   | ||||
| @@ -18,27 +18,32 @@ namespace Catch { | ||||
|  | ||||
|     public: | ||||
|  | ||||
|         virtual ~ReporterRegistry() { | ||||
|             deleteAllValues( m_factories ); | ||||
|         } | ||||
|         virtual ~ReporterRegistry() override {} | ||||
|  | ||||
|         virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const { | ||||
|         virtual IStreamingReporter* create( std::string const& name, Ptr<IConfig> const& config ) const override { | ||||
|             FactoryMap::const_iterator it =  m_factories.find( name ); | ||||
|             if( it == m_factories.end() ) | ||||
|                 return CATCH_NULL; | ||||
|             return it->second->create( ReporterConfig( config ) ); | ||||
|         } | ||||
|  | ||||
|         void registerReporter( std::string const& name, IReporterFactory* factory ) { | ||||
|         void registerReporter( std::string const& name, Ptr<IReporterFactory> const& factory ) { | ||||
|             m_factories.insert( std::make_pair( name, factory ) ); | ||||
|         } | ||||
|         void registerListener( Ptr<IReporterFactory> const& factory ) { | ||||
|             m_listeners.push_back( factory ); | ||||
|         } | ||||
|  | ||||
|         FactoryMap const& getFactories() const { | ||||
|         virtual FactoryMap const& getFactories() const override { | ||||
|             return m_factories; | ||||
|         } | ||||
|         virtual Listeners const& getListeners() const override { | ||||
|             return m_listeners; | ||||
|         } | ||||
|  | ||||
|     private: | ||||
|         FactoryMap m_factories; | ||||
|         Listeners m_listeners; | ||||
|     }; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -5,9 +5,6 @@ | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
|  | ||||
| #ifndef TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #   ifdef __ICC // icpc defines the __clang__ macro | ||||
| #       pragma warning(push) | ||||
| @@ -29,5 +26,3 @@ | ||||
| #    pragma GCC diagnostic push | ||||
| #    pragma GCC diagnostic ignored "-Wpadded" | ||||
| #endif | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_SUPPRESS_WARNINGS_H_INCLUDED | ||||
|   | ||||
| @@ -19,42 +19,48 @@ namespace Catch { | ||||
|         StreamingReporterBase( ReporterConfig const& _config ) | ||||
|         :   m_config( _config.fullConfig() ), | ||||
|             stream( _config.stream() ) | ||||
|         {} | ||||
|         { | ||||
|             m_reporterPrefs.shouldRedirectStdOut = false; | ||||
|         } | ||||
|  | ||||
|         virtual ~StreamingReporterBase(); | ||||
|         virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { | ||||
|             return m_reporterPrefs; | ||||
|         } | ||||
|  | ||||
|         virtual void noMatchingTestCases( std::string const& ) {} | ||||
|         virtual ~StreamingReporterBase() CATCH_OVERRIDE; | ||||
|  | ||||
|         virtual void testRunStarting( TestRunInfo const& _testRunInfo ) { | ||||
|         virtual void noMatchingTestCases( std::string const& ) CATCH_OVERRIDE {} | ||||
|  | ||||
|         virtual void testRunStarting( TestRunInfo const& _testRunInfo ) CATCH_OVERRIDE { | ||||
|             currentTestRunInfo = _testRunInfo; | ||||
|         } | ||||
|         virtual void testGroupStarting( GroupInfo const& _groupInfo ) { | ||||
|         virtual void testGroupStarting( GroupInfo const& _groupInfo ) CATCH_OVERRIDE { | ||||
|             currentGroupInfo = _groupInfo; | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseStarting( TestCaseInfo const& _testInfo ) { | ||||
|         virtual void testCaseStarting( TestCaseInfo const& _testInfo ) CATCH_OVERRIDE { | ||||
|             currentTestCaseInfo = _testInfo; | ||||
|         } | ||||
|         virtual void sectionStarting( SectionInfo const& _sectionInfo ) { | ||||
|         virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { | ||||
|             m_sectionStack.push_back( _sectionInfo ); | ||||
|         } | ||||
|  | ||||
|         virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) { | ||||
|         virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) CATCH_OVERRIDE { | ||||
|             m_sectionStack.pop_back(); | ||||
|         } | ||||
|         virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) { | ||||
|         virtual void testCaseEnded( TestCaseStats const& /* _testCaseStats */ ) CATCH_OVERRIDE { | ||||
|             currentTestCaseInfo.reset(); | ||||
|         } | ||||
|         virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) { | ||||
|         virtual void testGroupEnded( TestGroupStats const& /* _testGroupStats */ ) CATCH_OVERRIDE { | ||||
|             currentGroupInfo.reset(); | ||||
|         } | ||||
|         virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) { | ||||
|         virtual void testRunEnded( TestRunStats const& /* _testRunStats */ ) CATCH_OVERRIDE { | ||||
|             currentTestCaseInfo.reset(); | ||||
|             currentGroupInfo.reset(); | ||||
|             currentTestRunInfo.reset(); | ||||
|         } | ||||
|  | ||||
|         virtual void skipTest( TestCaseInfo const& ) { | ||||
|         virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE { | ||||
|             // Don't do anything with this by default. | ||||
|             // It can optionally be overridden in the derived class. | ||||
|         } | ||||
| @@ -67,6 +73,7 @@ namespace Catch { | ||||
|         LazyStat<TestCaseInfo> currentTestCaseInfo; | ||||
|  | ||||
|         std::vector<SectionInfo> m_sectionStack; | ||||
|         ReporterPreferences m_reporterPrefs; | ||||
|     }; | ||||
|  | ||||
|     struct CumulativeReporterBase : SharedImpl<IStreamingReporter> { | ||||
| @@ -118,15 +125,21 @@ namespace Catch { | ||||
|         CumulativeReporterBase( ReporterConfig const& _config ) | ||||
|         :   m_config( _config.fullConfig() ), | ||||
|             stream( _config.stream() ) | ||||
|         {} | ||||
|         { | ||||
|             m_reporterPrefs.shouldRedirectStdOut = false; | ||||
|         } | ||||
|         ~CumulativeReporterBase(); | ||||
|  | ||||
|         virtual void testRunStarting( TestRunInfo const& ) {} | ||||
|         virtual void testGroupStarting( GroupInfo const& ) {} | ||||
|         virtual ReporterPreferences getPreferences() const CATCH_OVERRIDE { | ||||
|             return m_reporterPrefs; | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseStarting( TestCaseInfo const& ) {} | ||||
|         virtual void testRunStarting( TestRunInfo const& ) CATCH_OVERRIDE {} | ||||
|         virtual void testGroupStarting( GroupInfo const& ) CATCH_OVERRIDE {} | ||||
|  | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) { | ||||
|         virtual void testCaseStarting( TestCaseInfo const& ) CATCH_OVERRIDE {} | ||||
|  | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { | ||||
|             SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); | ||||
|             Ptr<SectionNode> node; | ||||
|             if( m_sectionStack.empty() ) { | ||||
| @@ -151,7 +164,7 @@ namespace Catch { | ||||
|             m_deepestSection = node; | ||||
|         } | ||||
|  | ||||
|         virtual void assertionStarting( AssertionInfo const& ) {} | ||||
|         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} | ||||
|  | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) { | ||||
|             assert( !m_sectionStack.empty() ); | ||||
| @@ -159,13 +172,13 @@ namespace Catch { | ||||
|             sectionNode.assertions.push_back( assertionStats ); | ||||
|             return true; | ||||
|         } | ||||
|         virtual void sectionEnded( SectionStats const& sectionStats ) { | ||||
|         virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { | ||||
|             assert( !m_sectionStack.empty() ); | ||||
|             SectionNode& node = *m_sectionStack.back(); | ||||
|             node.stats = sectionStats; | ||||
|             m_sectionStack.pop_back(); | ||||
|         } | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { | ||||
|             Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats ); | ||||
|             assert( m_sectionStack.size() == 0 ); | ||||
|             node->children.push_back( m_rootSection ); | ||||
| @@ -176,12 +189,12 @@ namespace Catch { | ||||
|             m_deepestSection->stdOut = testCaseStats.stdOut; | ||||
|             m_deepestSection->stdErr = testCaseStats.stdErr; | ||||
|         } | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { | ||||
|             Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats ); | ||||
|             node->children.swap( m_testCases ); | ||||
|             m_testGroups.push_back( node ); | ||||
|         } | ||||
|         virtual void testRunEnded( TestRunStats const& testRunStats ) { | ||||
|         virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { | ||||
|             Ptr<TestRunNode> node = new TestRunNode( testRunStats ); | ||||
|             node->children.swap( m_testGroups ); | ||||
|             m_testRuns.push_back( node ); | ||||
| @@ -189,7 +202,7 @@ namespace Catch { | ||||
|         } | ||||
|         virtual void testRunEndedCumulative() = 0; | ||||
|  | ||||
|         virtual void skipTest( TestCaseInfo const& ) {} | ||||
|         virtual void skipTest( TestCaseInfo const& ) CATCH_OVERRIDE {} | ||||
|  | ||||
|         Ptr<IConfig> m_config; | ||||
|         std::ostream& stream; | ||||
| @@ -203,6 +216,7 @@ namespace Catch { | ||||
|         Ptr<SectionNode> m_rootSection; | ||||
|         Ptr<SectionNode> m_deepestSection; | ||||
|         std::vector<Ptr<SectionNode> > m_sectionStack; | ||||
|         ReporterPreferences m_reporterPrefs; | ||||
|  | ||||
|     }; | ||||
|  | ||||
| @@ -216,6 +230,18 @@ namespace Catch { | ||||
|         return line; | ||||
|     } | ||||
|  | ||||
|      | ||||
|     struct TestEventListenerBase : StreamingReporterBase { | ||||
|         TestEventListenerBase( ReporterConfig const& _config ) | ||||
|         :   StreamingReporterBase( _config ) | ||||
|         {} | ||||
|          | ||||
|         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {} | ||||
|         virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { | ||||
|             return false; | ||||
|         } | ||||
|     }; | ||||
|      | ||||
| } // end namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED | ||||
|   | ||||
| @@ -21,24 +21,19 @@ namespace Catch { | ||||
|             m_headerPrinted( false ) | ||||
|         {} | ||||
|  | ||||
|         virtual ~ConsoleReporter(); | ||||
|         virtual ~ConsoleReporter() CATCH_OVERRIDE; | ||||
|         static std::string getDescription() { | ||||
|             return "Reports test results as plain lines of text"; | ||||
|         } | ||||
|         virtual ReporterPreferences getPreferences() const { | ||||
|             ReporterPreferences prefs; | ||||
|             prefs.shouldRedirectStdOut = false; | ||||
|             return prefs; | ||||
|         } | ||||
|  | ||||
|         virtual void noMatchingTestCases( std::string const& spec ) { | ||||
|         virtual void noMatchingTestCases( std::string const& spec ) CATCH_OVERRIDE { | ||||
|             stream << "No test cases matched '" << spec << "'" << std::endl; | ||||
|         } | ||||
|  | ||||
|         virtual void assertionStarting( AssertionInfo const& ) { | ||||
|         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { | ||||
|         } | ||||
|  | ||||
|         virtual bool assertionEnded( AssertionStats const& _assertionStats ) { | ||||
|         virtual bool assertionEnded( AssertionStats const& _assertionStats ) CATCH_OVERRIDE { | ||||
|             AssertionResult const& result = _assertionStats.assertionResult; | ||||
|  | ||||
|             bool printInfoMessages = true; | ||||
| @@ -58,11 +53,11 @@ namespace Catch { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         virtual void sectionStarting( SectionInfo const& _sectionInfo ) { | ||||
|         virtual void sectionStarting( SectionInfo const& _sectionInfo ) CATCH_OVERRIDE { | ||||
|             m_headerPrinted = false; | ||||
|             StreamingReporterBase::sectionStarting( _sectionInfo ); | ||||
|         } | ||||
|         virtual void sectionEnded( SectionStats const& _sectionStats ) { | ||||
|         virtual void sectionEnded( SectionStats const& _sectionStats ) CATCH_OVERRIDE { | ||||
|             if( _sectionStats.missingAssertions ) { | ||||
|                 lazyPrint(); | ||||
|                 Colour colour( Colour::ResultError ); | ||||
| @@ -84,11 +79,11 @@ namespace Catch { | ||||
|             StreamingReporterBase::sectionEnded( _sectionStats ); | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) { | ||||
|         virtual void testCaseEnded( TestCaseStats const& _testCaseStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testCaseEnded( _testCaseStats ); | ||||
|             m_headerPrinted = false; | ||||
|         } | ||||
|         virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) { | ||||
|         virtual void testGroupEnded( TestGroupStats const& _testGroupStats ) CATCH_OVERRIDE { | ||||
|             if( currentGroupInfo.used ) { | ||||
|                 printSummaryDivider(); | ||||
|                 stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; | ||||
| @@ -97,7 +92,7 @@ namespace Catch { | ||||
|             } | ||||
|             StreamingReporterBase::testGroupEnded( _testGroupStats ); | ||||
|         } | ||||
|         virtual void testRunEnded( TestRunStats const& _testRunStats ) { | ||||
|         virtual void testRunEnded( TestRunStats const& _testRunStats ) CATCH_OVERRIDE { | ||||
|             printTotalsDivider( _testRunStats.totals ); | ||||
|             printTotals( _testRunStats.totals ); | ||||
|             stream << std::endl; | ||||
|   | ||||
| @@ -23,28 +23,24 @@ namespace Catch { | ||||
|         JunitReporter( ReporterConfig const& _config ) | ||||
|         :   CumulativeReporterBase( _config ), | ||||
|             xml( _config.stream() ) | ||||
|         {} | ||||
|         { | ||||
|             m_reporterPrefs.shouldRedirectStdOut = true; | ||||
|         } | ||||
|  | ||||
|         ~JunitReporter(); | ||||
|         virtual ~JunitReporter() CATCH_OVERRIDE; | ||||
|  | ||||
|         static std::string getDescription() { | ||||
|             return "Reports test results in an XML format that looks like Ant's junitreport target"; | ||||
|         } | ||||
|  | ||||
|         virtual void noMatchingTestCases( std::string const& /*spec*/ ) {} | ||||
|         virtual void noMatchingTestCases( std::string const& /*spec*/ ) CATCH_OVERRIDE {} | ||||
|  | ||||
|         virtual ReporterPreferences getPreferences() const { | ||||
|             ReporterPreferences prefs; | ||||
|             prefs.shouldRedirectStdOut = true; | ||||
|             return prefs; | ||||
|         } | ||||
|  | ||||
|         virtual void testRunStarting( TestRunInfo const& runInfo ) { | ||||
|         virtual void testRunStarting( TestRunInfo const& runInfo ) CATCH_OVERRIDE { | ||||
|             CumulativeReporterBase::testRunStarting( runInfo ); | ||||
|             xml.startElement( "testsuites" ); | ||||
|         } | ||||
|  | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) { | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { | ||||
|             suiteTimer.start(); | ||||
|             stdOutForSuite.str(""); | ||||
|             stdErrForSuite.str(""); | ||||
| @@ -52,25 +48,25 @@ namespace Catch { | ||||
|             CumulativeReporterBase::testGroupStarting( groupInfo ); | ||||
|         } | ||||
|  | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) { | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { | ||||
|             if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException ) | ||||
|                 unexpectedExceptions++; | ||||
|             return CumulativeReporterBase::assertionEnded( assertionStats ); | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { | ||||
|             stdOutForSuite << testCaseStats.stdOut; | ||||
|             stdErrForSuite << testCaseStats.stdErr; | ||||
|             CumulativeReporterBase::testCaseEnded( testCaseStats ); | ||||
|         } | ||||
|  | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { | ||||
|             double suiteTime = suiteTimer.getElapsedSeconds(); | ||||
|             CumulativeReporterBase::testGroupEnded( testGroupStats ); | ||||
|             writeGroup( *m_testGroups.back(), suiteTime ); | ||||
|         } | ||||
|  | ||||
|         virtual void testRunEndedCumulative() { | ||||
|         virtual void testRunEndedCumulative() CATCH_OVERRIDE { | ||||
|             xml.endElement(); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -17,8 +17,10 @@ | ||||
| #include <cstring> | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #pragma clang diagnostic push | ||||
| #pragma clang diagnostic ignored "-Wpadded" | ||||
| #   pragma clang diagnostic push | ||||
| #   pragma clang diagnostic ignored "-Wpadded" | ||||
| #   pragma clang diagnostic ignored "-Wc++98-compat" | ||||
| #   pragma clang diagnostic ignored "-Wc++98-compat-pedantic" | ||||
| #endif | ||||
|  | ||||
| namespace Catch { | ||||
| @@ -27,7 +29,9 @@ namespace Catch { | ||||
|         TeamCityReporter( ReporterConfig const& _config ) | ||||
|         :   StreamingReporterBase( _config ), | ||||
|             m_headerPrintedForThisSection( false ) | ||||
|         {} | ||||
|         { | ||||
|             m_reporterPrefs.shouldRedirectStdOut = true; | ||||
|         } | ||||
|          | ||||
|         static std::string escape( std::string const& str ) { | ||||
|             std::string escaped = str; | ||||
| @@ -39,18 +43,13 @@ namespace Catch { | ||||
|             replaceInPlace( escaped, "]", "|]" ); | ||||
|             return escaped; | ||||
|         } | ||||
|         virtual ~TeamCityReporter(); | ||||
|         virtual ~TeamCityReporter() CATCH_OVERRIDE; | ||||
|  | ||||
|         static std::string getDescription() { | ||||
|             return "Reports test results as TeamCity service messages"; | ||||
|         } | ||||
|         virtual ReporterPreferences getPreferences() const { | ||||
|             ReporterPreferences prefs; | ||||
|             prefs.shouldRedirectStdOut = true; | ||||
|             return prefs; | ||||
|         } | ||||
|  | ||||
|         virtual void skipTest( TestCaseInfo const& testInfo ) { | ||||
|         virtual void skipTest( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { | ||||
|             stream  << "##teamcity[testIgnored name='" | ||||
|                     << escape( testInfo.name ) << "'"; | ||||
|             if( testInfo.isHidden() ) | ||||
| @@ -60,24 +59,24 @@ namespace Catch { | ||||
|             stream << "]\n"; | ||||
|         } | ||||
|          | ||||
|         virtual void noMatchingTestCases( std::string const& /* spec */ ) {} | ||||
|         virtual void noMatchingTestCases( std::string const& /* spec */ ) CATCH_OVERRIDE {} | ||||
|          | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) { | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testGroupStarting( groupInfo ); | ||||
|             stream << "##teamcity[testSuiteStarted name='" | ||||
|                 << escape( groupInfo.name ) << "']\n"; | ||||
|         } | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testGroupEnded( testGroupStats ); | ||||
|             stream << "##teamcity[testSuiteFinished name='" | ||||
|                 << escape( testGroupStats.groupInfo.name ) << "']\n"; | ||||
|         } | ||||
|  | ||||
|          | ||||
|         virtual void assertionStarting( AssertionInfo const& ) { | ||||
|         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { | ||||
|         } | ||||
|          | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) { | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { | ||||
|             AssertionResult const& result = assertionStats.assertionResult; | ||||
|             if( !result.isOk() ) { | ||||
|                  | ||||
| @@ -143,18 +142,18 @@ namespace Catch { | ||||
|             return true; | ||||
|         } | ||||
|          | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) { | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { | ||||
|             m_headerPrintedForThisSection = false; | ||||
|             StreamingReporterBase::sectionStarting( sectionInfo ); | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseStarting( TestCaseInfo const& testInfo ) { | ||||
|         virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testCaseStarting( testInfo ); | ||||
|             stream << "##teamcity[testStarted name='" | ||||
|                 << escape( testInfo.name ) << "']\n"; | ||||
|         } | ||||
|          | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testCaseEnded( testCaseStats ); | ||||
|             if( !testCaseStats.stdOut.empty() ) | ||||
|                 stream << "##teamcity[testStdOut name='" | ||||
| @@ -216,7 +215,7 @@ namespace Catch { | ||||
| } // end namespace Catch | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #pragma clang diagnostic pop | ||||
| #   pragma clang diagnostic pop | ||||
| #endif | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED | ||||
|   | ||||
| @@ -21,26 +21,23 @@ namespace Catch { | ||||
|         XmlReporter( ReporterConfig const& _config ) | ||||
|         :   StreamingReporterBase( _config ), | ||||
|             m_sectionDepth( 0 ) | ||||
|         {} | ||||
|         { | ||||
|             m_reporterPrefs.shouldRedirectStdOut = true; | ||||
|         } | ||||
|  | ||||
|         virtual ~XmlReporter(); | ||||
|         virtual ~XmlReporter() CATCH_OVERRIDE; | ||||
|          | ||||
|         static std::string getDescription() { | ||||
|             return "Reports test results as an XML document"; | ||||
|         } | ||||
|  | ||||
|     public: // StreamingReporterBase | ||||
|         virtual ReporterPreferences getPreferences() const { | ||||
|             ReporterPreferences prefs; | ||||
|             prefs.shouldRedirectStdOut = true; | ||||
|             return prefs; | ||||
|         } | ||||
|  | ||||
|         virtual void noMatchingTestCases( std::string const& s ) { | ||||
|         virtual void noMatchingTestCases( std::string const& s ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::noMatchingTestCases( s ); | ||||
|         } | ||||
|  | ||||
|         virtual void testRunStarting( TestRunInfo const& testInfo ) { | ||||
|         virtual void testRunStarting( TestRunInfo const& testInfo ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testRunStarting( testInfo ); | ||||
|             m_xml.setStream( stream ); | ||||
|             m_xml.startElement( "Catch" ); | ||||
| @@ -48,13 +45,13 @@ namespace Catch { | ||||
|                 m_xml.writeAttribute( "name", m_config->name() ); | ||||
|         } | ||||
|  | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) { | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testGroupStarting( groupInfo ); | ||||
|             m_xml.startElement( "Group" ) | ||||
|                 .writeAttribute( "name", groupInfo.name ); | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseStarting( TestCaseInfo const& testInfo ) { | ||||
|         virtual void testCaseStarting( TestCaseInfo const& testInfo ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testCaseStarting(testInfo); | ||||
|             m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); | ||||
|  | ||||
| @@ -62,7 +59,7 @@ namespace Catch { | ||||
|                 m_testCaseTimer.start(); | ||||
|         } | ||||
|  | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) { | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::sectionStarting( sectionInfo ); | ||||
|             if( m_sectionDepth++ > 0 ) { | ||||
|                 m_xml.startElement( "Section" ) | ||||
| @@ -71,9 +68,9 @@ namespace Catch { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         virtual void assertionStarting( AssertionInfo const& ) { } | ||||
|         virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE { } | ||||
|  | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) { | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE { | ||||
|             const AssertionResult& assertionResult = assertionStats.assertionResult; | ||||
|                  | ||||
|             // Print any info messages in <Info> tags. | ||||
| @@ -144,7 +141,7 @@ namespace Catch { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         virtual void sectionEnded( SectionStats const& sectionStats ) { | ||||
|         virtual void sectionEnded( SectionStats const& sectionStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::sectionEnded( sectionStats ); | ||||
|             if( --m_sectionDepth > 0 ) { | ||||
|                 XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); | ||||
| @@ -159,7 +156,7 @@ namespace Catch { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testCaseEnded( testCaseStats ); | ||||
|             XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); | ||||
|             e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); | ||||
| @@ -170,7 +167,7 @@ namespace Catch { | ||||
|             m_xml.endElement(); | ||||
|         } | ||||
|  | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testGroupEnded( testGroupStats ); | ||||
|             // TODO: Check testGroupStats.aborting and act accordingly. | ||||
|             m_xml.scopedElement( "OverallResults" ) | ||||
| @@ -180,7 +177,7 @@ namespace Catch { | ||||
|             m_xml.endElement(); | ||||
|         } | ||||
|          | ||||
|         virtual void testRunEnded( TestRunStats const& testRunStats ) { | ||||
|         virtual void testRunEnded( TestRunStats const& testRunStats ) CATCH_OVERRIDE { | ||||
|             StreamingReporterBase::testRunEnded( testRunStats ); | ||||
|             m_xml.scopedElement( "OverallResults" ) | ||||
|                 .writeAttribute( "successes", testRunStats.totals.assertions.passed ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash