|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
* Catch v2.2.3 |
|
|
|
|
|
* Generated: 2018-06-06 23:11:57.601416 |
|
|
|
|
|
|
|
|
* Catch v2.3.0 |
|
|
|
|
|
* Generated: 2018-07-23 10:09:14.936841 |
|
|
* ---------------------------------------------------------- |
|
|
* ---------------------------------------------------------- |
|
|
* This file has been merged from multiple headers. Please don't edit it directly |
|
|
* This file has been merged from multiple headers. Please don't edit it directly |
|
|
* Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved. |
|
|
* Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CATCH_VERSION_MAJOR 2 |
|
|
#define CATCH_VERSION_MAJOR 2 |
|
|
#define CATCH_VERSION_MINOR 2 |
|
|
|
|
|
#define CATCH_VERSION_PATCH 3 |
|
|
|
|
|
|
|
|
#define CATCH_VERSION_MINOR 3 |
|
|
|
|
|
#define CATCH_VERSION_PATCH 0 |
|
|
|
|
|
|
|
|
#ifdef __clang__ |
|
|
#ifdef __clang__ |
|
|
# pragma clang system_header |
|
|
# pragma clang system_header |
|
|
|
|
|
|
|
|
# pragma warning(push) |
|
|
# pragma warning(push) |
|
|
# pragma warning(disable: 161 1682) |
|
|
# pragma warning(disable: 161 1682) |
|
|
# else // __ICC |
|
|
# else // __ICC |
|
|
# pragma clang diagnostic ignored "-Wunused-variable" |
|
|
|
|
|
# pragma clang diagnostic push |
|
|
# pragma clang diagnostic push |
|
|
# pragma clang diagnostic ignored "-Wpadded" |
|
|
# pragma clang diagnostic ignored "-Wpadded" |
|
|
# pragma clang diagnostic ignored "-Wswitch-enum" |
|
|
# pragma clang diagnostic ignored "-Wswitch-enum" |
|
|
# pragma clang diagnostic ignored "-Wcovered-switch-default" |
|
|
# pragma clang diagnostic ignored "-Wcovered-switch-default" |
|
|
# endif |
|
|
# endif |
|
|
#elif defined __GNUC__ |
|
|
#elif defined __GNUC__ |
|
|
|
|
|
// GCC likes to warn on REQUIREs, and we cannot suppress them |
|
|
|
|
|
// locally because g++'s support for _Pragma is lacking in older, |
|
|
|
|
|
// still supported, versions |
|
|
# pragma GCC diagnostic ignored "-Wparentheses" |
|
|
# pragma GCC diagnostic ignored "-Wparentheses" |
|
|
# pragma GCC diagnostic push |
|
|
# pragma GCC diagnostic push |
|
|
# pragma GCC diagnostic ignored "-Wunused-variable" |
|
|
# pragma GCC diagnostic ignored "-Wunused-variable" |
|
|
|
|
|
|
|
|
# if defined(CATCH_CONFIG_DISABLE_MATCHERS) |
|
|
# if defined(CATCH_CONFIG_DISABLE_MATCHERS) |
|
|
# undef CATCH_CONFIG_DISABLE_MATCHERS |
|
|
# undef CATCH_CONFIG_DISABLE_MATCHERS |
|
|
# endif |
|
|
# endif |
|
|
# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER |
|
|
|
|
|
|
|
|
# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) |
|
|
|
|
|
# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER |
|
|
|
|
|
# endif |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#if !defined(CATCH_CONFIG_IMPL_ONLY) |
|
|
#if !defined(CATCH_CONFIG_IMPL_ONLY) |
|
|
|
|
|
|
|
|
# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ |
|
|
# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ |
|
|
_Pragma( "clang diagnostic pop" ) |
|
|
_Pragma( "clang diagnostic pop" ) |
|
|
|
|
|
|
|
|
|
|
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ |
|
|
|
|
|
_Pragma( "clang diagnostic push" ) \ |
|
|
|
|
|
_Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) |
|
|
|
|
|
# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ |
|
|
|
|
|
_Pragma( "clang diagnostic pop" ) |
|
|
|
|
|
|
|
|
#endif // __clang__ |
|
|
#endif // __clang__ |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
|
# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH |
|
|
# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
// PS4 |
|
|
|
|
|
#if defined(__ORBIS__) |
|
|
|
|
|
# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
//////////////////////////////////////////////////////////////////////////////// |
|
|
// Cygwin |
|
|
// Cygwin |
|
|
#ifdef __CYGWIN__ |
|
|
#ifdef __CYGWIN__ |
|
|
|
|
|
|
|
|
# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS |
|
|
# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) |
|
|
|
|
|
# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) |
|
|
|
|
|
# define CATCH_CONFIG_NEW_CAPTURE |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) |
|
|
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) |
|
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS |
|
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS |
|
|
# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS |
|
|
# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS |
|
|
|
|
|
|
|
|
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS |
|
|
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS |
|
|
# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS |
|
|
# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) |
|
|
|
|
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS |
|
|
|
|
|
# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
// end catch_compiler_capabilities.h |
|
|
// end catch_compiler_capabilities.h |
|
|
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line |
|
|
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line |
|
|
|
|
|
|
|
|
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ |
|
|
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ |
|
|
static void TestName(); \ |
|
|
static void TestName(); \ |
|
|
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ |
|
|
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ |
|
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, "", Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ |
|
|
|
|
|
|
|
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ |
|
|
CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ |
|
|
CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ |
|
|
static void TestName() |
|
|
static void TestName() |
|
|
#define INTERNAL_CATCH_TESTCASE( ... ) \ |
|
|
#define INTERNAL_CATCH_TESTCASE( ... ) \ |
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ |
|
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ |
|
|
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ |
|
|
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ |
|
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, "", Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ |
|
|
|
|
|
|
|
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ |
|
|
CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS |
|
|
CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS |
|
|
|
|
|
|
|
|
// end catch_test_registry.h |
|
|
// end catch_test_registry.h |
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ |
|
|
#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ |
|
|
do { \ |
|
|
do { \ |
|
|
Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, "", resultDisposition ); \ |
|
|
|
|
|
|
|
|
Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \ |
|
|
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \ |
|
|
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \ |
|
|
INTERNAL_CATCH_REACT( catchAssertionHandler ) \ |
|
|
INTERNAL_CATCH_REACT( catchAssertionHandler ) \ |
|
|
} while( false ) |
|
|
} while( false ) |
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
struct SectionInfo { |
|
|
struct SectionInfo { |
|
|
|
|
|
SectionInfo |
|
|
|
|
|
( SourceLineInfo const& _lineInfo, |
|
|
|
|
|
std::string const& _name ); |
|
|
|
|
|
|
|
|
|
|
|
// Deprecated |
|
|
SectionInfo |
|
|
SectionInfo |
|
|
( SourceLineInfo const& _lineInfo, |
|
|
( SourceLineInfo const& _lineInfo, |
|
|
std::string const& _name, |
|
|
std::string const& _name, |
|
|
std::string const& _description = std::string() ); |
|
|
|
|
|
|
|
|
std::string const& ) : SectionInfo( _lineInfo, _name ) {} |
|
|
|
|
|
|
|
|
std::string name; |
|
|
std::string name; |
|
|
std::string description; |
|
|
|
|
|
|
|
|
std::string description; // !Deprecated: this will always be empty |
|
|
SourceLineInfo lineInfo; |
|
|
SourceLineInfo lineInfo; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
struct SectionEndInfo { |
|
|
struct SectionEndInfo { |
|
|
SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ); |
|
|
|
|
|
|
|
|
|
|
|
SectionInfo sectionInfo; |
|
|
SectionInfo sectionInfo; |
|
|
Counts prevAssertions; |
|
|
Counts prevAssertions; |
|
|
double durationInSeconds; |
|
|
double durationInSeconds; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // end namespace Catch |
|
|
} // end namespace Catch |
|
|
|
|
|
|
|
|
#define INTERNAL_CATCH_SECTION( ... ) \ |
|
|
|
|
|
if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) |
|
|
|
|
|
|
|
|
#define INTERNAL_CATCH_SECTION( ... ) \ |
|
|
|
|
|
CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ |
|
|
|
|
|
if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ |
|
|
|
|
|
CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS |
|
|
|
|
|
|
|
|
|
|
|
#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ |
|
|
|
|
|
CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ |
|
|
|
|
|
if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \ |
|
|
|
|
|
CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS |
|
|
|
|
|
|
|
|
// end catch_section.h |
|
|
// end catch_section.h |
|
|
// start catch_benchmark.h |
|
|
// start catch_benchmark.h |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static Approx custom(); |
|
|
static Approx custom(); |
|
|
|
|
|
|
|
|
|
|
|
Approx operator-() const; |
|
|
|
|
|
|
|
|
template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
|
|
template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> |
|
|
Approx operator()( T const& value ) { |
|
|
Approx operator()( T const& value ) { |
|
|
Approx approx( static_cast<double>(value) ); |
|
|
Approx approx( static_cast<double>(value) ); |
|
|
|
|
|
|
|
|
double m_scale; |
|
|
double m_scale; |
|
|
double m_value; |
|
|
double m_value; |
|
|
}; |
|
|
}; |
|
|
} |
|
|
|
|
|
|
|
|
} // end namespace Detail |
|
|
|
|
|
|
|
|
|
|
|
namespace literals { |
|
|
|
|
|
Detail::Approx operator "" _a(long double val); |
|
|
|
|
|
Detail::Approx operator "" _a(unsigned long long val); |
|
|
|
|
|
} // end namespace literals |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
struct StringMaker<Catch::Detail::Approx> { |
|
|
struct StringMaker<Catch::Detail::Approx> { |
|
|
|
|
|
|
|
|
std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); |
|
|
std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); |
|
|
const char* className = class_getName( cls ); |
|
|
const char* className = class_getName( cls ); |
|
|
|
|
|
|
|
|
getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, name.c_str(), desc.c_str(), SourceLineInfo("",0) ) ); |
|
|
|
|
|
|
|
|
getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo("",0) ) ); |
|
|
noTestMethods++; |
|
|
noTestMethods++; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ReporterPreferences { |
|
|
struct ReporterPreferences { |
|
|
bool shouldRedirectStdOut = false; |
|
|
bool shouldRedirectStdOut = false; |
|
|
|
|
|
bool shouldReportAllAssertions = false; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
template<typename T> |
|
|
template<typename T> |
|
|
|
|
|
|
|
|
return Approx( 0 ); |
|
|
return Approx( 0 ); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Approx Approx::operator-() const { |
|
|
|
|
|
auto temp(*this); |
|
|
|
|
|
temp.m_value = -temp.m_value; |
|
|
|
|
|
return temp; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
std::string Approx::toString() const { |
|
|
std::string Approx::toString() const { |
|
|
ReusableStringStream rss; |
|
|
ReusableStringStream rss; |
|
|
rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; |
|
|
rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // end namespace Detail |
|
|
} // end namespace Detail |
|
|
|
|
|
|
|
|
|
|
|
namespace literals { |
|
|
|
|
|
Detail::Approx operator "" _a(long double val) { |
|
|
|
|
|
return Detail::Approx(val); |
|
|
|
|
|
} |
|
|
|
|
|
Detail::Approx operator "" _a(unsigned long long val) { |
|
|
|
|
|
return Detail::Approx(val); |
|
|
|
|
|
} |
|
|
|
|
|
} // end namespace literals |
|
|
|
|
|
|
|
|
std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) { |
|
|
std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) { |
|
|
return value.toString(); |
|
|
return value.toString(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// end catch_run_context.h |
|
|
// end catch_run_context.h |
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& { |
|
|
|
|
|
expr.streamReconstructedExpression( os ); |
|
|
|
|
|
return os; |
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& { |
|
|
|
|
|
expr.streamReconstructedExpression( os ); |
|
|
|
|
|
return os; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
LazyExpression::LazyExpression( bool isNegated ) |
|
|
LazyExpression::LazyExpression( bool isNegated ) |
|
|
|
|
|
|
|
|
using Reporters = std::vector<IStreamingReporterPtr>; |
|
|
using Reporters = std::vector<IStreamingReporterPtr>; |
|
|
Reporters m_listeners; |
|
|
Reporters m_listeners; |
|
|
IStreamingReporterPtr m_reporter = nullptr; |
|
|
IStreamingReporterPtr m_reporter = nullptr; |
|
|
|
|
|
ReporterPreferences m_preferences; |
|
|
|
|
|
|
|
|
public: |
|
|
public: |
|
|
|
|
|
ListeningReporter(); |
|
|
|
|
|
|
|
|
void addListener( IStreamingReporterPtr&& listener ); |
|
|
void addListener( IStreamingReporterPtr&& listener ); |
|
|
void addReporter( IStreamingReporterPtr&& reporter ); |
|
|
void addReporter( IStreamingReporterPtr&& reporter ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto str() const -> std::string; |
|
|
auto str() const -> std::string; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
#if defined(CATCH_CONFIG_NEW_CAPTURE) |
|
|
|
|
|
|
|
|
// Windows's implementation of std::tmpfile is terrible (it tries |
|
|
// Windows's implementation of std::tmpfile is terrible (it tries |
|
|
// to create a file inside system folder, thus requiring elevated |
|
|
// to create a file inside system folder, thus requiring elevated |
|
|
// privileges for the binary), so we have to use tmpnam(_s) and |
|
|
// privileges for the binary), so we have to use tmpnam(_s) and |
|
|
|
|
|
|
|
|
std::string& m_stderrDest; |
|
|
std::string& m_stderrDest; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
} // end namespace Catch |
|
|
} // end namespace Catch |
|
|
|
|
|
|
|
|
#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H |
|
|
#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H |
|
|
|
|
|
|
|
|
#include <sstream> |
|
|
#include <sstream> |
|
|
#include <stdexcept> |
|
|
#include <stdexcept> |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#include <io.h> //_dup and _dup2 |
|
|
|
|
|
#define dup _dup |
|
|
|
|
|
#define dup2 _dup2 |
|
|
|
|
|
#define fileno _fileno |
|
|
|
|
|
#else |
|
|
|
|
|
#include <unistd.h> // dup and dup2 |
|
|
|
|
|
|
|
|
#if defined(CATCH_CONFIG_NEW_CAPTURE) |
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#include <io.h> //_dup and _dup2 |
|
|
|
|
|
#define dup _dup |
|
|
|
|
|
#define dup2 _dup2 |
|
|
|
|
|
#define fileno _fileno |
|
|
|
|
|
#else |
|
|
|
|
|
#include <unistd.h> // dup and dup2 |
|
|
|
|
|
#endif |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
{} |
|
|
{} |
|
|
auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } |
|
|
auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } |
|
|
|
|
|
|
|
|
|
|
|
#if defined(CATCH_CONFIG_NEW_CAPTURE) |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
#if defined(_MSC_VER) |
|
|
TempFile::TempFile() { |
|
|
TempFile::TempFile() { |
|
|
if (tmpnam_s(m_buffer)) { |
|
|
if (tmpnam_s(m_buffer)) { |
|
|
|
|
|
|
|
|
m_stderrDest += m_stderrFile.getContents(); |
|
|
m_stderrDest += m_stderrFile.getContents(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif // CATCH_CONFIG_NEW_CAPTURE |
|
|
|
|
|
|
|
|
} // namespace Catch |
|
|
} // namespace Catch |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#undef dup |
|
|
|
|
|
#undef dup2 |
|
|
|
|
|
#undef fileno |
|
|
|
|
|
|
|
|
#if defined(CATCH_CONFIG_NEW_CAPTURE) |
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#undef dup |
|
|
|
|
|
#undef dup2 |
|
|
|
|
|
#undef fileno |
|
|
|
|
|
#endif |
|
|
#endif |
|
|
#endif |
|
|
// end catch_output_redirect.cpp |
|
|
// end catch_output_redirect.cpp |
|
|
// start catch_random_number_generator.cpp |
|
|
// start catch_random_number_generator.cpp |
|
|
|
|
|
|
|
|
// start catch_random_number_generator.h |
|
|
// start catch_random_number_generator.h |
|
|
|
|
|
|
|
|
#include <algorithm> |
|
|
#include <algorithm> |
|
|
|
|
|
#include <random> |
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
struct IConfig; |
|
|
struct IConfig; |
|
|
|
|
|
|
|
|
|
|
|
std::mt19937& rng(); |
|
|
void seedRng( IConfig const& config ); |
|
|
void seedRng( IConfig const& config ); |
|
|
|
|
|
|
|
|
unsigned int rngSeed(); |
|
|
unsigned int rngSeed(); |
|
|
|
|
|
|
|
|
struct RandomNumberGenerator { |
|
|
|
|
|
using result_type = unsigned int; |
|
|
|
|
|
|
|
|
|
|
|
static constexpr result_type (min)() { return 0; } |
|
|
|
|
|
static constexpr result_type (max)() { return 1000000; } |
|
|
|
|
|
|
|
|
|
|
|
result_type operator()( result_type n ) const; |
|
|
|
|
|
result_type operator()() const; |
|
|
|
|
|
|
|
|
|
|
|
template<typename V> |
|
|
|
|
|
static void shuffle( V& vector ) { |
|
|
|
|
|
RandomNumberGenerator rng; |
|
|
|
|
|
std::shuffle( vector.begin(), vector.end(), rng ); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// end catch_random_number_generator.h |
|
|
// end catch_random_number_generator.h |
|
|
#include <cstdlib> |
|
|
|
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
|
|
|
std::mt19937& rng() { |
|
|
|
|
|
static std::mt19937 s_rng; |
|
|
|
|
|
return s_rng; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void seedRng( IConfig const& config ) { |
|
|
void seedRng( IConfig const& config ) { |
|
|
if( config.rngSeed() != 0 ) |
|
|
|
|
|
|
|
|
if( config.rngSeed() != 0 ) { |
|
|
std::srand( config.rngSeed() ); |
|
|
std::srand( config.rngSeed() ); |
|
|
|
|
|
rng().seed( config.rngSeed() ); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
unsigned int rngSeed() { |
|
|
unsigned int rngSeed() { |
|
|
return getCurrentContext().getConfig()->rngSeed(); |
|
|
return getCurrentContext().getConfig()->rngSeed(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
RandomNumberGenerator::result_type RandomNumberGenerator::operator()( result_type n ) const { |
|
|
|
|
|
return std::rand() % n; |
|
|
|
|
|
} |
|
|
|
|
|
RandomNumberGenerator::result_type RandomNumberGenerator::operator()() const { |
|
|
|
|
|
return std::rand() % (max)(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
// end catch_random_number_generator.cpp |
|
|
// end catch_random_number_generator.cpp |
|
|
// start catch_registry_hub.cpp |
|
|
// start catch_registry_hub.cpp |
|
|
|
|
|
|
|
|
m_config(_config), |
|
|
m_config(_config), |
|
|
m_reporter(std::move(reporter)), |
|
|
m_reporter(std::move(reporter)), |
|
|
m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, |
|
|
m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, |
|
|
m_includeSuccessfulResults( m_config->includeSuccessfulResults() ) |
|
|
|
|
|
|
|
|
m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions ) |
|
|
{ |
|
|
{ |
|
|
m_context.setRunner(this); |
|
|
m_context.setRunner(this); |
|
|
m_context.setConfig(m_config); |
|
|
m_context.setConfig(m_config); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Recreate section for test case (as we will lose the one that was in scope) |
|
|
// Recreate section for test case (as we will lose the one that was in scope) |
|
|
auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); |
|
|
auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); |
|
|
SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description); |
|
|
|
|
|
|
|
|
SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); |
|
|
|
|
|
|
|
|
Counts assertions; |
|
|
Counts assertions; |
|
|
assertions.failed = 1; |
|
|
assertions.failed = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) { |
|
|
void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) { |
|
|
auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); |
|
|
auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); |
|
|
SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name, testCaseInfo.description); |
|
|
|
|
|
|
|
|
SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); |
|
|
m_reporter->sectionStarting(testCaseSection); |
|
|
m_reporter->sectionStarting(testCaseSection); |
|
|
Counts prevAssertions = m_totals.assertions; |
|
|
Counts prevAssertions = m_totals.assertions; |
|
|
double duration = 0; |
|
|
double duration = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Section::~Section() { |
|
|
Section::~Section() { |
|
|
if( m_sectionIncluded ) { |
|
|
if( m_sectionIncluded ) { |
|
|
SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() ); |
|
|
|
|
|
|
|
|
SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() }; |
|
|
if( uncaught_exceptions() ) |
|
|
if( uncaught_exceptions() ) |
|
|
getResultCapture().sectionEndedEarly( endInfo ); |
|
|
getResultCapture().sectionEndedEarly( endInfo ); |
|
|
else |
|
|
else |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SectionInfo::SectionInfo |
|
|
SectionInfo::SectionInfo |
|
|
( SourceLineInfo const& _lineInfo, |
|
|
( SourceLineInfo const& _lineInfo, |
|
|
std::string const& _name, |
|
|
|
|
|
std::string const& _description ) |
|
|
|
|
|
|
|
|
std::string const& _name ) |
|
|
: name( _name ), |
|
|
: name( _name ), |
|
|
description( _description ), |
|
|
|
|
|
lineInfo( _lineInfo ) |
|
|
lineInfo( _lineInfo ) |
|
|
{} |
|
|
{} |
|
|
|
|
|
|
|
|
SectionEndInfo::SectionEndInfo( SectionInfo const& _sectionInfo, Counts const& _prevAssertions, double _durationInSeconds ) |
|
|
|
|
|
: sectionInfo( _sectionInfo ), prevAssertions( _prevAssertions ), durationInSeconds( _durationInSeconds ) |
|
|
|
|
|
{} |
|
|
|
|
|
|
|
|
|
|
|
} // end namespace Catch |
|
|
} // end namespace Catch |
|
|
// end catch_section_info.cpp |
|
|
// end catch_section_info.cpp |
|
|
// start catch_session.cpp |
|
|
// start catch_session.cpp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
char toLowerCh(char c) { |
|
|
|
|
|
return static_cast<char>( std::tolower( c ) ); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
bool startsWith( std::string const& s, std::string const& prefix ) { |
|
|
bool startsWith( std::string const& s, std::string const& prefix ) { |
|
|
return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); |
|
|
return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool contains( std::string const& s, std::string const& infix ) { |
|
|
bool contains( std::string const& s, std::string const& infix ) { |
|
|
return s.find( infix ) != std::string::npos; |
|
|
return s.find( infix ) != std::string::npos; |
|
|
} |
|
|
} |
|
|
char toLowerCh(char c) { |
|
|
|
|
|
return static_cast<char>( std::tolower( c ) ); |
|
|
|
|
|
} |
|
|
|
|
|
void toLowerInPlace( std::string& s ) { |
|
|
void toLowerInPlace( std::string& s ) { |
|
|
std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); |
|
|
std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { |
|
|
|
|
|
if( startsWith( tag, '.' ) || |
|
|
|
|
|
tag == "!hide" ) |
|
|
|
|
|
return TestCaseInfo::IsHidden; |
|
|
|
|
|
else if( tag == "!throws" ) |
|
|
|
|
|
return TestCaseInfo::Throws; |
|
|
|
|
|
else if( tag == "!shouldfail" ) |
|
|
|
|
|
return TestCaseInfo::ShouldFail; |
|
|
|
|
|
else if( tag == "!mayfail" ) |
|
|
|
|
|
return TestCaseInfo::MayFail; |
|
|
|
|
|
else if( tag == "!nonportable" ) |
|
|
|
|
|
return TestCaseInfo::NonPortable; |
|
|
|
|
|
else if( tag == "!benchmark" ) |
|
|
|
|
|
return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden ); |
|
|
|
|
|
else |
|
|
|
|
|
return TestCaseInfo::None; |
|
|
|
|
|
} |
|
|
|
|
|
bool isReservedTag( std::string const& tag ) { |
|
|
|
|
|
return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) ); |
|
|
|
|
|
} |
|
|
|
|
|
void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { |
|
|
|
|
|
CATCH_ENFORCE( !isReservedTag(tag), |
|
|
|
|
|
"Tag name: [" << tag << "] is not allowed.\n" |
|
|
|
|
|
<< "Tag names starting with non alpha-numeric characters are reserved\n" |
|
|
|
|
|
<< _lineInfo ); |
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { |
|
|
|
|
|
if( startsWith( tag, '.' ) || |
|
|
|
|
|
tag == "!hide" ) |
|
|
|
|
|
return TestCaseInfo::IsHidden; |
|
|
|
|
|
else if( tag == "!throws" ) |
|
|
|
|
|
return TestCaseInfo::Throws; |
|
|
|
|
|
else if( tag == "!shouldfail" ) |
|
|
|
|
|
return TestCaseInfo::ShouldFail; |
|
|
|
|
|
else if( tag == "!mayfail" ) |
|
|
|
|
|
return TestCaseInfo::MayFail; |
|
|
|
|
|
else if( tag == "!nonportable" ) |
|
|
|
|
|
return TestCaseInfo::NonPortable; |
|
|
|
|
|
else if( tag == "!benchmark" ) |
|
|
|
|
|
return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden ); |
|
|
|
|
|
else |
|
|
|
|
|
return TestCaseInfo::None; |
|
|
|
|
|
} |
|
|
|
|
|
bool isReservedTag( std::string const& tag ) { |
|
|
|
|
|
return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) ); |
|
|
|
|
|
} |
|
|
|
|
|
void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { |
|
|
|
|
|
CATCH_ENFORCE( !isReservedTag(tag), |
|
|
|
|
|
"Tag name: [" << tag << "] is not allowed.\n" |
|
|
|
|
|
<< "Tag names starting with non alpha-numeric characters are reserved\n" |
|
|
|
|
|
<< _lineInfo ); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
TestCase makeTestCase( ITestInvoker* _testCase, |
|
|
TestCase makeTestCase( ITestInvoker* _testCase, |
|
|
|
|
|
|
|
|
break; |
|
|
break; |
|
|
case RunTests::InRandomOrder: |
|
|
case RunTests::InRandomOrder: |
|
|
seedRng( config ); |
|
|
seedRng( config ); |
|
|
RandomNumberGenerator::shuffle( sorted ); |
|
|
|
|
|
|
|
|
std::shuffle( sorted.begin(), sorted.end(), rng() ); |
|
|
break; |
|
|
break; |
|
|
case RunTests::InDeclarationOrder: |
|
|
case RunTests::InDeclarationOrder: |
|
|
// already in declaration order |
|
|
// already in declaration order |
|
|
|
|
|
|
|
|
TrackerBase::TrackerHasName::TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} |
|
|
TrackerBase::TrackerHasName::TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} |
|
|
bool TrackerBase::TrackerHasName::operator ()( ITrackerPtr const& tracker ) const { |
|
|
bool TrackerBase::TrackerHasName::operator ()( ITrackerPtr const& tracker ) const { |
|
|
return |
|
|
return |
|
|
tracker->nameAndLocation().name == m_nameAndLocation.name && |
|
|
|
|
|
tracker->nameAndLocation().location == m_nameAndLocation.location; |
|
|
|
|
|
|
|
|
tracker->nameAndLocation().location == m_nameAndLocation.location && |
|
|
|
|
|
tracker->nameAndLocation().name == m_nameAndLocation.name; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) |
|
|
TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) |
|
|
|
|
|
|
|
|
return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count(); |
|
|
return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
auto estimateClockResolution() -> uint64_t { |
|
|
|
|
|
uint64_t sum = 0; |
|
|
|
|
|
static const uint64_t iterations = 1000000; |
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
auto estimateClockResolution() -> uint64_t { |
|
|
|
|
|
uint64_t sum = 0; |
|
|
|
|
|
static const uint64_t iterations = 1000000; |
|
|
|
|
|
|
|
|
auto startTime = getCurrentNanosecondsSinceEpoch(); |
|
|
|
|
|
|
|
|
auto startTime = getCurrentNanosecondsSinceEpoch(); |
|
|
|
|
|
|
|
|
for( std::size_t i = 0; i < iterations; ++i ) { |
|
|
|
|
|
|
|
|
for( std::size_t i = 0; i < iterations; ++i ) { |
|
|
|
|
|
|
|
|
uint64_t ticks; |
|
|
|
|
|
uint64_t baseTicks = getCurrentNanosecondsSinceEpoch(); |
|
|
|
|
|
do { |
|
|
|
|
|
ticks = getCurrentNanosecondsSinceEpoch(); |
|
|
|
|
|
} while( ticks == baseTicks ); |
|
|
|
|
|
|
|
|
uint64_t ticks; |
|
|
|
|
|
uint64_t baseTicks = getCurrentNanosecondsSinceEpoch(); |
|
|
|
|
|
do { |
|
|
|
|
|
ticks = getCurrentNanosecondsSinceEpoch(); |
|
|
|
|
|
} while( ticks == baseTicks ); |
|
|
|
|
|
|
|
|
auto delta = ticks - baseTicks; |
|
|
|
|
|
sum += delta; |
|
|
|
|
|
|
|
|
auto delta = ticks - baseTicks; |
|
|
|
|
|
sum += delta; |
|
|
|
|
|
|
|
|
// If we have been calibrating for over 3 seconds -- the clock |
|
|
|
|
|
// is terrible and we should move on. |
|
|
|
|
|
// TBD: How to signal that the measured resolution is probably wrong? |
|
|
|
|
|
if (ticks > startTime + 3 * nanosecondsInSecond) { |
|
|
|
|
|
return sum / i; |
|
|
|
|
|
|
|
|
// If we have been calibrating for over 3 seconds -- the clock |
|
|
|
|
|
// is terrible and we should move on. |
|
|
|
|
|
// TBD: How to signal that the measured resolution is probably wrong? |
|
|
|
|
|
if (ticks > startTime + 3 * nanosecondsInSecond) { |
|
|
|
|
|
return sum / i; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// We're just taking the mean, here. To do better we could take the std. dev and exclude outliers |
|
|
|
|
|
// - and potentially do more iterations if there's a high variance. |
|
|
|
|
|
return sum/iterations; |
|
|
|
|
|
|
|
|
// We're just taking the mean, here. To do better we could take the std. dev and exclude outliers |
|
|
|
|
|
// - and potentially do more iterations if there's a high variance. |
|
|
|
|
|
return sum/iterations; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
auto getEstimatedClockResolution() -> uint64_t { |
|
|
auto getEstimatedClockResolution() -> uint64_t { |
|
|
static auto s_resolution = estimateClockResolution(); |
|
|
static auto s_resolution = estimateClockResolution(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string ratio_string<std::atto>::symbol() { return "a"; } |
|
|
std::string ratio_string<std::atto>::symbol() { return "a"; } |
|
|
std::string ratio_string<std::femto>::symbol() { return "f"; } |
|
|
std::string ratio_string<std::femto>::symbol() { return "f"; } |
|
|
std::string ratio_string<std::pico>::symbol() { return "p"; } |
|
|
|
|
|
std::string ratio_string<std::nano>::symbol() { return "n"; } |
|
|
|
|
|
|
|
|
std::string ratio_string<std::pico>::symbol() { return "p"; } |
|
|
|
|
|
std::string ratio_string<std::nano>::symbol() { return "n"; } |
|
|
std::string ratio_string<std::micro>::symbol() { return "u"; } |
|
|
std::string ratio_string<std::micro>::symbol() { return "u"; } |
|
|
std::string ratio_string<std::milli>::symbol() { return "m"; } |
|
|
std::string ratio_string<std::milli>::symbol() { return "m"; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Version const& libraryVersion() { |
|
|
Version const& libraryVersion() { |
|
|
static Version version( 2, 2, 3, "", 0 ); |
|
|
|
|
|
|
|
|
static Version version( 2, 3, 0, "", 0 ); |
|
|
return version; |
|
|
return version; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ReporterPreferences CompactReporter::getPreferences() const { |
|
|
ReporterPreferences CompactReporter::getPreferences() const { |
|
|
ReporterPreferences prefs; |
|
|
|
|
|
prefs.shouldRedirectStdOut = false; |
|
|
|
|
|
return prefs; |
|
|
|
|
|
|
|
|
return m_reporterPrefs; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void CompactReporter::noMatchingTestCases( std::string const& spec ) { |
|
|
void CompactReporter::noMatchingTestCases( std::string const& spec ) { |
|
|
|
|
|
|
|
|
xml( _config.stream() ) |
|
|
xml( _config.stream() ) |
|
|
{ |
|
|
{ |
|
|
m_reporterPrefs.shouldRedirectStdOut = true; |
|
|
m_reporterPrefs.shouldRedirectStdOut = true; |
|
|
|
|
|
m_reporterPrefs.shouldReportAllAssertions = true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
JunitReporter::~JunitReporter() {} |
|
|
JunitReporter::~JunitReporter() {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
|
|
|
ListeningReporter::ListeningReporter() { |
|
|
|
|
|
// We will assume that listeners will always want all assertions |
|
|
|
|
|
m_preferences.shouldReportAllAssertions = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) { |
|
|
void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) { |
|
|
m_listeners.push_back( std::move( listener ) ); |
|
|
m_listeners.push_back( std::move( listener ) ); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) { |
|
|
void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) { |
|
|
assert(!m_reporter && "Listening reporter can wrap only 1 real reporter"); |
|
|
assert(!m_reporter && "Listening reporter can wrap only 1 real reporter"); |
|
|
m_reporter = std::move( reporter ); |
|
|
m_reporter = std::move( reporter ); |
|
|
|
|
|
m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ReporterPreferences ListeningReporter::getPreferences() const { |
|
|
ReporterPreferences ListeningReporter::getPreferences() const { |
|
|
return m_reporter->getPreferences(); |
|
|
|
|
|
|
|
|
return m_preferences; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::set<Verbosity> ListeningReporter::getSupportedVerbosities() { |
|
|
std::set<Verbosity> ListeningReporter::getSupportedVerbosities() { |
|
|
|
|
|
|
|
|
m_xml(_config.stream()) |
|
|
m_xml(_config.stream()) |
|
|
{ |
|
|
{ |
|
|
m_reporterPrefs.shouldRedirectStdOut = true; |
|
|
m_reporterPrefs.shouldRedirectStdOut = true; |
|
|
|
|
|
m_reporterPrefs.shouldReportAllAssertions = true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
XmlReporter::~XmlReporter() = default; |
|
|
XmlReporter::~XmlReporter() = default; |
|
|
|
|
|
|
|
|
StreamingReporterBase::sectionStarting( sectionInfo ); |
|
|
StreamingReporterBase::sectionStarting( sectionInfo ); |
|
|
if( m_sectionDepth++ > 0 ) { |
|
|
if( m_sectionDepth++ > 0 ) { |
|
|
m_xml.startElement( "Section" ) |
|
|
m_xml.startElement( "Section" ) |
|
|
.writeAttribute( "name", trim( sectionInfo.name ) ) |
|
|
|
|
|
.writeAttribute( "description", sectionInfo.description ); |
|
|
|
|
|
|
|
|
.writeAttribute( "name", trim( sectionInfo.name ) ); |
|
|
writeSourceInfo( sectionInfo.lineInfo ); |
|
|
writeSourceInfo( sectionInfo.lineInfo ); |
|
|
m_xml.ensureTagClosed(); |
|
|
m_xml.ensureTagClosed(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) |
|
|
#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) |
|
|
#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) |
|
|
#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) |
|
|
#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) |
|
|
#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) |
|
|
|
|
|
#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) |
|
|
#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) |
|
|
#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) |
|
|
#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
|
|
|
|
|
|
// "BDD-style" convenience wrappers |
|
|
// "BDD-style" convenience wrappers |
|
|
#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) |
|
|
#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) |
|
|
#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) |
|
|
#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) |
|
|
#define CATCH_GIVEN( desc ) CATCH_SECTION( std::string( "Given: ") + desc ) |
|
|
|
|
|
#define CATCH_WHEN( desc ) CATCH_SECTION( std::string( " When: ") + desc ) |
|
|
|
|
|
#define CATCH_AND_WHEN( desc ) CATCH_SECTION( std::string( " And: ") + desc ) |
|
|
|
|
|
#define CATCH_THEN( desc ) CATCH_SECTION( std::string( " Then: ") + desc ) |
|
|
|
|
|
#define CATCH_AND_THEN( desc ) CATCH_SECTION( std::string( " And: ") + desc ) |
|
|
|
|
|
|
|
|
#define CATCH_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) |
|
|
|
|
|
#define CATCH_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) |
|
|
|
|
|
#define CATCH_AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And when: " << desc ) |
|
|
|
|
|
#define CATCH_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) |
|
|
|
|
|
#define CATCH_AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) |
|
|
|
|
|
|
|
|
// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required |
|
|
// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required |
|
|
#else |
|
|
#else |
|
|
|
|
|
|
|
|
#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) |
|
|
#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) |
|
|
#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) |
|
|
#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) |
|
|
#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) |
|
|
#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) |
|
|
|
|
|
#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) |
|
|
#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) |
|
|
#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) |
|
|
#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) |
|
|
|
|
|
|
|
|
#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) |
|
|
#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) |
|
|
#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) |
|
|
#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) |
|
|
|
|
|
|
|
|
#define GIVEN( desc ) SECTION( std::string(" Given: ") + desc ) |
|
|
|
|
|
#define WHEN( desc ) SECTION( std::string(" When: ") + desc ) |
|
|
|
|
|
#define AND_WHEN( desc ) SECTION( std::string("And when: ") + desc ) |
|
|
|
|
|
#define THEN( desc ) SECTION( std::string(" Then: ") + desc ) |
|
|
|
|
|
#define AND_THEN( desc ) SECTION( std::string(" And: ") + desc ) |
|
|
|
|
|
|
|
|
#define GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) |
|
|
|
|
|
#define WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) |
|
|
|
|
|
#define AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And when: " << desc ) |
|
|
|
|
|
#define THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) |
|
|
|
|
|
#define AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) |
|
|
|
|
|
|
|
|
using Catch::Detail::Approx; |
|
|
using Catch::Detail::Approx; |
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
#else // CATCH_CONFIG_DISABLE |
|
|
|
|
|
|
|
|
////// |
|
|
////// |
|
|
// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ |
|
|
// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ |
|
|
#ifdef CATCH_CONFIG_PREFIX_ALL |
|
|
#ifdef CATCH_CONFIG_PREFIX_ALL |
|
|
|
|
|
|
|
|
#define CATCH_METHOD_AS_TEST_CASE( method, ... ) |
|
|
#define CATCH_METHOD_AS_TEST_CASE( method, ... ) |
|
|
#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0) |
|
|
#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0) |
|
|
#define CATCH_SECTION( ... ) |
|
|
#define CATCH_SECTION( ... ) |
|
|
|
|
|
#define CATCH_DYNAMIC_SECTION( ... ) |
|
|
#define CATCH_FAIL( ... ) (void)(0) |
|
|
#define CATCH_FAIL( ... ) (void)(0) |
|
|
#define CATCH_FAIL_CHECK( ... ) (void)(0) |
|
|
#define CATCH_FAIL_CHECK( ... ) (void)(0) |
|
|
#define CATCH_SUCCEED( ... ) (void)(0) |
|
|
#define CATCH_SUCCEED( ... ) (void)(0) |
|
|
|
|
|
|
|
|
#define METHOD_AS_TEST_CASE( method, ... ) |
|
|
#define METHOD_AS_TEST_CASE( method, ... ) |
|
|
#define REGISTER_TEST_CASE( Function, ... ) (void)(0) |
|
|
#define REGISTER_TEST_CASE( Function, ... ) (void)(0) |
|
|
#define SECTION( ... ) |
|
|
#define SECTION( ... ) |
|
|
|
|
|
#define DYNAMIC_SECTION( ... ) |
|
|
#define FAIL( ... ) (void)(0) |
|
|
#define FAIL( ... ) (void)(0) |
|
|
#define FAIL_CHECK( ... ) (void)(0) |
|
|
#define FAIL_CHECK( ... ) (void)(0) |
|
|
#define SUCCEED( ... ) (void)(0) |
|
|
#define SUCCEED( ... ) (void)(0) |