mirror of https://github.com/catchorg/Catch2.git
v1.6.1 build
This commit is contained in:
parent
81159838a5
commit
9a56609569
|
@ -1,6 +1,6 @@
|
||||||
![catch logo](catch-logo-small.png)
|
![catch logo](catch-logo-small.png)
|
||||||
|
|
||||||
*v1.6.0*
|
*v1.6.1*
|
||||||
|
|
||||||
Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.svg?branch=master)](https://travis-ci.org/philsquared/Catch)
|
Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.svg?branch=master)](https://travis-ci.org/philsquared/Catch)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,28 @@
|
||||||
# 1.6.0
|
# 1.6.1
|
||||||
|
|
||||||
|
### Features/ Changes:
|
||||||
|
* Catch now supports breaking into debugger on Linux
|
||||||
|
|
||||||
|
### Fixes:
|
||||||
|
* Generators no longer leak memory (generators are still unsupported in general)
|
||||||
|
* JUnit reporter now reports UTC timestamps, instead of "tbd"
|
||||||
|
* `CHECK_THAT` macro is now properly defined as `CATCH_CHECK_THAT` when using `CATCH_` prefixed macros
|
||||||
|
|
||||||
|
### Other:
|
||||||
|
* Types with overloaded `&&` operator are no longer evaluated twice when used in an assertion macro.
|
||||||
|
* The use of `__COUNTER__` is supressed when Catch is parsed by CLion
|
||||||
|
* This change is not active when compiling a binary
|
||||||
|
* Approval tests can now be run on Windows
|
||||||
|
* CMake will now warn if a file is present in the `include` folder but not is not enumerated as part of the project
|
||||||
|
* Catch now defines `NOMINMAX` and `WIN32_LEAN_AND_MEAN` before including `windows.h`
|
||||||
|
* This can be disabled if needed, see [documentation](docs/configuration.md) for details.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Older versions
|
||||||
|
Release notes were not maintained prior to v1.6.0, but you should be able to work them out from the Git history
|
||||||
|
|
||||||
|
## 1.6.0
|
||||||
|
|
||||||
### Cmake/ projects:
|
### Cmake/ projects:
|
||||||
* Moved CMakeLists.txt to root, made it friendlier for CLion and generating XCode and VS projects, and removed the manually maintained XCode and VS projects.
|
* Moved CMakeLists.txt to root, made it friendlier for CLion and generating XCode and VS projects, and removed the manually maintained XCode and VS projects.
|
||||||
|
@ -18,8 +42,6 @@
|
||||||
### Other:
|
### Other:
|
||||||
* Tweaks and changes to scripts - particularly for Approval test - to make them more portable
|
* Tweaks and changes to scripts - particularly for Approval test - to make them more portable
|
||||||
|
|
||||||
# Older versions
|
|
||||||
Release notes were not maintained prior to v1.6.0, but you should be able to work them out from the Git history
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace Catch {
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
Version libraryVersion( 1, 6, 0, "", 0 );
|
Version libraryVersion( 1, 6, 1, "", 0 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Catch v1.6.0
|
* Catch v1.6.1
|
||||||
* Generated: 2017-01-11 16:38:09.405017
|
* Generated: 2017-01-20 12:33:53.497767
|
||||||
* ----------------------------------------------------------
|
* ----------------------------------------------------------
|
||||||
* 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.
|
||||||
|
@ -266,7 +266,10 @@
|
||||||
#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11)
|
#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_NO_UNIQUE_PTR) && !defined(CATCH_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_NO_CPP11)
|
||||||
# define CATCH_CONFIG_CPP11_UNIQUE_PTR
|
# define CATCH_CONFIG_CPP11_UNIQUE_PTR
|
||||||
#endif
|
#endif
|
||||||
#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)
|
// Use of __COUNTER__ is suppressed if __JETBRAINS_IDE__ is #defined (meaning we're being parsed by a JetBrains IDE for
|
||||||
|
// analytics) because, at time of writing, __COUNTER__ is not properly handled by it.
|
||||||
|
// This does not affect compilation
|
||||||
|
#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) && !defined(__JETBRAINS_IDE__)
|
||||||
# define CATCH_CONFIG_COUNTER
|
# define CATCH_CONFIG_COUNTER
|
||||||
#endif
|
#endif
|
||||||
#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11)
|
#if defined(CATCH_INTERNAL_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_NO_SHUFFLE) && !defined(CATCH_CONFIG_CPP11_SHUFFLE) && !defined(CATCH_CONFIG_NO_CPP11)
|
||||||
|
@ -411,9 +414,8 @@ namespace Catch {
|
||||||
std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
|
std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );
|
||||||
|
|
||||||
// This is just here to avoid compiler warnings with macro constants and boolean literals
|
// This is just here to avoid compiler warnings with macro constants and boolean literals
|
||||||
inline bool isTrue( bool value ){ return value; }
|
inline bool alwaysTrue( std::size_t = 0 ) { return true; }
|
||||||
inline bool alwaysTrue() { return true; }
|
inline bool alwaysFalse( std::size_t = 0 ) { return false; }
|
||||||
inline bool alwaysFalse() { return false; }
|
|
||||||
|
|
||||||
void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );
|
void throwLogicError( std::string const& message, SourceLineInfo const& locationInfo );
|
||||||
|
|
||||||
|
@ -2008,8 +2010,16 @@ namespace Catch {
|
||||||
# define CATCH_PLATFORM_MAC
|
# define CATCH_PLATFORM_MAC
|
||||||
#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
|
#elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
|
||||||
# define CATCH_PLATFORM_IPHONE
|
# define CATCH_PLATFORM_IPHONE
|
||||||
|
#elif defined(linux) || defined(__linux) || defined(__linux__)
|
||||||
|
# define CATCH_PLATFORM_LINUX
|
||||||
#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
|
#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
|
||||||
# define CATCH_PLATFORM_WINDOWS
|
# define CATCH_PLATFORM_WINDOWS
|
||||||
|
# if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)
|
||||||
|
# define CATCH_DEFINES_NOMINMAX
|
||||||
|
# endif
|
||||||
|
# if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)
|
||||||
|
# define CATCH_DEFINES_WIN32_LEAN_AND_MEAN
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -2026,24 +2036,35 @@ namespace Catch{
|
||||||
// http://cocoawithlove.com/2008/03/break-into-debugger.html
|
// http://cocoawithlove.com/2008/03/break-into-debugger.html
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#if defined(__ppc64__) || defined(__ppc__)
|
#if defined(__ppc64__) || defined(__ppc__)
|
||||||
#define CATCH_BREAK_INTO_DEBUGGER() \
|
#define CATCH_TRAP() \
|
||||||
if( Catch::isDebuggerActive() ) { \
|
|
||||||
__asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
|
__asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" \
|
||||||
: : : "memory","r0","r3","r4" ); \
|
: : : "memory","r0","r3","r4" )
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) {__asm__("int $3\n" : : );}
|
#define CATCH_TRAP() _asm__("int $3\n" : : )
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#elif defined(CATCH_PLATFORM_LINUX)
|
||||||
|
// If we can use inline assembler, do it because this allows us to break
|
||||||
|
// directly at the location of the failing check instead of breaking inside
|
||||||
|
// raise() called from it, i.e. one stack frame below.
|
||||||
|
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
|
||||||
|
#define CATCH_TRAP() asm volatile ("int $3")
|
||||||
|
#else // Fall back to the generic way.
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#define CATCH_TRAP() raise(SIGTRAP)
|
||||||
|
#endif
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { __debugbreak(); }
|
#define CATCH_TRAP() __debugbreak()
|
||||||
#elif defined(__MINGW32__)
|
#elif defined(__MINGW32__)
|
||||||
extern "C" __declspec(dllimport) void __stdcall DebugBreak();
|
extern "C" __declspec(dllimport) void __stdcall DebugBreak();
|
||||||
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { DebugBreak(); }
|
#define CATCH_TRAP() DebugBreak()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CATCH_BREAK_INTO_DEBUGGER
|
#ifdef CATCH_TRAP
|
||||||
|
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); }
|
||||||
|
#else
|
||||||
#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();
|
#define CATCH_BREAK_INTO_DEBUGGER() Catch::alwaysTrue();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2080,7 +2101,7 @@ namespace Catch {
|
||||||
__catchResult.useActiveException( Catch::ResultDisposition::Normal ); \
|
__catchResult.useActiveException( Catch::ResultDisposition::Normal ); \
|
||||||
} \
|
} \
|
||||||
INTERNAL_CATCH_REACT( __catchResult ) \
|
INTERNAL_CATCH_REACT( __catchResult ) \
|
||||||
} while( Catch::isTrue( false && !!(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
|
} while( Catch::alwaysFalse( sizeof(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \
|
#define INTERNAL_CATCH_IF( expr, resultDisposition, macroName ) \
|
||||||
|
@ -6981,6 +7002,11 @@ namespace Catch {
|
||||||
Context( Context const& );
|
Context( Context const& );
|
||||||
void operator=( Context const& );
|
void operator=( Context const& );
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual ~Context() {
|
||||||
|
deleteAllValues( m_generatorsByTestName );
|
||||||
|
}
|
||||||
|
|
||||||
public: // IContext
|
public: // IContext
|
||||||
virtual IResultCapture* getResultCapture() {
|
virtual IResultCapture* getResultCapture() {
|
||||||
return m_resultCapture;
|
return m_resultCapture;
|
||||||
|
@ -7094,9 +7120,16 @@ namespace Catch {
|
||||||
|
|
||||||
#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////
|
#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef NOMINMAX
|
// #included from: catch_windows_h_proxy.h
|
||||||
|
|
||||||
|
#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef CATCH_DEFINES_NOMINMAX
|
||||||
# define NOMINMAX
|
# define NOMINMAX
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __AFXDLL
|
#ifdef __AFXDLL
|
||||||
#include <AfxWin.h>
|
#include <AfxWin.h>
|
||||||
|
@ -7104,6 +7137,13 @@ namespace Catch {
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CATCH_DEFINES_NOMINMAX
|
||||||
|
# undef NOMINMAX
|
||||||
|
#endif
|
||||||
|
#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN
|
||||||
|
# undef WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -7619,7 +7659,7 @@ namespace Catch {
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
Version libraryVersion( 1, 6, 0, "", 0 );
|
Version libraryVersion( 1, 6, 1, "", 0 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7790,7 +7830,6 @@ namespace Catch
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CATCH_PLATFORM_WINDOWS
|
#ifdef CATCH_PLATFORM_WINDOWS
|
||||||
#include <windows.h>
|
|
||||||
#else
|
#else
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -8030,6 +8069,33 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
} // namespace Catch
|
} // namespace Catch
|
||||||
|
|
||||||
|
#elif defined(CATCH_PLATFORM_LINUX)
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Catch{
|
||||||
|
// The standard POSIX way of detecting a debugger is to attempt to
|
||||||
|
// ptrace() the process, but this needs to be done from a child and not
|
||||||
|
// this process itself to still allow attaching to this process later
|
||||||
|
// if wanted, so is rather heavy. Under Linux we have the PID of the
|
||||||
|
// "debugger" (which doesn't need to be gdb, of course, it could also
|
||||||
|
// be strace, for example) in /proc/$PID/status, so just get it from
|
||||||
|
// there instead.
|
||||||
|
bool isDebuggerActive(){
|
||||||
|
std::ifstream in("/proc/self/status");
|
||||||
|
for( std::string line; std::getline(in, line); ) {
|
||||||
|
static const int PREFIX_LEN = 11;
|
||||||
|
if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) {
|
||||||
|
// We're traced if the PID is not 0 and no other PID starts
|
||||||
|
// with 0 digit, so it's enough to check for just a single
|
||||||
|
// character.
|
||||||
|
return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} // namespace Catch
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
|
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
@ -9390,6 +9456,35 @@ namespace Catch {
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::string getCurrentTimestamp() {
|
||||||
|
// Beware, this is not reentrant because of backward compatibility issues
|
||||||
|
// Also, UTC only, again because of backward compatibility (%z is C++11)
|
||||||
|
time_t rawtime;
|
||||||
|
std::time(&rawtime);
|
||||||
|
const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z");
|
||||||
|
|
||||||
|
#ifdef CATCH_PLATFORM_WINDOWS
|
||||||
|
std::tm timeInfo = {};
|
||||||
|
gmtime_s(&timeInfo, &rawtime);
|
||||||
|
#else
|
||||||
|
std::tm* timeInfo;
|
||||||
|
timeInfo = std::gmtime(&rawtime);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char timeStamp[timeStampSize];
|
||||||
|
const char * const fmt = "%Y-%m-%dT%H:%M:%SZ";
|
||||||
|
|
||||||
|
#ifdef CATCH_PLATFORM_WINDOWS
|
||||||
|
std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
|
||||||
|
#else
|
||||||
|
std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
|
||||||
|
#endif
|
||||||
|
return std::string(timeStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
class JunitReporter : public CumulativeReporterBase {
|
class JunitReporter : public CumulativeReporterBase {
|
||||||
public:
|
public:
|
||||||
JunitReporter( ReporterConfig const& _config )
|
JunitReporter( ReporterConfig const& _config )
|
||||||
|
@ -9454,7 +9549,7 @@ namespace Catch {
|
||||||
xml.writeAttribute( "time", "" );
|
xml.writeAttribute( "time", "" );
|
||||||
else
|
else
|
||||||
xml.writeAttribute( "time", suiteTime );
|
xml.writeAttribute( "time", suiteTime );
|
||||||
xml.writeAttribute( "timestamp", "tbd" ); // !TBD
|
xml.writeAttribute( "timestamp", getCurrentTimestamp() );
|
||||||
|
|
||||||
// Write test cases
|
// Write test cases
|
||||||
for( TestGroupNode::ChildNodes::const_iterator
|
for( TestGroupNode::ChildNodes::const_iterator
|
||||||
|
@ -10442,7 +10537,7 @@ int main (int argc, char * const argv[]) {
|
||||||
#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH" )
|
#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS( expr, Catch::ResultDisposition::ContinueOnFailure, matcher, "CATCH_CHECK_THROWS_WITH" )
|
||||||
#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" )
|
#define CATCH_CHECK_NOTHROW( expr ) INTERNAL_CATCH_NO_THROW( expr, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_NOTHROW" )
|
||||||
|
|
||||||
#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
|
#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::ContinueOnFailure, "CATCH_CHECK_THAT" )
|
||||||
#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
|
#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( arg, matcher, Catch::ResultDisposition::Normal, "CATCH_REQUIRE_THAT" )
|
||||||
|
|
||||||
#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
|
#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( msg, "CATCH_INFO" )
|
||||||
|
|
Loading…
Reference in New Issue