|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
* Catch v2.1.1 |
|
|
|
|
|
* Generated: 2018-01-26 16:04:07.190063 |
|
|
|
|
|
|
|
|
* Catch v2.1.2 |
|
|
|
|
|
* Generated: 2018-02-09 17:05:21.506253 |
|
|
* ---------------------------------------------------------- |
|
|
* ---------------------------------------------------------- |
|
|
* 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. |
|
|
|
|
|
|
|
|
// start catch.hpp |
|
|
// start catch.hpp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CATCH_VERSION_MAJOR 2 |
|
|
|
|
|
#define CATCH_VERSION_MINOR 1 |
|
|
|
|
|
#define CATCH_VERSION_PATCH 2 |
|
|
|
|
|
|
|
|
#ifdef __clang__ |
|
|
#ifdef __clang__ |
|
|
# pragma clang system_header |
|
|
# pragma clang system_header |
|
|
#elif defined __GNUC__ |
|
|
#elif defined __GNUC__ |
|
|
|
|
|
|
|
|
# define CATCH_CPP14_OR_GREATER |
|
|
# define CATCH_CPP14_OR_GREATER |
|
|
# endif |
|
|
# endif |
|
|
|
|
|
|
|
|
|
|
|
# if __cplusplus >= 201703L |
|
|
|
|
|
# define CATCH_CPP17_OR_GREATER |
|
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(CATCH_CPP17_OR_GREATER) |
|
|
|
|
|
# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#ifdef __clang__ |
|
|
#ifdef __clang__ |
|
|
|
|
|
|
|
|
// Visual C++ |
|
|
// Visual C++ |
|
|
#ifdef _MSC_VER |
|
|
#ifdef _MSC_VER |
|
|
|
|
|
|
|
|
|
|
|
# if _MSC_VER >= 1900 // Visual Studio 2015 or newer |
|
|
|
|
|
# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS |
|
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
// Universal Windows platform does not support SEH |
|
|
// Universal Windows platform does not support SEH |
|
|
// Or console colours (or console at all...) |
|
|
// Or console colours (or console at all...) |
|
|
# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) |
|
|
# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) |
|
|
|
|
|
|
|
|
# define CATCH_CONFIG_POSIX_SIGNALS |
|
|
# define CATCH_CONFIG_POSIX_SIGNALS |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_INTERNAL_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) |
|
|
|
|
|
# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS |
|
|
|
|
|
#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 |
|
|
|
|
|
|
|
|
template<typename T> |
|
|
template<typename T> |
|
|
typename std::enable_if<!std::is_enum<T>::value, std::string>::type convertUnstreamable( T const& ) { |
|
|
typename std::enable_if<!std::is_enum<T>::value, std::string>::type convertUnstreamable( T const& ) { |
|
|
return Detail::unprintableString; |
|
|
return Detail::unprintableString; |
|
|
}; |
|
|
|
|
|
|
|
|
} |
|
|
template<typename T> |
|
|
template<typename T> |
|
|
typename std::enable_if<std::is_enum<T>::value, std::string>::type convertUnstreamable( T const& value ) { |
|
|
typename std::enable_if<std::is_enum<T>::value, std::string>::type convertUnstreamable( T const& value ) { |
|
|
return convertUnknownEnumToString( value ); |
|
|
return convertUnknownEnumToString( value ); |
|
|
}; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} // namespace Detail |
|
|
} // namespace Detail |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<typename R> |
|
|
template<typename R> |
|
|
struct StringMaker<R, typename std::enable_if<is_range<R>::value && !std::is_array<R>::value>::type> { |
|
|
|
|
|
|
|
|
struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> { |
|
|
static std::string convert( R const& range ) { |
|
|
static std::string convert( R const& range ) { |
|
|
return rangeToString( range ); |
|
|
return rangeToString( range ); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int) |
|
|
// Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int) |
|
|
template<typename LhsT, typename RhsT> |
|
|
template<typename LhsT, typename RhsT> |
|
|
auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); }; |
|
|
|
|
|
|
|
|
auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); } |
|
|
template<typename T> |
|
|
template<typename T> |
|
|
auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); } |
|
|
auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); } |
|
|
template<typename T> |
|
|
template<typename T> |
|
|
|
|
|
|
|
|
auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; } |
|
|
auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; } |
|
|
|
|
|
|
|
|
template<typename LhsT, typename RhsT> |
|
|
template<typename LhsT, typename RhsT> |
|
|
auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); }; |
|
|
|
|
|
|
|
|
auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); } |
|
|
template<typename T> |
|
|
template<typename T> |
|
|
auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); } |
|
|
auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); } |
|
|
template<typename T> |
|
|
template<typename T> |
|
|
|
|
|
|
|
|
BrightGreen = Bright | Green, |
|
|
BrightGreen = Bright | Green, |
|
|
LightGrey = Bright | Grey, |
|
|
LightGrey = Bright | Grey, |
|
|
BrightWhite = Bright | White, |
|
|
BrightWhite = Bright | White, |
|
|
|
|
|
BrightYellow = Bright | Yellow, |
|
|
|
|
|
|
|
|
// By intention |
|
|
// By intention |
|
|
FileName = LightGrey, |
|
|
FileName = LightGrey, |
|
|
Warning = Yellow, |
|
|
|
|
|
|
|
|
Warning = BrightYellow, |
|
|
ResultError = BrightRed, |
|
|
ResultError = BrightRed, |
|
|
ResultSuccess = BrightGreen, |
|
|
ResultSuccess = BrightGreen, |
|
|
ResultExpectedFailure = Warning, |
|
|
ResultExpectedFailure = Warning, |
|
|
|
|
|
|
|
|
Success = Green, |
|
|
Success = Green, |
|
|
|
|
|
|
|
|
OriginalExpression = Cyan, |
|
|
OriginalExpression = Cyan, |
|
|
ReconstructedExpression = Yellow, |
|
|
|
|
|
|
|
|
ReconstructedExpression = BrightYellow, |
|
|
|
|
|
|
|
|
SecondaryText = LightGrey, |
|
|
SecondaryText = LightGrey, |
|
|
Headers = White |
|
|
Headers = White |
|
|
|
|
|
|
|
|
#ifdef CATCH_TRAP |
|
|
#ifdef CATCH_TRAP |
|
|
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } |
|
|
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } |
|
|
#else |
|
|
#else |
|
|
#define CATCH_BREAK_INTO_DEBUGGER() (void)0, 0 |
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
|
|
|
inline void doNothing() {} |
|
|
|
|
|
} |
|
|
|
|
|
#define CATCH_BREAK_INTO_DEBUGGER() Catch::doNothing() |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
// end catch_debugger.h |
|
|
// end catch_debugger.h |
|
|
|
|
|
|
|
|
// |
|
|
// |
|
|
// See https://github.com/philsquared/Clara for more details |
|
|
// See https://github.com/philsquared/Clara for more details |
|
|
|
|
|
|
|
|
// Clara v1.1.1 |
|
|
|
|
|
|
|
|
// Clara v1.1.2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH |
|
|
#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH |
|
|
|
|
|
|
|
|
struct BoundRef : NonCopyable { |
|
|
struct BoundRef : NonCopyable { |
|
|
virtual ~BoundRef() = default; |
|
|
virtual ~BoundRef() = default; |
|
|
virtual auto isContainer() const -> bool { return false; } |
|
|
virtual auto isContainer() const -> bool { return false; } |
|
|
|
|
|
virtual auto isFlag() const -> bool { return false; } |
|
|
}; |
|
|
}; |
|
|
struct BoundValueRefBase : BoundRef { |
|
|
struct BoundValueRefBase : BoundRef { |
|
|
virtual auto setValue( std::string const &arg ) -> ParserResult = 0; |
|
|
virtual auto setValue( std::string const &arg ) -> ParserResult = 0; |
|
|
}; |
|
|
}; |
|
|
struct BoundFlagRefBase : BoundRef { |
|
|
struct BoundFlagRefBase : BoundRef { |
|
|
virtual auto setFlag( bool flag ) -> ParserResult = 0; |
|
|
virtual auto setFlag( bool flag ) -> ParserResult = 0; |
|
|
|
|
|
virtual auto isFlag() const -> bool { return true; } |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
template<typename T> |
|
|
template<typename T> |
|
|
|
|
|
|
|
|
if( token.type != TokenType::Argument ) |
|
|
if( token.type != TokenType::Argument ) |
|
|
return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); |
|
|
return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); |
|
|
|
|
|
|
|
|
assert( dynamic_cast<detail::BoundValueRefBase*>( m_ref.get() ) ); |
|
|
|
|
|
|
|
|
assert( !m_ref->isFlag() ); |
|
|
auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
|
|
auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
|
|
|
|
|
|
|
|
auto result = valueRef->setValue( remainingTokens->token ); |
|
|
auto result = valueRef->setValue( remainingTokens->token ); |
|
|
|
|
|
|
|
|
if( remainingTokens && remainingTokens->type == TokenType::Option ) { |
|
|
if( remainingTokens && remainingTokens->type == TokenType::Option ) { |
|
|
auto const &token = *remainingTokens; |
|
|
auto const &token = *remainingTokens; |
|
|
if( isMatch(token.token ) ) { |
|
|
if( isMatch(token.token ) ) { |
|
|
if( auto flagRef = dynamic_cast<detail::BoundFlagRefBase*>( m_ref.get() ) ) { |
|
|
|
|
|
|
|
|
if( m_ref->isFlag() ) { |
|
|
|
|
|
auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() ); |
|
|
auto result = flagRef->setFlag( true ); |
|
|
auto result = flagRef->setFlag( true ); |
|
|
if( !result ) |
|
|
if( !result ) |
|
|
return InternalParseResult( result ); |
|
|
return InternalParseResult( result ); |
|
|
if( result.value() == ParseResultType::ShortCircuitAll ) |
|
|
if( result.value() == ParseResultType::ShortCircuitAll ) |
|
|
return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
|
|
return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); |
|
|
} else { |
|
|
} else { |
|
|
assert( dynamic_cast<detail::BoundValueRefBase*>( m_ref.get() ) ); |
|
|
|
|
|
auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
|
|
auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); |
|
|
++remainingTokens; |
|
|
++remainingTokens; |
|
|
if( !remainingTokens ) |
|
|
if( !remainingTokens ) |
|
|
|
|
|
|
|
|
case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); |
|
|
case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); |
|
|
case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); |
|
|
case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); |
|
|
case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); |
|
|
case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); |
|
|
|
|
|
case Colour::BrightYellow: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN ); |
|
|
|
|
|
|
|
|
case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); |
|
|
case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); |
|
|
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
|
CATCH_ERROR( "Unknown colour requested" ); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case Colour::BrightRed: return setColour( "[1;31m" ); |
|
|
case Colour::BrightRed: return setColour( "[1;31m" ); |
|
|
case Colour::BrightGreen: return setColour( "[1;32m" ); |
|
|
case Colour::BrightGreen: return setColour( "[1;32m" ); |
|
|
case Colour::BrightWhite: return setColour( "[1;37m" ); |
|
|
case Colour::BrightWhite: return setColour( "[1;37m" ); |
|
|
|
|
|
case Colour::BrightYellow: return setColour( "[1;33m" ); |
|
|
|
|
|
|
|
|
case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); |
|
|
case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); |
|
|
|
|
|
default: CATCH_INTERNAL_ERROR( "Unknown colour requested" ); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
static IColourImpl* instance() { |
|
|
static IColourImpl* instance() { |
|
|
|
|
|
|
|
|
# pragma GCC diagnostic ignored "-Wmissing-field-initializers" |
|
|
# pragma GCC diagnostic ignored "-Wmissing-field-initializers" |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if (defined(CATCH_PLATFORM_WINDOWS) && defined(CATCH_CONFIG_WINDOWS_SEH)) || defined(CATCH_CONFIG_POSIX_SIGNALS) |
|
|
namespace { |
|
|
namespace { |
|
|
// Report the error condition |
|
|
// Report the error condition |
|
|
void reportFatal( char const * const message ) { |
|
|
void reportFatal( char const * const message ) { |
|
|
Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message ); |
|
|
Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message ); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// |
|
|
#if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// end catch_matchers_string.cpp |
|
|
// end catch_matchers_string.cpp |
|
|
// start catch_message.cpp |
|
|
// start catch_message.cpp |
|
|
|
|
|
|
|
|
|
|
|
// start catch_uncaught_exceptions.h |
|
|
|
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
|
|
|
bool uncaught_exceptions(); |
|
|
|
|
|
} // end namespace Catch |
|
|
|
|
|
|
|
|
|
|
|
// end catch_uncaught_exceptions.h |
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
|
|
|
|
|
|
MessageInfo::MessageInfo( std::string const& _macroName, |
|
|
MessageInfo::MessageInfo( std::string const& _macroName, |
|
|
|
|
|
|
|
|
getResultCapture().pushScopedMessage( m_info ); |
|
|
getResultCapture().pushScopedMessage( m_info ); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#pragma warning(push) |
|
|
|
|
|
#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 |
|
|
|
|
|
#endif |
|
|
|
|
|
ScopedMessage::~ScopedMessage() { |
|
|
ScopedMessage::~ScopedMessage() { |
|
|
if ( !std::uncaught_exception() ){ |
|
|
|
|
|
|
|
|
if ( !uncaught_exceptions() ){ |
|
|
getResultCapture().popScopedMessage(m_info); |
|
|
getResultCapture().popScopedMessage(m_info); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#pragma warning(pop) |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
} // end namespace Catch |
|
|
} // end namespace Catch |
|
|
// end catch_message.cpp |
|
|
// end catch_message.cpp |
|
|
// start catch_random_number_generator.cpp |
|
|
// start catch_random_number_generator.cpp |
|
|
|
|
|
|
|
|
handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction ); |
|
|
handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction ); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
Counts assertions = m_totals.assertions - prevAssertions; |
|
|
|
|
|
bool missingAssertions = testForMissingAssertions(assertions); |
|
|
|
|
|
|
|
|
m_testCaseTracker->close(); |
|
|
m_testCaseTracker->close(); |
|
|
handleUnfinishedSections(); |
|
|
handleUnfinishedSections(); |
|
|
m_messages.clear(); |
|
|
m_messages.clear(); |
|
|
|
|
|
|
|
|
Counts assertions = m_totals.assertions - prevAssertions; |
|
|
|
|
|
bool missingAssertions = testForMissingAssertions(assertions); |
|
|
|
|
|
SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions); |
|
|
SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions); |
|
|
m_reporter->sectionEnded(testCaseSectionStats); |
|
|
m_reporter->sectionEnded(testCaseSectionStats); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
m_timer.start(); |
|
|
m_timer.start(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#pragma warning(push) |
|
|
|
|
|
#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17 |
|
|
|
|
|
#endif |
|
|
|
|
|
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( std::uncaught_exception() ) |
|
|
|
|
|
|
|
|
if( uncaught_exceptions() ) |
|
|
getResultCapture().sectionEndedEarly( endInfo ); |
|
|
getResultCapture().sectionEndedEarly( endInfo ); |
|
|
else |
|
|
else |
|
|
getResultCapture().sectionEnded( endInfo ); |
|
|
getResultCapture().sectionEnded( endInfo ); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#if defined(_MSC_VER) |
|
|
|
|
|
#pragma warning(pop) |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// This indicates whether the section should be executed or not |
|
|
// This indicates whether the section should be executed or not |
|
|
Section::operator bool() const { |
|
|
Section::operator bool() const { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <ostream> |
|
|
#include <ostream> |
|
|
#include <cstring> |
|
|
#include <cstring> |
|
|
|
|
|
#include <cstdint> |
|
|
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
const uint32_t byte_2_lead = 0xC0; |
|
|
|
|
|
const uint32_t byte_3_lead = 0xE0; |
|
|
|
|
|
const uint32_t byte_4_lead = 0xF0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
namespace Catch { |
|
|
StringRef::StringRef( char const* rawChars ) noexcept |
|
|
StringRef::StringRef( char const* rawChars ) noexcept |
|
|
|
|
|
|
|
|
// Make adjustments for uft encodings |
|
|
// Make adjustments for uft encodings |
|
|
for( size_type i=0; i < m_size; ++i ) { |
|
|
for( size_type i=0; i < m_size; ++i ) { |
|
|
char c = m_start[i]; |
|
|
char c = m_start[i]; |
|
|
if( ( c & 0b11000000 ) == 0b11000000 ) { |
|
|
|
|
|
if( ( c & 0b11100000 ) == 0b11000000 ) |
|
|
|
|
|
|
|
|
if( ( c & byte_2_lead ) == byte_2_lead ) { |
|
|
|
|
|
noChars--; |
|
|
|
|
|
if (( c & byte_3_lead ) == byte_3_lead ) |
|
|
|
|
|
noChars--; |
|
|
|
|
|
if( ( c & byte_4_lead ) == byte_4_lead ) |
|
|
noChars--; |
|
|
noChars--; |
|
|
else if( ( c & 0b11110000 ) == 0b11100000 ) |
|
|
|
|
|
noChars-=2; |
|
|
|
|
|
else if( ( c & 0b11111000 ) == 0b11110000 ) |
|
|
|
|
|
noChars-=3; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return noChars; |
|
|
return noChars; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
// end catch_totals.cpp |
|
|
// end catch_totals.cpp |
|
|
|
|
|
// start catch_uncaught_exceptions.cpp |
|
|
|
|
|
|
|
|
|
|
|
#include <exception> |
|
|
|
|
|
|
|
|
|
|
|
namespace Catch { |
|
|
|
|
|
bool uncaught_exceptions() { |
|
|
|
|
|
#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) |
|
|
|
|
|
return std::uncaught_exceptions() > 0; |
|
|
|
|
|
#else |
|
|
|
|
|
return std::uncaught_exception(); |
|
|
|
|
|
#endif |
|
|
|
|
|
} |
|
|
|
|
|
} // end namespace Catch |
|
|
|
|
|
// end catch_uncaught_exceptions.cpp |
|
|
// start catch_version.cpp |
|
|
// start catch_version.cpp |
|
|
|
|
|
|
|
|
#include <ostream> |
|
|
#include <ostream> |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Version const& libraryVersion() { |
|
|
Version const& libraryVersion() { |
|
|
static Version version( 2, 1, 1, "", 0 ); |
|
|
|
|
|
|
|
|
static Version version( 2, 1, 2, "", 0 ); |
|
|
return version; |
|
|
return version; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_reporterPrefs.shouldRedirectStdOut = true; |
|
|
m_reporterPrefs.shouldRedirectStdOut = true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
JunitReporter::~JunitReporter() {}; |
|
|
|
|
|
|
|
|
JunitReporter::~JunitReporter() {} |
|
|
|
|
|
|
|
|
std::string JunitReporter::getDescription() { |
|
|
std::string JunitReporter::getDescription() { |
|
|
return "Reports test results in an XML format that looks like Ant's junitreport target"; |
|
|
return "Reports test results in an XML format that looks like Ant's junitreport target"; |