mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Use __COUNTER__ when generating unique names instead of __LINE__, if available.
Based on PR #351
This commit is contained in:
		| @@ -10,7 +10,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 ) | ||||||
|   | |||||||
| @@ -23,7 +23,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 | ||||||
| @@ -123,6 +123,14 @@ | |||||||
|  |  | ||||||
| #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 | ||||||
| @@ -196,6 +204,9 @@ | |||||||
| #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) | #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) | ||||||
| #   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS | #   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS | ||||||
|   | |||||||
| @@ -66,9 +66,11 @@ 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 ) | ||||||
|  |  | ||||||
| #endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED | #endif // TWOBLUECUBES_CATCH_INTERFACES_EXCEPTION_H_INCLUDED | ||||||
|   | |||||||
| @@ -85,24 +85,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, ... ) \ | ||||||
| @@ -110,24 +114,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 ) \ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash