| /* | /* | ||||
| * Catch v2.7.0 | |||||
| * Generated: 2019-03-07 21:34:30.252164 | |||||
| * Catch v2.7.1 | |||||
| * Generated: 2019-04-05 18:22:37.720122 | |||||
| * ---------------------------------------------------------- | * ---------------------------------------------------------- | ||||
| * 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) 2019 Two Blue Cubes Ltd. All rights reserved. | * Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved. | ||||
| #define CATCH_VERSION_MAJOR 2 | #define CATCH_VERSION_MAJOR 2 | ||||
| #define CATCH_VERSION_MINOR 7 | #define CATCH_VERSION_MINOR 7 | ||||
| #define CATCH_VERSION_PATCH 0 | |||||
| #define CATCH_VERSION_PATCH 1 | |||||
| #ifdef __clang__ | #ifdef __clang__ | ||||
| # pragma clang system_header | # pragma clang system_header | ||||
| } // namespace Catch | } // namespace Catch | ||||
| #define GENERATE( ... ) \ | #define GENERATE( ... ) \ | ||||
| Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, []{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) | |||||
| Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) | |||||
| #define GENERATE_COPY( ... ) \ | |||||
| Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) | |||||
| #define GENERATE_REF( ... ) \ | |||||
| Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) | |||||
| // end catch_generators.hpp | // end catch_generators.hpp | ||||
| // start catch_generators_generic.hpp | // start catch_generators_generic.hpp | ||||
| } | } | ||||
| }; | }; | ||||
| template <typename T, typename U, typename Func> | |||||
| #if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 | |||||
| // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is | |||||
| // replaced with std::invoke_result here. Also *_t format is preferred over | |||||
| // typename *::type format. | |||||
| template <typename Func, typename U> | |||||
| using MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>; | |||||
| #else | |||||
| template <typename Func, typename U> | |||||
| using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type; | |||||
| #endif | |||||
| template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>> | |||||
| GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { | ||||
| return GeneratorWrapper<T>( | return GeneratorWrapper<T>( | ||||
| pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) | pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) | ||||
| ); | ); | ||||
| } | } | ||||
| template <typename T, typename Func> | |||||
| GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<T>&& generator) { | |||||
| template <typename T, typename U, typename Func> | |||||
| GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { | |||||
| return GeneratorWrapper<T>( | return GeneratorWrapper<T>( | ||||
| pf::make_unique<MapGenerator<T, T, Func>>(std::forward<Func>(function), std::move(generator)) | |||||
| pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) | |||||
| ); | ); | ||||
| } | } | ||||
| virtual ShowDurations::OrNot showDurations() const = 0; | virtual ShowDurations::OrNot showDurations() const = 0; | ||||
| virtual TestSpec const& testSpec() const = 0; | virtual TestSpec const& testSpec() const = 0; | ||||
| virtual bool hasTestFilters() const = 0; | virtual bool hasTestFilters() const = 0; | ||||
| virtual std::vector<std::string> const& getTestsOrTags() const = 0; | |||||
| virtual RunTests::InWhatOrder runOrder() const = 0; | virtual RunTests::InWhatOrder runOrder() const = 0; | ||||
| virtual unsigned int rngSeed() const = 0; | virtual unsigned int rngSeed() const = 0; | ||||
| virtual int benchmarkResolutionMultiple() const = 0; | virtual int benchmarkResolutionMultiple() const = 0; | ||||
| arcSafeRelease( m_substr ); | arcSafeRelease( m_substr ); | ||||
| } | } | ||||
| bool match( NSString* arg ) const override { | |||||
| bool match( NSString* const& str ) const override { | |||||
| return false; | return false; | ||||
| } | } | ||||
| struct Equals : StringHolder { | struct Equals : StringHolder { | ||||
| Equals( NSString* substr ) : StringHolder( substr ){} | Equals( NSString* substr ) : StringHolder( substr ){} | ||||
| bool match( NSString* str ) const override { | |||||
| bool match( NSString* const& str ) const override { | |||||
| return (str != nil || m_substr == nil ) && | return (str != nil || m_substr == nil ) && | ||||
| [str isEqualToString:m_substr]; | [str isEqualToString:m_substr]; | ||||
| } | } | ||||
| struct Contains : StringHolder { | struct Contains : StringHolder { | ||||
| Contains( NSString* substr ) : StringHolder( substr ){} | Contains( NSString* substr ) : StringHolder( substr ){} | ||||
| bool match( NSString* str ) const { | |||||
| bool match( NSString* const& str ) const override { | |||||
| return (str != nil || m_substr == nil ) && | return (str != nil || m_substr == nil ) && | ||||
| [str rangeOfString:m_substr].location != NSNotFound; | [str rangeOfString:m_substr].location != NSNotFound; | ||||
| } | } | ||||
| struct StartsWith : StringHolder { | struct StartsWith : StringHolder { | ||||
| StartsWith( NSString* substr ) : StringHolder( substr ){} | StartsWith( NSString* substr ) : StringHolder( substr ){} | ||||
| bool match( NSString* str ) const override { | |||||
| bool match( NSString* const& str ) const override { | |||||
| return (str != nil || m_substr == nil ) && | return (str != nil || m_substr == nil ) && | ||||
| [str rangeOfString:m_substr].location == 0; | [str rangeOfString:m_substr].location == 0; | ||||
| } | } | ||||
| struct EndsWith : StringHolder { | struct EndsWith : StringHolder { | ||||
| EndsWith( NSString* substr ) : StringHolder( substr ){} | EndsWith( NSString* substr ) : StringHolder( substr ){} | ||||
| bool match( NSString* str ) const override { | |||||
| bool match( NSString* const& str ) const override { | |||||
| return (str != nil || m_substr == nil ) && | return (str != nil || m_substr == nil ) && | ||||
| [str rangeOfString:m_substr].location == [str length] - [m_substr length]; | [str rangeOfString:m_substr].location == [str length] - [m_substr length]; | ||||
| } | } | ||||
| std::string getProcessName() const; | std::string getProcessName() const; | ||||
| std::string const& getReporterName() const; | std::string const& getReporterName() const; | ||||
| std::vector<std::string> const& getTestsOrTags() const; | |||||
| std::vector<std::string> const& getTestsOrTags() const override; | |||||
| std::vector<std::string> const& getSectionsToRun() const override; | std::vector<std::string> const& getSectionsToRun() const override; | ||||
| virtual TestSpec const& testSpec() const override; | virtual TestSpec const& testSpec() const override; | ||||
| // Returns double formatted as %.3f (format expected on output) | // Returns double formatted as %.3f (format expected on output) | ||||
| std::string getFormattedDuration( double duration ); | std::string getFormattedDuration( double duration ); | ||||
| std::string serializeFilters( std::vector<std::string> const& container ); | |||||
| template<typename DerivedT> | template<typename DerivedT> | ||||
| struct StreamingReporterBase : IStreamingReporter { | struct StreamingReporterBase : IStreamingReporter { | ||||
| void testRunStarting(TestRunInfo const& _testRunInfo) override { | void testRunStarting(TestRunInfo const& _testRunInfo) override { | ||||
| currentTestRunInfo = _testRunInfo; | currentTestRunInfo = _testRunInfo; | ||||
| } | } | ||||
| void testGroupStarting(GroupInfo const& _groupInfo) override { | void testGroupStarting(GroupInfo const& _groupInfo) override { | ||||
| currentGroupInfo = _groupInfo; | currentGroupInfo = _groupInfo; | ||||
| } | } | ||||
| void testCaseEnded(TestCaseStats const& _testCaseStats) override; | void testCaseEnded(TestCaseStats const& _testCaseStats) override; | ||||
| void testGroupEnded(TestGroupStats const& _testGroupStats) override; | void testGroupEnded(TestGroupStats const& _testGroupStats) override; | ||||
| void testRunEnded(TestRunStats const& _testRunStats) override; | void testRunEnded(TestRunStats const& _testRunStats) override; | ||||
| void testRunStarting(TestRunInfo const& _testRunInfo) override; | |||||
| private: | private: | ||||
| void lazyPrint(); | void lazyPrint(); | ||||
| void printTotalsDivider(Totals const& totals); | void printTotalsDivider(Totals const& totals); | ||||
| void printSummaryDivider(); | void printSummaryDivider(); | ||||
| void printTestFilters(); | |||||
| private: | private: | ||||
| bool m_headerPrinted = false; | bool m_headerPrinted = false; | ||||
| // Windows can easily distinguish between SO and SigSegV, | // Windows can easily distinguish between SO and SigSegV, | ||||
| // but SigInt, SigTerm, etc are handled differently. | // but SigInt, SigTerm, etc are handled differently. | ||||
| static SignalDefs signalDefs[] = { | static SignalDefs signalDefs[] = { | ||||
| { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, | |||||
| { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, | |||||
| { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, | |||||
| { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, | |||||
| { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION), "SIGILL - Illegal instruction signal" }, | |||||
| { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow" }, | |||||
| { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal" }, | |||||
| { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error" }, | |||||
| }; | }; | ||||
| LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { | LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { | ||||
| else if( prop == TestCaseInfo::None ) | else if( prop == TestCaseInfo::None ) | ||||
| enforceNotReservedTag( tag, _lineInfo ); | enforceNotReservedTag( tag, _lineInfo ); | ||||
| // Merged hide tags like `[.approvals]` should be added as | |||||
| // `[.][approvals]`. The `[.]` is added at later point, so | |||||
| // we only strip the prefix | |||||
| if (startsWith(tag, '.') && tag.size() > 1) { | |||||
| tag.erase(0, 1); | |||||
| } | |||||
| tags.push_back( tag ); | tags.push_back( tag ); | ||||
| tag.clear(); | tag.clear(); | ||||
| inTag = false; | inTag = false; | ||||
| } | } | ||||
| Version const& libraryVersion() { | Version const& libraryVersion() { | ||||
| static Version version( 2, 7, 0, "", 0 ); | |||||
| static Version version( 2, 7, 1, "", 0 ); | |||||
| return version; | return version; | ||||
| } | } | ||||
| return std::string(buffer); | return std::string(buffer); | ||||
| } | } | ||||
| std::string serializeFilters( std::vector<std::string> const& container ) { | |||||
| ReusableStringStream oss; | |||||
| bool first = true; | |||||
| for (auto&& filter : container) | |||||
| { | |||||
| if (!first) | |||||
| oss << ' '; | |||||
| else | |||||
| first = false; | |||||
| oss << filter; | |||||
| } | |||||
| return oss.str(); | |||||
| } | |||||
| TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) | TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) | ||||
| :StreamingReporterBase(_config) {} | :StreamingReporterBase(_config) {} | ||||
| stream << std::endl; | stream << std::endl; | ||||
| StreamingReporterBase::testRunEnded(_testRunStats); | StreamingReporterBase::testRunEnded(_testRunStats); | ||||
| } | } | ||||
| void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) { | |||||
| StreamingReporterBase::testRunStarting(_testInfo); | |||||
| printTestFilters(); | |||||
| } | |||||
| void ConsoleReporter::lazyPrint() { | void ConsoleReporter::lazyPrint() { | ||||
| stream << getLineOfChars<'-'>() << '\n'; | stream << getLineOfChars<'-'>() << '\n'; | ||||
| } | } | ||||
| void ConsoleReporter::printTestFilters() { | |||||
| if (m_config->testSpec().hasFilters()) | |||||
| stream << Colour(Colour::BrightYellow) << "Filters: " << serializeFilters( m_config->getTestsOrTags() ) << '\n'; | |||||
| } | |||||
| CATCH_REGISTER_REPORTER("console", ConsoleReporter) | CATCH_REGISTER_REPORTER("console", ConsoleReporter) | ||||
| } // end namespace Catch | } // end namespace Catch | ||||
| void JunitReporter::testRunStarting( TestRunInfo const& runInfo ) { | void JunitReporter::testRunStarting( TestRunInfo const& runInfo ) { | ||||
| CumulativeReporterBase::testRunStarting( runInfo ); | CumulativeReporterBase::testRunStarting( runInfo ); | ||||
| xml.startElement( "testsuites" ); | xml.startElement( "testsuites" ); | ||||
| if ( m_config->hasTestFilters() || m_config->rngSeed() != 0 ) | |||||
| xml.startElement("properties"); | |||||
| if ( m_config->hasTestFilters() ) { | |||||
| xml.scopedElement( "property" ) | |||||
| .writeAttribute( "name" , "filters" ) | |||||
| .writeAttribute( "value" , serializeFilters( m_config->getTestsOrTags() ) ); | |||||
| } | |||||
| if( m_config->rngSeed() != 0 ) { | if( m_config->rngSeed() != 0 ) { | ||||
| xml.startElement( "properties" ); | |||||
| xml.scopedElement( "property" ) | xml.scopedElement( "property" ) | ||||
| .writeAttribute( "name", "random-seed" ) | .writeAttribute( "name", "random-seed" ) | ||||
| .writeAttribute( "value", m_config->rngSeed() ); | .writeAttribute( "value", m_config->rngSeed() ); | ||||
| m_xml.startElement( "Catch" ); | m_xml.startElement( "Catch" ); | ||||
| if( !m_config->name().empty() ) | if( !m_config->name().empty() ) | ||||
| m_xml.writeAttribute( "name", m_config->name() ); | m_xml.writeAttribute( "name", m_config->name() ); | ||||
| if (m_config->testSpec().hasFilters()) | |||||
| m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) ); | |||||
| if( m_config->rngSeed() != 0 ) | if( m_config->rngSeed() != 0 ) | ||||
| m_xml.scopedElement( "Randomness" ) | m_xml.scopedElement( "Randomness" ) | ||||
| .writeAttribute( "seed", m_config->rngSeed() ); | .writeAttribute( "seed", m_config->rngSeed() ); |