mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-03 21:49:32 +01:00 
			
		
		
		
	Added support for manually registering test functions.
As discussed in #421
This commit is contained in:
		@@ -96,6 +96,7 @@
 | 
			
		||||
    #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
 | 
			
		||||
    #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
 | 
			
		||||
    #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
 | 
			
		||||
    #define CATCH_REGISTER_TEST_CASE( ... ) INTERNAL_CATCH_REGISTER_TESTCASE( __VA_ARGS__ )
 | 
			
		||||
    #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
 | 
			
		||||
    #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", __VA_ARGS__ )
 | 
			
		||||
    #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", __VA_ARGS__ )
 | 
			
		||||
@@ -103,6 +104,7 @@
 | 
			
		||||
    #define CATCH_TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
 | 
			
		||||
    #define CATCH_TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
 | 
			
		||||
    #define CATCH_METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
 | 
			
		||||
    #define CATCH_REGISTER_TEST_CASE( function, name, description ) INTERNAL_CATCH_REGISTER_TESTCASE( function, name, description )
 | 
			
		||||
    #define CATCH_SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
 | 
			
		||||
    #define CATCH_FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "CATCH_FAIL", msg )
 | 
			
		||||
    #define CATCH_SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "CATCH_SUCCEED", msg )
 | 
			
		||||
@@ -161,6 +163,7 @@
 | 
			
		||||
    #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )
 | 
			
		||||
    #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )
 | 
			
		||||
    #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )
 | 
			
		||||
    #define REGISTER_TEST_CASE( ... ) INTERNAL_CATCH_REGISTER_TESTCASE( __VA_ARGS__ )
 | 
			
		||||
    #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )
 | 
			
		||||
    #define FAIL( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", __VA_ARGS__ )
 | 
			
		||||
    #define SUCCEED( ... ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", __VA_ARGS__ )
 | 
			
		||||
@@ -168,6 +171,7 @@
 | 
			
		||||
    #define TEST_CASE( name, description ) INTERNAL_CATCH_TESTCASE( name, description )
 | 
			
		||||
    #define TEST_CASE_METHOD( className, name, description ) INTERNAL_CATCH_TEST_CASE_METHOD( className, name, description )
 | 
			
		||||
    #define METHOD_AS_TEST_CASE( method, name, description ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, name, description )
 | 
			
		||||
    #define REGISTER_TEST_CASE( ... ) INTERNAL_CATCH_REGISTER_TESTCASE( __VA_ARGS__ )
 | 
			
		||||
    #define SECTION( name, description ) INTERNAL_CATCH_SECTION( name, description )
 | 
			
		||||
    #define FAIL( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, "FAIL", msg )
 | 
			
		||||
    #define SUCCEED( msg ) INTERNAL_CATCH_MSG( Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, "SUCCEED", msg )
 | 
			
		||||
 
 | 
			
		||||
@@ -151,29 +151,38 @@ namespace Catch {
 | 
			
		||||
        return className;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void registerTestCase
 | 
			
		||||
        (   ITestCase* testCase,
 | 
			
		||||
            char const* classOrQualifiedMethodName,
 | 
			
		||||
            NameAndDesc const& nameAndDesc,
 | 
			
		||||
            SourceLineInfo const& lineInfo ) {
 | 
			
		||||
        
 | 
			
		||||
        getMutableRegistryHub().registerTest
 | 
			
		||||
            ( makeTestCase
 | 
			
		||||
                (   testCase,
 | 
			
		||||
                    extractClassName( classOrQualifiedMethodName ),
 | 
			
		||||
                    nameAndDesc.name,
 | 
			
		||||
                    nameAndDesc.description,
 | 
			
		||||
                    lineInfo ) );
 | 
			
		||||
    }
 | 
			
		||||
    void registerTestCaseFunction
 | 
			
		||||
        (   TestFunction function,
 | 
			
		||||
            SourceLineInfo const& lineInfo,
 | 
			
		||||
            NameAndDesc const& nameAndDesc ) {
 | 
			
		||||
        registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    ///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
    AutoReg::AutoReg(   TestFunction function,
 | 
			
		||||
                        SourceLineInfo const& lineInfo,
 | 
			
		||||
                        NameAndDesc const& nameAndDesc ) {
 | 
			
		||||
        registerTestCase( new FreeFunctionTestCase( function ), "", nameAndDesc, lineInfo );
 | 
			
		||||
    AutoReg::AutoReg
 | 
			
		||||
        (   TestFunction function,
 | 
			
		||||
            SourceLineInfo const& lineInfo,
 | 
			
		||||
            NameAndDesc const& nameAndDesc ) {
 | 
			
		||||
        registerTestCaseFunction( function, lineInfo, nameAndDesc );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    AutoReg::~AutoReg() {}
 | 
			
		||||
 | 
			
		||||
    void AutoReg::registerTestCase( ITestCase* testCase,
 | 
			
		||||
                                    char const* classOrQualifiedMethodName,
 | 
			
		||||
                                    NameAndDesc const& nameAndDesc,
 | 
			
		||||
                                    SourceLineInfo const& lineInfo ) {
 | 
			
		||||
 | 
			
		||||
        getMutableRegistryHub().registerTest
 | 
			
		||||
            ( makeTestCase( testCase,
 | 
			
		||||
                            extractClassName( classOrQualifiedMethodName ),
 | 
			
		||||
                            nameAndDesc.name,
 | 
			
		||||
                            nameAndDesc.description,
 | 
			
		||||
                            lineInfo ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
} // end namespace Catch
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,27 +42,32 @@ struct NameAndDesc {
 | 
			
		||||
    const char* description;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void registerTestCase
 | 
			
		||||
    (   ITestCase* testCase,
 | 
			
		||||
        char const* className,
 | 
			
		||||
        NameAndDesc const& nameAndDesc,
 | 
			
		||||
        SourceLineInfo const& lineInfo );
 | 
			
		||||
 | 
			
		||||
struct AutoReg {
 | 
			
		||||
 | 
			
		||||
    AutoReg(    TestFunction function,
 | 
			
		||||
                SourceLineInfo const& lineInfo,
 | 
			
		||||
                NameAndDesc const& nameAndDesc );
 | 
			
		||||
    AutoReg
 | 
			
		||||
        (   TestFunction function,
 | 
			
		||||
            SourceLineInfo const& lineInfo,
 | 
			
		||||
            NameAndDesc const& nameAndDesc );
 | 
			
		||||
 | 
			
		||||
    template<typename C>
 | 
			
		||||
    AutoReg(    void (C::*method)(),
 | 
			
		||||
                char const* className,
 | 
			
		||||
                NameAndDesc const& nameAndDesc,
 | 
			
		||||
                SourceLineInfo const& lineInfo ) {
 | 
			
		||||
        registerTestCase(   new MethodTestCase<C>( method ),
 | 
			
		||||
                            className,
 | 
			
		||||
                            nameAndDesc,
 | 
			
		||||
                            lineInfo );
 | 
			
		||||
    }
 | 
			
		||||
    AutoReg
 | 
			
		||||
        (   void (C::*method)(),
 | 
			
		||||
            char const* className,
 | 
			
		||||
            NameAndDesc const& nameAndDesc,
 | 
			
		||||
            SourceLineInfo const& lineInfo ) {
 | 
			
		||||
 | 
			
		||||
    void registerTestCase(  ITestCase* testCase,
 | 
			
		||||
                            char const* className,
 | 
			
		||||
                            NameAndDesc const& nameAndDesc,
 | 
			
		||||
                            SourceLineInfo const& lineInfo );
 | 
			
		||||
        registerTestCase
 | 
			
		||||
            (   new MethodTestCase<C>( method ),
 | 
			
		||||
                className,
 | 
			
		||||
                nameAndDesc,
 | 
			
		||||
                lineInfo );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~AutoReg();
 | 
			
		||||
 | 
			
		||||
@@ -71,6 +76,11 @@ private:
 | 
			
		||||
    void operator= ( AutoReg const& );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void registerTestCaseFunction
 | 
			
		||||
    (   TestFunction function,
 | 
			
		||||
        SourceLineInfo const& lineInfo,
 | 
			
		||||
        NameAndDesc const& nameAndDesc );
 | 
			
		||||
 | 
			
		||||
} // end namespace Catch
 | 
			
		||||
 | 
			
		||||
#ifdef CATCH_CONFIG_VARIADIC_MACROS
 | 
			
		||||
@@ -94,6 +104,10 @@ private:
 | 
			
		||||
        } \
 | 
			
		||||
        void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
 | 
			
		||||
 | 
			
		||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
 | 
			
		||||
        Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \
 | 
			
		||||
@@ -115,6 +129,9 @@ private:
 | 
			
		||||
        } \
 | 
			
		||||
        void INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )::test()
 | 
			
		||||
 | 
			
		||||
    ///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, Name, Desc ) \
 | 
			
		||||
        Catch::AutoReg( Function, CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user