mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			145 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| //              Copyright Catch2 Authors
 | |
| // Distributed under the Boost Software License, Version 1.0.
 | |
| //   (See accompanying file LICENSE_1_0.txt or copy at
 | |
| //        https://www.boost.org/LICENSE_1_0.txt)
 | |
| 
 | |
| // SPDX-License-Identifier: BSL-1.0
 | |
| #ifndef CATCH_MESSAGE_HPP_INCLUDED
 | |
| #define CATCH_MESSAGE_HPP_INCLUDED
 | |
| 
 | |
| #include <catch2/internal/catch_result_type.hpp>
 | |
| #include <catch2/internal/catch_stream.hpp>
 | |
| #include <catch2/internal/catch_stream_end_stop.hpp>
 | |
| #include <catch2/internal/catch_message_info.hpp>
 | |
| #include <catch2/interfaces/catch_interfaces_capture.hpp>
 | |
| #include <catch2/catch_tostring.hpp>
 | |
| 
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| namespace Catch {
 | |
| 
 | |
|     struct SourceLineInfo;
 | |
| 
 | |
|     struct MessageStream {
 | |
| 
 | |
|         template<typename T>
 | |
|         MessageStream& operator << ( T const& value ) {
 | |
|             m_stream << value;
 | |
|             return *this;
 | |
|         }
 | |
| 
 | |
|         ReusableStringStream m_stream;
 | |
|     };
 | |
| 
 | |
|     struct MessageBuilder : MessageStream {
 | |
|         MessageBuilder( StringRef const& macroName,
 | |
|                         SourceLineInfo const& lineInfo,
 | |
|                         ResultWas::OfType type );
 | |
| 
 | |
|         template<typename T>
 | |
|         MessageBuilder& operator << ( T const& value ) {
 | |
|             m_stream << value;
 | |
|             return *this;
 | |
|         }
 | |
| 
 | |
|         MessageInfo m_info;
 | |
|     };
 | |
| 
 | |
|     class ScopedMessage {
 | |
|     public:
 | |
|         explicit ScopedMessage( MessageBuilder const& builder );
 | |
|         ScopedMessage( ScopedMessage& duplicate ) = delete;
 | |
|         ScopedMessage( ScopedMessage&& old ) noexcept;
 | |
|         ~ScopedMessage();
 | |
| 
 | |
|         MessageInfo m_info;
 | |
|         bool m_moved = false;
 | |
|     };
 | |
| 
 | |
|     class Capturer {
 | |
|         std::vector<MessageInfo> m_messages;
 | |
|         IResultCapture& m_resultCapture = getResultCapture();
 | |
|         size_t m_captured = 0;
 | |
|     public:
 | |
|         Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names );
 | |
| 
 | |
|         Capturer(Capturer const&) = delete;
 | |
|         Capturer& operator=(Capturer const&) = delete;
 | |
| 
 | |
|         ~Capturer();
 | |
| 
 | |
|         void captureValue( size_t index, std::string const& value );
 | |
| 
 | |
|         template<typename T>
 | |
|         void captureValues( size_t index, T const& value ) {
 | |
|             captureValue( index, Catch::Detail::stringify( value ) );
 | |
|         }
 | |
| 
 | |
|         template<typename T, typename... Ts>
 | |
|         void captureValues( size_t index, T const& value, Ts const&... values ) {
 | |
|             captureValue( index, Catch::Detail::stringify(value) );
 | |
|             captureValues( index+1, values... );
 | |
|         }
 | |
|     };
 | |
| 
 | |
| } // end namespace Catch
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \
 | |
|     do { \
 | |
|         Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
 | |
|         catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
 | |
|         INTERNAL_CATCH_REACT( catchAssertionHandler ) \
 | |
|     } while( false )
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \
 | |
|     Catch::Capturer varName( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \
 | |
|     varName.captureValues( 0, __VA_ARGS__ )
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define INTERNAL_CATCH_INFO( macroName, log ) \
 | |
|     Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| #define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \
 | |
|     Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
 | |
| 
 | |
| 
 | |
| #if defined(CATCH_CONFIG_PREFIX_ALL) && !defined(CATCH_CONFIG_DISABLE)
 | |
| 
 | |
|   #define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
 | |
|   #define CATCH_UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "CATCH_UNSCOPED_INFO", msg )
 | |
|   #define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
 | |
|   #define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE", __VA_ARGS__ )
 | |
| 
 | |
| #elif defined(CATCH_CONFIG_PREFIX_ALL) && defined(CATCH_CONFIG_DISABLE)
 | |
| 
 | |
|   #define CATCH_INFO( msg )          (void)(0)
 | |
|   #define CATCH_UNSCOPED_INFO( msg ) (void)(0)
 | |
|   #define CATCH_WARN( msg )          (void)(0)
 | |
|   #define CATCH_CAPTURE( ... )       (void)(0)
 | |
| 
 | |
| #elif !defined(CATCH_CONFIG_PREFIX_ALL) && !defined(CATCH_CONFIG_DISABLE)
 | |
| 
 | |
|   #define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
 | |
|   #define UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "UNSCOPED_INFO", msg )
 | |
|   #define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
 | |
|   #define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE", __VA_ARGS__ )
 | |
| 
 | |
| #elif !defined(CATCH_CONFIG_PREFIX_ALL) && defined(CATCH_CONFIG_DISABLE)
 | |
| 
 | |
|   #define INFO( msg )          (void)(0)
 | |
|   #define UNSCOPED_INFO( msg ) (void)(0)
 | |
|   #define WARN( msg )          (void)(0)
 | |
|   #define CAPTURE( ... )       (void)(0)
 | |
| 
 | |
| #endif // end of user facing macro declarations
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| #endif // CATCH_MESSAGE_HPP_INCLUDED
 | 
