| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | /* *  Created by Phil on 9/8/2017 *  Copyright 2017 Two Blue Cubes Ltd. All rights reserved. * *  Distributed under the Boost Software License, Version 1.0. (See accompanying *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */#ifndef TWOBLUECUBES_CATCH_CAPTURE_MATCHERS_HPP_INCLUDED#define TWOBLUECUBES_CATCH_CAPTURE_MATCHERS_HPP_INCLUDED#include "catch_capture.hpp"#include "catch_matchers.h"#include "catch_matchers_exception.hpp"#include "catch_matchers_floating.h"#include "catch_matchers_generic.hpp"#include "catch_matchers_string.h"#include "catch_matchers_vector.h"#include "catch_stringref.h"namespace Catch {    template<typename ArgT, typename MatcherT>    class MatchExpr : public ITransientExpression {        ArgT const& m_arg;        MatcherT m_matcher;        StringRef m_matcherString;    public:        MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString )        :   ITransientExpression{ true, matcher.match( arg ) },            m_arg( arg ),            m_matcher( matcher ),            m_matcherString( matcherString )        {}        void streamReconstructedExpression( std::ostream &os ) const override {            auto matcherAsString = m_matcher.toString();            os << Catch::Detail::stringify( m_arg ) << ' ';            if( matcherAsString == Detail::unprintableString )                os << m_matcherString;            else                os << matcherAsString;        }    };    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;    void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString  );    template<typename ArgT, typename MatcherT>    auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString  ) -> MatchExpr<ArgT, MatcherT> {        return MatchExpr<ArgT, MatcherT>( arg, matcher, matcherString );    }} // namespace Catch///////////////////////////////////////////////////////////////////////////////#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \    do { \        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \        INTERNAL_CATCH_TRY { \            catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \        } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \        INTERNAL_CATCH_REACT( catchAssertionHandler ) \    } while( false )///////////////////////////////////////////////////////////////////////////////#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \    do { \        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \        if( catchAssertionHandler.allowThrows() ) \            try { \                static_cast<void>(__VA_ARGS__ ); \                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \            } \            catch( exceptionType const& ex ) { \                catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \            } \            catch( ... ) { \                catchAssertionHandler.handleUnexpectedInflightException(); \            } \        else \            catchAssertionHandler.handleThrowingCallSkipped(); \        INTERNAL_CATCH_REACT( catchAssertionHandler ) \    } while( false )#endif // TWOBLUECUBES_CATCH_CAPTURE_MATCHERS_HPP_INCLUDED
 |