Completed CumulativeReporterBase and reimplemented JUnitReporter in terms of it

This commit is contained in:
Phil Nash 2013-08-15 18:39:55 +01:00
parent 1f519dd856
commit 2ddb9d3802
9 changed files with 601 additions and 270 deletions

View File

@ -116,7 +116,9 @@ namespace Catch {
bool empty() const {
return file.empty();
}
bool operator == ( SourceLineInfo const& other ) const {
return line == other.line && file == other.file;
}
std::string file;
std::size_t line;
};

View File

@ -58,6 +58,8 @@ namespace Catch {
TestCaseStats::~TestCaseStats() {}
TestGroupStats::~TestGroupStats() {}
TestRunStats::~TestRunStats() {}
CumulativeReporterBase::SectionNode::~SectionNode() {}
CumulativeReporterBase::~CumulativeReporterBase() {}
BasicReporter::~BasicReporter() {}
StreamingReporterBase::~StreamingReporterBase() {}
@ -84,7 +86,7 @@ namespace Catch {
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "basic", BasicReporter )
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "xml", XmlReporter )
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "junit", JunitReporter )
INTERNAL_CATCH_REGISTER_LEGACY_REPORTER( "junit2", JunitReporter2 )
}

View File

@ -46,20 +46,6 @@ namespace Catch
bool shouldRedirectStdOut;
};
template<typename T, typename ChildT=T>
struct Node : SharedImpl<> {
Node( T const& _value, Node* _parent = NULL )
: value( _value ),
parent( _parent )
{}
virtual ~Node() {}
T value;
std::vector<Ptr<Node> > children;
Node* parent;
};
template<typename T>
struct LazyStat : Option<T> {
LazyStat() : used( false ) {}
@ -238,8 +224,6 @@ namespace Catch
struct StreamingReporterBase : SharedImpl<IStreamingReporter> {
typedef Ptr<Node<SectionInfo> > SectionInfoNode;
StreamingReporterBase( ReporterConfig const& _config )
: m_config( _config.fullConfig() ),
stream( _config.stream() )
@ -260,8 +244,7 @@ namespace Catch
currentTestCaseInfo = _testInfo;
}
virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
Ptr<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _sectionInfo );
m_sectionStack.push_back( sectionInfo );
m_sectionStack.push_back( _sectionInfo );
}
virtual void sectionEnded( SectionStats const& /* _sectionStats */ ) {
@ -281,30 +264,137 @@ namespace Catch
}
Ptr<IConfig> m_config;
std::ostream& stream;
LazyStat<TestRunInfo> currentTestRunInfo;
LazyStat<GroupInfo> currentGroupInfo;
LazyStat<TestCaseInfo> currentTestCaseInfo;
std::ostream& stream;
std::vector<SectionInfoNode> m_sectionStack;
std::vector<SectionInfo> m_sectionStack;
};
struct CumulativeReporterBase : StreamingReporterBase {
virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
struct CumulativeReporterBase : SharedImpl<IStreamingReporter> {
template<typename T, typename ChildNodeT>
struct Node : SharedImpl<> {
explicit Node( T const& _value ) : value( _value ) {}
virtual ~Node() {}
virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;
virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;
typedef std::vector<Ptr<ChildNodeT> > ChildNodes;
T value;
ChildNodes children;
};
struct SectionNode : SharedImpl<> {
explicit SectionNode( SectionStats const& _stats ) : stats( _stats ) {}
virtual ~SectionNode();
virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;
bool operator == ( SectionNode const& other ) const {
return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
}
bool operator == ( Ptr<SectionNode> const& other ) const {
return operator==( *other );
}
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;
virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
SectionStats stats;
typedef std::vector<Ptr<SectionNode> > ChildSections;
typedef std::vector<AssertionStats> Assertions;
ChildSections childSections;
Assertions assertions;
std::string stdOut;
std::string stdErr;
};
friend bool operator == ( Ptr<SectionNode> const& node, SectionInfo const& other ) {
return node->stats.sectionInfo.lineInfo == other.lineInfo;
}
typedef Node<TestCaseStats, SectionNode> TestCaseNode;
typedef Node<TestGroupStats, TestCaseNode> TestGroupNode;
typedef Node<TestRunStats, TestGroupNode> TestRunNode;
CumulativeReporterBase( ReporterConfig const& _config )
: m_config( _config.fullConfig() ),
stream( _config.stream() )
{}
~CumulativeReporterBase();
virtual void testRunStarting( TestRunInfo const& ) {}
virtual void testGroupStarting( GroupInfo const& ) {}
virtual void testCaseStarting( TestCaseInfo const& ) {}
virtual void sectionStarting( SectionInfo const& sectionInfo ) {
SectionStats incompleteStats( sectionInfo, Counts(), 0, false );
Ptr<SectionNode> node;
if( m_sectionStack.empty() ) {
if( !m_rootSection )
m_rootSection = new SectionNode( incompleteStats );
node = m_rootSection;
}
else {
SectionNode& parentNode = *m_sectionStack.back();
SectionNode::ChildSections::const_iterator it =
std::find( parentNode.childSections.begin(), parentNode.childSections.end(), sectionInfo );
if( it == parentNode.childSections.end() ) {
node = new SectionNode( incompleteStats );
parentNode.childSections.push_back( node );
}
else
node = *it;
}
m_sectionStack.push_back( node );
m_deepestSection = node;
}
virtual void assertionStarting( AssertionInfo const& ) {}
virtual bool assertionEnded( AssertionStats const& assertionStats ) {
assert( !m_sectionStack.empty() );
SectionNode& sectionNode = *m_sectionStack.back();
sectionNode.assertions.push_back( assertionStats );
return true;
}
virtual void sectionEnded( SectionStats const& sectionStats ) {
assert( !m_sectionStack.empty() );
SectionNode& node = *m_sectionStack.back();
node.stats = sectionStats;
m_sectionStack.pop_back();
}
virtual void testCaseEnded( TestCaseStats const& testCaseStats ) {
Ptr<TestCaseNode> node = new TestCaseNode( testCaseStats );
assert( m_sectionStack.size() == 0 );
node->children.push_back( m_rootSection );
m_testCases.push_back( node );
m_rootSection.reset();
assert( m_deepestSection );
m_deepestSection->stdOut = testCaseStats.stdOut;
m_deepestSection->stdErr = testCaseStats.stdErr;
}
virtual void testGroupEnded( TestGroupStats const& testGroupStats ) {
Ptr<TestGroupNode> node = new TestGroupNode( testGroupStats );
node->children.swap( m_testCases );
m_testGroups.push_back( node );
}
virtual void testRunEnded( TestRunStats const& testRunStats ) {
Ptr<TestRunNode> node = new TestRunNode( testRunStats );
node->children.swap( m_testGroups );
m_testRuns.push_back( node );
testRunEnded();
}
virtual void testRunEnded() = 0;
Ptr<IConfig> m_config;
std::ostream& stream;
std::vector<AssertionStats> m_assertions;
std::vector<std::vector<Ptr<SectionNode> > > m_sections;
std::vector<Ptr<TestCaseNode> > m_testCases;
std::vector<Ptr<TestGroupNode> > m_testGroups;
std::vector<Ptr<TestRunNode> > m_testRuns;
Ptr<SectionNode> m_rootSection;
Ptr<SectionNode> m_deepestSection;
std::vector<Ptr<SectionNode> > m_sectionStack;
std::vector<Ptr<Node<TestGroupStats> > > m_groups;
};
// Deprecated

View File

@ -127,7 +127,7 @@ namespace Catch {
AutoReg::AutoReg( TestFunction function,
SourceLineInfo const& lineInfo,
NameAndDesc const& nameAndDesc ) {
registerTestCase( new FreeFunctionTestCase( function ), "global", nameAndDesc, lineInfo );
registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo );
}
AutoReg::~AutoReg() {}

View File

@ -174,9 +174,17 @@ inline std::string toString( unsigned int value ) {
inline std::string toString( const double value ) {
std::ostringstream oss;
oss << std::setprecision (std::numeric_limits<double>::digits10 + 1)
oss << std::setprecision( 10 )
<< std::fixed
<< value;
return oss.str();
std::string d = oss.str();
std::size_t i = d.find_last_not_of( '0' );
if( i != std::string::npos && i != d.size()-1 ) {
if( d[i] == '.' )
i++;
d = d.substr( 0, i+1 );
}
return d;
}
inline std::string toString( bool value ) {

View File

@ -29,7 +29,6 @@ namespace Catch {
ReporterPreferences prefs;
prefs.shouldRedirectStdOut = false;
return prefs;
}
virtual void noMatchingTestCases( std::string const& spec ) {
@ -267,14 +266,14 @@ namespace Catch {
if( m_sectionStack.size() > 1 ) {
Colour colourGuard( Colour::Headers );
std::vector<SectionInfoNode>::const_iterator
std::vector<SectionInfo>::const_iterator
it = m_sectionStack.begin()+1, // Skip first section (test case)
itEnd = m_sectionStack.end();
for( ; it != itEnd; ++it )
printHeaderString( (*it)->value.name, 2 );
printHeaderString( it->name, 2 );
}
SourceLineInfo lineInfo = m_sectionStack.front()->value.lineInfo;
SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;
if( !lineInfo.empty() ){
stream << getDashes() << "\n";

View File

@ -17,7 +17,210 @@
namespace Catch {
class JunitReporter : public SharedImpl<IReporter> {
class JunitReporter : public CumulativeReporterBase {
public:
JunitReporter( ReporterConfig const& _config )
: CumulativeReporterBase( _config ),
xml( _config.stream() )
{}
~JunitReporter();
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 ReporterPreferences getPreferences() const {
ReporterPreferences prefs;
prefs.shouldRedirectStdOut = true;
return prefs;
}
virtual void testRunStarting( TestRunInfo const& runInfo ) {
CumulativeReporterBase::testRunStarting( runInfo );
xml.startElement( "testsuites" );
}
virtual void testGroupStarting( GroupInfo const& groupInfo ) {
suiteTimer.start();
stdOutForSuite.str("");
stdErrForSuite.str("");
unexpectedExceptions = 0;
CumulativeReporterBase::testGroupStarting( groupInfo );
}
virtual bool assertionEnded( AssertionStats const& assertionStats ) {
if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException )
unexpectedExceptions++;
return CumulativeReporterBase::assertionEnded( assertionStats );
}
virtual void testCaseEnded( TestCaseStats const& testCaseStats ) {
stdOutForSuite << testCaseStats.stdOut;
stdErrForSuite << testCaseStats.stdErr;
CumulativeReporterBase::testCaseEnded( testCaseStats );
}
virtual void testGroupEnded( TestGroupStats const& testGroupStats ) {
double suiteTime = suiteTimer.getElapsedSeconds();
CumulativeReporterBase::testGroupEnded( testGroupStats );
writeGroup( *m_testGroups.back(), suiteTime );
}
virtual void testRunEnded() {
xml.endElement();
}
void writeGroup( TestGroupNode const& groupNode, double suiteTime ) {
XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" );
TestGroupStats const& stats = groupNode.value;
xml.writeAttribute( "name", stats.groupInfo.name );
xml.writeAttribute( "errors", unexpectedExceptions );
xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions );
xml.writeAttribute( "tests", stats.totals.assertions.total() );
xml.writeAttribute( "hostname", "tbd" ); // !TBD
if( m_config->showDurations() == ShowDurations::Never )
xml.writeAttribute( "time", "" );
else
xml.writeAttribute( "time", suiteTime );
xml.writeAttribute( "timestamp", "tbd" ); // !TBD
// Write test cases
for( TestGroupNode::ChildNodes::const_iterator
it = groupNode.children.begin(), itEnd = groupNode.children.end();
it != itEnd;
++it )
writeTestCase( **it );
xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite.str() ), false );
xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite.str() ), false );
}
void writeTestCase( TestCaseNode const& testCaseNode ) {
TestCaseStats const& stats = testCaseNode.value;
// All test cases have exactly one section - which represents the
// test case itself. That section may have 0-n nested sections
assert( testCaseNode.children.size() == 1 );
SectionNode const& rootSection = *testCaseNode.children.front();
std::string className = stats.testInfo.className;
if( className.empty() ) {
if( rootSection.childSections.empty() )
className = "global";
}
writeSection( className, "", rootSection );
}
void writeSection( std::string const& className,
std::string const& rootName,
SectionNode const& sectionNode ) {
std::string name = trim( sectionNode.stats.sectionInfo.name );
if( !rootName.empty() )
name = rootName + "/" + name;
if( !sectionNode.assertions.empty() ||
!sectionNode.stdOut.empty() ||
!sectionNode.stdErr.empty() ) {
XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
if( className.empty() ) {
xml.writeAttribute( "classname", name );
xml.writeAttribute( "name", "root" );
}
else {
xml.writeAttribute( "classname", className );
xml.writeAttribute( "name", name );
}
xml.writeAttribute( "time", toString( sectionNode.stats.durationInSeconds ) );
writeAssertions( sectionNode );
if( !sectionNode.stdOut.empty() )
xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false );
if( !sectionNode.stdErr.empty() )
xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false );
}
for( SectionNode::ChildSections::const_iterator
it = sectionNode.childSections.begin(),
itEnd = sectionNode.childSections.end();
it != itEnd;
++it )
if( className.empty() )
writeSection( name, "", **it );
else
writeSection( className, name, **it );
}
void writeAssertions( SectionNode const& sectionNode ) {
for( SectionNode::Assertions::const_iterator
it = sectionNode.assertions.begin(), itEnd = sectionNode.assertions.end();
it != itEnd;
++it )
writeAssertion( *it );
}
void writeAssertion( AssertionStats const& stats ) {
AssertionResult const& result = stats.assertionResult;
if( !result.isOk() ) {
std::string elementName;
switch( result.getResultType() ) {
case ResultWas::ThrewException:
elementName = "error";
break;
case ResultWas::ExplicitFailure:
elementName = "failure";
break;
case ResultWas::ExpressionFailed:
elementName = "failure";
break;
case ResultWas::DidntThrowException:
elementName = "failure";
break;
// We should never see these here:
case ResultWas::Info:
case ResultWas::Warning:
case ResultWas::Ok:
case ResultWas::Unknown:
case ResultWas::FailureBit:
case ResultWas::Exception:
elementName = "internalError";
break;
}
XmlWriter::ScopedElement e = xml.scopedElement( elementName );
xml.writeAttribute( "message", result.getExpandedExpression() );
xml.writeAttribute( "type", result.getTestMacroName() );
std::ostringstream oss;
if( !result.getMessage().empty() )
oss << result.getMessage() << "\n";
for( std::vector<MessageInfo>::const_iterator
it = stats.infoMessages.begin(),
itEnd = stats.infoMessages.end();
it != itEnd;
++it )
if( it->type == ResultWas::Info )
oss << it->message << "\n";
oss << "at " << result.getSourceInfo();
xml.writeText( oss.str(), false );
}
}
XmlWriter xml;
Timer suiteTimer;
std::ostringstream stdOutForSuite;
std::ostringstream stdErrForSuite;
unsigned int unexpectedExceptions;
};
INTERNAL_CATCH_REGISTER_REPORTER( "junit", JunitReporter )
class JunitReporter2 : public SharedImpl<IReporter> {
struct TestStats {
std::string m_element;
@ -65,12 +268,12 @@ namespace Catch {
};
public:
JunitReporter( ReporterConfig const& config )
JunitReporter2( ReporterConfig const& config )
: m_config( config ),
m_testSuiteStats( "AllTests" ),
m_currentStats( &m_testSuiteStats )
{}
virtual ~JunitReporter();
// virtual ~JunitReporter2();
static std::string getDescription() {
return "Reports test results in an XML format that looks like Ant's junitreport target";

View File

@ -186,7 +186,7 @@ with expansion:
ConditionTests.cpp: FAILED:
CHECK( data.float_nine_point_one > 9.2 )
with expansion:
9.1 > 9.199999999999999
9.1 > 9.2
ConditionTests.cpp: FAILED:
CHECK( data.str_hello > "hello" )
@ -907,13 +907,13 @@ ApproxTests.cpp:
PASSED:
REQUIRE( divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 ) )
with expansion:
3.142857142857143 == Approx( 3.141 )
3.1428571429 == Approx( 3.141 )
ApproxTests.cpp:
PASSED:
REQUIRE( divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 ) )
with expansion:
3.142857142857143 != Approx( 3.141 )
3.1428571429 != Approx( 3.141 )
-------------------------------------------------------------------------------
./succeeding/TestClass/succeedingCase
@ -1253,7 +1253,7 @@ ConditionTests.cpp:
PASSED:
REQUIRE( data.float_nine_point_one < 9.2 )
with expansion:
9.1 < 9.199999999999999
9.1 < 9.2
ConditionTests.cpp:
PASSED:
@ -1350,7 +1350,7 @@ with expansion:
ConditionTests.cpp: FAILED:
CHECK( data.float_nine_point_one > 9.2 )
with expansion:
9.1 > 9.199999999999999
9.1 > 9.2
ConditionTests.cpp: FAILED:
CHECK( data.str_hello > "hello" )
@ -7175,28 +7175,28 @@ No test cases matched '~dummy 4'
No tests ran
<testsuites>
<testsuite name="~dummy" errors="10" failures="81" tests="756" hostname="tbd" time="" timestamp="tbd">
<testcase classname="global" name="./succeeding/Approx/simple" time="0"/>
<testcase classname="global" name="./succeeding/Approx/epsilon" time="0"/>
<testcase classname="global" name="./succeeding/Approx/float" time="0"/>
<testcase classname="global" name="./succeeding/Approx/int" time="0"/>
<testcase classname="global" name="./succeeding/Approx/mixed" time="0"/>
<testcase classname="global" name="./succeeding/Approx/custom" time="0"/>
<testcase classname="global" name="Approximate PI" time="0"/>
<testcase classname="TestClass" name="./succeeding/TestClass/succeedingCase" time="0"/>
<testcase classname="TestClass" name="./failing/TestClass/failingCase" time="0">
<testsuite name="~dummy" errors="10" failures="99" tests="756" hostname="tbd" time="0.027385" timestamp="tbd">
<testcase classname="global" name="./succeeding/Approx/simple" time="0.000086"/>
<testcase classname="global" name="./succeeding/Approx/epsilon" time="0.000022"/>
<testcase classname="global" name="./succeeding/Approx/float" time="0.000022"/>
<testcase classname="global" name="./succeeding/Approx/int" time="0.00002"/>
<testcase classname="global" name="./succeeding/Approx/mixed" time="0.00005"/>
<testcase classname="global" name="./succeeding/Approx/custom" time="0.000073"/>
<testcase classname="global" name="Approximate PI" time="0.00002"/>
<testcase classname="TestClass" name="./succeeding/TestClass/succeedingCase" time="0.000007"/>
<testcase classname="TestClass" name="./failing/TestClass/failingCase" time="0.0">
<failure message="&quot;hello&quot; == &quot;world&quot;" type="REQUIRE">
ClassTests.cpp
</failure>
</testcase>
<testcase classname="Fixture" name="./succeeding/Fixture/succeedingCase" time="0"/>
<testcase classname="Fixture" name="./failing/Fixture/failingCase" time="0">
<testcase classname="Fixture" name="./succeeding/Fixture/succeedingCase" time="0.000009"/>
<testcase classname="Fixture" name="./failing/Fixture/failingCase" time="0.0">
<failure message="1 == 2" type="REQUIRE">
ClassTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/conditions/equality" time="0"/>
<testcase classname="global" name="./failing/conditions/equality" time="0">
<testcase classname="global" name="./succeeding/conditions/equality" time="0.000079"/>
<testcase classname="global" name="./failing/conditions/equality" time="0.000139">
<failure message="7 == 6" type="CHECK">
ConditionTests.cpp
</failure>
@ -7237,8 +7237,8 @@ ConditionTests.cpp
ConditionTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/conditions/inequality" time="0"/>
<testcase classname="global" name="./failing/conditions/inequality" time="0">
<testcase classname="global" name="./succeeding/conditions/inequality" time="0.000093"/>
<testcase classname="global" name="./failing/conditions/inequality" time="0.000048">
<failure message="7 != 7" type="CHECK">
ConditionTests.cpp
</failure>
@ -7255,8 +7255,8 @@ ConditionTests.cpp
ConditionTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/conditions/ordered" time="0"/>
<testcase classname="global" name="./failing/conditions/ordered" time="0">
<testcase classname="global" name="./succeeding/conditions/ordered" time="0.000138"/>
<testcase classname="global" name="./failing/conditions/ordered" time="0.000135">
<failure message="7 > 7" type="CHECK">
ConditionTests.cpp
</failure>
@ -7287,7 +7287,7 @@ ConditionTests.cpp
<failure message="9.1 > 10" type="CHECK">
ConditionTests.cpp
</failure>
<failure message="9.1 > 9.199999999999999" type="CHECK">
<failure message="9.1 > 9.2" type="CHECK">
ConditionTests.cpp
</failure>
<failure message="&quot;hello&quot; > &quot;hello&quot;" type="CHECK">
@ -7315,14 +7315,14 @@ ConditionTests.cpp
ConditionTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/conditions/int literals" time="0"/>
<testcase classname="global" name="./succeeding/conditions//long_to_unsigned_x" time="0"/>
<testcase classname="global" name="./succeeding/conditions/const ints to int literal" time="0"/>
<testcase classname="global" name="./succeeding/conditions/negative ints" time="0"/>
<testcase classname="global" name="./succeeding/conditions/computed ints" time="0"/>
<testcase classname="global" name="./succeeding/conditions/ptr" time="0"/>
<testcase classname="global" name="./succeeding/conditions/not" time="0"/>
<testcase classname="global" name="./failing/conditions/not" time="0">
<testcase classname="global" name="./succeeding/conditions/int literals" time="0.000105"/>
<testcase classname="global" name="./succeeding/conditions//long_to_unsigned_x" time="0.000037"/>
<testcase classname="global" name="./succeeding/conditions/const ints to int literal" time="0.00003"/>
<testcase classname="global" name="./succeeding/conditions/negative ints" time="0.000038"/>
<testcase classname="global" name="./succeeding/conditions/computed ints" time="0.000007"/>
<testcase classname="global" name="./succeeding/conditions/ptr" time="0.000066"/>
<testcase classname="global" name="./succeeding/conditions/not" time="0.000048"/>
<testcase classname="global" name="./failing/conditions/not" time="0.000042">
<failure message="false != false" type="CHECK">
ConditionTests.cpp
</failure>
@ -7348,189 +7348,171 @@ ConditionTests.cpp
ConditionTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/exceptions/explicit" time="0"/>
<testcase classname="global" name="./failing/exceptions/explicit" time="0">
<testcase classname="global" name="./succeeding/exceptions/explicit" time="0.000041"/>
<testcase classname="global" name="./failing/exceptions/explicit" time="0.000045">
<error message="thisThrows()" type="CHECK_THROWS_AS">
expected exception
ExceptionTests.cpp
</error>
<failure message="thisDoesntThrow()" type="CHECK_THROWS_AS">
ExceptionTests.cpp
</failure>
<error message="thisThrows()" type="CHECK_NOTHROW">
expected exception
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/implicit" time="0">
<testcase classname="global" name="./failing/exceptions/implicit" time="0.0">
<error type="TEST_CASE">
unexpected exception
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/implicit/2" time="0">
<testcase classname="global" name="./failing/exceptions/implicit/2" time="0.0">
<error message="{Unknown expression after the reported line}">
unexpected exception
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/implicit/3" time="0">
<testcase classname="./failing/exceptions/implicit/3" name="section name" time="0.000004">
<error type="TEST_CASE">
unexpected exception
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/implicit/4" time="0">
<testcase classname="global" name="./failing/exceptions/implicit/4" time="0.000016">
<error message="thisThrows() == 0" type="CHECK">
expected exception
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./succeeding/exceptions/implicit" time="0"/>
<testcase classname="global" name="./failing/exceptions/custom" time="0">
<testcase classname="global" name="./failing/exceptions/custom" time="0.0">
<error type="TEST_CASE">
custom exception
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/custom/nothrow" time="0">
<testcase classname="global" name="./failing/exceptions/custom/nothrow" time="0.0">
<error message="throwCustom()" type="REQUIRE_NOTHROW">
custom exception - not std
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/custom/throw" time="0">
<testcase classname="global" name="./failing/exceptions/custom/throw" time="0.000018">
<error message="throwCustom()" type="REQUIRE_THROWS_AS">
custom exception - not std
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./failing/exceptions/custom/double" time="0">
<testcase classname="global" name="./failing/exceptions/custom/double" time="0.0">
<error type="TEST_CASE">
3.14
ExceptionTests.cpp
</error>
</testcase>
<testcase classname="global" name="./succeeding/exceptions/notimplemented" time="0"/>
<testcase classname="global" name="./succeeding/generators/1" time="0"/>
<testcase classname="global" name="./succeeding/generators/2" time="0"/>
<testcase classname="global" name="./succeeding/message" time="0">
<info type="INFO">
MessageTests.cpp
</info>
<warning type="WARN">
MessageTests.cpp
</warning>
</testcase>
<testcase classname="global" name="./succeeding/succeed" time="0"/>
<testcase classname="global" name="./failing/message/info/1" time="0">
<info type="INFO">
MessageTests.cpp
</info>
<info type="INFO">
MessageTests.cpp
</info>
<testcase classname="global" name="./succeeding/exceptions/notimplemented" time="0.000018"/>
<testcase classname="global" name="./succeeding/generators/1" time="0.000016"/>
<testcase classname="global" name="./succeeding/generators/2" time="0.000009"/>
<testcase classname="global" name="./succeeding/message" time="0.000014"/>
<testcase classname="global" name="./succeeding/succeed" time="0.000008"/>
<testcase classname="global" name="./failing/message/info/1" time="0.0">
<failure message="2 == 1" type="REQUIRE">
this message should be logged
so should this
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./mixed/message/info/2" time="0">
<info type="INFO">
MessageTests.cpp
</info>
<testcase classname="global" name="./mixed/message/info/2" time="0.000044">
<failure message="2 == 1" type="CHECK">
this message should be logged
MessageTests.cpp
</failure>
<info type="INFO">
MessageTests.cpp
</info>
<failure message="2 == 0" type="CHECK">
and this, but later
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./failing/message/fail" time="0">
<testcase classname="global" name="./failing/message/fail" time="0.0">
<failure type="FAIL">
This is a failure
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./failing/message/sections" time="0">
<failure type="FAIL">
MessageTests.cpp
</failure>
<testcase classname="./failing/message/sections" name="one" time="0.000014">
<failure type="FAIL">
Message from section one
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/message/sections/stdout" time="0">
<testcase classname="./failing/message/sections" name="two" time="0.000015">
<failure type="FAIL">
Message from section two
MessageTests.cpp
</failure>
</testcase>
<testcase classname="./succeeding/message/sections/stdout" name="two" time="0.000001">
<system-out>
Message from section one
Message from section two
</system-out>
</testcase>
<testcase classname="global" name="./mixed/message/scoped" time="0">
<info type="INFO">
MessageTests.cpp
</info>
<info type="CAPTURE">
MessageTests.cpp
</info>
<testcase classname="global" name="./mixed/message/scoped" time="0.0">
<failure message="10 &lt; 10" type="REQUIRE">
current counter 10
i := 10
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/nofail" time="0">
<failure message="1 == 2" type="CHECK_NOFAIL">
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="just info" time="0"/>
<testcase classname="global" name="just failure" time="0">
<testcase classname="global" name="./succeeding/nofail" time="0.000007"/>
<testcase classname="global" name="just failure" time="0.0">
<failure type="FAIL">
Previous info should not be seen
MessageTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/Misc/Sections" time="0"/>
<testcase classname="global" name="./succeeding/Misc/Sections/nested" time="0"/>
<testcase classname="global" name="./mixed/Misc/Sections/nested2" time="0">
<testcase classname="./succeeding/Misc/Sections" name="s1" time="0.000012"/>
<testcase classname="./succeeding/Misc/Sections" name="s2" time="0.000006"/>
<testcase classname="./succeeding/Misc/Sections/nested" name="s1" time="0.000023"/>
<testcase classname="./succeeding/Misc/Sections/nested" name="s1/s2" time="0.000005"/>
<testcase classname="./mixed/Misc/Sections/nested2" name="s1/s2" time="0.000017">
<failure message="1 == 2" type="REQUIRE">
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./Sections/nested/a/b" time="0"/>
<testcase classname="global" name="./mixed/Misc/Sections/loops" time="0">
<testcase classname="./mixed/Misc/Sections/nested2" name="s1/s3" time="0.000006"/>
<testcase classname="./mixed/Misc/Sections/nested2" name="s1/s4" time="0.000007"/>
<testcase classname="./mixed/Misc/Sections/loops" name="s1" time="0.000007">
<failure message="0 > 1" type="CHECK">
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./mixed/Misc/loops" time="0">
<info type="INFO">
MiscTests.cpp
</info>
<testcase classname="global" name="./mixed/Misc/loops" time="0.000089">
<failure message="1 == 0" type="CHECK">
Testing if fib[0] (1) is even
MiscTests.cpp
</failure>
<info type="INFO">
MiscTests.cpp
</info>
<failure message="1 == 0" type="CHECK">
Testing if fib[1] (1) is even
MiscTests.cpp
</failure>
<info type="INFO">
MiscTests.cpp
</info>
<failure message="1 == 0" type="CHECK">
Testing if fib[3] (3) is even
MiscTests.cpp
</failure>
<info type="INFO">
MiscTests.cpp
</info>
<failure message="1 == 0" type="CHECK">
Testing if fib[4] (5) is even
MiscTests.cpp
</failure>
<info type="INFO">
MiscTests.cpp
</info>
<failure message="1 == 0" type="CHECK">
Testing if fib[6] (13) is even
MiscTests.cpp
</failure>
<info type="INFO">
MiscTests.cpp
</info>
<failure message="1 == 0" type="CHECK">
Testing if fib[7] (21) is even
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/Misc/stdout,stderr" time="0">
<testcase classname="global" name="./succeeding/Misc/stdout,stderr" time="0.000011">
<system-out>
Some information
</system-out>
@ -7538,20 +7520,16 @@ Some information
An error
</system-err>
</testcase>
<testcase classname="global" name="./succeeding/Misc/null strings" time="0"/>
<testcase classname="global" name="./failing/info" time="0">
<info type="INFO">
MiscTests.cpp
</info>
<info type="CAPTURE">
MiscTests.cpp
</info>
<testcase classname="global" name="./succeeding/Misc/null strings" time="0.000021"/>
<testcase classname="global" name="./failing/info" time="0.0">
<failure message="false" type="REQUIRE">
hi
i := 7
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/checkedif" time="0"/>
<testcase classname="global" name="./failing/checkedif" time="0">
<testcase classname="global" name="./succeeding/checkedif" time="0.000012"/>
<testcase classname="global" name="./failing/checkedif" time="0.0">
<failure message="false" type="CHECKED_IF">
MiscTests.cpp
</failure>
@ -7559,8 +7537,8 @@ MiscTests.cpp
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/checkedelse" time="0"/>
<testcase classname="global" name="./failing/checkedelse" time="0">
<testcase classname="global" name="./succeeding/checkedelse" time="0.000013"/>
<testcase classname="global" name="./failing/checkedelse" time="0.0">
<failure message="false" type="CHECKED_ELSE">
MiscTests.cpp
</failure>
@ -7568,63 +7546,65 @@ MiscTests.cpp
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./misc/xmlentitycheck" time="0"/>
<testcase classname="global" name="./manual/onechar" time="0">
<info type="INFO">
MiscTests.cpp
</info>
<testcase classname="global" name="./manual/onechar" time="0.0">
<failure message="false" type="REQUIRE">
3
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/atomic if" time="0"/>
<testcase classname="global" name="./succeeding/matchers" time="0"/>
<testcase classname="global" name="./failing/matchers/Contains" time="0">
<testcase classname="global" name="./succeeding/atomic if" time="0.000011"/>
<testcase classname="global" name="./succeeding/matchers" time="0.000052"/>
<testcase classname="global" name="./failing/matchers/Contains" time="0.000011">
<failure message="&quot;this string contains 'abc' as a substring&quot; contains: &quot;not there&quot;" type="CHECK_THAT">
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./failing/matchers/StartsWith" time="0">
<testcase classname="global" name="./failing/matchers/StartsWith" time="0.000012">
<failure message="&quot;this string contains 'abc' as a substring&quot; starts with: &quot;string&quot;" type="CHECK_THAT">
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./failing/matchers/EndsWith" time="0">
<testcase classname="global" name="./failing/matchers/EndsWith" time="0.000012">
<failure message="&quot;this string contains 'abc' as a substring&quot; ends with: &quot;this&quot;" type="CHECK_THAT">
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./failing/matchers/Equals" time="0">
<testcase classname="global" name="./failing/matchers/Equals" time="0.000011">
<failure message="&quot;this string contains 'abc' as a substring&quot; equals: &quot;something else&quot;" type="CHECK_THAT">
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="string" time="0"/>
<testcase classname="global" name="./succeeding/matchers/AllOf" time="0"/>
<testcase classname="global" name="./succeeding/matchers/AnyOf" time="0"/>
<testcase classname="global" name="./succeeding/matchers/Equals" time="0"/>
<testcase classname="global" name="Factorials are computed" time="0"/>
<testcase classname="global" name="empty" time="0"/>
<testcase classname="global" name="Nice descriptive name" time="0">
<warning type="WARN">
MiscTests.cpp
</warning>
</testcase>
<testcase classname="global" name="first tag" time="0"/>
<testcase classname="global" name="second tag" time="0"/>
<testcase classname="global" name="vectors can be sized and resized" time="0"/>
<testcase classname="global" name="./failing/CatchSectionInfiniteLoop" time="0">
<testcase classname="global" name="string" time="0.00001"/>
<testcase classname="global" name="./succeeding/matchers/AllOf" time="0.000022"/>
<testcase classname="global" name="./succeeding/matchers/AnyOf" time="0.000041"/>
<testcase classname="global" name="./succeeding/matchers/Equals" time="0.000011"/>
<testcase classname="global" name="Factorials are computed" time="0.000053"/>
<testcase classname="global" name="Nice descriptive name" time="0.000008"/>
<testcase classname="vectors can be sized and resized" name="root" time="0.000049"/>
<testcase classname="vectors can be sized and resized" name="resizing bigger changes size and capacity" time="0.000016"/>
<testcase classname="vectors can be sized and resized" name="resizing smaller changes size but not capacity" time="0.000025"/>
<testcase classname="vectors can be sized and resized" name="resizing smaller changes size but not capacity/We can use the 'swap trick' to reset the capacity" time="0.000006"/>
<testcase classname="vectors can be sized and resized" name="reserving bigger changes capacity but not size" time="0.000013"/>
<testcase classname="vectors can be sized and resized" name="reserving smaller does not change size or capacity" time="0.000012"/>
<testcase classname="./failing/CatchSectionInfiniteLoop" name="root" time="0.0">
<failure type="FAIL">
to infinity and beyond
MiscTests.cpp
</failure>
<failure type="FAIL">
to infinity and beyond
MiscTests.cpp
</failure>
<failure type="FAIL">
to infinity and beyond
MiscTests.cpp
</failure>
</testcase>
<testcase classname="global" name="selftest/main" time="0">
<testcase classname="./failing/CatchSectionInfiniteLoop" name="Outer/Inner" time="0.000009"/>
<testcase classname="selftest/main" name="selftest/expected result/selftest/expected result/failing tests" time="0.003089"/>
<testcase classname="selftest/main" name="selftest/expected result/selftest/expected result/succeeding tests" time="0.006112"/>
<testcase classname="selftest/main" name="selftest/test counts/selftest/test counts/succeeding tests" time="0.002688"/>
<testcase classname="selftest/main" name="selftest/test counts/selftest/test counts/failing tests" time="0.000995">
<system-out>
Message from section one
Message from section two
@ -7638,33 +7618,58 @@ An error
An error
</system-err>
</testcase>
<testcase classname="global" name="meta/Misc/Sections" time="0"/>
<testcase classname="global" name="Process can be configured on command line" time="0"/>
<testcase classname="global" name="selftest/test filter" time="0"/>
<testcase classname="global" name="selftest/test filters" time="0"/>
<testcase classname="global" name="selftest/filter/prefix wildcard" time="0"/>
<testcase classname="global" name="selftest/filter/wildcard at both ends" time="0"/>
<testcase classname="global" name="selftest/tags" time="0"/>
<testcase classname="global" name="Long strings can be wrapped" time="0"/>
<testcase classname="global" name="Strings can be rendered with colour" time="0">
<testcase classname="global" name="meta/Misc/Sections" time="0.000201"/>
<testcase classname="Process can be configured on command line" name="default - no arguments" time="0.000074"/>
<testcase classname="Process can be configured on command line" name="test lists/1 test" time="0.000076"/>
<testcase classname="Process can be configured on command line" name="test lists/Specify one test case exclusion using exclude:" time="0.000073"/>
<testcase classname="Process can be configured on command line" name="test lists/Specify one test case exclusion using ~" time="0.000077"/>
<testcase classname="Process can be configured on command line" name="test lists/Specify two test cases using -t" time="0.000087"/>
<testcase classname="Process can be configured on command line" name="reporter/-r/console" time="0.000051"/>
<testcase classname="Process can be configured on command line" name="reporter/-r/xml" time="0.00005"/>
<testcase classname="Process can be configured on command line" name="reporter/--reporter/junit" time="0.000045"/>
<testcase classname="Process can be configured on command line" name="debugger/-b" time="0.000048"/>
<testcase classname="Process can be configured on command line" name="debugger/--break" time="0.000043"/>
<testcase classname="Process can be configured on command line" name="abort/-a aborts after first failure" time="0.000047"/>
<testcase classname="Process can be configured on command line" name="abort/-x 2 aborts after two failures" time="0.000052"/>
<testcase classname="Process can be configured on command line" name="abort/-x must be greater than zero" time="0.000074"/>
<testcase classname="Process can be configured on command line" name="abort/-x must be numeric" time="0.00007"/>
<testcase classname="Process can be configured on command line" name="nothrow/-e" time="0.000045"/>
<testcase classname="Process can be configured on command line" name="nothrow/--nothrow" time="0.000044"/>
<testcase classname="Process can be configured on command line" name="output filename/-o filename" time="0.000047"/>
<testcase classname="Process can be configured on command line" name="output filename/--out" time="0.000044"/>
<testcase classname="Process can be configured on command line" name="combinations/Single character flags can be combined" time="0.000063"/>
<testcase classname="global" name="selftest/test filter" time="0.000078"/>
<testcase classname="global" name="selftest/test filters" time="0.000042"/>
<testcase classname="global" name="selftest/filter/prefix wildcard" time="0.00002"/>
<testcase classname="global" name="selftest/filter/wildcard at both ends" time="0.000036"/>
<testcase classname="selftest/tags" name="one tag" time="0.000109"/>
<testcase classname="selftest/tags" name="two tags" time="0.000117"/>
<testcase classname="selftest/tags" name="one tag with characters either side" time="0.000037"/>
<testcase classname="selftest/tags" name="start of a tag, but not closed" time="0.000025"/>
<testcase classname="selftest/tags" name="hidden" time="0.000034"/>
<testcase classname="Long strings can be wrapped" name="plain string/No wrapping" time="0.000027"/>
<testcase classname="Long strings can be wrapped" name="plain string/Wrapped once" time="0.000051"/>
<testcase classname="Long strings can be wrapped" name="plain string/Wrapped twice" time="0.000034"/>
<testcase classname="Long strings can be wrapped" name="plain string/Wrapped three times" time="0.00002"/>
<testcase classname="Long strings can be wrapped" name="plain string/Short wrap" time="0.000061"/>
<testcase classname="Long strings can be wrapped" name="plain string/As container" time="0.000033"/>
<testcase classname="Long strings can be wrapped" name="plain string/Indent first line differently" time="0.000013"/>
<testcase classname="Long strings can be wrapped" name="With newlines/No wrapping" time="0.000032"/>
<testcase classname="Long strings can be wrapped" name="With newlines/Trailing newline" time="0.000027"/>
<testcase classname="Long strings can be wrapped" name="With newlines/Wrapped once" time="0.000032"/>
<testcase classname="Long strings can be wrapped" name="With newlines/Wrapped twice" time="0.00001"/>
<testcase classname="Long strings can be wrapped" name="With tabs" time="0.000015"/>
<testcase classname="global" name="Strings can be rendered with colour" time="0.000008">
<system-out>
hello
hello
</system-out>
</testcase>
<testcase classname="global" name="Text can be formatted using the Text class" time="0"/>
<testcase classname="global" name="./succeeding/Tricky/std::pair" time="0"/>
<testcase classname="global" name="./inprogress/failing/Tricky/trailing expression" time="0">
<warning type="WARN">
TrickyTests.cpp
</warning>
</testcase>
<testcase classname="global" name="./inprogress/failing/Tricky/compound lhs" time="0">
<warning type="WARN">
TrickyTests.cpp
</warning>
</testcase>
<testcase classname="global" name="./failing/Tricky/non streamable type" time="0">
<testcase classname="global" name="Text can be formatted using the Text class" time="0.000019"/>
<testcase classname="global" name="./succeeding/Tricky/std::pair" time="0.00001"/>
<testcase classname="global" name="./inprogress/failing/Tricky/trailing expression" time="0.000012"/>
<testcase classname="global" name="./inprogress/failing/Tricky/compound lhs" time="0.000011"/>
<testcase classname="global" name="./failing/Tricky/non streamable type" time="0.000014">
<failure message="0x<hex digits> == 0x<hex digits>" type="CHECK">
TrickyTests.cpp
</failure>
@ -7672,57 +7677,80 @@ TrickyTests.cpp
TrickyTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./failing/string literals" time="0">
<testcase classname="global" name="./failing/string literals" time="0.0">
<failure message="&quot;first&quot; == &quot;second&quot;" type="REQUIRE">
TrickyTests.cpp
</failure>
</testcase>
<testcase classname="global" name="./succeeding/side-effects" time="0"/>
<testcase classname="global" name="./succeeding/koenig" time="0"/>
<testcase classname="global" name="./succeeding/non-const==" time="0"/>
<testcase classname="global" name="./succeeding/enum/bits" time="0"/>
<testcase classname="global" name="./succeeding/boolean member" time="0"/>
<testcase classname="global" name="./succeeding/unimplemented static bool" time="0"/>
<testcase classname="global" name="./succeeding/SafeBool" time="0"/>
<testcase classname="global" name="Assertions then sections" time="0"/>
<testcase classname="global" name="non streamable - with conv. op" time="0"/>
<testcase classname="global" name="Comparing function pointers" time="0"/>
<testcase classname="global" name="pointer to class" time="0"/>
<testcase classname="global" name="X/level/0/a" time="0"/>
<testcase classname="global" name="X/level/0/b" time="0"/>
<testcase classname="global" name="X/level/1/a" time="0"/>
<testcase classname="global" name="X/level/1/b" time="0"/>
<testcase classname="global" name="Anonymous test case 1" time="0"/>
<testcase classname="global" name="Test case with one argument" time="0"/>
<testcase classname="global" name="Variadic macros" time="0"/>
<testcase classname="global" name="Scenario: Do that thing with the thing" time="0"/>
<testcase classname="global" name="Scenario: Vector resizing affects size and capacity" time="0"/>
<testcase classname="global" name="Scenario: This is a really long scenario name to see how the list command deals with wrapping" time="0"/>
<testcase classname="global" name="cmdline" time="0"/>
<testcase classname="global" name="section tracking" time="0"/>
<testcase classname="global" name="./succeeding/side-effects" time="0.000021"/>
<testcase classname="global" name="./succeeding/koenig" time="0.000008"/>
<testcase classname="global" name="./succeeding/non-const==" time="0.000007"/>
<testcase classname="global" name="./succeeding/enum/bits" time="0.000009"/>
<testcase classname="global" name="./succeeding/boolean member" time="0.000017"/>
<testcase classname="./succeeding/unimplemented static bool" name="compare to true" time="0.000011"/>
<testcase classname="./succeeding/unimplemented static bool" name="compare to false" time="0.00001"/>
<testcase classname="./succeeding/unimplemented static bool" name="negation" time="0.000005"/>
<testcase classname="./succeeding/unimplemented static bool" name="double negation" time="0.000005"/>
<testcase classname="./succeeding/unimplemented static bool" name="direct" time="0.000008"/>
<testcase classname="global" name="./succeeding/SafeBool" time="0.000013"/>
<testcase classname="Assertions then sections" name="root" time="0.00003"/>
<testcase classname="Assertions then sections" name="A section" time="0.000021"/>
<testcase classname="Assertions then sections" name="A section/Another section" time="0.000004"/>
<testcase classname="Assertions then sections" name="A section/Another other section" time="0.000004"/>
<testcase classname="global" name="non streamable - with conv. op" time="0.000008"/>
<testcase classname="global" name="Comparing function pointers" time="0.000017"/>
<testcase classname="global" name="pointer to class" time="0.000011"/>
<testcase classname="global" name="X/level/0/a" time="0.000004"/>
<testcase classname="global" name="X/level/0/b" time="0.000005"/>
<testcase classname="global" name="X/level/1/a" time="0.000004"/>
<testcase classname="global" name="X/level/1/b" time="0.000004"/>
<testcase classname="global" name="Anonymous test case 1" time="0.00001"/>
<testcase classname="global" name="Test case with one argument" time="0.000006"/>
<testcase classname="Variadic macros" name="Section with one argument" time="0.000007"/>
<testcase classname="Scenario: Do that thing with the thing" name="Given: This stuff exists/When: I do this/Then: it should do this" time="0.000025"/>
<testcase classname="Scenario: Do that thing with the thing" name="Given: This stuff exists/When: I do this/Then: it should do this/And: do that" time="0.000004"/>
<testcase classname="Scenario: Vector resizing affects size and capacity" name="Given: an empty vector" time="0.000035"/>
<testcase classname="Scenario: Vector resizing affects size and capacity" name="Given: an empty vector/When: it is made larger/Then: the size and capacity go up" time="0.00004"/>
<testcase classname="Scenario: Vector resizing affects size and capacity" name="Given: an empty vector/When: it is made larger/Then: the size and capacity go up/And when: it is made smaller again/Then: the size goes down but the capacity stays the same" time="0.000013"/>
<testcase classname="Scenario: Vector resizing affects size and capacity" name="Given: an empty vector/When: we reserve more space/Then: The capacity is increased but the size remains the same" time="0.000012"/>
<testcase classname="Scenario: This is a really long scenario name to see how the list command deals with wrapping" name="Given: A section name that is so long that it cannot fit in a single console width/When: The test headers are printed as part of the normal running of the scenario/Then: The, deliberately very long and overly verbose (you see what I did there?) section names must wrap, along with an indent" time="0.000007"/>
<testcase classname="cmdline" name="process name" time="0.000016"/>
<testcase classname="cmdline" name="arg separated by spaces" time="0.00001"/>
<testcase classname="cmdline" name="arg separated by colon" time="0.00001"/>
<testcase classname="cmdline" name="arg separated by =" time="0.00001"/>
<testcase classname="cmdline" name="long opt" time="0.000009"/>
<testcase classname="cmdline" name="a number" time="0.000012"/>
<testcase classname="cmdline" name="not a number" time="0.000048"/>
<testcase classname="cmdline" name="two parsers" time="0.000056"/>
<testcase classname="cmdline" name="methods/in range" time="0.000013"/>
<testcase classname="cmdline" name="methods/out of range" time="0.000041"/>
<testcase classname="cmdline" name="flags/set" time="0.000007"/>
<testcase classname="cmdline" name="flags/not set" time="0.000007"/>
<testcase classname="cmdline" name="positional" time="0.000036"/>
<testcase classname="section tracking" name="root" time="0.000078"/>
<testcase classname="section tracking" name="test case with no sections" time="0.000009"/>
<testcase classname="section tracking" name="test case with one section" time="0.000029"/>
<testcase classname="section tracking" name="test case with two consecutive sections" time="0.000054"/>
<testcase classname="section tracking" name="test case with one section within another" time="0.000048"/>
<system-out>
Message from section one
Message from section two
Some information
Message from section one
Message from section two
Some information
Message from section one
Message from section two
Some information
hello
hello
</system-out>
<system-err>
An error
An error
An error
</system-err>
</testsuite>
<system-out>
Message from section one
Message from section two
Some information
Message from section one
Message from section two
Some information
Message from section one
Message from section two
Some information
hello
hello
</system-out>
<system-err>
An error
An error
An error
</system-err>
</testsuites>
<Catch name="CatchSelfTest">
<Group name="~dummy">
@ -7950,7 +7978,7 @@ An error
divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 )
</Original>
<Expanded>
3.142857142857143 == Approx( 3.141 )
3.1428571429 == Approx( 3.141 )
</Expanded>
</Expression>
<Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ApproxTests.cpp" >
@ -7958,7 +7986,7 @@ An error
divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 )
</Original>
<Expanded>
3.142857142857143 != Approx( 3.141 )
3.1428571429 != Approx( 3.141 )
</Expanded>
</Expression>
<OverallResult success="true"/>
@ -8393,7 +8421,7 @@ An error
data.float_nine_point_one &lt; 9.2
</Original>
<Expanded>
9.1 &lt; 9.199999999999999
9.1 &lt; 9.2
</Expanded>
</Expression>
<Expression success="true" filename="/Users/philnash/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp" >
@ -8532,7 +8560,7 @@ An error
data.float_nine_point_one > 9.2
</Original>
<Expanded>
9.1 > 9.199999999999999
9.1 > 9.2
</Expanded>
</Expression>
<Expression success="false" filename="/Users/philnash/Dev/OSS/Catch/projects/XCode4/CatchSelfTest/CatchSelfTest/../../../SelfTest/ConditionTests.cpp" >

View File

@ -67,7 +67,6 @@ TEST_CASE( "meta/Misc/Sections", "looped tests" ) {
#include "../../include/internal/catch_test_spec.h"
#include "../../include/reporters/catch_reporter_basic.hpp"
#include "../../include/reporters/catch_reporter_xml.hpp"
#include "../../include/reporters/catch_reporter_junit.hpp"
template<size_t size>
void parseIntoConfig( const char * (&argv)[size], Catch::ConfigData& config ) {