mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 04:07:10 +01:00 
			
		
		
		
	Regenerated single include
This commit is contained in:
		| @@ -2554,14 +2554,14 @@ namespace Catch | |||||||
| } // end namespace Catch | } // end namespace Catch | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined( CATCH_CONFIG_MAIN ) || defined( CATCH_CONFIG_RUNNER ) | #ifdef __OBJC__ | ||||||
| // #included from: catch_runner.hpp | // #included from: internal/catch_objc.hpp | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  *  catch_runner.hpp |  *  catch_objc.hpp | ||||||
|  *  Catch |  *  Catch | ||||||
|  * |  * | ||||||
|  *  Created by Phil on 31/10/2010. |  *  Created by Phil on 14/11/2010. | ||||||
|  *  Copyright 2010 Two Blue Cubes Ltd. All rights reserved. |  *  Copyright 2010 Two Blue Cubes Ltd. All rights reserved. | ||||||
|  * |  * | ||||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying |  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||||
| @@ -2569,104 +2569,15 @@ namespace Catch | |||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED | #define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED | ||||||
|  |  | ||||||
| // #included from: internal/catch_hub_impl.hpp | #import <objc/runtime.h> | ||||||
|  | #include <string> | ||||||
|  |  | ||||||
| /* | // NB. Any general catch headers included here must be included | ||||||
|  *  catch_hub_impl.hpp | // in catch.hpp first to make sure they are included by the single | ||||||
|  *  Catch | // header for non obj-usage | ||||||
|  * | // #included from: internal/catch_test_case_info.hpp | ||||||
|  *  Created by Phil on 31/12/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) |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| // #included from: catch_reporter_registry.hpp |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  *  catch_reporter_registry.hpp |  | ||||||
|  *  Catch |  | ||||||
|  * |  | ||||||
|  *  Created by Phil on 29/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) |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| #define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <map> |  | ||||||
|  |  | ||||||
| namespace Catch |  | ||||||
| { |  | ||||||
|     class ReporterRegistry : public IReporterRegistry |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         ~ReporterRegistry |  | ||||||
|         () |  | ||||||
|         { |  | ||||||
|             deleteAllValues( m_factories ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         virtual IReporter* create |  | ||||||
|         ( |  | ||||||
|             const std::string& name, |  | ||||||
|             const IReporterConfig& config |  | ||||||
|         ) |  | ||||||
|         const |  | ||||||
|         { |  | ||||||
|             FactoryMap::const_iterator it =  m_factories.find( name ); |  | ||||||
|             if( it == m_factories.end() ) |  | ||||||
|                 return NULL; |  | ||||||
|             return it->second->create( config ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         void registerReporter |  | ||||||
|         ( |  | ||||||
|             const std::string& name, |  | ||||||
|             IReporterFactory* factory |  | ||||||
|         ) |  | ||||||
|         { |  | ||||||
|             m_factories.insert( std::make_pair( name, factory ) ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         const FactoryMap& getFactories |  | ||||||
|         () |  | ||||||
|         const |  | ||||||
|         { |  | ||||||
|             return m_factories; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|     private: |  | ||||||
|         FactoryMap m_factories; |  | ||||||
|     }; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // #included from: catch_test_case_registry_impl.hpp |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  *  catch_test_case_registry_impl.hpp |  | ||||||
|  *  Catch |  | ||||||
|  * |  | ||||||
|  *  Created by Phil on 7/1/2011 |  | ||||||
|  *  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) |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| // #included from: catch_test_case_info.hpp |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  *  catch_test_case_info.hpp |  *  catch_test_case_info.hpp | ||||||
| @@ -2893,6 +2804,284 @@ namespace Catch | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | // This protocol is really only here for (self) documenting purposes, since | ||||||
|  | // all its methods are optional. | ||||||
|  | @protocol OcFixture | ||||||
|  |  | ||||||
|  | @optional | ||||||
|  |  | ||||||
|  | -(void) setUp; | ||||||
|  | -(void) tearDown; | ||||||
|  |  | ||||||
|  | @end | ||||||
|  |  | ||||||
|  | namespace Catch | ||||||
|  | { | ||||||
|  |     class OcMethod : public ITestCase | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         OcMethod | ||||||
|  |         ( | ||||||
|  |             Class cls, | ||||||
|  |             SEL sel | ||||||
|  |         ) | ||||||
|  |         :   m_cls( cls ), | ||||||
|  |             m_sel( sel ) | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         virtual void invoke | ||||||
|  |         () | ||||||
|  |         const | ||||||
|  |         { | ||||||
|  |             id obj = class_createInstance( m_cls, 0 ); | ||||||
|  |             obj = [obj init]; | ||||||
|  |  | ||||||
|  |             if( [obj respondsToSelector: @selector(setUp) ] ) | ||||||
|  |                 [obj performSelector: @selector(setUp)]; | ||||||
|  |  | ||||||
|  |             if( [obj respondsToSelector: m_sel] ) | ||||||
|  |                 [obj performSelector: m_sel]; | ||||||
|  |  | ||||||
|  |             if( [obj respondsToSelector: @selector(tearDown) ] ) | ||||||
|  |                 [obj performSelector: @selector(tearDown)]; | ||||||
|  |  | ||||||
|  |             [obj release]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         virtual ITestCase* clone | ||||||
|  |         () | ||||||
|  |         const | ||||||
|  |         { | ||||||
|  |             return new OcMethod( m_cls, m_sel ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         virtual bool operator == | ||||||
|  |         ( | ||||||
|  |             const ITestCase& other | ||||||
|  |         ) | ||||||
|  |         const | ||||||
|  |         { | ||||||
|  |             const OcMethod* ocmOther = dynamic_cast<const OcMethod*> ( &other ); | ||||||
|  |             return ocmOther && ocmOther->m_sel == m_sel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         virtual bool operator < | ||||||
|  |         ( | ||||||
|  |             const ITestCase& other | ||||||
|  |         ) | ||||||
|  |         const | ||||||
|  |         { | ||||||
|  |             const OcMethod* ocmOther = dynamic_cast<const OcMethod*> ( &other ); | ||||||
|  |             return ocmOther && ocmOther->m_sel < m_sel; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         Class m_cls; | ||||||
|  |         SEL m_sel; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     namespace Detail | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         inline bool startsWith | ||||||
|  |         ( | ||||||
|  |             const std::string& str, | ||||||
|  |             const std::string& sub | ||||||
|  |         ) | ||||||
|  |         { | ||||||
|  |             return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         inline const char* getAnnotation | ||||||
|  |         ( | ||||||
|  |             Class cls, | ||||||
|  |             const std::string& annotationName, | ||||||
|  |             const std::string& testCaseName | ||||||
|  |         ) | ||||||
|  |         { | ||||||
|  |             NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; | ||||||
|  |             SEL sel = NSSelectorFromString( selStr ); | ||||||
|  |             [selStr release]; | ||||||
|  |             if( [cls respondsToSelector: sel] ) | ||||||
|  |                 return (const char*)[cls performSelector: sel]; | ||||||
|  |             return ""; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /////////////////////////////////////////////////////////////////////////// | ||||||
|  |     inline size_t registerTestMethods | ||||||
|  |     () | ||||||
|  |     { | ||||||
|  |         size_t noTestMethods = 0; | ||||||
|  |         int noClasses = objc_getClassList( NULL, 0 ); | ||||||
|  |  | ||||||
|  |         std::vector<Class> classes( noClasses ); | ||||||
|  |         objc_getClassList( &classes[0], noClasses ); | ||||||
|  |  | ||||||
|  |         for( int c = 0; c < noClasses; c++ ) | ||||||
|  |         { | ||||||
|  |             Class cls = classes[c]; | ||||||
|  |             { | ||||||
|  |                 u_int count; | ||||||
|  |                 Method* methods = class_copyMethodList( cls, &count ); | ||||||
|  |                 for( int m = 0; m < count ; m++ ) | ||||||
|  |                 { | ||||||
|  |                     SEL selector = method_getName(methods[m]); | ||||||
|  |                     std::string methodName = sel_getName(selector); | ||||||
|  |                     if( Detail::startsWith( methodName, "Catch_TestCase_" ) ) | ||||||
|  |                     { | ||||||
|  |                         std::string testCaseName = methodName.substr( 15 ); | ||||||
|  |                         const char* name = Detail::getAnnotation( cls, "Name", testCaseName ); | ||||||
|  |                         const char* desc = Detail::getAnnotation( cls, "Description", testCaseName ); | ||||||
|  |  | ||||||
|  |                         Hub::getTestCaseRegistry().registerTest( TestCaseInfo( new OcMethod( cls, selector ), name, desc, "", 0 ) ); | ||||||
|  |                         noTestMethods++; | ||||||
|  |  | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 free(methods); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return noTestMethods; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /////////////////////////////////////////////////////////////////////////////// | ||||||
|  | #define OC_TEST_CASE( name, desc )\ | ||||||
|  | +(const char*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ | ||||||
|  | {\ | ||||||
|  | return name; \ | ||||||
|  | }\ | ||||||
|  | +(const char*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ | ||||||
|  | { \ | ||||||
|  | return desc; \ | ||||||
|  | } \ | ||||||
|  | -(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined( CATCH_CONFIG_MAIN ) || defined( CATCH_CONFIG_RUNNER ) | ||||||
|  | // #included from: catch_runner.hpp | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  catch_runner.hpp | ||||||
|  |  *  Catch | ||||||
|  |  * | ||||||
|  |  *  Created by Phil on 31/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) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define TWOBLUECUBES_CATCH_RUNNER_HPP_INCLUDED | ||||||
|  |  | ||||||
|  | // #included from: internal/catch_hub_impl.hpp | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  catch_hub_impl.hpp | ||||||
|  |  *  Catch | ||||||
|  |  * | ||||||
|  |  *  Created by Phil on 31/12/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) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | // #included from: catch_reporter_registry.hpp | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  catch_reporter_registry.hpp | ||||||
|  |  *  Catch | ||||||
|  |  * | ||||||
|  |  *  Created by Phil on 29/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) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | #define TWOBLUECUBES_CATCH_REPORTER_REGISTRY_HPP_INCLUDED | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <map> | ||||||
|  |  | ||||||
|  | namespace Catch | ||||||
|  | { | ||||||
|  |     class ReporterRegistry : public IReporterRegistry | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         ~ReporterRegistry | ||||||
|  |         () | ||||||
|  |         { | ||||||
|  |             deleteAllValues( m_factories ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         virtual IReporter* create | ||||||
|  |         ( | ||||||
|  |             const std::string& name, | ||||||
|  |             const IReporterConfig& config | ||||||
|  |         ) | ||||||
|  |         const | ||||||
|  |         { | ||||||
|  |             FactoryMap::const_iterator it =  m_factories.find( name ); | ||||||
|  |             if( it == m_factories.end() ) | ||||||
|  |                 return NULL; | ||||||
|  |             return it->second->create( config ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         void registerReporter | ||||||
|  |         ( | ||||||
|  |             const std::string& name, | ||||||
|  |             IReporterFactory* factory | ||||||
|  |         ) | ||||||
|  |         { | ||||||
|  |             m_factories.insert( std::make_pair( name, factory ) ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         const FactoryMap& getFactories | ||||||
|  |         () | ||||||
|  |         const | ||||||
|  |         { | ||||||
|  |             return m_factories; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         FactoryMap m_factories; | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // #included from: catch_test_case_registry_impl.hpp | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  catch_test_case_registry_impl.hpp | ||||||
|  |  *  Catch | ||||||
|  |  * | ||||||
|  |  *  Created by Phil on 7/1/2011 | ||||||
|  |  *  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) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <set> | #include <set> | ||||||
| #include <sstream> | #include <sstream> | ||||||
| @@ -5993,195 +6182,6 @@ int main (int argc, char * const argv[]) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef __OBJC__ |  | ||||||
| // #included from: internal/catch_objc.hpp |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  *  catch_objc.hpp |  | ||||||
|  *  Catch |  | ||||||
|  * |  | ||||||
|  *  Created by Phil on 14/11/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) |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #define TWOBLUECUBES_CATCH_OBJC_HPP_INCLUDED |  | ||||||
|  |  | ||||||
| #import <objc/runtime.h> |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| // NB. Any general catch headers included here must be included |  | ||||||
| // in catch.hpp first to make sure they are included by the single |  | ||||||
| // header for non obj-usage |  | ||||||
|  |  | ||||||
| /////////////////////////////////////////////////////////////////////////////// |  | ||||||
| // This protocol is really only here for (self) documenting purposes, since |  | ||||||
| // all its methods are optional. |  | ||||||
| @protocol OcFixture |  | ||||||
|  |  | ||||||
| @optional |  | ||||||
|  |  | ||||||
| -(void) setUp; |  | ||||||
| -(void) tearDown; |  | ||||||
|  |  | ||||||
| @end |  | ||||||
|  |  | ||||||
| namespace Catch |  | ||||||
| { |  | ||||||
|     class OcMethod : public ITestCase |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         OcMethod |  | ||||||
|         ( |  | ||||||
|             Class cls, |  | ||||||
|             SEL sel |  | ||||||
|         ) |  | ||||||
|         :   m_cls( cls ), |  | ||||||
|             m_sel( sel ) |  | ||||||
|         { |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         virtual void invoke |  | ||||||
|         () |  | ||||||
|         const |  | ||||||
|         { |  | ||||||
|             id obj = class_createInstance( m_cls, 0 ); |  | ||||||
|             obj = [obj init]; |  | ||||||
|  |  | ||||||
|             if( [obj respondsToSelector: @selector(setUp) ] ) |  | ||||||
|                 [obj performSelector: @selector(setUp)]; |  | ||||||
|  |  | ||||||
|             if( [obj respondsToSelector: m_sel] ) |  | ||||||
|                 [obj performSelector: m_sel]; |  | ||||||
|  |  | ||||||
|             if( [obj respondsToSelector: @selector(tearDown) ] ) |  | ||||||
|                 [obj performSelector: @selector(tearDown)]; |  | ||||||
|  |  | ||||||
|             [obj release]; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         virtual ITestCase* clone |  | ||||||
|         () |  | ||||||
|         const |  | ||||||
|         { |  | ||||||
|             return new OcMethod( m_cls, m_sel ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         virtual bool operator == |  | ||||||
|         ( |  | ||||||
|             const ITestCase& other |  | ||||||
|         ) |  | ||||||
|         const |  | ||||||
|         { |  | ||||||
|             const OcMethod* ocmOther = dynamic_cast<const OcMethod*> ( &other ); |  | ||||||
|             return ocmOther && ocmOther->m_sel == m_sel; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         virtual bool operator < |  | ||||||
|         ( |  | ||||||
|             const ITestCase& other |  | ||||||
|         ) |  | ||||||
|         const |  | ||||||
|         { |  | ||||||
|             const OcMethod* ocmOther = dynamic_cast<const OcMethod*> ( &other ); |  | ||||||
|             return ocmOther && ocmOther->m_sel < m_sel; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|     private: |  | ||||||
|         Class m_cls; |  | ||||||
|         SEL m_sel; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     namespace Detail |  | ||||||
|     { |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         inline bool startsWith |  | ||||||
|         ( |  | ||||||
|             const std::string& str, |  | ||||||
|             const std::string& sub |  | ||||||
|         ) |  | ||||||
|         { |  | ||||||
|             return str.length() > sub.length() && str.substr( 0, sub.length() ) == sub; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         /////////////////////////////////////////////////////////////////////// |  | ||||||
|         inline const char* getAnnotation |  | ||||||
|         ( |  | ||||||
|             Class cls, |  | ||||||
|             const std::string& annotationName, |  | ||||||
|             const std::string& testCaseName |  | ||||||
|         ) |  | ||||||
|         { |  | ||||||
|             NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; |  | ||||||
|             SEL sel = NSSelectorFromString( selStr ); |  | ||||||
|             [selStr release]; |  | ||||||
|             if( [cls respondsToSelector: sel] ) |  | ||||||
|                 return (const char*)[cls performSelector: sel]; |  | ||||||
|             return ""; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /////////////////////////////////////////////////////////////////////////// |  | ||||||
|     inline size_t registerTestMethods |  | ||||||
|     () |  | ||||||
|     { |  | ||||||
|         size_t noTestMethods = 0; |  | ||||||
|         int noClasses = objc_getClassList( NULL, 0 ); |  | ||||||
|  |  | ||||||
|         std::vector<Class> classes( noClasses ); |  | ||||||
|         objc_getClassList( &classes[0], noClasses ); |  | ||||||
|  |  | ||||||
|         for( int c = 0; c < noClasses; c++ ) |  | ||||||
|         { |  | ||||||
|             Class cls = classes[c]; |  | ||||||
|             { |  | ||||||
|                 u_int count; |  | ||||||
|                 Method* methods = class_copyMethodList( cls, &count ); |  | ||||||
|                 for( int m = 0; m < count ; m++ ) |  | ||||||
|                 { |  | ||||||
|                     SEL selector = method_getName(methods[m]); |  | ||||||
|                     std::string methodName = sel_getName(selector); |  | ||||||
|                     if( Detail::startsWith( methodName, "Catch_TestCase_" ) ) |  | ||||||
|                     { |  | ||||||
|                         std::string testCaseName = methodName.substr( 15 ); |  | ||||||
|                         const char* name = Detail::getAnnotation( cls, "Name", testCaseName ); |  | ||||||
|                         const char* desc = Detail::getAnnotation( cls, "Description", testCaseName ); |  | ||||||
|  |  | ||||||
|                         Hub::getTestCaseRegistry().registerTest( TestCaseInfo( new OcMethod( cls, selector ), name, desc, "", 0 ) ); |  | ||||||
|                         noTestMethods++; |  | ||||||
|  |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 free(methods); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return noTestMethods; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /////////////////////////////////////////////////////////////////////////////// |  | ||||||
| #define OC_TEST_CASE( name, desc )\ |  | ||||||
| +(const char*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Name_test ) \ |  | ||||||
| {\ |  | ||||||
| return name; \ |  | ||||||
| }\ |  | ||||||
| +(const char*) INTERNAL_CATCH_UNIQUE_NAME( Catch_Description_test ) \ |  | ||||||
| { \ |  | ||||||
| return desc; \ |  | ||||||
| } \ |  | ||||||
| -(void) INTERNAL_CATCH_UNIQUE_NAME( Catch_TestCase_test ) |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| ////// | ////// | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash