| /* | /* | ||||
| * Catch v2.0.0-develop.5 | |||||
| * Generated: 2017-10-12 13:05:08.135067 | |||||
| * Catch v2.0.0-develop.6 | |||||
| * Generated: 2017-10-31 15:09:47.277913 | |||||
| * ---------------------------------------------------------- | * ---------------------------------------------------------- | ||||
| * 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) 2017 Two Blue Cubes Ltd. All rights reserved. | * Copyright (c) 2017 Two Blue Cubes Ltd. All rights reserved. | ||||
| // 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 (WINAPI_FAMILY == WINAPI_FAMILY_APP) | |||||
| # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) | |||||
| # define CATCH_CONFIG_COLOUR_NONE | # define CATCH_CONFIG_COLOUR_NONE | ||||
| # else | # else | ||||
| # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH | # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH | ||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||
| // All supported compilers support COUNTER macro, | |||||
| //but user still might want to turn it off | |||||
| #define CATCH_INTERNAL_CONFIG_COUNTER | |||||
| // Now set the actual defines based on the above + anything the user has configured | |||||
| // Use of __COUNTER__ is suppressed during code analysis in | |||||
| // CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly | |||||
| // handled by it. | |||||
| // Otherwise all supported compilers support COUNTER macro, | |||||
| // but user still might want to turn it off | |||||
| #if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) | |||||
| #define CATCH_INTERNAL_CONFIG_COUNTER | |||||
| #endif | |||||
| // Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for | |||||
| // analytics) because, at time of writing, __COUNTER__ is not properly handled by it. | |||||
| // This does not affect compilation | |||||
| #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__) | |||||
| #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) | |||||
| # define CATCH_CONFIG_COUNTER | # define CATCH_CONFIG_COUNTER | ||||
| #endif | #endif | ||||
| #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) | #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) | ||||
| // 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&& rhs ) -> bool { return lhs == rhs; }; | |||||
| auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return 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> | ||||
| ExprLhs( LhsT lhs ) : m_lhs( lhs ) {} | ExprLhs( LhsT lhs ) : m_lhs( lhs ) {} | ||||
| template<typename RhsT> | template<typename RhsT> | ||||
| auto operator == ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const { | |||||
| return BinaryExpr<LhsT, RhsT&>( compareEqual( m_lhs, rhs ), m_lhs, "==", rhs ); | |||||
| auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { | |||||
| return BinaryExpr<LhsT, RhsT const&>( compareEqual( m_lhs, rhs ), m_lhs, "==", rhs ); | |||||
| } | } | ||||
| auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const { | auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const { | ||||
| return BinaryExpr<LhsT, bool>( m_lhs == rhs, m_lhs, "==", rhs ); | return BinaryExpr<LhsT, bool>( m_lhs == rhs, m_lhs, "==", rhs ); | ||||
| } | } | ||||
| template<typename RhsT> | template<typename RhsT> | ||||
| auto operator != ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const { | |||||
| return BinaryExpr<LhsT, RhsT&>( compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs ); | |||||
| auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { | |||||
| return BinaryExpr<LhsT, RhsT const&>( compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs ); | |||||
| } | } | ||||
| auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const { | auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const { | ||||
| return BinaryExpr<LhsT, bool>( m_lhs != rhs, m_lhs, "!=", rhs ); | return BinaryExpr<LhsT, bool>( m_lhs != rhs, m_lhs, "!=", rhs ); | ||||
| } | } | ||||
| template<typename RhsT> | template<typename RhsT> | ||||
| auto operator > ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const { | |||||
| return BinaryExpr<LhsT, RhsT&>( m_lhs > rhs, m_lhs, ">", rhs ); | |||||
| auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { | |||||
| return BinaryExpr<LhsT, RhsT const&>( m_lhs > rhs, m_lhs, ">", rhs ); | |||||
| } | } | ||||
| template<typename RhsT> | template<typename RhsT> | ||||
| auto operator < ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const { | |||||
| return BinaryExpr<LhsT, RhsT&>( m_lhs < rhs, m_lhs, "<", rhs ); | |||||
| auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { | |||||
| return BinaryExpr<LhsT, RhsT const&>( m_lhs < rhs, m_lhs, "<", rhs ); | |||||
| } | } | ||||
| template<typename RhsT> | template<typename RhsT> | ||||
| auto operator >= ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const { | |||||
| return BinaryExpr<LhsT, RhsT&>( m_lhs >= rhs, m_lhs, ">=", rhs ); | |||||
| auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { | |||||
| return BinaryExpr<LhsT, RhsT const&>( m_lhs >= rhs, m_lhs, ">=", rhs ); | |||||
| } | } | ||||
| template<typename RhsT> | template<typename RhsT> | ||||
| auto operator <= ( RhsT&& rhs ) -> BinaryExpr<LhsT, RhsT&> const { | |||||
| return BinaryExpr<LhsT, RhsT&>( m_lhs <= rhs, m_lhs, "<=", rhs ); | |||||
| auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { | |||||
| return BinaryExpr<LhsT, RhsT const&>( m_lhs <= rhs, m_lhs, "<=", rhs ); | |||||
| } | } | ||||
| auto makeUnaryExpr() const -> UnaryExpr<LhsT> { | auto makeUnaryExpr() const -> UnaryExpr<LhsT> { | ||||
| } // end namespace Catch | } // end namespace Catch | ||||
| #ifdef _MSC_VER | |||||
| #pragma warning(pop) | |||||
| #endif | |||||
| // end catch_decomposer.h | // end catch_decomposer.h | ||||
| // start catch_assertioninfo.h | // start catch_assertioninfo.h | ||||
| // end catch_interfaces_exception.h | // end catch_interfaces_exception.h | ||||
| // start catch_approx.h | // start catch_approx.h | ||||
| // start catch_enforce.h | |||||
| #include <sstream> | |||||
| #include <stdexcept> | |||||
| #define CATCH_PREPARE_EXCEPTION( type, msg ) \ | |||||
| type( static_cast<std::ostringstream&&>( std::ostringstream() << msg ).str() ) | |||||
| #define CATCH_INTERNAL_ERROR( msg ) \ | |||||
| throw CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg); | |||||
| #define CATCH_ERROR( msg ) \ | |||||
| throw CATCH_PREPARE_EXCEPTION( std::domain_error, msg ) | |||||
| #define CATCH_ENFORCE( condition, msg ) \ | |||||
| do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false) | |||||
| // end catch_enforce.h | |||||
| #include <cmath> | #include <cmath> | ||||
| #include <type_traits> | #include <type_traits> | ||||
| namespace Catch { | namespace Catch { | ||||
| namespace Detail { | namespace Detail { | ||||
| double max(double lhs, double rhs); | |||||
| double dmax(double lhs, double rhs); | |||||
| class Approx { | class Approx { | ||||
| public: | public: | ||||
| friend bool operator == ( const T& lhs, Approx const& rhs ) { | friend bool operator == ( const T& lhs, Approx const& rhs ) { | ||||
| // Thanks to Richard Harris for his help refining this formula | // Thanks to Richard Harris for his help refining this formula | ||||
| auto lhs_v = static_cast<double>(lhs); | auto lhs_v = static_cast<double>(lhs); | ||||
| bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + (max)(std::fabs(lhs_v), std::fabs(rhs.m_value))); | |||||
| bool relativeOK = std::fabs(lhs_v - rhs.m_value) < rhs.m_epsilon * (rhs.m_scale + | |||||
| dmax(std::fabs(lhs_v), std::fabs(rhs.m_value))); | |||||
| if (relativeOK) { | if (relativeOK) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| return std::fabs(lhs_v - rhs.m_value) < rhs.m_margin; | |||||
| return std::fabs(lhs_v - rhs.m_value) <= rhs.m_margin; | |||||
| } | } | ||||
| 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> | ||||
| 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& margin( T const& newMargin ) { | Approx& margin( T const& newMargin ) { | ||||
| m_margin = static_cast<double>(newMargin); | m_margin = static_cast<double>(newMargin); | ||||
| CATCH_ENFORCE(m_margin >= 0, "Invalid Approx::margin: " << m_margin << ", Approx::Margin has to be non-negative."); | |||||
| return *this; | return *this; | ||||
| } | } | ||||
| // start catch_reporter_bases.hpp | // start catch_reporter_bases.hpp | ||||
| // start catch_enforce.h | |||||
| #include <sstream> | |||||
| #include <stdexcept> | |||||
| #define CATCH_PREPARE_EXCEPTION( type, msg ) \ | |||||
| type( static_cast<std::ostringstream&&>( std::ostringstream() << msg ).str() ) | |||||
| #define CATCH_INTERNAL_ERROR( msg ) \ | |||||
| throw CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg); | |||||
| #define CATCH_ERROR( msg ) \ | |||||
| throw CATCH_PREPARE_EXCEPTION( std::domain_error, msg ) | |||||
| #define CATCH_ENFORCE( condition, msg ) \ | |||||
| do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false) | |||||
| // end catch_enforce.h | |||||
| // start catch_interfaces_reporter.h | // start catch_interfaces_reporter.h | ||||
| // start catch_config.hpp | // start catch_config.hpp | ||||
| namespace Catch { | namespace Catch { | ||||
| namespace Detail { | namespace Detail { | ||||
| double max(double lhs, double rhs) { | |||||
| double dmax(double lhs, double rhs) { | |||||
| if (lhs < rhs) { | if (lhs < rhs) { | ||||
| return rhs; | return rhs; | ||||
| } | } | ||||
| } | } | ||||
| std::string AssertionResult::getExpression() const { | std::string AssertionResult::getExpression() const { | ||||
| if (isFalseTest(m_info.resultDisposition)) | |||||
| return '!' + std::string(m_info.capturedExpression); | |||||
| if( isFalseTest( m_info.resultDisposition ) ) | |||||
| return "!(" + std::string(m_info.capturedExpression) + ")"; | |||||
| else | else | ||||
| return m_info.capturedExpression; | return m_info.capturedExpression; | ||||
| } | } | ||||
| #endif | #endif | ||||
| // start clara.hpp | // start clara.hpp | ||||
| // v1.0 | |||||
| // v1.0-develop.2 | |||||
| // See https://github.com/philsquared/Clara | // See https://github.com/philsquared/Clara | ||||
| std::string token; | std::string token; | ||||
| }; | }; | ||||
| inline auto isOptPrefix( char c ) -> bool { | |||||
| return c == '-' | |||||
| #ifdef CATCH_PLATFORM_WINDOWS | |||||
| || c == '/' | |||||
| #endif | |||||
| ; | |||||
| } | |||||
| // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled | // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled | ||||
| class TokenStream { | class TokenStream { | ||||
| using Iterator = std::vector<std::string>::const_iterator; | using Iterator = std::vector<std::string>::const_iterator; | ||||
| if( it != itEnd ) { | if( it != itEnd ) { | ||||
| auto const &next = *it; | auto const &next = *it; | ||||
| if( next[0] == '-' || next[0] == '/' ) { | |||||
| if( isOptPrefix( next[0] ) ) { | |||||
| auto delimiterPos = next.find_first_of( " :=" ); | auto delimiterPos = next.find_first_of( " :=" ); | ||||
| if( delimiterPos != std::string::npos ) { | if( delimiterPos != std::string::npos ) { | ||||
| m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); | m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); | ||||
| }; | }; | ||||
| inline auto normaliseOpt( std::string const &optName ) -> std::string { | inline auto normaliseOpt( std::string const &optName ) -> std::string { | ||||
| #ifdef CATCH_PLATFORM_WINDOWS | |||||
| if( optName[0] == '/' ) | if( optName[0] == '/' ) | ||||
| return "-" + optName.substr( 1 ); | return "-" + optName.substr( 1 ); | ||||
| else | else | ||||
| #endif | |||||
| return optName; | return optName; | ||||
| } | } | ||||
| } | } | ||||
| auto isMatch( std::string const &optToken ) const -> bool { | auto isMatch( std::string const &optToken ) const -> bool { | ||||
| #ifdef CATCH_PLATFORM_WINDOWS | |||||
| auto normalisedToken = normaliseOpt( optToken ); | auto normalisedToken = normaliseOpt( optToken ); | ||||
| #else | |||||
| auto const &normalisedToken = optToken; | |||||
| #endif | |||||
| for( auto const &name : m_optNames ) { | for( auto const &name : m_optNames ) { | ||||
| if( normaliseOpt( name ) == normalisedToken ) | if( normaliseOpt( name ) == normalisedToken ) | ||||
| return true; | return true; | ||||
| for( auto const &name : m_optNames ) { | for( auto const &name : m_optNames ) { | ||||
| if( name.empty() ) | if( name.empty() ) | ||||
| return Result::logicError( "Option name cannot be empty" ); | return Result::logicError( "Option name cannot be empty" ); | ||||
| #ifdef CATCH_PLATFORM_WINDOWS | |||||
| if( name[0] != '-' && name[0] != '/' ) | if( name[0] != '-' && name[0] != '/' ) | ||||
| return Result::logicError( "Option name must begin with '-' or '/'" ); | return Result::logicError( "Option name must begin with '-' or '/'" ); | ||||
| #else | |||||
| if( name[0] != '-' ) | |||||
| return Result::logicError( "Option name must begin with '-'" ); | |||||
| #endif | |||||
| } | } | ||||
| return ParserRefImpl::validate(); | return ParserRefImpl::validate(); | ||||
| } | } | ||||
| size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; | size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; | ||||
| size_t optWidth = 0; | size_t optWidth = 0; | ||||
| for( auto const &cols : rows ) | for( auto const &cols : rows ) | ||||
| optWidth = std::max(optWidth, cols.left.size() + 2); | |||||
| optWidth = (std::max)(optWidth, cols.left.size() + 2); | |||||
| for( auto const &cols : rows ) { | for( auto const &cols : rows ) { | ||||
| auto row = | auto row = | ||||
| unsigned int rngSeed(); | unsigned int rngSeed(); | ||||
| struct RandomNumberGenerator { | struct RandomNumberGenerator { | ||||
| using result_type = std::ptrdiff_t; | |||||
| using result_type = unsigned int; | |||||
| static constexpr result_type min() { return 0; } | |||||
| static constexpr result_type max() { return 1000000; } | |||||
| static constexpr result_type (min)() { return 0; } | |||||
| static constexpr result_type (max)() { return 1000000; } | |||||
| result_type operator()( result_type n ) const; | result_type operator()( result_type n ) const; | ||||
| result_type operator()() const; | result_type operator()() const; | ||||
| return std::rand() % n; | return std::rand() % n; | ||||
| } | } | ||||
| RandomNumberGenerator::result_type RandomNumberGenerator::operator()() const { | RandomNumberGenerator::result_type RandomNumberGenerator::operator()() const { | ||||
| return std::rand() % max(); | |||||
| return std::rand() % (max)(); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Version const& libraryVersion() { | Version const& libraryVersion() { | ||||
| static Version version( 2, 0, 0, "develop", 5 ); | |||||
| static Version version( 2, 0, 0, "develop", 6 ); | |||||
| return version; | return version; | ||||
| } | } | ||||
| #include <cfloat> | #include <cfloat> | ||||
| #include <cstdio> | #include <cstdio> | ||||
| #if defined(_MSC_VER) | |||||
| #pragma warning(push) | |||||
| #pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch | |||||
| // Note that 4062 (not all labels are handled | |||||
| // and default is missing) is enabled | |||||
| #endif | |||||
| namespace Catch { | namespace Catch { | ||||
| namespace { | namespace { | ||||
| ConsoleReporter::~ConsoleReporter() {} | ConsoleReporter::~ConsoleReporter() {} | ||||
| } // end namespace Catch | } // end namespace Catch | ||||
| #if defined(_MSC_VER) | |||||
| #pragma warning(pop) | |||||
| #endif | |||||
| // end catch_reporter_console.cpp | // end catch_reporter_console.cpp | ||||
| // start catch_reporter_junit.cpp | // start catch_reporter_junit.cpp | ||||
| // end catch_reporter_multi.cpp | // end catch_reporter_multi.cpp | ||||
| // start catch_reporter_xml.cpp | // start catch_reporter_xml.cpp | ||||
| #if defined(_MSC_VER) | |||||
| #pragma warning(push) | |||||
| #pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch | |||||
| // Note that 4062 (not all labels are handled | |||||
| // and default is missing) is enabled | |||||
| #endif | |||||
| namespace Catch { | namespace Catch { | ||||
| class XmlReporter : public StreamingReporterBase<XmlReporter> { | class XmlReporter : public StreamingReporterBase<XmlReporter> { | ||||
| public: | public: | ||||
| CATCH_REGISTER_REPORTER( "xml", XmlReporter ) | CATCH_REGISTER_REPORTER( "xml", XmlReporter ) | ||||
| } // end namespace Catch | } // end namespace Catch | ||||
| #if defined(_MSC_VER) | |||||
| #pragma warning(pop) | |||||
| #endif | |||||
| // end catch_reporter_xml.cpp | // end catch_reporter_xml.cpp | ||||
| namespace Catch { | namespace Catch { |