| /* |
| * Created by Phil on 18/10/2010. |
| * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. |
| * |
| * Distributed under the Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| #ifndef TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED |
| #define TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED |
| |
| #include "catch_common.h" |
| #include "catch_interfaces_testcase.h" |
| #include "internal/catch_compiler_capabilities.h" |
| |
| namespace Catch { |
| |
| template<typename C> |
| class MethodTestCase : public SharedImpl<ITestCase> { |
| |
| public: |
| MethodTestCase( void (C::*method)() ) : m_method( method ) {} |
| |
| virtual void invoke() const { |
| C obj; |
| (obj.*m_method)(); |
| } |
| |
| private: |
| virtual ~MethodTestCase() {} |
| |
| void (C::*m_method)(); |
| }; |
| |
| typedef void(*TestFunction)(); |
| |
| struct NameAndDesc { |
| NameAndDesc( const char* _name = "", const char* _description= "" ) |
| : name( _name ), description( _description ) |
| {} |
| |
| const char* name; |
| const char* description; |
| }; |
| |
| struct AutoReg { |
| |
| 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 ); |
| } |
| |
| void registerTestCase( ITestCase* testCase, |
| char const* className, |
| NameAndDesc const& nameAndDesc, |
| SourceLineInfo const& lineInfo ); |
| |
| ~AutoReg(); |
| |
| private: |
| AutoReg( AutoReg const& ); |
| void operator= ( AutoReg const& ); |
| }; |
| |
| } // end namespace Catch |
| |
| #ifdef CATCH_CONFIG_VARIADIC_MACROS |
| /////////////////////////////////////////////////////////////////////////////// |
| #define INTERNAL_CATCH_TESTCASE( ... ) \ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )(); \ |
| namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #define INTERNAL_CATCH_TESTCASE_NORETURN( ... ) \ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() CATCH_ATTRIBUTE_NORETURN; \ |
| namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( __VA_ARGS__ ) ); }\ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #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 TEST_CASE_METHOD( ClassName, ... )\ |
| namespace{ \ |
| struct INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ ) : ClassName{ \ |
| void test(); \ |
| }; \ |
| Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test, #ClassName, Catch::NameAndDesc( __VA_ARGS__ ), CATCH_INTERNAL_LINEINFO ); \ |
| } \ |
| void INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test() |
| |
| #else |
| /////////////////////////////////////////////////////////////////////////////// |
| #define INTERNAL_CATCH_TESTCASE( Name, Desc ) \ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )(); \ |
| namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #define INTERNAL_CATCH_TESTCASE_NORETURN( Name, Desc ) \ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() CATCH_ATTRIBUTE_NORETURN; \ |
| namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ ), CATCH_INTERNAL_LINEINFO, Catch::NameAndDesc( Name, Desc ) ); }\ |
| static void INTERNAL_CATCH_UNIQUE_NAME( TestCaseFunction_catch_internal_ )() |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #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 TEST_CASE_METHOD( ClassName, TestName, Desc )\ |
| namespace{ \ |
| struct INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ ) : ClassName{ \ |
| void test(); \ |
| }; \ |
| Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( &INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test, #ClassName, Catch::NameAndDesc( TestName, Desc ), CATCH_INTERNAL_LINEINFO ); \ |
| } \ |
| void INTERNAL_CATCH_UNIQUE_NAME( TestCaseMethod_catch_internal_ )::test() |
| |
| #endif |
| |
| #endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED |