updated to Catch v1.5.6
This commit is contained in:
parent
4ff27b207e
commit
8c48ef1f73
1 changed files with 301 additions and 151 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Catch v1.3.4
|
* Catch v1.5.6
|
||||||
* Generated: 2016-02-10 19:24:03.089683
|
* Generated: 2016-06-09 19:20:41.460328
|
||||||
* ----------------------------------------------------------
|
* ----------------------------------------------------------
|
||||||
* 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.
|
||||||
|
@ -62,7 +62,11 @@
|
||||||
|
|
||||||
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
|
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
|
||||||
#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
|
#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
|
||||||
#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
|
#ifdef CATCH_CONFIG_COUNTER
|
||||||
|
# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
|
||||||
|
#else
|
||||||
|
# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
|
||||||
|
#endif
|
||||||
|
|
||||||
#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
|
#define INTERNAL_CATCH_STRINGIFY2( expr ) #expr
|
||||||
#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
|
#define INTERNAL_CATCH_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr )
|
||||||
|
@ -89,7 +93,7 @@
|
||||||
// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
|
// CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 supported?
|
||||||
|
|
||||||
// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported?
|
// CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported?
|
||||||
|
// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?
|
||||||
// ****************
|
// ****************
|
||||||
// Note to maintainers: if new toggles are added please document them
|
// Note to maintainers: if new toggles are added please document them
|
||||||
// in configuration.md, too
|
// in configuration.md, too
|
||||||
|
@ -102,6 +106,18 @@
|
||||||
|
|
||||||
// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11
|
// All the C++11 features can be disabled with CATCH_CONFIG_NO_CPP11
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
# if __cplusplus >= 201103L
|
||||||
|
# define CATCH_CPP11_OR_GREATER
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if __cplusplus >= 201402L
|
||||||
|
# define CATCH_CPP14_OR_GREATER
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
|
|
||||||
# if __has_feature(cxx_nullptr)
|
# if __has_feature(cxx_nullptr)
|
||||||
|
@ -112,6 +128,10 @@
|
||||||
# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
|
# define CATCH_INTERNAL_CONFIG_CPP11_NOEXCEPT
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# if defined(CATCH_CPP11_OR_GREATER)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
|
||||||
|
# endif
|
||||||
|
|
||||||
#endif // __clang__
|
#endif // __clang__
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -136,9 +156,13 @@
|
||||||
// GCC
|
// GCC
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
|
||||||
#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
|
# if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
|
# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
|
# if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) && defined(CATCH_CPP11_OR_GREATER)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" )
|
||||||
|
# endif
|
||||||
|
|
||||||
// - otherwise more recent versions define __cplusplus >= 201103L
|
// - otherwise more recent versions define __cplusplus >= 201103L
|
||||||
// and will get picked up below
|
// and will get picked up below
|
||||||
|
@ -173,13 +197,20 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Use __COUNTER__ if the compiler supports it
|
||||||
|
#if ( defined _MSC_VER && _MSC_VER >= 1300 ) || \
|
||||||
|
( defined __GNUC__ && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 ) || \
|
||||||
|
( defined __clang__ && __clang_major__ >= 3 )
|
||||||
|
|
||||||
|
#define CATCH_INTERNAL_CONFIG_COUNTER
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// C++ language feature support
|
// C++ language feature support
|
||||||
|
|
||||||
// catch all support for C++11
|
// catch all support for C++11
|
||||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
#if defined(CATCH_CPP11_OR_GREATER)
|
||||||
|
|
||||||
# define CATCH_CPP11_OR_GREATER
|
|
||||||
|
|
||||||
# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR)
|
# if !defined(CATCH_INTERNAL_CONFIG_CPP11_NULLPTR)
|
||||||
# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
|
# define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR
|
||||||
|
@ -246,6 +277,13 @@
|
||||||
#if defined(CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR) && !defined(CATCH_CONFIG_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_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)
|
||||||
|
# define CATCH_CONFIG_COUNTER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
|
||||||
|
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
// noexcept support:
|
// noexcept support:
|
||||||
#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)
|
#if defined(CATCH_CONFIG_CPP11_NOEXCEPT) && !defined(CATCH_NOEXCEPT)
|
||||||
|
@ -672,24 +710,28 @@ void registerTestCaseFunction
|
||||||
|
|
||||||
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
#ifdef CATCH_CONFIG_VARIADIC_MACROS
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
|
||||||
|
static void TestName(); \
|
||||||
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\
|
||||||
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
#define INTERNAL_CATCH_TESTCASE( ... ) \
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \
|
INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\
|
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )()
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); }
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); }
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\
|
#define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
|
||||||
namespace{ \
|
namespace{ \
|
||||||
struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \
|
struct TestName : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestName::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \
|
||||||
} \
|
} \
|
||||||
void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
|
void TestName::test()
|
||||||
|
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \
|
||||||
|
INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
|
||||||
|
@ -697,24 +739,28 @@ void registerTestCaseFunction
|
||||||
|
|
||||||
#else
|
#else
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#define INTERNAL_CATCH_TESTCASE2( TestName, Name, Desc ) \
|
||||||
|
static void TestName(); \
|
||||||
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &TestName, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
|
||||||
|
static void TestName()
|
||||||
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
#define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \
|
INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), Name, Desc )
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\
|
|
||||||
static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )()
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, Name, Desc ) \
|
||||||
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); }
|
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &QualifiedMethod, "&" #QualifiedMethod, Catch::NameAndDesc( Name, Desc ), CATCH_INTERNAL_LINEINFO ); }
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\
|
#define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\
|
||||||
namespace{ \
|
namespace{ \
|
||||||
struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \
|
struct TestCaseName : ClassName{ \
|
||||||
void test(); \
|
void test(); \
|
||||||
}; \
|
}; \
|
||||||
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
|
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &TestCaseName::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \
|
||||||
} \
|
} \
|
||||||
void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
|
void TestCaseName::test()
|
||||||
|
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\
|
||||||
|
INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, TestName, Desc )
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
|
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
|
||||||
|
@ -1287,37 +1333,37 @@ namespace Internal {
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsEqualTo> {
|
struct Evaluator<T1, T2, IsEqualTo> {
|
||||||
static bool evaluate( T1 const& lhs, T2 const& rhs) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs) {
|
||||||
return opCast( lhs ) == opCast( rhs );
|
return bool( opCast( lhs ) == opCast( rhs ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsNotEqualTo> {
|
struct Evaluator<T1, T2, IsNotEqualTo> {
|
||||||
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return opCast( lhs ) != opCast( rhs );
|
return bool( opCast( lhs ) != opCast( rhs ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsLessThan> {
|
struct Evaluator<T1, T2, IsLessThan> {
|
||||||
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return opCast( lhs ) < opCast( rhs );
|
return bool( opCast( lhs ) < opCast( rhs ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsGreaterThan> {
|
struct Evaluator<T1, T2, IsGreaterThan> {
|
||||||
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return opCast( lhs ) > opCast( rhs );
|
return bool( opCast( lhs ) > opCast( rhs ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
|
struct Evaluator<T1, T2, IsGreaterThanOrEqualTo> {
|
||||||
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return opCast( lhs ) >= opCast( rhs );
|
return bool( opCast( lhs ) >= opCast( rhs ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
|
struct Evaluator<T1, T2, IsLessThanOrEqualTo> {
|
||||||
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
static bool evaluate( T1 const& lhs, T2 const& rhs ) {
|
||||||
return opCast( lhs ) <= opCast( rhs );
|
return bool( opCast( lhs ) <= opCast( rhs ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2020,13 +2066,14 @@ namespace Catch {
|
||||||
do { \
|
do { \
|
||||||
Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
|
Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #expr, resultDisposition ); \
|
||||||
try { \
|
try { \
|
||||||
|
CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
|
||||||
( __catchResult <= expr ).endExpression(); \
|
( __catchResult <= expr ).endExpression(); \
|
||||||
} \
|
} \
|
||||||
catch( ... ) { \
|
catch( ... ) { \
|
||||||
__catchResult.useActiveException( Catch::ResultDisposition::Normal ); \
|
__catchResult.useActiveException( Catch::ResultDisposition::Normal ); \
|
||||||
} \
|
} \
|
||||||
INTERNAL_CATCH_REACT( __catchResult ) \
|
INTERNAL_CATCH_REACT( __catchResult ) \
|
||||||
} while( Catch::isTrue( false && static_cast<bool>(expr) ) ) // expr here is never evaluated at runtime but it forces the compiler to give it a look
|
} while( Catch::isTrue( false && !!(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 ) \
|
||||||
|
@ -2563,10 +2610,12 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \
|
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
|
||||||
static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \
|
static std::string translatorName( signature ); \
|
||||||
namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\
|
namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\
|
||||||
static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature )
|
static std::string translatorName( signature )
|
||||||
|
|
||||||
|
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
|
||||||
|
|
||||||
// #included from: internal/catch_approx.hpp
|
// #included from: internal/catch_approx.hpp
|
||||||
#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
|
#define TWOBLUECUBES_CATCH_APPROX_HPP_INCLUDED
|
||||||
|
@ -3331,6 +3380,11 @@ namespace Catch {
|
||||||
InLexicographicalOrder,
|
InLexicographicalOrder,
|
||||||
InRandomOrder
|
InRandomOrder
|
||||||
}; };
|
}; };
|
||||||
|
struct UseColour { enum YesOrNo {
|
||||||
|
Auto,
|
||||||
|
Yes,
|
||||||
|
No
|
||||||
|
}; };
|
||||||
|
|
||||||
class TestSpec;
|
class TestSpec;
|
||||||
|
|
||||||
|
@ -3350,7 +3404,7 @@ namespace Catch {
|
||||||
virtual TestSpec const& testSpec() const = 0;
|
virtual TestSpec const& testSpec() const = 0;
|
||||||
virtual RunTests::InWhatOrder runOrder() const = 0;
|
virtual RunTests::InWhatOrder runOrder() const = 0;
|
||||||
virtual unsigned int rngSeed() const = 0;
|
virtual unsigned int rngSeed() const = 0;
|
||||||
virtual bool forceColour() const = 0;
|
virtual UseColour::YesOrNo useColour() const = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3404,7 +3458,7 @@ namespace Catch {
|
||||||
};
|
};
|
||||||
|
|
||||||
class DebugOutStream : public IStream {
|
class DebugOutStream : public IStream {
|
||||||
std::auto_ptr<StreamBufBase> m_streamBuf;
|
CATCH_AUTO_PTR( StreamBufBase ) m_streamBuf;
|
||||||
mutable std::ostream m_os;
|
mutable std::ostream m_os;
|
||||||
public:
|
public:
|
||||||
DebugOutStream();
|
DebugOutStream();
|
||||||
|
@ -3439,14 +3493,14 @@ namespace Catch {
|
||||||
noThrow( false ),
|
noThrow( false ),
|
||||||
showHelp( false ),
|
showHelp( false ),
|
||||||
showInvisibles( false ),
|
showInvisibles( false ),
|
||||||
forceColour( false ),
|
|
||||||
filenamesAsTags( false ),
|
filenamesAsTags( false ),
|
||||||
abortAfter( -1 ),
|
abortAfter( -1 ),
|
||||||
rngSeed( 0 ),
|
rngSeed( 0 ),
|
||||||
verbosity( Verbosity::Normal ),
|
verbosity( Verbosity::Normal ),
|
||||||
warnings( WarnAbout::Nothing ),
|
warnings( WarnAbout::Nothing ),
|
||||||
showDurations( ShowDurations::DefaultForReporter ),
|
showDurations( ShowDurations::DefaultForReporter ),
|
||||||
runOrder( RunTests::InDeclarationOrder )
|
runOrder( RunTests::InDeclarationOrder ),
|
||||||
|
useColour( UseColour::Auto )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
bool listTests;
|
bool listTests;
|
||||||
|
@ -3459,7 +3513,6 @@ namespace Catch {
|
||||||
bool noThrow;
|
bool noThrow;
|
||||||
bool showHelp;
|
bool showHelp;
|
||||||
bool showInvisibles;
|
bool showInvisibles;
|
||||||
bool forceColour;
|
|
||||||
bool filenamesAsTags;
|
bool filenamesAsTags;
|
||||||
|
|
||||||
int abortAfter;
|
int abortAfter;
|
||||||
|
@ -3469,6 +3522,7 @@ namespace Catch {
|
||||||
WarnAbout::What warnings;
|
WarnAbout::What warnings;
|
||||||
ShowDurations::OrNot showDurations;
|
ShowDurations::OrNot showDurations;
|
||||||
RunTests::InWhatOrder runOrder;
|
RunTests::InWhatOrder runOrder;
|
||||||
|
UseColour::YesOrNo useColour;
|
||||||
|
|
||||||
std::string outputFilename;
|
std::string outputFilename;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
@ -3534,7 +3588,7 @@ namespace Catch {
|
||||||
virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }
|
virtual ShowDurations::OrNot showDurations() const { return m_data.showDurations; }
|
||||||
virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; }
|
virtual RunTests::InWhatOrder runOrder() const { return m_data.runOrder; }
|
||||||
virtual unsigned int rngSeed() const { return m_data.rngSeed; }
|
virtual unsigned int rngSeed() const { return m_data.rngSeed; }
|
||||||
virtual bool forceColour() const { return m_data.forceColour; }
|
virtual UseColour::YesOrNo useColour() const { return m_data.useColour; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -3552,7 +3606,7 @@ namespace Catch {
|
||||||
}
|
}
|
||||||
ConfigData m_data;
|
ConfigData m_data;
|
||||||
|
|
||||||
std::auto_ptr<IStream const> m_stream;
|
CATCH_AUTO_PTR( IStream const ) m_stream;
|
||||||
TestSpec m_testSpec;
|
TestSpec m_testSpec;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3572,7 +3626,7 @@ namespace Catch {
|
||||||
#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
|
#define STITCH_CLARA_OPEN_NAMESPACE namespace Catch {
|
||||||
// #included from: ../external/clara.h
|
// #included from: ../external/clara.h
|
||||||
|
|
||||||
// Version 0.0.1.1
|
// Version 0.0.2.4
|
||||||
|
|
||||||
// Only use header guard if we are not using an outer namespace
|
// Only use header guard if we are not using an outer namespace
|
||||||
#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
|
#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OPEN_NAMESPACE)
|
||||||
|
@ -3888,6 +3942,10 @@ namespace Tbc {
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
|
||||||
|
#define CLARA_PLATFORM_WINDOWS
|
||||||
|
#endif
|
||||||
|
|
||||||
// Use optional outer namespace
|
// Use optional outer namespace
|
||||||
#ifdef STITCH_CLARA_OPEN_NAMESPACE
|
#ifdef STITCH_CLARA_OPEN_NAMESPACE
|
||||||
STITCH_CLARA_OPEN_NAMESPACE
|
STITCH_CLARA_OPEN_NAMESPACE
|
||||||
|
@ -3911,9 +3969,6 @@ namespace Clara {
|
||||||
const unsigned int consoleWidth = 80;
|
const unsigned int consoleWidth = 80;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use this to try and stop compiler from warning about unreachable code
|
|
||||||
inline bool isTrue( bool value ) { return value; }
|
|
||||||
|
|
||||||
using namespace Tbc;
|
using namespace Tbc;
|
||||||
|
|
||||||
inline bool startsWith( std::string const& str, std::string const& prefix ) {
|
inline bool startsWith( std::string const& str, std::string const& prefix ) {
|
||||||
|
@ -3949,14 +4004,6 @@ namespace Clara {
|
||||||
else
|
else
|
||||||
throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" );
|
throw std::runtime_error( "Expected a boolean value but did not recognise:\n '" + _source + "'" );
|
||||||
}
|
}
|
||||||
inline void convertInto( bool _source, bool& _dest ) {
|
|
||||||
_dest = _source;
|
|
||||||
}
|
|
||||||
template<typename T>
|
|
||||||
inline void convertInto( bool, T& ) {
|
|
||||||
if( isTrue( true ) )
|
|
||||||
throw std::runtime_error( "Invalid conversion" );
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ConfigT>
|
template<typename ConfigT>
|
||||||
struct IArgFunction {
|
struct IArgFunction {
|
||||||
|
@ -3966,7 +4013,6 @@ namespace Clara {
|
||||||
IArgFunction( IArgFunction const& ) = default;
|
IArgFunction( IArgFunction const& ) = default;
|
||||||
#endif
|
#endif
|
||||||
virtual void set( ConfigT& config, std::string const& value ) const = 0;
|
virtual void set( ConfigT& config, std::string const& value ) const = 0;
|
||||||
virtual void setFlag( ConfigT& config ) const = 0;
|
|
||||||
virtual bool takesArg() const = 0;
|
virtual bool takesArg() const = 0;
|
||||||
virtual IArgFunction* clone() const = 0;
|
virtual IArgFunction* clone() const = 0;
|
||||||
};
|
};
|
||||||
|
@ -3988,9 +4034,6 @@ namespace Clara {
|
||||||
void set( ConfigT& config, std::string const& value ) const {
|
void set( ConfigT& config, std::string const& value ) const {
|
||||||
functionObj->set( config, value );
|
functionObj->set( config, value );
|
||||||
}
|
}
|
||||||
void setFlag( ConfigT& config ) const {
|
|
||||||
functionObj->setFlag( config );
|
|
||||||
}
|
|
||||||
bool takesArg() const { return functionObj->takesArg(); }
|
bool takesArg() const { return functionObj->takesArg(); }
|
||||||
|
|
||||||
bool isSet() const {
|
bool isSet() const {
|
||||||
|
@ -4003,7 +4046,6 @@ namespace Clara {
|
||||||
template<typename C>
|
template<typename C>
|
||||||
struct NullBinder : IArgFunction<C>{
|
struct NullBinder : IArgFunction<C>{
|
||||||
virtual void set( C&, std::string const& ) const {}
|
virtual void set( C&, std::string const& ) const {}
|
||||||
virtual void setFlag( C& ) const {}
|
|
||||||
virtual bool takesArg() const { return true; }
|
virtual bool takesArg() const { return true; }
|
||||||
virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }
|
virtual IArgFunction<C>* clone() const { return new NullBinder( *this ); }
|
||||||
};
|
};
|
||||||
|
@ -4014,9 +4056,6 @@ namespace Clara {
|
||||||
virtual void set( C& p, std::string const& stringValue ) const {
|
virtual void set( C& p, std::string const& stringValue ) const {
|
||||||
convertInto( stringValue, p.*member );
|
convertInto( stringValue, p.*member );
|
||||||
}
|
}
|
||||||
virtual void setFlag( C& p ) const {
|
|
||||||
convertInto( true, p.*member );
|
|
||||||
}
|
|
||||||
virtual bool takesArg() const { return !IsBool<M>::value; }
|
virtual bool takesArg() const { return !IsBool<M>::value; }
|
||||||
virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }
|
virtual IArgFunction<C>* clone() const { return new BoundDataMember( *this ); }
|
||||||
M C::* member;
|
M C::* member;
|
||||||
|
@ -4029,11 +4068,6 @@ namespace Clara {
|
||||||
convertInto( stringValue, value );
|
convertInto( stringValue, value );
|
||||||
(p.*member)( value );
|
(p.*member)( value );
|
||||||
}
|
}
|
||||||
virtual void setFlag( C& p ) const {
|
|
||||||
typename RemoveConstRef<M>::type value;
|
|
||||||
convertInto( true, value );
|
|
||||||
(p.*member)( value );
|
|
||||||
}
|
|
||||||
virtual bool takesArg() const { return !IsBool<M>::value; }
|
virtual bool takesArg() const { return !IsBool<M>::value; }
|
||||||
virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }
|
virtual IArgFunction<C>* clone() const { return new BoundUnaryMethod( *this ); }
|
||||||
void (C::*member)( M );
|
void (C::*member)( M );
|
||||||
|
@ -4047,9 +4081,6 @@ namespace Clara {
|
||||||
if( value )
|
if( value )
|
||||||
(p.*member)();
|
(p.*member)();
|
||||||
}
|
}
|
||||||
virtual void setFlag( C& p ) const {
|
|
||||||
(p.*member)();
|
|
||||||
}
|
|
||||||
virtual bool takesArg() const { return false; }
|
virtual bool takesArg() const { return false; }
|
||||||
virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }
|
virtual IArgFunction<C>* clone() const { return new BoundNullaryMethod( *this ); }
|
||||||
void (C::*member)();
|
void (C::*member)();
|
||||||
|
@ -4064,9 +4095,6 @@ namespace Clara {
|
||||||
if( value )
|
if( value )
|
||||||
function( obj );
|
function( obj );
|
||||||
}
|
}
|
||||||
virtual void setFlag( C& p ) const {
|
|
||||||
function( p );
|
|
||||||
}
|
|
||||||
virtual bool takesArg() const { return false; }
|
virtual bool takesArg() const { return false; }
|
||||||
virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }
|
virtual IArgFunction<C>* clone() const { return new BoundUnaryFunction( *this ); }
|
||||||
void (*function)( C& );
|
void (*function)( C& );
|
||||||
|
@ -4080,11 +4108,6 @@ namespace Clara {
|
||||||
convertInto( stringValue, value );
|
convertInto( stringValue, value );
|
||||||
function( obj, value );
|
function( obj, value );
|
||||||
}
|
}
|
||||||
virtual void setFlag( C& obj ) const {
|
|
||||||
typename RemoveConstRef<T>::type value;
|
|
||||||
convertInto( true, value );
|
|
||||||
function( obj, value );
|
|
||||||
}
|
|
||||||
virtual bool takesArg() const { return !IsBool<T>::value; }
|
virtual bool takesArg() const { return !IsBool<T>::value; }
|
||||||
virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
|
virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
|
||||||
void (*function)( C&, T );
|
void (*function)( C&, T );
|
||||||
|
@ -4092,8 +4115,20 @@ namespace Clara {
|
||||||
|
|
||||||
} // namespace Detail
|
} // namespace Detail
|
||||||
|
|
||||||
struct Parser {
|
inline std::vector<std::string> argsToVector( int argc, char const* const* const argv ) {
|
||||||
Parser() : separators( " \t=:" ) {}
|
std::vector<std::string> args( static_cast<std::size_t>( argc ) );
|
||||||
|
for( std::size_t i = 0; i < static_cast<std::size_t>( argc ); ++i )
|
||||||
|
args[i] = argv[i];
|
||||||
|
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Parser {
|
||||||
|
enum Mode { None, MaybeShortOpt, SlashOpt, ShortOpt, LongOpt, Positional };
|
||||||
|
Mode mode;
|
||||||
|
std::size_t from;
|
||||||
|
bool inQuotes;
|
||||||
|
public:
|
||||||
|
|
||||||
struct Token {
|
struct Token {
|
||||||
enum Type { Positional, ShortOpt, LongOpt };
|
enum Type { Positional, ShortOpt, LongOpt };
|
||||||
|
@ -4102,38 +4137,75 @@ namespace Clara {
|
||||||
std::string data;
|
std::string data;
|
||||||
};
|
};
|
||||||
|
|
||||||
void parseIntoTokens( int argc, char const* const argv[], std::vector<Parser::Token>& tokens ) const {
|
Parser() : mode( None ), from( 0 ), inQuotes( false ){}
|
||||||
|
|
||||||
|
void parseIntoTokens( std::vector<std::string> const& args, std::vector<Token>& tokens ) {
|
||||||
const std::string doubleDash = "--";
|
const std::string doubleDash = "--";
|
||||||
for( int i = 1; i < argc && argv[i] != doubleDash; ++i )
|
for( std::size_t i = 1; i < args.size() && args[i] != doubleDash; ++i )
|
||||||
parseIntoTokens( argv[i] , tokens);
|
parseIntoTokens( args[i], tokens);
|
||||||
}
|
}
|
||||||
void parseIntoTokens( std::string arg, std::vector<Parser::Token>& tokens ) const {
|
|
||||||
while( !arg.empty() ) {
|
void parseIntoTokens( std::string const& arg, std::vector<Token>& tokens ) {
|
||||||
Parser::Token token( Parser::Token::Positional, arg );
|
for( std::size_t i = 0; i <= arg.size(); ++i ) {
|
||||||
arg = "";
|
char c = arg[i];
|
||||||
if( token.data[0] == '-' ) {
|
if( c == '"' )
|
||||||
if( token.data.size() > 1 && token.data[1] == '-' ) {
|
inQuotes = !inQuotes;
|
||||||
token = Parser::Token( Parser::Token::LongOpt, token.data.substr( 2 ) );
|
mode = handleMode( i, c, arg, tokens );
|
||||||
}
|
|
||||||
else {
|
|
||||||
token = Parser::Token( Parser::Token::ShortOpt, token.data.substr( 1 ) );
|
|
||||||
if( token.data.size() > 1 && separators.find( token.data[1] ) == std::string::npos ) {
|
|
||||||
arg = "-" + token.data.substr( 1 );
|
|
||||||
token.data = token.data.substr( 0, 1 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
Mode handleMode( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {
|
||||||
if( token.type != Parser::Token::Positional ) {
|
switch( mode ) {
|
||||||
std::size_t pos = token.data.find_first_of( separators );
|
case None: return handleNone( i, c );
|
||||||
if( pos != std::string::npos ) {
|
case MaybeShortOpt: return handleMaybeShortOpt( i, c );
|
||||||
arg = token.data.substr( pos+1 );
|
case ShortOpt:
|
||||||
token.data = token.data.substr( 0, pos );
|
case LongOpt:
|
||||||
|
case SlashOpt: return handleOpt( i, c, arg, tokens );
|
||||||
|
case Positional: return handlePositional( i, c, arg, tokens );
|
||||||
|
default: throw std::logic_error( "Unknown mode" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tokens.push_back( token );
|
|
||||||
|
Mode handleNone( std::size_t i, char c ) {
|
||||||
|
if( inQuotes ) {
|
||||||
|
from = i;
|
||||||
|
return Positional;
|
||||||
|
}
|
||||||
|
switch( c ) {
|
||||||
|
case '-': return MaybeShortOpt;
|
||||||
|
#ifdef CLARA_PLATFORM_WINDOWS
|
||||||
|
case '/': from = i+1; return SlashOpt;
|
||||||
|
#endif
|
||||||
|
default: from = i; return Positional;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::string separators;
|
Mode handleMaybeShortOpt( std::size_t i, char c ) {
|
||||||
|
switch( c ) {
|
||||||
|
case '-': from = i+1; return LongOpt;
|
||||||
|
default: from = i; return ShortOpt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Mode handleOpt( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {
|
||||||
|
if( std::string( ":=\0", 3 ).find( c ) == std::string::npos )
|
||||||
|
return mode;
|
||||||
|
|
||||||
|
std::string optName = arg.substr( from, i-from );
|
||||||
|
if( mode == ShortOpt )
|
||||||
|
for( std::size_t j = 0; j < optName.size(); ++j )
|
||||||
|
tokens.push_back( Token( Token::ShortOpt, optName.substr( j, 1 ) ) );
|
||||||
|
else if( mode == SlashOpt && optName.size() == 1 )
|
||||||
|
tokens.push_back( Token( Token::ShortOpt, optName ) );
|
||||||
|
else
|
||||||
|
tokens.push_back( Token( Token::LongOpt, optName ) );
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
Mode handlePositional( std::size_t i, char c, std::string const& arg, std::vector<Token>& tokens ) {
|
||||||
|
if( inQuotes || std::string( "\0", 1 ).find( c ) == std::string::npos )
|
||||||
|
return mode;
|
||||||
|
|
||||||
|
std::string data = arg.substr( from, i-from );
|
||||||
|
tokens.push_back( Token( Token::Positional, data ) );
|
||||||
|
return None;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename ConfigT>
|
template<typename ConfigT>
|
||||||
|
@ -4436,21 +4508,21 @@ namespace Clara {
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigT parse( int argc, char const* const argv[] ) const {
|
ConfigT parse( std::vector<std::string> const& args ) const {
|
||||||
ConfigT config;
|
ConfigT config;
|
||||||
parseInto( argc, argv, config );
|
parseInto( args, config );
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Parser::Token> parseInto( int argc, char const* argv[], ConfigT& config ) const {
|
std::vector<Parser::Token> parseInto( std::vector<std::string> const& args, ConfigT& config ) const {
|
||||||
std::string processName = argv[0];
|
std::string processName = args[0];
|
||||||
std::size_t lastSlash = processName.find_last_of( "/\\" );
|
std::size_t lastSlash = processName.find_last_of( "/\\" );
|
||||||
if( lastSlash != std::string::npos )
|
if( lastSlash != std::string::npos )
|
||||||
processName = processName.substr( lastSlash+1 );
|
processName = processName.substr( lastSlash+1 );
|
||||||
m_boundProcessName.set( config, processName );
|
m_boundProcessName.set( config, processName );
|
||||||
std::vector<Parser::Token> tokens;
|
std::vector<Parser::Token> tokens;
|
||||||
Parser parser;
|
Parser parser;
|
||||||
parser.parseIntoTokens( argc, argv, tokens );
|
parser.parseIntoTokens( args, tokens );
|
||||||
return populate( tokens, config );
|
return populate( tokens, config );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4481,7 +4553,7 @@ namespace Clara {
|
||||||
arg.boundField.set( config, tokens[++i].data );
|
arg.boundField.set( config, tokens[++i].data );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
arg.boundField.setFlag( config );
|
arg.boundField.set( config, "true" );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4624,6 +4696,21 @@ namespace Catch {
|
||||||
? ShowDurations::Always
|
? ShowDurations::Always
|
||||||
: ShowDurations::Never;
|
: ShowDurations::Never;
|
||||||
}
|
}
|
||||||
|
inline void setUseColour( ConfigData& config, std::string const& value ) {
|
||||||
|
std::string mode = toLower( value );
|
||||||
|
|
||||||
|
if( mode == "yes" )
|
||||||
|
config.useColour = UseColour::Yes;
|
||||||
|
else if( mode == "no" )
|
||||||
|
config.useColour = UseColour::No;
|
||||||
|
else if( mode == "auto" )
|
||||||
|
config.useColour = UseColour::Auto;
|
||||||
|
else
|
||||||
|
throw std::runtime_error( "colour mode must be one of: auto, yes or no" );
|
||||||
|
}
|
||||||
|
inline void forceColour( ConfigData& config ) {
|
||||||
|
config.useColour = UseColour::Yes;
|
||||||
|
}
|
||||||
inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) {
|
inline void loadTestNamesFromFile( ConfigData& config, std::string const& _filename ) {
|
||||||
std::ifstream f( _filename.c_str() );
|
std::ifstream f( _filename.c_str() );
|
||||||
if( !f.is_open() )
|
if( !f.is_open() )
|
||||||
|
@ -4710,7 +4797,7 @@ namespace Catch {
|
||||||
|
|
||||||
cli["-d"]["--durations"]
|
cli["-d"]["--durations"]
|
||||||
.describe( "show test durations" )
|
.describe( "show test durations" )
|
||||||
.bind( &setShowDurations, "yes/no" );
|
.bind( &setShowDurations, "yes|no" );
|
||||||
|
|
||||||
cli["-f"]["--input-file"]
|
cli["-f"]["--input-file"]
|
||||||
.describe( "load test names to run from a file" )
|
.describe( "load test names to run from a file" )
|
||||||
|
@ -4738,8 +4825,12 @@ namespace Catch {
|
||||||
.bind( &setRngSeed, "'time'|number" );
|
.bind( &setRngSeed, "'time'|number" );
|
||||||
|
|
||||||
cli["--force-colour"]
|
cli["--force-colour"]
|
||||||
.describe( "force colourised output" )
|
.describe( "force colourised output (deprecated)" )
|
||||||
.bind( &ConfigData::forceColour );
|
.bind( &forceColour );
|
||||||
|
|
||||||
|
cli["--use-colour"]
|
||||||
|
.describe( "should output be colourised" )
|
||||||
|
.bind( &setUseColour, "yes|no" );
|
||||||
|
|
||||||
return cli;
|
return cli;
|
||||||
}
|
}
|
||||||
|
@ -5170,6 +5261,8 @@ namespace Catch
|
||||||
bool aborting;
|
bool aborting;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MultipleReporters;
|
||||||
|
|
||||||
struct IStreamingReporter : IShared {
|
struct IStreamingReporter : IShared {
|
||||||
virtual ~IStreamingReporter();
|
virtual ~IStreamingReporter();
|
||||||
|
|
||||||
|
@ -5197,6 +5290,8 @@ namespace Catch
|
||||||
virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
|
virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;
|
||||||
|
|
||||||
virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
|
virtual void skipTest( TestCaseInfo const& testInfo ) = 0;
|
||||||
|
|
||||||
|
virtual MultipleReporters* tryAsMulti() { return CATCH_NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct IReporterFactory : IShared {
|
struct IReporterFactory : IShared {
|
||||||
|
@ -5414,6 +5509,10 @@ namespace TestCaseTracking {
|
||||||
virtual void addChild( Ptr<ITracker> const& child ) = 0;
|
virtual void addChild( Ptr<ITracker> const& child ) = 0;
|
||||||
virtual ITracker* findChild( std::string const& name ) = 0;
|
virtual ITracker* findChild( std::string const& name ) = 0;
|
||||||
virtual void openChild() = 0;
|
virtual void openChild() = 0;
|
||||||
|
|
||||||
|
// Debug/ checking
|
||||||
|
virtual bool isSectionTracker() const = 0;
|
||||||
|
virtual bool isIndexTracker() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TrackerContext {
|
class TrackerContext {
|
||||||
|
@ -5538,6 +5637,10 @@ namespace TestCaseTracking {
|
||||||
m_parent->openChild();
|
m_parent->openChild();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool isSectionTracker() const CATCH_OVERRIDE { return false; }
|
||||||
|
virtual bool isIndexTracker() const CATCH_OVERRIDE { return false; }
|
||||||
|
|
||||||
void open() {
|
void open() {
|
||||||
m_runState = Executing;
|
m_runState = Executing;
|
||||||
moveToThis();
|
moveToThis();
|
||||||
|
@ -5601,13 +5704,16 @@ namespace TestCaseTracking {
|
||||||
{}
|
{}
|
||||||
virtual ~SectionTracker();
|
virtual ~SectionTracker();
|
||||||
|
|
||||||
|
virtual bool isSectionTracker() const CATCH_OVERRIDE { return true; }
|
||||||
|
|
||||||
static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) {
|
static SectionTracker& acquire( TrackerContext& ctx, std::string const& name ) {
|
||||||
SectionTracker* section = CATCH_NULL;
|
SectionTracker* section = CATCH_NULL;
|
||||||
|
|
||||||
ITracker& currentTracker = ctx.currentTracker();
|
ITracker& currentTracker = ctx.currentTracker();
|
||||||
if( ITracker* childTracker = currentTracker.findChild( name ) ) {
|
if( ITracker* childTracker = currentTracker.findChild( name ) ) {
|
||||||
section = dynamic_cast<SectionTracker*>( childTracker );
|
assert( childTracker );
|
||||||
assert( section );
|
assert( childTracker->isSectionTracker() );
|
||||||
|
section = static_cast<SectionTracker*>( childTracker );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
section = new SectionTracker( name, ctx, ¤tTracker );
|
section = new SectionTracker( name, ctx, ¤tTracker );
|
||||||
|
@ -5632,13 +5738,16 @@ namespace TestCaseTracking {
|
||||||
{}
|
{}
|
||||||
virtual ~IndexTracker();
|
virtual ~IndexTracker();
|
||||||
|
|
||||||
|
virtual bool isIndexTracker() const CATCH_OVERRIDE { return true; }
|
||||||
|
|
||||||
static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) {
|
static IndexTracker& acquire( TrackerContext& ctx, std::string const& name, int size ) {
|
||||||
IndexTracker* tracker = CATCH_NULL;
|
IndexTracker* tracker = CATCH_NULL;
|
||||||
|
|
||||||
ITracker& currentTracker = ctx.currentTracker();
|
ITracker& currentTracker = ctx.currentTracker();
|
||||||
if( ITracker* childTracker = currentTracker.findChild( name ) ) {
|
if( ITracker* childTracker = currentTracker.findChild( name ) ) {
|
||||||
tracker = dynamic_cast<IndexTracker*>( childTracker );
|
assert( childTracker );
|
||||||
assert( tracker );
|
assert( childTracker->isIndexTracker() );
|
||||||
|
tracker = static_cast<IndexTracker*>( childTracker );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tracker = new IndexTracker( name, ctx, ¤tTracker, size );
|
tracker = new IndexTracker( name, ctx, ¤tTracker, size );
|
||||||
|
@ -5845,6 +5954,11 @@ namespace Catch {
|
||||||
while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
|
while( getCurrentContext().advanceGeneratorsForCurrentTest() && !aborting() );
|
||||||
|
|
||||||
Totals deltaTotals = m_totals.delta( prevTotals );
|
Totals deltaTotals = m_totals.delta( prevTotals );
|
||||||
|
if( testInfo.expectedToFail() && deltaTotals.testCases.passed > 0 ) {
|
||||||
|
deltaTotals.assertions.failed++;
|
||||||
|
deltaTotals.testCases.passed--;
|
||||||
|
deltaTotals.testCases.failed++;
|
||||||
|
}
|
||||||
m_totals.testCases += deltaTotals.testCases;
|
m_totals.testCases += deltaTotals.testCases;
|
||||||
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
m_reporter->testCaseEnded( TestCaseStats( testInfo,
|
||||||
deltaTotals,
|
deltaTotals,
|
||||||
|
@ -6236,10 +6350,10 @@ namespace Catch {
|
||||||
Catch::cout() << "For more detail usage please see the project docs\n" << std::endl;
|
Catch::cout() << "For more detail usage please see the project docs\n" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int applyCommandLine( int argc, char const* argv[], OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {
|
int applyCommandLine( int argc, char const* const* const argv, OnUnusedOptions::DoWhat unusedOptionBehaviour = OnUnusedOptions::Fail ) {
|
||||||
try {
|
try {
|
||||||
m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail );
|
m_cli.setThrowOnUnrecognisedTokens( unusedOptionBehaviour == OnUnusedOptions::Fail );
|
||||||
m_unusedTokens = m_cli.parseInto( argc, argv, m_configData );
|
m_unusedTokens = m_cli.parseInto( Clara::argsToVector( argc, argv ), m_configData );
|
||||||
if( m_configData.showHelp )
|
if( m_configData.showHelp )
|
||||||
showHelp( m_configData.processName );
|
showHelp( m_configData.processName );
|
||||||
m_config.reset();
|
m_config.reset();
|
||||||
|
@ -6263,16 +6377,13 @@ namespace Catch {
|
||||||
m_config.reset();
|
m_config.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
int run( int argc, char const* argv[] ) {
|
int run( int argc, char const* const* const argv ) {
|
||||||
|
|
||||||
int returnCode = applyCommandLine( argc, argv );
|
int returnCode = applyCommandLine( argc, argv );
|
||||||
if( returnCode == 0 )
|
if( returnCode == 0 )
|
||||||
returnCode = run();
|
returnCode = run();
|
||||||
return returnCode;
|
return returnCode;
|
||||||
}
|
}
|
||||||
int run( int argc, char* argv[] ) {
|
|
||||||
return run( argc, const_cast<char const**>( argv ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int run() {
|
int run() {
|
||||||
if( m_configData.showHelp )
|
if( m_configData.showHelp )
|
||||||
|
@ -6336,13 +6447,31 @@ namespace Catch {
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#ifdef CATCH_CPP14_OR_GREATER
|
||||||
|
#include <random>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Catch {
|
namespace Catch {
|
||||||
|
|
||||||
struct LexSort {
|
|
||||||
bool operator() (TestCase i,TestCase j) const { return (i<j);}
|
|
||||||
};
|
|
||||||
struct RandomNumberGenerator {
|
struct RandomNumberGenerator {
|
||||||
int operator()( int n ) const { return std::rand() % n; }
|
typedef int result_type;
|
||||||
|
|
||||||
|
result_type operator()( result_type n ) const { return std::rand() % n; }
|
||||||
|
|
||||||
|
#ifdef CATCH_CPP14_OR_GREATER
|
||||||
|
static constexpr result_type min() { return 0; }
|
||||||
|
static constexpr result_type max() { return 1000000; }
|
||||||
|
result_type operator()() const { return std::rand() % max(); }
|
||||||
|
#endif
|
||||||
|
template<typename V>
|
||||||
|
static void shuffle( V& vector ) {
|
||||||
|
RandomNumberGenerator rng;
|
||||||
|
#ifdef CATCH_CPP14_OR_GREATER
|
||||||
|
std::shuffle( vector.begin(), vector.end(), rng );
|
||||||
|
#else
|
||||||
|
std::random_shuffle( vector.begin(), vector.end(), rng );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
|
inline std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
|
||||||
|
@ -6351,14 +6480,12 @@ namespace Catch {
|
||||||
|
|
||||||
switch( config.runOrder() ) {
|
switch( config.runOrder() ) {
|
||||||
case RunTests::InLexicographicalOrder:
|
case RunTests::InLexicographicalOrder:
|
||||||
std::sort( sorted.begin(), sorted.end(), LexSort() );
|
std::sort( sorted.begin(), sorted.end() );
|
||||||
break;
|
break;
|
||||||
case RunTests::InRandomOrder:
|
case RunTests::InRandomOrder:
|
||||||
{
|
{
|
||||||
seedRng( config );
|
seedRng( config );
|
||||||
|
RandomNumberGenerator::shuffle( sorted );
|
||||||
RandomNumberGenerator rng;
|
|
||||||
std::random_shuffle( sorted.begin(), sorted.end(), rng );
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RunTests::InDeclarationOrder:
|
case RunTests::InDeclarationOrder:
|
||||||
|
@ -6377,13 +6504,15 @@ namespace Catch {
|
||||||
it != itEnd;
|
it != itEnd;
|
||||||
++it ) {
|
++it ) {
|
||||||
std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert( *it );
|
std::pair<std::set<TestCase>::const_iterator, bool> prev = seenFunctions.insert( *it );
|
||||||
if( !prev.second ){
|
if( !prev.second ) {
|
||||||
Catch::cerr()
|
std::ostringstream ss;
|
||||||
<< Colour( Colour::Red )
|
|
||||||
|
ss << Colour( Colour::Red )
|
||||||
<< "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n"
|
<< "error: TEST_CASE( \"" << it->name << "\" ) already defined.\n"
|
||||||
<< "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n"
|
<< "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n"
|
||||||
<< "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl;
|
<< "\tRedefined at " << it->getTestCaseInfo().lineInfo << std::endl;
|
||||||
exit(1);
|
|
||||||
|
throw std::runtime_error(ss.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6971,7 +7100,18 @@ namespace {
|
||||||
|
|
||||||
IColourImpl* platformColourInstance() {
|
IColourImpl* platformColourInstance() {
|
||||||
static Win32ColourImpl s_instance;
|
static Win32ColourImpl s_instance;
|
||||||
return &s_instance;
|
|
||||||
|
Ptr<IConfig const> config = getCurrentContext().getConfig();
|
||||||
|
UseColour::YesOrNo colourMode = config
|
||||||
|
? config->useColour()
|
||||||
|
: UseColour::Auto;
|
||||||
|
if( colourMode == UseColour::Auto )
|
||||||
|
colourMode = !isDebuggerActive()
|
||||||
|
? UseColour::Yes
|
||||||
|
: UseColour::No;
|
||||||
|
return colourMode == UseColour::Yes
|
||||||
|
? &s_instance
|
||||||
|
: NoColourImpl::instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end anon namespace
|
} // end anon namespace
|
||||||
|
@ -7022,7 +7162,14 @@ namespace {
|
||||||
|
|
||||||
IColourImpl* platformColourInstance() {
|
IColourImpl* platformColourInstance() {
|
||||||
Ptr<IConfig const> config = getCurrentContext().getConfig();
|
Ptr<IConfig const> config = getCurrentContext().getConfig();
|
||||||
return (config && config->forceColour()) || isatty(STDOUT_FILENO)
|
UseColour::YesOrNo colourMode = config
|
||||||
|
? config->useColour()
|
||||||
|
: UseColour::Auto;
|
||||||
|
if( colourMode == UseColour::Auto )
|
||||||
|
colourMode = (!isDebuggerActive() && isatty(STDOUT_FILENO) )
|
||||||
|
? UseColour::Yes
|
||||||
|
: UseColour::No;
|
||||||
|
return colourMode == UseColour::Yes
|
||||||
? PosixColourImpl::instance()
|
? PosixColourImpl::instance()
|
||||||
: NoColourImpl::instance();
|
: NoColourImpl::instance();
|
||||||
}
|
}
|
||||||
|
@ -7047,9 +7194,7 @@ namespace Catch {
|
||||||
Colour::~Colour(){ if( !m_moved ) use( None ); }
|
Colour::~Colour(){ if( !m_moved ) use( None ); }
|
||||||
|
|
||||||
void Colour::use( Code _colourCode ) {
|
void Colour::use( Code _colourCode ) {
|
||||||
static IColourImpl* impl = isDebuggerActive()
|
static IColourImpl* impl = platformColourInstance();
|
||||||
? NoColourImpl::instance()
|
|
||||||
: platformColourInstance();
|
|
||||||
impl->use( _colourCode );
|
impl->use( _colourCode );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7426,7 +7571,7 @@ namespace Catch {
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
Version libraryVersion( 1, 3, 4, "", 0 );
|
Version libraryVersion( 1, 5, 6, "", 0 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8405,13 +8550,18 @@ public: // IStreamingReporter
|
||||||
++it )
|
++it )
|
||||||
(*it)->skipTest( testInfo );
|
(*it)->skipTest( testInfo );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual MultipleReporters* tryAsMulti() CATCH_OVERRIDE {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ) {
|
Ptr<IStreamingReporter> addReporter( Ptr<IStreamingReporter> const& existingReporter, Ptr<IStreamingReporter> const& additionalReporter ) {
|
||||||
Ptr<IStreamingReporter> resultingReporter;
|
Ptr<IStreamingReporter> resultingReporter;
|
||||||
|
|
||||||
if( existingReporter ) {
|
if( existingReporter ) {
|
||||||
MultipleReporters* multi = dynamic_cast<MultipleReporters*>( existingReporter.get() );
|
MultipleReporters* multi = existingReporter->tryAsMulti();
|
||||||
if( !multi ) {
|
if( !multi ) {
|
||||||
multi = new MultipleReporters;
|
multi = new MultipleReporters;
|
||||||
resultingReporter = Ptr<IStreamingReporter>( multi );
|
resultingReporter = Ptr<IStreamingReporter>( multi );
|
||||||
|
@ -8591,7 +8741,7 @@ namespace Catch {
|
||||||
|
|
||||||
virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}
|
virtual void assertionStarting( AssertionInfo const& ) CATCH_OVERRIDE {}
|
||||||
|
|
||||||
virtual bool assertionEnded( AssertionStats const& assertionStats ) {
|
virtual bool assertionEnded( AssertionStats const& assertionStats ) CATCH_OVERRIDE {
|
||||||
assert( !m_sectionStack.empty() );
|
assert( !m_sectionStack.empty() );
|
||||||
SectionNode& sectionNode = *m_sectionStack.back();
|
SectionNode& sectionNode = *m_sectionStack.back();
|
||||||
sectionNode.assertions.push_back( assertionStats );
|
sectionNode.assertions.push_back( assertionStats );
|
||||||
|
@ -9722,7 +9872,7 @@ namespace Catch {
|
||||||
if( totals.testCases.total() == 0 ) {
|
if( totals.testCases.total() == 0 ) {
|
||||||
stream << Colour( Colour::Warning ) << "No tests ran\n";
|
stream << Colour( Colour::Warning ) << "No tests ran\n";
|
||||||
}
|
}
|
||||||
else if( totals.assertions.total() > 0 && totals.assertions.allPassed() ) {
|
else if( totals.assertions.total() > 0 && totals.testCases.allPassed() ) {
|
||||||
stream << Colour( Colour::ResultSuccess ) << "All tests passed";
|
stream << Colour( Colour::ResultSuccess ) << "All tests passed";
|
||||||
stream << " ("
|
stream << " ("
|
||||||
<< pluralise( totals.assertions.passed, "assertion" ) << " in "
|
<< pluralise( totals.assertions.passed, "assertion" ) << " in "
|
||||||
|
|
Loading…
Reference in a new issue