mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-26 23:36:11 +01:00
build 40
- Fixed endianness when converting numbers to hex strings - Added option to show invisibles (/t, /n) in printed strings with -i - moved toString() impls to impl file - avoid allocations for static strings used in reporter
This commit is contained in:
parent
31caba4f73
commit
aef6cd5332
@ -1,6 +1,6 @@
|
|||||||
![catch logo](catch-logo-small.png)
|
![catch logo](catch-logo-small.png)
|
||||||
|
|
||||||
*v1.0 build 39 (master branch)*
|
*v1.0 build 40 (master branch)*
|
||||||
|
|
||||||
Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch)
|
Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch)
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
// These numbers are maintained by a script
|
// These numbers are maintained by a script
|
||||||
Version libraryVersion( 1, 0, 39, "master" );
|
Version libraryVersion( 1, 0, 40, "master" );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
|
#endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* CATCH v1.0 build 39 (master branch)
|
* CATCH v1.0 build 40 (master branch)
|
||||||
* Generated: 2014-04-21 18:50:19.658444
|
* Generated: 2014-04-23 07:07:39.268798
|
||||||
* ----------------------------------------------------------
|
* ----------------------------------------------------------
|
||||||
* 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) 2012 Two Blue Cubes Ltd. All rights reserved.
|
* Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.
|
||||||
@ -576,8 +576,8 @@ private:
|
|||||||
// #included from: catch_expressionresult_builder.h
|
// #included from: catch_expressionresult_builder.h
|
||||||
#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED
|
#define TWOBLUECUBES_CATCH_ASSERTIONRESULT_BUILDER_H_INCLUDED
|
||||||
|
|
||||||
// #included from: catch_tostring.hpp
|
// #included from: catch_tostring.h
|
||||||
#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_TOSTRING_H_INCLUDED
|
||||||
|
|
||||||
// #included from: catch_sfinae.hpp
|
// #included from: catch_sfinae.hpp
|
||||||
#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_SFINAE_HPP_INCLUDED
|
||||||
@ -723,8 +723,21 @@ namespace Detail {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// For display purposes only.
|
struct Endianness {
|
||||||
// Does not consider endian-ness
|
enum Arch { Big, Little };
|
||||||
|
|
||||||
|
static Arch which() {
|
||||||
|
union {
|
||||||
|
int asInt;
|
||||||
|
char asChar[sizeof (int)];
|
||||||
|
};
|
||||||
|
|
||||||
|
asInt = 1;
|
||||||
|
return ( asChar[sizeof(int)-1] == 1 ) ? Big : Little;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Writes the raw memory into a string, considering endianness
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::string rawMemoryToString( T value ) {
|
std::string rawMemoryToString( T value ) {
|
||||||
union {
|
union {
|
||||||
@ -736,8 +749,14 @@ namespace Detail {
|
|||||||
|
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "0x";
|
oss << "0x";
|
||||||
for( unsigned char* cp = bytes; cp < bytes+sizeof(T); ++cp )
|
|
||||||
oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)*cp;
|
int i = 0, end = sizeof(T), inc = 1;
|
||||||
|
if( Endianness::which() == Endianness::Little ) {
|
||||||
|
i = end-1;
|
||||||
|
end = inc = -1;
|
||||||
|
}
|
||||||
|
for( ; i != end; i += inc )
|
||||||
|
oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)bytes[i];
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -785,7 +804,7 @@ struct StringMaker<std::vector<T, Allocator> > {
|
|||||||
|
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline std::string makeString( T const& value ) {
|
std::string makeString( T const& value ) {
|
||||||
return StringMaker<T>::convert( value );
|
return StringMaker<T>::convert( value );
|
||||||
}
|
}
|
||||||
} // end namespace Detail
|
} // end namespace Detail
|
||||||
@ -804,99 +823,27 @@ std::string toString( T const& value ) {
|
|||||||
|
|
||||||
// Built in overloads
|
// Built in overloads
|
||||||
|
|
||||||
inline std::string toString( std::string const& value ) {
|
std::string toString( std::string const& value );
|
||||||
return "\"" + value + "\"";
|
std::string toString( std::wstring const& value );
|
||||||
}
|
std::string toString( const char* const value );
|
||||||
|
std::string toString( char* const value );
|
||||||
inline std::string toString( std::wstring const& value ) {
|
std::string toString( int value );
|
||||||
std::ostringstream oss;
|
std::string toString( unsigned long value );
|
||||||
oss << "\"";
|
std::string toString( unsigned int value );
|
||||||
for(size_t i = 0; i < value.size(); ++i )
|
std::string toString( const double value );
|
||||||
oss << static_cast<char>( value[i] <= 0xff ? value[i] : '?');
|
std::string toString( bool value );
|
||||||
oss << "\"";
|
std::string toString( char value );
|
||||||
return oss.str();
|
std::string toString( signed char value );
|
||||||
}
|
std::string toString( unsigned char value );
|
||||||
|
|
||||||
inline std::string toString( const char* const value ) {
|
|
||||||
return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( char* const value ) {
|
|
||||||
return Catch::toString( static_cast<const char*>( value ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( int value ) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << value;
|
|
||||||
return oss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( unsigned long value ) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
if( value > 8192 )
|
|
||||||
oss << "0x" << std::hex << value;
|
|
||||||
else
|
|
||||||
oss << value;
|
|
||||||
return oss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( unsigned int value ) {
|
|
||||||
return toString( static_cast<unsigned long>( value ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( const double value ) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << std::setprecision( 10 )
|
|
||||||
<< std::fixed
|
|
||||||
<< value;
|
|
||||||
std::string d = oss.str();
|
|
||||||
std::size_t i = d.find_last_not_of( '0' );
|
|
||||||
if( i != std::string::npos && i != d.size()-1 ) {
|
|
||||||
if( d[i] == '.' )
|
|
||||||
i++;
|
|
||||||
d = d.substr( 0, i+1 );
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( bool value ) {
|
|
||||||
return value ? "true" : "false";
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( char value ) {
|
|
||||||
return value < ' '
|
|
||||||
? toString( static_cast<unsigned int>( value ) )
|
|
||||||
: Detail::makeString( value );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( signed char value ) {
|
|
||||||
return toString( static_cast<char>( value ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string toString( unsigned char value ) {
|
|
||||||
return toString( static_cast<char>( value ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
inline std::string toString( std::nullptr_t ) {
|
std::string toString( std::nullptr_t );
|
||||||
return "nullptr";
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __OBJC__
|
#ifdef __OBJC__
|
||||||
inline std::string toString( NSString const * const& nsstring ) {
|
std::string toString( NSString const * const& nsstring );
|
||||||
if( !nsstring )
|
std::string toString( NSString * CATCH_ARC_STRONG const& nsstring );
|
||||||
return "nil";
|
std::string toString( NSObject* const& nsObject );
|
||||||
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
|
||||||
}
|
|
||||||
inline std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
|
|
||||||
if( !nsstring )
|
|
||||||
return "nil";
|
|
||||||
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
|
||||||
}
|
|
||||||
inline std::string toString( NSObject* const& nsObject ) {
|
|
||||||
return toString( [nsObject description] );
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
@ -1575,6 +1522,7 @@ namespace Catch {
|
|||||||
virtual bool shouldDebugBreak() const = 0;
|
virtual bool shouldDebugBreak() const = 0;
|
||||||
virtual bool warnAboutMissingAssertions() const = 0;
|
virtual bool warnAboutMissingAssertions() const = 0;
|
||||||
virtual int abortAfter() const = 0;
|
virtual int abortAfter() const = 0;
|
||||||
|
virtual bool showInvisibles() const = 0;
|
||||||
virtual ShowDurations::OrNot showDurations() const = 0;
|
virtual ShowDurations::OrNot showDurations() const = 0;
|
||||||
virtual std::vector<TestCaseFilters> const& filters() const = 0;
|
virtual std::vector<TestCaseFilters> const& filters() const = 0;
|
||||||
};
|
};
|
||||||
@ -2925,6 +2873,7 @@ namespace Catch {
|
|||||||
shouldDebugBreak( false ),
|
shouldDebugBreak( false ),
|
||||||
noThrow( false ),
|
noThrow( false ),
|
||||||
showHelp( false ),
|
showHelp( false ),
|
||||||
|
showInvisibles( false ),
|
||||||
abortAfter( -1 ),
|
abortAfter( -1 ),
|
||||||
verbosity( Verbosity::Normal ),
|
verbosity( Verbosity::Normal ),
|
||||||
warnings( WarnAbout::Nothing ),
|
warnings( WarnAbout::Nothing ),
|
||||||
@ -2940,6 +2889,7 @@ namespace Catch {
|
|||||||
bool shouldDebugBreak;
|
bool shouldDebugBreak;
|
||||||
bool noThrow;
|
bool noThrow;
|
||||||
bool showHelp;
|
bool showHelp;
|
||||||
|
bool showInvisibles;
|
||||||
|
|
||||||
int abortAfter;
|
int abortAfter;
|
||||||
|
|
||||||
@ -3043,6 +2993,7 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool showHelp() const { return m_data.showHelp; }
|
bool showHelp() const { return m_data.showHelp; }
|
||||||
|
bool showInvisibles() const { return m_data.showInvisibles; }
|
||||||
|
|
||||||
// IConfig interface
|
// IConfig interface
|
||||||
virtual bool allowThrows() const { return !m_data.noThrow; }
|
virtual bool allowThrows() const { return !m_data.noThrow; }
|
||||||
@ -4002,6 +3953,10 @@ namespace Catch {
|
|||||||
.describe( "skip exception tests" )
|
.describe( "skip exception tests" )
|
||||||
.bind( &ConfigData::noThrow );
|
.bind( &ConfigData::noThrow );
|
||||||
|
|
||||||
|
cli["-i"]["--invisibles"]
|
||||||
|
.describe( "show invisibles (tabs, newlines)" )
|
||||||
|
.bind( &ConfigData::showInvisibles );
|
||||||
|
|
||||||
cli["-o"]["--out"]
|
cli["-o"]["--out"]
|
||||||
.describe( "output filename" )
|
.describe( "output filename" )
|
||||||
.bind( &ConfigData::outputFilename, "filename" );
|
.bind( &ConfigData::outputFilename, "filename" );
|
||||||
@ -6697,7 +6652,7 @@ namespace Catch {
|
|||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
// These numbers are maintained by a script
|
// These numbers are maintained by a script
|
||||||
Version libraryVersion( 1, 0, 39, "master" );
|
Version libraryVersion( 1, 0, 40, "master" );
|
||||||
}
|
}
|
||||||
|
|
||||||
// #included from: catch_message.hpp
|
// #included from: catch_message.hpp
|
||||||
@ -7096,6 +7051,122 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
#endif // Platform
|
#endif // Platform
|
||||||
|
|
||||||
|
// #included from: catch_tostring.hpp
|
||||||
|
#define TWOBLUECUBES_CATCH_TOSTRING_HPP_INCLUDED
|
||||||
|
|
||||||
|
namespace Catch {
|
||||||
|
|
||||||
|
std::string toString( std::string const& value ) {
|
||||||
|
std::string s = value;
|
||||||
|
if( getCurrentContext().getConfig()->showInvisibles() ) {
|
||||||
|
for(size_t i = 0; i < s.size(); ++i ) {
|
||||||
|
std::string subs;
|
||||||
|
switch( s[i] ) {
|
||||||
|
case '\n': subs = "\\n"; break;
|
||||||
|
case '\t': subs = "\\t"; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
if( !subs.empty() ) {
|
||||||
|
s = s.substr( 0, i ) + subs + s.substr( i+1 );
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "\"" + s + "\"";
|
||||||
|
}
|
||||||
|
std::string toString( std::wstring const& value ) {
|
||||||
|
|
||||||
|
std::string s;
|
||||||
|
s.reserve( value.size() );
|
||||||
|
for(size_t i = 0; i < value.size(); ++i )
|
||||||
|
s += value[i] <= 0xff ? static_cast<char>( value[i] ) : '?';
|
||||||
|
return toString( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( const char* const value ) {
|
||||||
|
return value ? Catch::toString( std::string( value ) ) : std::string( "{null string}" );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( char* const value ) {
|
||||||
|
return Catch::toString( static_cast<const char*>( value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( int value ) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << value;
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( unsigned long value ) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
if( value > 8192 )
|
||||||
|
oss << "0x" << std::hex << value;
|
||||||
|
else
|
||||||
|
oss << value;
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( unsigned int value ) {
|
||||||
|
return toString( static_cast<unsigned long>( value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( const double value ) {
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << std::setprecision( 10 )
|
||||||
|
<< std::fixed
|
||||||
|
<< value;
|
||||||
|
std::string d = oss.str();
|
||||||
|
std::size_t i = d.find_last_not_of( '0' );
|
||||||
|
if( i != std::string::npos && i != d.size()-1 ) {
|
||||||
|
if( d[i] == '.' )
|
||||||
|
i++;
|
||||||
|
d = d.substr( 0, i+1 );
|
||||||
|
}
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( bool value ) {
|
||||||
|
return value ? "true" : "false";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( char value ) {
|
||||||
|
return value < ' '
|
||||||
|
? toString( static_cast<unsigned int>( value ) )
|
||||||
|
: Detail::makeString( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( signed char value ) {
|
||||||
|
return toString( static_cast<char>( value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string toString( unsigned char value ) {
|
||||||
|
return toString( static_cast<char>( value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CATCH_CONFIG_CPP11_NULLPTR
|
||||||
|
std::string toString( std::nullptr_t ) {
|
||||||
|
return "nullptr";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __OBJC__
|
||||||
|
std::string toString( NSString const * const& nsstring ) {
|
||||||
|
if( !nsstring )
|
||||||
|
return "nil";
|
||||||
|
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
||||||
|
}
|
||||||
|
std::string toString( NSString * CATCH_ARC_STRONG const& nsstring ) {
|
||||||
|
if( !nsstring )
|
||||||
|
return "nil";
|
||||||
|
return std::string( "@\"" ) + [nsstring UTF8String] + "\"";
|
||||||
|
}
|
||||||
|
std::string toString( NSObject* const& nsObject ) {
|
||||||
|
return toString( [nsObject description] );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // end namespace Catch
|
||||||
|
|
||||||
// #included from: ../reporters/catch_reporter_xml.hpp
|
// #included from: ../reporters/catch_reporter_xml.hpp
|
||||||
#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_REPORTER_XML_HPP_INCLUDED
|
||||||
|
|
||||||
@ -8156,7 +8227,7 @@ namespace Catch {
|
|||||||
m_atLeastOneTestCasePrinted = true;
|
m_atLeastOneTestCasePrinted = true;
|
||||||
}
|
}
|
||||||
void lazyPrintRunInfo() {
|
void lazyPrintRunInfo() {
|
||||||
stream << "\n" << getTildes() << "\n";
|
stream << "\n" << getLineOfChars<'~'>() << "\n";
|
||||||
Colour colour( Colour::SecondaryText );
|
Colour colour( Colour::SecondaryText );
|
||||||
stream << currentTestRunInfo->name
|
stream << currentTestRunInfo->name
|
||||||
<< " is a Catch v" << libraryVersion.majorVersion << "."
|
<< " is a Catch v" << libraryVersion.majorVersion << "."
|
||||||
@ -8192,19 +8263,19 @@ namespace Catch {
|
|||||||
SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;
|
SourceLineInfo lineInfo = m_sectionStack.front().lineInfo;
|
||||||
|
|
||||||
if( !lineInfo.empty() ){
|
if( !lineInfo.empty() ){
|
||||||
stream << getDashes() << "\n";
|
stream << getLineOfChars<'-'>() << "\n";
|
||||||
Colour colourGuard( Colour::FileName );
|
Colour colourGuard( Colour::FileName );
|
||||||
stream << lineInfo << "\n";
|
stream << lineInfo << "\n";
|
||||||
}
|
}
|
||||||
stream << getDots() << "\n" << std::endl;
|
stream << getLineOfChars<'.'>() << "\n" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printClosedHeader( std::string const& _name ) {
|
void printClosedHeader( std::string const& _name ) {
|
||||||
printOpenHeader( _name );
|
printOpenHeader( _name );
|
||||||
stream << getDots() << "\n";
|
stream << getLineOfChars<'.'>() << "\n";
|
||||||
}
|
}
|
||||||
void printOpenHeader( std::string const& _name ) {
|
void printOpenHeader( std::string const& _name ) {
|
||||||
stream << getDashes() << "\n";
|
stream << getLineOfChars<'-'>() << "\n";
|
||||||
{
|
{
|
||||||
Colour colourGuard( Colour::Headers );
|
Colour colourGuard( Colour::Headers );
|
||||||
printHeaderString( _name );
|
printHeaderString( _name );
|
||||||
@ -8277,26 +8348,19 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printTotalsDivider() {
|
void printTotalsDivider() {
|
||||||
stream << getDoubleDashes() << "\n";
|
stream << getLineOfChars<'='>() << "\n";
|
||||||
}
|
}
|
||||||
void printSummaryDivider() {
|
void printSummaryDivider() {
|
||||||
stream << getDashes() << "\n";
|
stream << getLineOfChars<'-'>() << "\n";
|
||||||
}
|
}
|
||||||
static std::string const& getDashes() {
|
template<char C>
|
||||||
static const std::string dashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '-' );
|
static char const* getLineOfChars() {
|
||||||
return dashes;
|
static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
|
||||||
|
if( !*line ) {
|
||||||
|
memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );
|
||||||
|
line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;
|
||||||
}
|
}
|
||||||
static std::string const& getDots() {
|
return line;
|
||||||
static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '.' );
|
|
||||||
return dots;
|
|
||||||
}
|
|
||||||
static std::string const& getDoubleDashes() {
|
|
||||||
static const std::string doubleDashes( CATCH_CONFIG_CONSOLE_WIDTH-1, '=' );
|
|
||||||
return doubleDashes;
|
|
||||||
}
|
|
||||||
static std::string const& getTildes() {
|
|
||||||
static const std::string dots( CATCH_CONFIG_CONSOLE_WIDTH-1, '~' );
|
|
||||||
return dots;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user