Skip to content

Commit

Permalink
CAPTURE is now variadic
Browse files Browse the repository at this point in the history
  • Loading branch information
philsquared authored and horenmar committed Aug 19, 2018
1 parent 1a63fad commit 1cdaa48
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 4 deletions.
4 changes: 2 additions & 2 deletions include/catch.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@

#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg )
#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
#define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) )
#define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE",__VA_ARGS__ )

#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
Expand Down Expand Up @@ -190,7 +190,7 @@

#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg )
#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )
#define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) )
#define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE",__VA_ARGS__ )

#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
Expand Down
5 changes: 5 additions & 0 deletions include/internal/catch_capture.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
} while( false )

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \
auto varName = Catch::Capturer( 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 );
Expand Down
34 changes: 34 additions & 0 deletions include/internal/catch_message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#include "catch_interfaces_capture.h"
#include "catch_uncaught_exceptions.h"

#include <cassert>

namespace Catch {

MessageInfo::MessageInfo( StringRef const& _macroName,
Expand Down Expand Up @@ -55,4 +57,36 @@ namespace Catch {
getResultCapture().popScopedMessage(m_info);
}
}


Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {
auto start = std::string::npos;
for( size_t pos = 0; pos <= names.size(); ++pos ) {
char c = names[pos];
if( pos == names.size() || c == ' ' || c == '\t' || c == ',' || c == ']' ) {
if( start != std::string::npos ) {
m_messages.push_back( MessageInfo( macroName, lineInfo, resultType ) );
m_messages.back().message = names.substr( start, pos-start) + " := ";
start = std::string::npos;
}
}
else if( c != '[' && c != ']' && start == std::string::npos )
start = pos;
}
}
Capturer::~Capturer() {
if ( !uncaught_exceptions() ){
assert( m_captured == m_messages.size() );
for( size_t i = 0; i < m_captured; ++i )
m_resultCapture.popScopedMessage( m_messages[i] );
}
}

void Capturer::captureValue( size_t index, StringRef value ) {
assert( index < m_messages.size() );
m_messages[index].message += value;
m_resultCapture.pushScopedMessage( m_messages[index] );
m_captured++;
}

} // end namespace Catch
29 changes: 27 additions & 2 deletions include/internal/catch_message.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
#ifndef TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED
#define TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED

#include <string>
#include "catch_result_type.h"
#include "catch_common.h"
#include "catch_stream.h"
#include "catch_stringref.h"
#include "catch_interfaces_capture.h"
#include "catch_tostring.h"

#include <string>
#include <vector>

namespace Catch {

Expand Down Expand Up @@ -66,6 +69,28 @@ namespace Catch {
MessageInfo m_info;
};

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();

void captureValue( size_t index, StringRef value );

template<typename T>
void captureValues( size_t index, T&& value ) {
captureValue( index, Catch::Detail::stringify( value ) );
}

template<typename T, typename... Ts>
void captureValues( size_t index, T&& value, Ts&&... values ) {
captureValues( index, value );
captureValues( index+1, values... );
}
};

} // end namespace Catch

#endif // TWOBLUECUBES_CATCH_MESSAGE_H_INCLUDED

0 comments on commit 1cdaa48

Please sign in to comment.