mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 04:07:10 +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_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( 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_STRINGIFY( expr ) INTERNAL_CATCH_STRINGIFY2( expr ) | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| // CATCH_CONFIG_CPP11_OR_GREATER : Is C++11 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 | ||||
| // in configuration.md, too | ||||
| @@ -123,6 +123,14 @@ | ||||
|  | ||||
| #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 | ||||
| @@ -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) | ||||
| #   define CATCH_CONFIG_CPP11_UNIQUE_PTR | ||||
| #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 | ||||
|   | ||||
| @@ -66,9 +66,11 @@ namespace Catch { | ||||
| } | ||||
|  | ||||
| /////////////////////////////////////////////////////////////////////////////// | ||||
| #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) \ | ||||
|     static std::string INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator )( signature ); \ | ||||
|     namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ) ); }\ | ||||
|     static std::string INTERNAL_CATCH_UNIQUE_NAME(  catch_internal_ExceptionTranslator )( signature ) | ||||
| #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ | ||||
|     static std::string translatorName( signature ); \ | ||||
|     namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); }\ | ||||
|     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 | ||||
|   | ||||
| @@ -85,24 +85,28 @@ void registerTestCaseFunction | ||||
|  | ||||
| #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( ... ) \ | ||||
|         static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ | ||||
|         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____ )() | ||||
|         INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) | ||||
|  | ||||
|     /////////////////////////////////////////////////////////////////////////////// | ||||
|     #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 ); } | ||||
|  | ||||
|     /////////////////////////////////////////////////////////////////////////////// | ||||
|     #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... )\ | ||||
|     #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ | ||||
|         namespace{ \ | ||||
|             struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ | ||||
|             struct TestName : ClassName{ \ | ||||
|                 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, ... ) \ | ||||
| @@ -110,24 +114,28 @@ void registerTestCaseFunction | ||||
|  | ||||
| #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 ) \ | ||||
|         static void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )(); \ | ||||
|         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____ )() | ||||
|         INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), 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 ); } | ||||
|  | ||||
|     /////////////////////////////////////////////////////////////////////////////// | ||||
|     #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, TestName, Desc )\ | ||||
|     #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestCaseName, ClassName, TestName, Desc )\ | ||||
|         namespace{ \ | ||||
|             struct INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) : ClassName{ \ | ||||
|             struct TestCaseName : ClassName{ \ | ||||
|                 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 ) \ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash