First cut of Timer class.

- started integrating with reporters (now (optionally) supported in console reporter).
- introduced Node<> template to help with cumulative reporting and used it instead of ThreadedSectionInfo.
This commit is contained in:
Phil Nash 2013-08-07 18:56:35 +01:00
parent 649f8c24b1
commit 6339254cb2
16 changed files with 379 additions and 174 deletions

View File

@ -24,15 +24,21 @@ namespace Catch {
inline void addWarning( ConfigData& config, std::string const& _warning ) { inline void addWarning( ConfigData& config, std::string const& _warning ) {
if( _warning == "NoAssertions" ) if( _warning == "NoAssertions" )
config.warnings = (ConfigData::WarnAbout::What)( config.warnings | ConfigData::WarnAbout::NoAssertions ); config.warnings = (WarnAbout::What)( config.warnings | WarnAbout::NoAssertions );
else else
throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" ); throw std::runtime_error( "Unrecognised warning: '" + _warning + "'" );
} }
inline void setVerbosity( ConfigData& config, int level ) { inline void setVerbosity( ConfigData& config, int level ) {
// !TBD: accept strings? // !TBD: accept strings?
config.verbosity = (ConfigData::Verbosity::Level)level; config.verbosity = (Verbosity::Level)level;
} }
inline void setShowDurations( ConfigData& config, bool _showDurations ) {
config.showDurations = _showDurations
? ShowDurations::Always
: ShowDurations::Never;
}
inline Clara::CommandLine<ConfigData> makeCommandLineParser() { inline Clara::CommandLine<ConfigData> makeCommandLineParser() {
@ -121,6 +127,12 @@ namespace Catch {
.describe( "which test or tests to use" ) .describe( "which test or tests to use" )
.argName( "test name, pattern or tags" ); .argName( "test name, pattern or tags" );
cli.bind( &setShowDurations )
.describe( "show test durations" )
.shortOpt( "d")
.longOpt( "durations" )
.argName( "durations" );
return cli; return cli;
} }

View File

@ -26,17 +26,6 @@ namespace Catch {
struct ConfigData { struct ConfigData {
struct Verbosity { enum Level {
NoOutput = 0,
Quiet,
Normal
}; };
struct WarnAbout { enum What {
Nothing = 0x00,
NoAssertions = 0x01
}; };
ConfigData() ConfigData()
: listTests( false ), : listTests( false ),
listTags( false ), listTags( false ),
@ -47,7 +36,8 @@ namespace Catch {
showHelp( false ), showHelp( false ),
abortAfter( -1 ), abortAfter( -1 ),
verbosity( Verbosity::Normal ), verbosity( Verbosity::Normal ),
warnings( WarnAbout::Nothing ) warnings( WarnAbout::Nothing ),
showDurations( ShowDurations::DefaultForReporter )
{} {}
bool listTests; bool listTests;
@ -63,6 +53,7 @@ namespace Catch {
Verbosity::Level verbosity; Verbosity::Level verbosity;
WarnAbout::What warnings; WarnAbout::What warnings;
ShowDurations::OrNot showDurations;
std::string reporterName; std::string reporterName;
std::string outputFilename; std::string outputFilename;
@ -166,7 +157,9 @@ namespace Catch {
virtual std::ostream& stream() const { return m_os; } virtual std::ostream& stream() const { return m_os; }
virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } virtual std::string name() const { return m_data.name.empty() ? m_data.processName : m_data.name; }
virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; } virtual bool includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
virtual bool warnAboutMissingAssertions() const { return m_data.warnings & ConfigData::WarnAbout::NoAssertions; } virtual bool warnAboutMissingAssertions() const { return m_data.warnings & WarnAbout::NoAssertions; }
virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }
private: private:
ConfigData m_data; ConfigData m_data;

View File

@ -30,6 +30,7 @@
#include "catch_text.hpp" #include "catch_text.hpp"
#include "catch_message.hpp" #include "catch_message.hpp"
#include "catch_legacy_reporter_adapter.hpp" #include "catch_legacy_reporter_adapter.hpp"
#include "catch_timer.hpp"
#include "../reporters/catch_reporter_basic.hpp" #include "../reporters/catch_reporter_basic.hpp"
#include "../reporters/catch_reporter_xml.hpp" #include "../reporters/catch_reporter_xml.hpp"
@ -57,7 +58,6 @@ namespace Catch {
TestCaseStats::~TestCaseStats() {} TestCaseStats::~TestCaseStats() {}
TestGroupStats::~TestGroupStats() {} TestGroupStats::~TestGroupStats() {}
TestRunStats::~TestRunStats() {} TestRunStats::~TestRunStats() {}
ThreadedSectionInfo::~ThreadedSectionInfo() {}
TestGroupNode::~TestGroupNode() {} TestGroupNode::~TestGroupNode() {}
TestRunNode::~TestRunNode() {} TestRunNode::~TestRunNode() {}

View File

@ -30,7 +30,7 @@ namespace Catch {
virtual void assertionEnded( AssertionResult const& result ) = 0; virtual void assertionEnded( AssertionResult const& result ) = 0;
virtual bool sectionStarted( SectionInfo const& sectionInfo, virtual bool sectionStarted( SectionInfo const& sectionInfo,
Counts& assertions ) = 0; Counts& assertions ) = 0;
virtual void sectionEnded( SectionInfo const& name, Counts const& assertions ) = 0; virtual void sectionEnded( SectionInfo const& name, Counts const& assertions, double _durationInSeconds ) = 0;
virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void pushScopedMessage( MessageInfo const& message ) = 0;
virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0;

View File

@ -15,6 +15,23 @@
namespace Catch { namespace Catch {
struct Verbosity { enum Level {
NoOutput = 0,
Quiet,
Normal
}; };
struct WarnAbout { enum What {
Nothing = 0x00,
NoAssertions = 0x01
}; };
struct ShowDurations { enum OrNot {
DefaultForReporter,
Always,
Never
}; };
struct IConfig : IShared { struct IConfig : IShared {
virtual ~IConfig(); virtual ~IConfig();
@ -26,6 +43,7 @@ namespace Catch {
virtual bool shouldDebugBreak() const = 0; virtual bool shouldDebugBreak() const = 0;
virtual bool warnAboutMissingAssertions() const = 0; virtual bool warnAboutMissingAssertions() const = 0;
virtual int abortAfter() const = 0; virtual int abortAfter() const = 0;
virtual ShowDurations::OrNot showDurations() const = 0;
}; };
} }

View File

@ -46,6 +46,20 @@ namespace Catch
bool shouldRedirectStdOut; bool shouldRedirectStdOut;
}; };
template<typename 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;
};
struct TestRunInfo { struct TestRunInfo {
TestRunInfo( std::string const& _name ) : name( _name ) {} TestRunInfo( std::string const& _name ) : name( _name ) {}
std::string name; std::string name;
@ -78,17 +92,6 @@ namespace Catch
SourceLineInfo lineInfo; SourceLineInfo lineInfo;
}; };
struct ThreadedSectionInfo : SectionInfo, SharedImpl<> {
ThreadedSectionInfo( SectionInfo const& _sectionInfo, ThreadedSectionInfo* _parent = NULL )
: SectionInfo( _sectionInfo ),
parent( _parent )
{}
virtual ~ThreadedSectionInfo();
std::vector<Ptr<ThreadedSectionInfo> > children;
ThreadedSectionInfo* parent;
};
struct AssertionStats { struct AssertionStats {
AssertionStats( AssertionResult const& _assertionResult, AssertionStats( AssertionResult const& _assertionResult,
std::vector<MessageInfo> const& _infoMessages, std::vector<MessageInfo> const& _infoMessages,
@ -117,15 +120,18 @@ namespace Catch
struct SectionStats { struct SectionStats {
SectionStats( SectionInfo const& _sectionInfo, SectionStats( SectionInfo const& _sectionInfo,
Counts const& _assertions, Counts const& _assertions,
double _durationInSeconds,
bool _missingAssertions ) bool _missingAssertions )
: sectionInfo( _sectionInfo ), : sectionInfo( _sectionInfo ),
assertions( _assertions ), assertions( _assertions ),
durationInSeconds( _durationInSeconds ),
missingAssertions( _missingAssertions ) missingAssertions( _missingAssertions )
{} {}
virtual ~SectionStats(); virtual ~SectionStats();
SectionInfo sectionInfo; SectionInfo sectionInfo;
Counts assertions; Counts assertions;
double durationInSeconds;
bool missingAssertions; bool missingAssertions;
}; };
@ -189,6 +195,7 @@ namespace Catch
bool aborting; bool aborting;
}; };
struct IStreamingReporter : IShared { struct IStreamingReporter : IShared {
virtual ~IStreamingReporter(); virtual ~IStreamingReporter();
@ -236,7 +243,7 @@ namespace Catch
unusedTestCaseInfo = _testInfo; unusedTestCaseInfo = _testInfo;
} }
virtual void sectionStarting( SectionInfo const& _sectionInfo ) { virtual void sectionStarting( SectionInfo const& _sectionInfo ) {
Ptr<ThreadedSectionInfo> sectionInfo = new ThreadedSectionInfo( _sectionInfo ); Ptr<Node<SectionInfo> > sectionInfo = new Node<SectionInfo>( _sectionInfo );
if( !currentSectionInfo ) { if( !currentSectionInfo ) {
currentSectionInfo = sectionInfo; currentSectionInfo = sectionInfo;
m_rootSections.push_back( currentSectionInfo ); m_rootSections.push_back( currentSectionInfo );
@ -268,11 +275,11 @@ namespace Catch
Option<TestRunInfo> testRunInfo; Option<TestRunInfo> testRunInfo;
Option<GroupInfo> unusedGroupInfo; Option<GroupInfo> unusedGroupInfo;
Option<TestCaseInfo> unusedTestCaseInfo; Option<TestCaseInfo> unusedTestCaseInfo;
Ptr<ThreadedSectionInfo> currentSectionInfo; Ptr<Node<SectionInfo> > currentSectionInfo;
std::ostream& stream; std::ostream& stream;
// !TBD: This should really go in the TestCaseStats class // !TBD: This should really go in the TestCaseStats class
std::vector<Ptr<ThreadedSectionInfo> > m_rootSections; std::vector<Ptr<Node<SectionInfo> > > m_rootSections;
}; };
struct TestGroupNode : TestGroupStats { struct TestGroupNode : TestGroupStats {

View File

@ -18,6 +18,7 @@
#include "catch_totals.hpp" #include "catch_totals.hpp"
#include "catch_test_spec.h" #include "catch_test_spec.h"
#include "catch_test_case_tracker.hpp" #include "catch_test_case_tracker.hpp"
#include "catch_timer.h"
#include <set> #include <set>
#include <string> #include <string>
@ -194,9 +195,9 @@ namespace Catch {
return true; return true;
} }
virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions ) { virtual void sectionEnded( SectionInfo const& info, Counts const& prevAssertions, double _durationInSeconds ) {
if( std::uncaught_exception() ) { if( std::uncaught_exception() ) {
m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions ) ); m_unfinishedSections.push_back( UnfinishedSections( info, prevAssertions, _durationInSeconds ) );
return; return;
} }
@ -205,7 +206,7 @@ namespace Catch {
m_testCaseTracker->leaveSection(); m_testCaseTracker->leaveSection();
m_reporter->sectionEnded( SectionStats( info, assertions, missingAssertions ) ); m_reporter->sectionEnded( SectionStats( info, assertions, _durationInSeconds, missingAssertions ) );
m_messages.clear(); m_messages.clear();
} }
@ -260,10 +261,13 @@ namespace Catch {
SectionInfo testCaseSection( testCaseInfo.name, testCaseInfo.description, testCaseInfo.lineInfo ); SectionInfo testCaseSection( testCaseInfo.name, testCaseInfo.description, testCaseInfo.lineInfo );
m_reporter->sectionStarting( testCaseSection ); m_reporter->sectionStarting( testCaseSection );
Counts prevAssertions = m_totals.assertions; Counts prevAssertions = m_totals.assertions;
double duration = 0;
try { try {
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal ); m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
TestCaseTracker::Guard guard( *m_testCaseTracker ); TestCaseTracker::Guard guard( *m_testCaseTracker );
Timer timer;
timer.start();
if( m_reporter->getPreferences().shouldRedirectStdOut ) { if( m_reporter->getPreferences().shouldRedirectStdOut ) {
StreamRedirect coutRedir( std::cout, redirectedCout ); StreamRedirect coutRedir( std::cout, redirectedCout );
StreamRedirect cerrRedir( std::cerr, redirectedCerr ); StreamRedirect cerrRedir( std::cerr, redirectedCerr );
@ -272,6 +276,7 @@ namespace Catch {
else { else {
m_activeTestCase->invoke(); m_activeTestCase->invoke();
} }
duration = timer.getElapsedSeconds();
} }
catch( TestFailureException& ) { catch( TestFailureException& ) {
// This just means the test was aborted due to failure // This just means the test was aborted due to failure
@ -287,25 +292,26 @@ namespace Catch {
itEnd = m_unfinishedSections.end(); itEnd = m_unfinishedSections.end();
it != itEnd; it != itEnd;
++it ) ++it )
sectionEnded( it->info, it->prevAssertions ); sectionEnded( it->info, it->prevAssertions, it->durationInSeconds );
m_unfinishedSections.clear(); m_unfinishedSections.clear();
m_messages.clear(); m_messages.clear();
Counts assertions = m_totals.assertions - prevAssertions; Counts assertions = m_totals.assertions - prevAssertions;
bool missingAssertions = testForMissingAssertions( assertions ); bool missingAssertions = testForMissingAssertions( assertions );
SectionStats testCaseSectionStats( testCaseSection, assertions, missingAssertions ); SectionStats testCaseSectionStats( testCaseSection, assertions, duration, missingAssertions );
m_reporter->sectionEnded( testCaseSectionStats ); m_reporter->sectionEnded( testCaseSectionStats );
} }
private: private:
struct UnfinishedSections { struct UnfinishedSections {
UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions ) UnfinishedSections( SectionInfo const& _info, Counts const& _prevAssertions, double _durationInSeconds )
: info( _info ), prevAssertions( _prevAssertions ) : info( _info ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds )
{} {}
SectionInfo info; SectionInfo info;
Counts prevAssertions; Counts prevAssertions;
double durationInSeconds;
}; };
TestRunInfo m_runInfo; TestRunInfo m_runInfo;

View File

@ -11,6 +11,7 @@
#include "catch_capture.hpp" #include "catch_capture.hpp"
#include "catch_totals.hpp" #include "catch_totals.hpp"
#include "catch_compiler_capabilities.h" #include "catch_compiler_capabilities.h"
#include "catch_timer.h"
#include <string> #include <string>
@ -23,11 +24,13 @@ namespace Catch {
std::string const& description = "" ) std::string const& description = "" )
: m_info( name, description, lineInfo ), : m_info( name, description, lineInfo ),
m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( m_info, m_assertions ) ) m_sectionIncluded( getCurrentContext().getResultCapture().sectionStarted( m_info, m_assertions ) )
{} {
m_timer.start();
}
~Section() { ~Section() {
if( m_sectionIncluded ) if( m_sectionIncluded )
getCurrentContext().getResultCapture().sectionEnded( m_info, m_assertions ); getCurrentContext().getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() );
} }
// This indicates whether the section should be executed or not // This indicates whether the section should be executed or not
@ -41,6 +44,7 @@ namespace Catch {
std::string m_name; std::string m_name;
Counts m_assertions; Counts m_assertions;
bool m_sectionIncluded; bool m_sectionIncluded;
Timer m_timer;
}; };
} // end namespace Catch } // end namespace Catch

View File

@ -0,0 +1,33 @@
/*
* Created by Phil on 05/08/2013.
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef TWOBLUECUBES_CATCH_TIMER_H_INCLUDED
#define TWOBLUECUBES_CATCH_TIMER_H_INCLUDED
#ifdef WIN32
typedef unsigned long long uint64_t;
#else
#include <stdint.h>
#endif
namespace Catch {
class Timer {
public:
Timer() : m_ticks( 0 ) {}
void start();
unsigned int getElapsedNanoseconds() const;
unsigned int getElapsedMilliseconds() const;
double getElapsedSeconds() const;
private:
uint64_t m_ticks;
};
} // namespace Catch
#endif // TWOBLUECUBES_CATCH_TIMER_H_INCLUDED

View File

@ -0,0 +1,62 @@
/*
* Created by Phil on 05/08/2013.
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#include "catch_timer.h"
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wc++11-long-long"
#endif
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
namespace Catch {
namespace {
#ifdef WIN32
uint64_t getCurrentTicks() {
static uint64_t hz=0, hzo=0;
if (!hz) {
QueryPerformanceFrequency((LARGE_INTEGER*)&hz);
QueryPerformanceCounter((LARGE_INTEGER*)&hzo);
}
uint64_t t;
QueryPerformanceCounter((LARGE_INTEGER*)&t);
return ((t-hzo)*1000000)/hz;
}
#else
uint64_t getCurrentTicks() {
timeval t;
gettimeofday(&t,NULL);
return (uint64_t)t.tv_sec * 1000000ull + (uint64_t)t.tv_usec;
}
#endif
}
void Timer::start() {
m_ticks = getCurrentTicks();
}
unsigned int Timer::getElapsedNanoseconds() const {
return (unsigned int)(getCurrentTicks() - m_ticks);
}
unsigned int Timer::getElapsedMilliseconds() const {
return (unsigned int)((getCurrentTicks() - m_ticks)/1000);
}
double Timer::getElapsedSeconds() const {
return (getCurrentTicks() - m_ticks)/1000000.0;
}
} // namespace Catch
#ifdef __clang__
#pragma clang diagnostic pop
#endif

View File

@ -69,6 +69,8 @@ namespace Catch {
stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
} }
m_headerPrinted = false; m_headerPrinted = false;
if( m_config->showDurations() == ShowDurations::Always )
stream << "Completed in " << _sectionStats.durationInSeconds << "s" << std::endl;
StreamingReporterBase::sectionEnded( _sectionStats ); StreamingReporterBase::sectionEnded( _sectionStats );
} }
@ -263,20 +265,20 @@ namespace Catch {
assert( currentSectionInfo ); assert( currentSectionInfo );
if( currentSectionInfo ) { if( currentSectionInfo ) {
Colour colourGuard( Colour::Headers ); Colour colourGuard( Colour::Headers );
std::vector<ThreadedSectionInfo*> sections; std::vector<Node<SectionInfo>*> sections;
for( ThreadedSectionInfo* section = currentSectionInfo.get(); for( Node<SectionInfo>* section = currentSectionInfo.get();
section; section;
section = section->parent ) section = section->parent )
sections.push_back( section ); sections.push_back( section );
// Sections // Sections
std::vector<ThreadedSectionInfo*>::const_reverse_iterator std::vector<Node<SectionInfo>*>::const_reverse_iterator
it = sections.rbegin(), itEnd = sections.rend(); it = sections.rbegin(), itEnd = sections.rend();
for( ++it; it != itEnd; ++it ) // Skip first section (test case) for( ++it; it != itEnd; ++it ) // Skip first section (test case)
printHeaderString( (*it)->name, 2 ); printHeaderString( (*it)->value.name, 2 );
} }
SourceLineInfo lineInfo = currentSectionInfo SourceLineInfo lineInfo = currentSectionInfo
? currentSectionInfo->lineInfo ? currentSectionInfo->value.lineInfo
: unusedTestCaseInfo->lineInfo; : unusedTestCaseInfo->lineInfo;
if( !lineInfo.empty() ){ if( !lineInfo.empty() ){

View File

@ -82,7 +82,7 @@ namespace Catch {
return true; return true;
} }
virtual void StartTesting(){} virtual void StartTesting() {}
virtual void StartGroup( const std::string& groupName ) { virtual void StartGroup( const std::string& groupName ) {
if( groupName.empty() ) if( groupName.empty() )
@ -189,7 +189,10 @@ namespace Catch {
xml.writeAttribute( "failures", it->m_failuresCount ); xml.writeAttribute( "failures", it->m_failuresCount );
xml.writeAttribute( "tests", it->m_testsCount ); xml.writeAttribute( "tests", it->m_testsCount );
xml.writeAttribute( "hostname", "tbd" ); xml.writeAttribute( "hostname", "tbd" );
xml.writeAttribute( "time", "tbd" ); if( m_config.fullConfig()->showDurations() == ShowDurations::Never )
xml.writeAttribute( "time", it->m_timeInSeconds );
else
xml.writeAttribute( "time", "" );
xml.writeAttribute( "timestamp", "tbd" ); xml.writeAttribute( "timestamp", "tbd" );
OutputTestCases( xml, *it ); OutputTestCases( xml, *it );
@ -207,7 +210,10 @@ namespace Catch {
XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); XmlWriter::ScopedElement e = xml.scopedElement( "testcase" );
xml.writeAttribute( "classname", it->m_className ); xml.writeAttribute( "classname", it->m_className );
xml.writeAttribute( "name", it->m_name ); xml.writeAttribute( "name", it->m_name );
xml.writeAttribute( "time", "tbd" ); if( m_config.fullConfig()->showDurations() == ShowDurations::Never )
xml.writeAttribute( "time", "" );
else
xml.writeAttribute( "time", stats.m_timeInSeconds );
OutputTestResult( xml, *it ); OutputTestResult( xml, *it );

View File

@ -670,6 +670,8 @@ MiscTests.cpp: FAILED:
explicitly with message: explicitly with message:
to infinity and beyond to infinity and beyond
starting...
finished in 0.322593
Message from section one Message from section one
Message from section two Message from section two
Some information Some information
@ -708,7 +710,7 @@ with expansion:
"first" == "second" "first" == "second"
=============================================================================== ===============================================================================
121 test cases - 35 failed (737 assertions - 90 failed) 122 test cases - 35 failed (738 assertions - 90 failed)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -4316,6 +4318,19 @@ MiscTests.cpp: FAILED:
explicitly with message: explicitly with message:
to infinity and beyond to infinity and beyond
starting...
finished in 0.323247
-------------------------------------------------------------------------------
Timer
-------------------------------------------------------------------------------
MiscTests.cpp
...............................................................................
MiscTests.cpp:
PASSED:
with message:
yay
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
selftest/main selftest/main
selftest/expected result selftest/expected result
@ -7169,34 +7184,34 @@ with expansion:
true true
=============================================================================== ===============================================================================
121 test cases - 50 failed (756 assertions - 109 failed) 122 test cases - 50 failed (757 assertions - 109 failed)
No test cases matched '~dummy 4' No test cases matched '~dummy 4'
No tests ran No tests ran
<testsuites> <testsuites>
<testsuite name="~dummy" errors="10" failures="81" tests="756" hostname="tbd" time="tbd" timestamp="tbd"> <testsuite name="~dummy" errors="10" failures="81" tests="757" hostname="tbd" time="" timestamp="tbd">
<testcase classname="global" name="./succeeding/Approx/simple" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/simple" time="0"/>
<testcase classname="global" name="./succeeding/Approx/epsilon" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/epsilon" time="0"/>
<testcase classname="global" name="./succeeding/Approx/float" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/float" time="0"/>
<testcase classname="global" name="./succeeding/Approx/int" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/int" time="0"/>
<testcase classname="global" name="./succeeding/Approx/mixed" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/mixed" time="0"/>
<testcase classname="global" name="./succeeding/Approx/custom" time="tbd"/> <testcase classname="global" name="./succeeding/Approx/custom" time="0"/>
<testcase classname="global" name="Approximate PI" time="tbd"/> <testcase classname="global" name="Approximate PI" time="0"/>
<testcase classname="TestClass" name="./succeeding/TestClass/succeedingCase" time="tbd"/> <testcase classname="TestClass" name="./succeeding/TestClass/succeedingCase" time="0"/>
<testcase classname="TestClass" name="./failing/TestClass/failingCase" time="tbd"> <testcase classname="TestClass" name="./failing/TestClass/failingCase" time="0">
<failure message="&quot;hello&quot; == &quot;world&quot;" type="REQUIRE"> <failure message="&quot;hello&quot; == &quot;world&quot;" type="REQUIRE">
ClassTests.cpp ClassTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="Fixture" name="./succeeding/Fixture/succeedingCase" time="tbd"/> <testcase classname="Fixture" name="./succeeding/Fixture/succeedingCase" time="0"/>
<testcase classname="Fixture" name="./failing/Fixture/failingCase" time="tbd"> <testcase classname="Fixture" name="./failing/Fixture/failingCase" time="0">
<failure message="1 == 2" type="REQUIRE"> <failure message="1 == 2" type="REQUIRE">
ClassTests.cpp ClassTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/conditions/equality" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/equality" time="0"/>
<testcase classname="global" name="./failing/conditions/equality" time="tbd"> <testcase classname="global" name="./failing/conditions/equality" time="0">
<failure message="7 == 6" type="CHECK"> <failure message="7 == 6" type="CHECK">
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
@ -7237,8 +7252,8 @@ ConditionTests.cpp
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/conditions/inequality" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/inequality" time="0"/>
<testcase classname="global" name="./failing/conditions/inequality" time="tbd"> <testcase classname="global" name="./failing/conditions/inequality" time="0">
<failure message="7 != 7" type="CHECK"> <failure message="7 != 7" type="CHECK">
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
@ -7255,8 +7270,8 @@ ConditionTests.cpp
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/conditions/ordered" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/ordered" time="0"/>
<testcase classname="global" name="./failing/conditions/ordered" time="tbd"> <testcase classname="global" name="./failing/conditions/ordered" time="0">
<failure message="7 > 7" type="CHECK"> <failure message="7 > 7" type="CHECK">
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
@ -7315,14 +7330,14 @@ ConditionTests.cpp
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/conditions/int literals" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/int literals" time="0"/>
<testcase classname="global" name="./succeeding/conditions//long_to_unsigned_x" time="tbd"/> <testcase classname="global" name="./succeeding/conditions//long_to_unsigned_x" time="0"/>
<testcase classname="global" name="./succeeding/conditions/const ints to int literal" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/const ints to int literal" time="0"/>
<testcase classname="global" name="./succeeding/conditions/negative ints" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/negative ints" time="0"/>
<testcase classname="global" name="./succeeding/conditions/computed ints" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/computed ints" time="0"/>
<testcase classname="global" name="./succeeding/conditions/ptr" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/ptr" time="0"/>
<testcase classname="global" name="./succeeding/conditions/not" time="tbd"/> <testcase classname="global" name="./succeeding/conditions/not" time="0"/>
<testcase classname="global" name="./failing/conditions/not" time="tbd"> <testcase classname="global" name="./failing/conditions/not" time="0">
<failure message="false != false" type="CHECK"> <failure message="false != false" type="CHECK">
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
@ -7348,8 +7363,8 @@ ConditionTests.cpp
ConditionTests.cpp ConditionTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/exceptions/explicit" time="tbd"/> <testcase classname="global" name="./succeeding/exceptions/explicit" time="0"/>
<testcase classname="global" name="./failing/exceptions/explicit" time="tbd"> <testcase classname="global" name="./failing/exceptions/explicit" time="0">
<error message="thisThrows()" type="CHECK_THROWS_AS"> <error message="thisThrows()" type="CHECK_THROWS_AS">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
@ -7360,51 +7375,51 @@ ExceptionTests.cpp
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/implicit" time="tbd"> <testcase classname="global" name="./failing/exceptions/implicit" time="0">
<error type="TEST_CASE"> <error type="TEST_CASE">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/implicit/2" time="tbd"> <testcase classname="global" name="./failing/exceptions/implicit/2" time="0">
<error message="{Unknown expression after the reported line}"> <error message="{Unknown expression after the reported line}">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/implicit/3" time="tbd"> <testcase classname="global" name="./failing/exceptions/implicit/3" time="0">
<error type="TEST_CASE"> <error type="TEST_CASE">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/implicit/4" time="tbd"> <testcase classname="global" name="./failing/exceptions/implicit/4" time="0">
<error message="thisThrows() == 0" type="CHECK"> <error message="thisThrows() == 0" type="CHECK">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/exceptions/implicit" time="tbd"/> <testcase classname="global" name="./succeeding/exceptions/implicit" time="0"/>
<testcase classname="global" name="./failing/exceptions/custom" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom" time="0">
<error type="TEST_CASE"> <error type="TEST_CASE">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/custom/nothrow" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom/nothrow" time="0">
<error message="throwCustom()" type="REQUIRE_NOTHROW"> <error message="throwCustom()" type="REQUIRE_NOTHROW">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/custom/throw" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom/throw" time="0">
<error message="throwCustom()" type="REQUIRE_THROWS_AS"> <error message="throwCustom()" type="REQUIRE_THROWS_AS">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./failing/exceptions/custom/double" time="tbd"> <testcase classname="global" name="./failing/exceptions/custom/double" time="0">
<error type="TEST_CASE"> <error type="TEST_CASE">
ExceptionTests.cpp ExceptionTests.cpp
</error> </error>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/exceptions/notimplemented" time="tbd"/> <testcase classname="global" name="./succeeding/exceptions/notimplemented" time="0"/>
<testcase classname="global" name="./succeeding/generators/1" time="tbd"/> <testcase classname="global" name="./succeeding/generators/1" time="0"/>
<testcase classname="global" name="./succeeding/generators/2" time="tbd"/> <testcase classname="global" name="./succeeding/generators/2" time="0"/>
<testcase classname="global" name="./succeeding/message" time="tbd"> <testcase classname="global" name="./succeeding/message" time="0">
<info type="INFO"> <info type="INFO">
MessageTests.cpp MessageTests.cpp
</info> </info>
@ -7412,8 +7427,8 @@ MessageTests.cpp
MessageTests.cpp MessageTests.cpp
</warning> </warning>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/succeed" time="tbd"/> <testcase classname="global" name="./succeeding/succeed" time="0"/>
<testcase classname="global" name="./failing/message/info/1" time="tbd"> <testcase classname="global" name="./failing/message/info/1" time="0">
<info type="INFO"> <info type="INFO">
MessageTests.cpp MessageTests.cpp
</info> </info>
@ -7424,7 +7439,7 @@ MessageTests.cpp
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./mixed/message/info/2" time="tbd"> <testcase classname="global" name="./mixed/message/info/2" time="0">
<info type="INFO"> <info type="INFO">
MessageTests.cpp MessageTests.cpp
</info> </info>
@ -7438,12 +7453,12 @@ MessageTests.cpp
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./failing/message/fail" time="tbd"> <testcase classname="global" name="./failing/message/fail" time="0">
<failure type="FAIL"> <failure type="FAIL">
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./failing/message/sections" time="tbd"> <testcase classname="global" name="./failing/message/sections" time="0">
<failure type="FAIL"> <failure type="FAIL">
MessageTests.cpp MessageTests.cpp
</failure> </failure>
@ -7451,13 +7466,13 @@ MessageTests.cpp
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/message/sections/stdout" time="tbd"> <testcase classname="global" name="./succeeding/message/sections/stdout" time="0">
<system-out> <system-out>
Message from section one Message from section one
Message from section two Message from section two
</system-out> </system-out>
</testcase> </testcase>
<testcase classname="global" name="./mixed/message/scoped" time="tbd"> <testcase classname="global" name="./mixed/message/scoped" time="0">
<info type="INFO"> <info type="INFO">
MessageTests.cpp MessageTests.cpp
</info> </info>
@ -7468,31 +7483,31 @@ MessageTests.cpp
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/nofail" time="tbd"> <testcase classname="global" name="./succeeding/nofail" time="0">
<failure message="1 == 2" type="CHECK_NOFAIL"> <failure message="1 == 2" type="CHECK_NOFAIL">
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="just info" time="tbd"/> <testcase classname="global" name="just info" time="0"/>
<testcase classname="global" name="just failure" time="tbd"> <testcase classname="global" name="just failure" time="0">
<failure type="FAIL"> <failure type="FAIL">
MessageTests.cpp MessageTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/Misc/Sections" time="tbd"/> <testcase classname="global" name="./succeeding/Misc/Sections" time="0"/>
<testcase classname="global" name="./succeeding/Misc/Sections/nested" time="tbd"/> <testcase classname="global" name="./succeeding/Misc/Sections/nested" time="0"/>
<testcase classname="global" name="./mixed/Misc/Sections/nested2" time="tbd"> <testcase classname="global" name="./mixed/Misc/Sections/nested2" time="0">
<failure message="1 == 2" type="REQUIRE"> <failure message="1 == 2" type="REQUIRE">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./Sections/nested/a/b" time="tbd"/> <testcase classname="global" name="./Sections/nested/a/b" time="0"/>
<testcase classname="global" name="./mixed/Misc/Sections/loops" time="tbd"> <testcase classname="global" name="./mixed/Misc/Sections/loops" time="0">
<failure message="0 > 1" type="CHECK"> <failure message="0 > 1" type="CHECK">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./mixed/Misc/loops" time="tbd"> <testcase classname="global" name="./mixed/Misc/loops" time="0">
<info type="INFO"> <info type="INFO">
MiscTests.cpp MiscTests.cpp
</info> </info>
@ -7530,7 +7545,7 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/Misc/stdout,stderr" time="tbd"> <testcase classname="global" name="./succeeding/Misc/stdout,stderr" time="0">
<system-out> <system-out>
Some information Some information
</system-out> </system-out>
@ -7538,8 +7553,8 @@ Some information
An error An error
</system-err> </system-err>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/Misc/null strings" time="tbd"/> <testcase classname="global" name="./succeeding/Misc/null strings" time="0"/>
<testcase classname="global" name="./failing/info" time="tbd"> <testcase classname="global" name="./failing/info" time="0">
<info type="INFO"> <info type="INFO">
MiscTests.cpp MiscTests.cpp
</info> </info>
@ -7550,8 +7565,8 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/checkedif" time="tbd"/> <testcase classname="global" name="./succeeding/checkedif" time="0"/>
<testcase classname="global" name="./failing/checkedif" time="tbd"> <testcase classname="global" name="./failing/checkedif" time="0">
<failure message="false" type="CHECKED_IF"> <failure message="false" type="CHECKED_IF">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
@ -7559,8 +7574,8 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/checkedelse" time="tbd"/> <testcase classname="global" name="./succeeding/checkedelse" time="0"/>
<testcase classname="global" name="./failing/checkedelse" time="tbd"> <testcase classname="global" name="./failing/checkedelse" time="0">
<failure message="false" type="CHECKED_ELSE"> <failure message="false" type="CHECKED_ELSE">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
@ -7568,8 +7583,8 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./misc/xmlentitycheck" time="tbd"/> <testcase classname="global" name="./misc/xmlentitycheck" time="0"/>
<testcase classname="global" name="./manual/onechar" time="tbd"> <testcase classname="global" name="./manual/onechar" time="0">
<info type="INFO"> <info type="INFO">
MiscTests.cpp MiscTests.cpp
</info> </info>
@ -7577,43 +7592,43 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/atomic if" time="tbd"/> <testcase classname="global" name="./succeeding/atomic if" time="0"/>
<testcase classname="global" name="./succeeding/matchers" time="tbd"/> <testcase classname="global" name="./succeeding/matchers" time="0"/>
<testcase classname="global" name="./failing/matchers/Contains" time="tbd"> <testcase classname="global" name="./failing/matchers/Contains" time="0">
<failure message="&quot;this string contains 'abc' as a substring&quot; contains: &quot;not there&quot;" type="CHECK_THAT"> <failure message="&quot;this string contains 'abc' as a substring&quot; contains: &quot;not there&quot;" type="CHECK_THAT">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./failing/matchers/StartsWith" time="tbd"> <testcase classname="global" name="./failing/matchers/StartsWith" time="0">
<failure message="&quot;this string contains 'abc' as a substring&quot; starts with: &quot;string&quot;" type="CHECK_THAT"> <failure message="&quot;this string contains 'abc' as a substring&quot; starts with: &quot;string&quot;" type="CHECK_THAT">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./failing/matchers/EndsWith" time="tbd"> <testcase classname="global" name="./failing/matchers/EndsWith" time="0">
<failure message="&quot;this string contains 'abc' as a substring&quot; ends with: &quot;this&quot;" type="CHECK_THAT"> <failure message="&quot;this string contains 'abc' as a substring&quot; ends with: &quot;this&quot;" type="CHECK_THAT">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./failing/matchers/Equals" time="tbd"> <testcase classname="global" name="./failing/matchers/Equals" time="0">
<failure message="&quot;this string contains 'abc' as a substring&quot; equals: &quot;something else&quot;" type="CHECK_THAT"> <failure message="&quot;this string contains 'abc' as a substring&quot; equals: &quot;something else&quot;" type="CHECK_THAT">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="string" time="tbd"/> <testcase classname="global" name="string" time="0"/>
<testcase classname="global" name="./succeeding/matchers/AllOf" time="tbd"/> <testcase classname="global" name="./succeeding/matchers/AllOf" time="0"/>
<testcase classname="global" name="./succeeding/matchers/AnyOf" time="tbd"/> <testcase classname="global" name="./succeeding/matchers/AnyOf" time="0"/>
<testcase classname="global" name="./succeeding/matchers/Equals" time="tbd"/> <testcase classname="global" name="./succeeding/matchers/Equals" time="0"/>
<testcase classname="global" name="Factorials are computed" time="tbd"/> <testcase classname="global" name="Factorials are computed" time="0"/>
<testcase classname="global" name="empty" time="tbd"/> <testcase classname="global" name="empty" time="0"/>
<testcase classname="global" name="Nice descriptive name" time="tbd"> <testcase classname="global" name="Nice descriptive name" time="0">
<warning type="WARN"> <warning type="WARN">
MiscTests.cpp MiscTests.cpp
</warning> </warning>
</testcase> </testcase>
<testcase classname="global" name="first tag" time="tbd"/> <testcase classname="global" name="first tag" time="0"/>
<testcase classname="global" name="second tag" time="tbd"/> <testcase classname="global" name="second tag" time="0"/>
<testcase classname="global" name="vectors can be sized and resized" time="tbd"/> <testcase classname="global" name="vectors can be sized and resized" time="0"/>
<testcase classname="global" name="./failing/CatchSectionInfiniteLoop" time="tbd"> <testcase classname="global" name="./failing/CatchSectionInfiniteLoop" time="0">
<failure type="FAIL"> <failure type="FAIL">
MiscTests.cpp MiscTests.cpp
</failure> </failure>
@ -7624,7 +7639,13 @@ MiscTests.cpp
MiscTests.cpp MiscTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="selftest/main" time="tbd"> <testcase classname="global" name="Timer" time="0">
<system-out>
starting...
finished in 0.322247
</system-out>
</testcase>
<testcase classname="global" name="selftest/main" time="0">
<system-out> <system-out>
Message from section one Message from section one
Message from section two Message from section two
@ -7638,33 +7659,33 @@ An error
An error An error
</system-err> </system-err>
</testcase> </testcase>
<testcase classname="global" name="meta/Misc/Sections" time="tbd"/> <testcase classname="global" name="meta/Misc/Sections" time="0"/>
<testcase classname="global" name="Process can be configured on command line" time="tbd"/> <testcase classname="global" name="Process can be configured on command line" time="0"/>
<testcase classname="global" name="selftest/test filter" time="tbd"/> <testcase classname="global" name="selftest/test filter" time="0"/>
<testcase classname="global" name="selftest/test filters" time="tbd"/> <testcase classname="global" name="selftest/test filters" time="0"/>
<testcase classname="global" name="selftest/filter/prefix wildcard" time="tbd"/> <testcase classname="global" name="selftest/filter/prefix wildcard" time="0"/>
<testcase classname="global" name="selftest/filter/wildcard at both ends" time="tbd"/> <testcase classname="global" name="selftest/filter/wildcard at both ends" time="0"/>
<testcase classname="global" name="selftest/tags" time="tbd"/> <testcase classname="global" name="selftest/tags" time="0"/>
<testcase classname="global" name="Long strings can be wrapped" time="tbd"/> <testcase classname="global" name="Long strings can be wrapped" time="0"/>
<testcase classname="global" name="Strings can be rendered with colour" time="tbd"> <testcase classname="global" name="Strings can be rendered with colour" time="0">
<system-out> <system-out>
hello hello
hello hello
</system-out> </system-out>
</testcase> </testcase>
<testcase classname="global" name="Text can be formatted using the Text class" time="tbd"/> <testcase classname="global" name="Text can be formatted using the Text class" time="0"/>
<testcase classname="global" name="./succeeding/Tricky/std::pair" time="tbd"/> <testcase classname="global" name="./succeeding/Tricky/std::pair" time="0"/>
<testcase classname="global" name="./inprogress/failing/Tricky/trailing expression" time="tbd"> <testcase classname="global" name="./inprogress/failing/Tricky/trailing expression" time="0">
<warning type="WARN"> <warning type="WARN">
TrickyTests.cpp TrickyTests.cpp
</warning> </warning>
</testcase> </testcase>
<testcase classname="global" name="./inprogress/failing/Tricky/compound lhs" time="tbd"> <testcase classname="global" name="./inprogress/failing/Tricky/compound lhs" time="0">
<warning type="WARN"> <warning type="WARN">
TrickyTests.cpp TrickyTests.cpp
</warning> </warning>
</testcase> </testcase>
<testcase classname="global" name="./failing/Tricky/non streamable type" time="tbd"> <testcase classname="global" name="./failing/Tricky/non streamable type" time="0">
<failure message="0x<hex digits> == 0x<hex digits>" type="CHECK"> <failure message="0x<hex digits> == 0x<hex digits>" type="CHECK">
TrickyTests.cpp TrickyTests.cpp
</failure> </failure>
@ -7672,34 +7693,34 @@ TrickyTests.cpp
TrickyTests.cpp TrickyTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./failing/string literals" time="tbd"> <testcase classname="global" name="./failing/string literals" time="0">
<failure message="&quot;first&quot; == &quot;second&quot;" type="REQUIRE"> <failure message="&quot;first&quot; == &quot;second&quot;" type="REQUIRE">
TrickyTests.cpp TrickyTests.cpp
</failure> </failure>
</testcase> </testcase>
<testcase classname="global" name="./succeeding/side-effects" time="tbd"/> <testcase classname="global" name="./succeeding/side-effects" time="0"/>
<testcase classname="global" name="./succeeding/koenig" time="tbd"/> <testcase classname="global" name="./succeeding/koenig" time="0"/>
<testcase classname="global" name="./succeeding/non-const==" time="tbd"/> <testcase classname="global" name="./succeeding/non-const==" time="0"/>
<testcase classname="global" name="./succeeding/enum/bits" time="tbd"/> <testcase classname="global" name="./succeeding/enum/bits" time="0"/>
<testcase classname="global" name="./succeeding/boolean member" time="tbd"/> <testcase classname="global" name="./succeeding/boolean member" time="0"/>
<testcase classname="global" name="./succeeding/unimplemented static bool" time="tbd"/> <testcase classname="global" name="./succeeding/unimplemented static bool" time="0"/>
<testcase classname="global" name="./succeeding/SafeBool" time="tbd"/> <testcase classname="global" name="./succeeding/SafeBool" time="0"/>
<testcase classname="global" name="Assertions then sections" time="tbd"/> <testcase classname="global" name="Assertions then sections" time="0"/>
<testcase classname="global" name="non streamable - with conv. op" time="tbd"/> <testcase classname="global" name="non streamable - with conv. op" time="0"/>
<testcase classname="global" name="Comparing function pointers" time="tbd"/> <testcase classname="global" name="Comparing function pointers" time="0"/>
<testcase classname="global" name="pointer to class" time="tbd"/> <testcase classname="global" name="pointer to class" time="0"/>
<testcase classname="global" name="X/level/0/a" time="tbd"/> <testcase classname="global" name="X/level/0/a" time="0"/>
<testcase classname="global" name="X/level/0/b" time="tbd"/> <testcase classname="global" name="X/level/0/b" time="0"/>
<testcase classname="global" name="X/level/1/a" time="tbd"/> <testcase classname="global" name="X/level/1/a" time="0"/>
<testcase classname="global" name="X/level/1/b" time="tbd"/> <testcase classname="global" name="X/level/1/b" time="0"/>
<testcase classname="global" name="Anonymous test case 1" time="tbd"/> <testcase classname="global" name="Anonymous test case 1" time="0"/>
<testcase classname="global" name="Test case with one argument" time="tbd"/> <testcase classname="global" name="Test case with one argument" time="0"/>
<testcase classname="global" name="Variadic macros" time="tbd"/> <testcase classname="global" name="Variadic macros" time="0"/>
<testcase classname="global" name="Scenario: Do that thing with the thing" time="tbd"/> <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="tbd"/> <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="tbd"/> <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="tbd"/> <testcase classname="global" name="cmdline" time="0"/>
<testcase classname="global" name="section tracking" time="tbd"/> <testcase classname="global" name="section tracking" time="0"/>
</testsuite> </testsuite>
<system-out> <system-out>
Message from section one Message from section one
@ -7707,6 +7728,9 @@ Message from section two
Some information Some information
starting...
finished in 0.322247
Message from section one Message from section one
Message from section two Message from section two
Some information Some information
@ -11414,6 +11438,9 @@ An error
</Failure> </Failure>
<OverallResult success="false"/> <OverallResult success="false"/>
</TestCase> </TestCase>
<TestCase name="Timer">
<OverallResult success="true"/>
</TestCase>
<TestCase name="selftest/main"> <TestCase name="selftest/main">
<Section name="selftest/expected result" description="Tests do what they claim"> <Section name="selftest/expected result" description="Tests do what they claim">
<OverallResults successes="0" failures="0"/> <OverallResults successes="0" failures="0"/>
@ -14069,7 +14096,7 @@ there&quot;
</Section> </Section>
<OverallResult success="true"/> <OverallResult success="true"/>
</TestCase> </TestCase>
<OverallResults successes="647" failures="109"/> <OverallResults successes="648" failures="109"/>
</Group> </Group>
<OverallResults successes="647" failures="109"/> <OverallResults successes="648" failures="109"/>
</Catch> </Catch>

View File

@ -341,3 +341,26 @@ TEST_CASE("./failing/CatchSectionInfiniteLoop", "")
FAIL("to infinity and beyond"); FAIL("to infinity and beyond");
} }
#include "internal/catch_timer.h"
TEST_CASE( "Timer", "[work-in-progress]" )
{
Catch::Timer t;
t.start();
std::cout << "starting..." << std::endl;
double d = 0;
for( int i = 0; i < 100000; ++i )
for( int j = 0; j < 1000; ++j )
d += (double)i*(double)j;
double duration = t.getElapsedSeconds();
std::cout << "finished in " << duration << std::endl;
SUCCEED("yay");
}

View File

@ -359,6 +359,10 @@
RelativePath="..\..\..\SelfTest\ClassTests.cpp" RelativePath="..\..\..\SelfTest\ClassTests.cpp"
> >
</File> </File>
<File
RelativePath="..\..\..\SelfTest\CmdLineTests.cpp"
>
</File>
<File <File
RelativePath="..\..\..\SelfTest\ConditionTests.cpp" RelativePath="..\..\..\SelfTest\ConditionTests.cpp"
> >
@ -379,6 +383,10 @@
RelativePath="..\..\..\SelfTest\MiscTests.cpp" RelativePath="..\..\..\SelfTest\MiscTests.cpp"
> >
</File> </File>
<File
RelativePath="..\..\..\SelfTest\SectionTrackerTests.cpp"
>
</File>
<File <File
RelativePath="..\..\..\SelfTest\TrickyTests.cpp" RelativePath="..\..\..\SelfTest\TrickyTests.cpp"
> >

View File

@ -57,6 +57,8 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
263FD06017AF8DF200988A20 /* catch_timer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_timer.hpp; sourceTree = "<group>"; };
263FD06117AF8DF200988A20 /* catch_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_timer.h; sourceTree = "<group>"; };
266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VariadicMacrosTests.cpp; path = ../../../SelfTest/VariadicMacrosTests.cpp; sourceTree = "<group>"; }; 266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VariadicMacrosTests.cpp; path = ../../../SelfTest/VariadicMacrosTests.cpp; sourceTree = "<group>"; };
266E9AD117230ACF0061DAB2 /* catch_text.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_text.hpp; sourceTree = "<group>"; }; 266E9AD117230ACF0061DAB2 /* catch_text.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = catch_text.hpp; sourceTree = "<group>"; };
266E9AD417290E8E0061DAB2 /* CmdLineTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CmdLineTests.cpp; path = ../../../SelfTest/CmdLineTests.cpp; sourceTree = "<group>"; }; 266E9AD417290E8E0061DAB2 /* CmdLineTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CmdLineTests.cpp; path = ../../../SelfTest/CmdLineTests.cpp; sourceTree = "<group>"; };
@ -318,6 +320,7 @@
4AC91CB4155B9EBF00DC5117 /* impl */ = { 4AC91CB4155B9EBF00DC5117 /* impl */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
263FD06017AF8DF200988A20 /* catch_timer.hpp */,
266E9AD117230ACF0061DAB2 /* catch_text.hpp */, 266E9AD117230ACF0061DAB2 /* catch_text.hpp */,
4A4B0F9C15CEFA8300AE2392 /* catch_impl.hpp */, 4A4B0F9C15CEFA8300AE2392 /* catch_impl.hpp */,
4A4B0F9715CE6CFB00AE2392 /* catch_registry_hub.hpp */, 4A4B0F9715CE6CFB00AE2392 /* catch_registry_hub.hpp */,
@ -423,6 +426,7 @@
26759472171C72A400A84BD1 /* catch_sfinae.hpp */, 26759472171C72A400A84BD1 /* catch_sfinae.hpp */,
26759473171C74C200A84BD1 /* catch_compiler_capabilities.h */, 26759473171C74C200A84BD1 /* catch_compiler_capabilities.h */,
26DACF2F17206D3400A21326 /* catch_text.h */, 26DACF2F17206D3400A21326 /* catch_text.h */,
263FD06117AF8DF200988A20 /* catch_timer.h */,
); );
name = Infrastructure; name = Infrastructure;
sourceTree = "<group>"; sourceTree = "<group>";