mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-30 19:57:10 +01:00 
			
		
		
		
	build 12
- includes updated xml reporter
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
|  | ||||
|  | ||||
| *v1.1 build 11 (develop branch)* | ||||
| *v1.1 build 12 (develop branch)* | ||||
|  | ||||
| Build status (on Travis CI) [](https://travis-ci.org/philsquared/Catch) | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
| namespace Catch { | ||||
|  | ||||
|     // These numbers are maintained by a script | ||||
|     Version libraryVersion( 1, 1, 11, "develop" ); | ||||
|     Version libraryVersion( 1, 1, 12, "develop" ); | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  *  CATCH v1.1 build 11 (develop branch) | ||||
|  *  Generated: 2014-12-22 20:17:55.347268 | ||||
|  *  CATCH v1.1 build 12 (develop branch) | ||||
|  *  Generated: 2014-12-30 18:25:37.281243 | ||||
|  *  ---------------------------------------------------------- | ||||
|  *  This file has been merged from multiple headers. Please don't edit it directly | ||||
|  *  Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. | ||||
| @@ -1689,6 +1689,9 @@ namespace Catch { | ||||
|         bool allPassed() const { | ||||
|             return failed == 0 && failedButOk == 0; | ||||
|         } | ||||
|         bool allOk() const { | ||||
|             return failed == 0; | ||||
|         } | ||||
|  | ||||
|         std::size_t passed; | ||||
|         std::size_t failed; | ||||
| @@ -6686,7 +6689,7 @@ namespace Catch { | ||||
| namespace Catch { | ||||
|  | ||||
|     // These numbers are maintained by a script | ||||
|     Version libraryVersion( 1, 1, 11, "develop" ); | ||||
|     Version libraryVersion( 1, 1, 12, "develop" ); | ||||
| } | ||||
|  | ||||
| // #included from: catch_message.hpp | ||||
| @@ -7986,81 +7989,90 @@ namespace Catch { | ||||
|  | ||||
| } | ||||
| namespace Catch { | ||||
|     class XmlReporter : public SharedImpl<IReporter> { | ||||
|     class XmlReporter : public StreamingReporterBase { | ||||
|     public: | ||||
|         XmlReporter( ReporterConfig const& config ) : m_config( config ), m_sectionDepth( 0 ) {} | ||||
|         XmlReporter( ReporterConfig const& _config ) | ||||
|         :   StreamingReporterBase( _config ), | ||||
|             m_sectionDepth( 0 ) | ||||
|         {} | ||||
|  | ||||
|         virtual ~XmlReporter(); | ||||
|  | ||||
|         static std::string getDescription() { | ||||
|             return "Reports test results as an XML document"; | ||||
|         } | ||||
|         virtual ~XmlReporter(); | ||||
|  | ||||
|     private: // IReporter | ||||
|  | ||||
|         virtual bool shouldRedirectStdout() const { | ||||
|             return true; | ||||
|     public: // StreamingReporterBase | ||||
|         virtual ReporterPreferences getPreferences() const { | ||||
|             ReporterPreferences prefs; | ||||
|             prefs.shouldRedirectStdOut = true; | ||||
|             return prefs; | ||||
|         } | ||||
|  | ||||
|         virtual void StartTesting() { | ||||
|             m_xml.setStream( m_config.stream() ); | ||||
|         virtual void noMatchingTestCases( std::string const& s ) { | ||||
|             StreamingReporterBase::noMatchingTestCases( s ); | ||||
|         } | ||||
|  | ||||
|         virtual void testRunStarting( TestRunInfo const& testInfo ) { | ||||
|             StreamingReporterBase::testRunStarting( testInfo ); | ||||
|             m_xml.setStream( stream ); | ||||
|             m_xml.startElement( "Catch" ); | ||||
|             if( !m_config.fullConfig()->name().empty() ) | ||||
|                 m_xml.writeAttribute( "name", m_config.fullConfig()->name() ); | ||||
|             if( !m_config->name().empty() ) | ||||
|                 m_xml.writeAttribute( "name", m_config->name() ); | ||||
|         } | ||||
|  | ||||
|         virtual void EndTesting( const Totals& totals ) { | ||||
|             m_xml.scopedElement( "OverallResults" ) | ||||
|                 .writeAttribute( "successes", totals.assertions.passed ) | ||||
|                 .writeAttribute( "failures", totals.assertions.failed ) | ||||
|                 .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); | ||||
|             m_xml.endElement(); | ||||
|         } | ||||
|  | ||||
|         virtual void StartGroup( const std::string& groupName ) { | ||||
|         virtual void testGroupStarting( GroupInfo const& groupInfo ) { | ||||
|             StreamingReporterBase::testGroupStarting( groupInfo ); | ||||
|             m_xml.startElement( "Group" ) | ||||
|                 .writeAttribute( "name", groupName ); | ||||
|                 .writeAttribute( "name", groupInfo.name ); | ||||
|         } | ||||
|  | ||||
|         virtual void EndGroup( const std::string&, const Totals& totals ) { | ||||
|             m_xml.scopedElement( "OverallResults" ) | ||||
|                 .writeAttribute( "successes", totals.assertions.passed ) | ||||
|                 .writeAttribute( "failures", totals.assertions.failed ) | ||||
|                 .writeAttribute( "expectedFailures", totals.assertions.failedButOk ); | ||||
|             m_xml.endElement(); | ||||
|         virtual void testCaseStarting( TestCaseInfo const& testInfo ) { | ||||
|             StreamingReporterBase::testCaseStarting(testInfo); | ||||
|             m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); | ||||
|  | ||||
|             if ( m_config->showDurations() == ShowDurations::Always ) | ||||
|                 m_testCaseTimer.start(); | ||||
|         } | ||||
|  | ||||
|         virtual void StartSection( const std::string& sectionName, const std::string& description ) { | ||||
|         virtual void sectionStarting( SectionInfo const& sectionInfo ) { | ||||
|             StreamingReporterBase::sectionStarting( sectionInfo ); | ||||
|             if( m_sectionDepth++ > 0 ) { | ||||
|                 m_xml.startElement( "Section" ) | ||||
|                     .writeAttribute( "name", trim( sectionName ) ) | ||||
|                     .writeAttribute( "description", description ); | ||||
|             } | ||||
|         } | ||||
|         virtual void NoAssertionsInSection( const std::string& ) {} | ||||
|         virtual void NoAssertionsInTestCase( const std::string& ) {} | ||||
|  | ||||
|         virtual void EndSection( const std::string& /*sectionName*/, const Counts& assertions ) { | ||||
|             if( --m_sectionDepth > 0 ) { | ||||
|                 m_xml.scopedElement( "OverallResults" ) | ||||
|                     .writeAttribute( "successes", assertions.passed ) | ||||
|                     .writeAttribute( "failures", assertions.failed ) | ||||
|                     .writeAttribute( "expectedFailures", assertions.failedButOk ); | ||||
|                 m_xml.endElement(); | ||||
|                     .writeAttribute( "name", trim( sectionInfo.name ) ) | ||||
|                     .writeAttribute( "description", sectionInfo.description ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         virtual void StartTestCase( const Catch::TestCaseInfo& testInfo ) { | ||||
|             m_xml.startElement( "TestCase" ).writeAttribute( "name", trim( testInfo.name ) ); | ||||
|             m_currentTestSuccess = true; | ||||
|         } | ||||
|         virtual void assertionStarting( AssertionInfo const& ) { } | ||||
|  | ||||
|         virtual void Result( const Catch::AssertionResult& assertionResult ) { | ||||
|             if( !m_config.fullConfig()->includeSuccessfulResults() && assertionResult.getResultType() == ResultWas::Ok ) | ||||
|                 return; | ||||
|         virtual bool assertionEnded( AssertionStats const& assertionStats ) { | ||||
|             const AssertionResult& assertionResult = assertionStats.assertionResult; | ||||
|  | ||||
|             // Print any info messages in <Info> tags. | ||||
|             if( assertionStats.assertionResult.getResultType() != ResultWas::Ok ) { | ||||
|                 for( std::vector<MessageInfo>::const_iterator it = assertionStats.infoMessages.begin(), itEnd = assertionStats.infoMessages.end(); | ||||
|                         it != itEnd; | ||||
|                         ++it ) { | ||||
|                     if( it->type == ResultWas::Info ) { | ||||
|                         m_xml.scopedElement( "Info" ) | ||||
|                             .writeText( it->message ); | ||||
|                     } else if ( it->type == ResultWas::Warning ) { | ||||
|                         m_xml.scopedElement( "Warning" ) | ||||
|                             .writeText( it->message ); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // Drop out if result was successful but we're not printing them. | ||||
|             if( !m_config->includeSuccessfulResults() && isOk(assertionResult.getResultType()) ) | ||||
|                 return true; | ||||
|  | ||||
|             // Print the expression if there is one. | ||||
|             if( assertionResult.hasExpression() ) { | ||||
|                 m_xml.startElement( "Expression" ) | ||||
|                     .writeAttribute( "success", assertionResult.succeeded() ) | ||||
| 					.writeAttribute( "type", assertionResult.getTestMacroName() ) | ||||
|                     .writeAttribute( "filename", assertionResult.getSourceInfo().file ) | ||||
|                     .writeAttribute( "line", assertionResult.getSourceInfo().line ); | ||||
|  | ||||
| @@ -8068,65 +8080,96 @@ namespace Catch { | ||||
|                     .writeText( assertionResult.getExpression() ); | ||||
|                 m_xml.scopedElement( "Expanded" ) | ||||
|                     .writeText( assertionResult.getExpandedExpression() ); | ||||
|                 m_currentTestSuccess &= assertionResult.succeeded(); | ||||
|             } | ||||
|  | ||||
|             // And... Print a result applicable to each result type. | ||||
|             switch( assertionResult.getResultType() ) { | ||||
|                 case ResultWas::ThrewException: | ||||
|                     m_xml.scopedElement( "Exception" ) | ||||
|                         .writeAttribute( "filename", assertionResult.getSourceInfo().file ) | ||||
|                         .writeAttribute( "line", assertionResult.getSourceInfo().line ) | ||||
|                         .writeText( assertionResult.getMessage() ); | ||||
|                     m_currentTestSuccess = false; | ||||
|                     break; | ||||
|                 case ResultWas::FatalErrorCondition: | ||||
|                     m_xml.scopedElement( "Fatal Error Condition" ) | ||||
|                         .writeAttribute( "filename", assertionResult.getSourceInfo().file ) | ||||
|                         .writeAttribute( "line", assertionResult.getSourceInfo().line ) | ||||
|                         .writeText( assertionResult.getMessage() ); | ||||
|                     m_currentTestSuccess = false; | ||||
|                     break; | ||||
|                 case ResultWas::Info: | ||||
|                     m_xml.scopedElement( "Info" ) | ||||
|                         .writeText( assertionResult.getMessage() ); | ||||
|                     break; | ||||
|                 case ResultWas::Warning: | ||||
|                     m_xml.scopedElement( "Warning" ) | ||||
|                         .writeText( assertionResult.getMessage() ); | ||||
|                     // Warning will already have been written | ||||
|                     break; | ||||
|                 case ResultWas::ExplicitFailure: | ||||
|                     m_xml.scopedElement( "Failure" ) | ||||
|                         .writeText( assertionResult.getMessage() ); | ||||
|                     m_currentTestSuccess = false; | ||||
|                     break; | ||||
|                 case ResultWas::Unknown: | ||||
|                 case ResultWas::Ok: | ||||
|                 case ResultWas::FailureBit: | ||||
|                 case ResultWas::ExpressionFailed: | ||||
|                 case ResultWas::Exception: | ||||
|                 case ResultWas::DidntThrowException: | ||||
|                 default: | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|             if( assertionResult.hasExpression() ) | ||||
|                 m_xml.endElement(); | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         virtual void Aborted() { | ||||
|             // !TBD | ||||
|         virtual void sectionEnded( SectionStats const& sectionStats ) { | ||||
|             StreamingReporterBase::sectionEnded( sectionStats ); | ||||
|             if( --m_sectionDepth > 0 ) { | ||||
|                 XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); | ||||
|                 e.writeAttribute( "successes", sectionStats.assertions.passed ); | ||||
|                 e.writeAttribute( "failures", sectionStats.assertions.failed ); | ||||
|                 e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); | ||||
|  | ||||
|                 if ( m_config->showDurations() == ShowDurations::Always ) | ||||
|                     e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); | ||||
|  | ||||
|                 m_xml.endElement(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         virtual void EndTestCase( const Catch::TestCaseInfo&, const Totals&, const std::string&, const std::string& ) { | ||||
|             m_xml.scopedElement( "OverallResult" ).writeAttribute( "success", m_currentTestSuccess ); | ||||
|         virtual void testCaseEnded( TestCaseStats const& testCaseStats ) { | ||||
|             StreamingReporterBase::testCaseEnded( testCaseStats ); | ||||
|             XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); | ||||
|             e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); | ||||
|  | ||||
|             if ( m_config->showDurations() == ShowDurations::Always ) | ||||
|                 e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); | ||||
|  | ||||
|             m_xml.endElement(); | ||||
|         } | ||||
|  | ||||
|         virtual void testGroupEnded( TestGroupStats const& testGroupStats ) { | ||||
|             StreamingReporterBase::testGroupEnded( testGroupStats ); | ||||
|             // TODO: Check testGroupStats.aborting and act accordingly. | ||||
|             m_xml.scopedElement( "OverallResults" ) | ||||
|                 .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) | ||||
|                 .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) | ||||
|                 .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); | ||||
|             m_xml.endElement(); | ||||
|         } | ||||
|  | ||||
|         virtual void testRunEnded( TestRunStats const& testRunStats ) { | ||||
|             StreamingReporterBase::testRunEnded( testRunStats ); | ||||
|             m_xml.scopedElement( "OverallResults" ) | ||||
|                 .writeAttribute( "successes", testRunStats.totals.assertions.passed ) | ||||
|                 .writeAttribute( "failures", testRunStats.totals.assertions.failed ) | ||||
|                 .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); | ||||
|             m_xml.endElement(); | ||||
|         } | ||||
|  | ||||
|     private: | ||||
|         ReporterConfig m_config; | ||||
|         bool m_currentTestSuccess; | ||||
|         Timer m_testCaseTimer; | ||||
|         XmlWriter m_xml; | ||||
|         int m_sectionDepth; | ||||
|     }; | ||||
|  | ||||
|      INTERNAL_CATCH_REGISTER_REPORTER( "xml", XmlReporter ) | ||||
|  | ||||
| } // end namespace Catch | ||||
|  | ||||
| // #included from: ../reporters/catch_reporter_junit.hpp | ||||
| @@ -9119,8 +9162,6 @@ namespace Catch { | ||||
|     Matchers::Impl::StdString::EndsWith::~EndsWith() {} | ||||
|  | ||||
|     void Config::dummy() {} | ||||
|  | ||||
|     INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter ) | ||||
| } | ||||
|  | ||||
| #ifdef __clang__ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash