From 966f5dbff281dc3200ba275308321c23d1215035 Mon Sep 17 00:00:00 2001 From: Phil Nash Date: Sun, 4 Mar 2012 21:18:46 +0000 Subject: [PATCH] Added initial built-in matchers for NSString (ObjC) --- include/internal/catch_capture.hpp | 59 ++++++------ include/internal/catch_objc.hpp | 89 ++++++++++++++++++- projects/SelfTest/TestMain.cpp | 2 +- .../XCode4/OCTest/OCTest/CatchOCTestCase.mm | 8 ++ 4 files changed, 122 insertions(+), 36 deletions(-) diff --git a/include/internal/catch_capture.hpp b/include/internal/catch_capture.hpp index 5cd41844..dbc1ffb6 100644 --- a/include/internal/catch_capture.hpp +++ b/include/internal/catch_capture.hpp @@ -53,6 +53,32 @@ namespace Detail return oss.str(); } + template + inline std::string makeString + ( + T* p + ) + { + if( !p ) + return INTERNAL_CATCH_STRINGIFY( NULL ); + std::ostringstream oss; + oss << p; + return oss.str(); + } + + template + inline std::string makeString + ( + const T* p + ) + { + if( !p ) + return INTERNAL_CATCH_STRINGIFY( NULL ); + std::ostringstream oss; + oss << p; + return oss.str(); + } + }// end namespace Detail /////////////////////////////////////////////////////////////////////////////// @@ -166,39 +192,6 @@ inline std::string toString { return value ? "true" : "false"; } - -/////////////////////////////////////////////////////////////////////////////// -inline std::string toString -( - void* p -) -{ - if( !p ) - return INTERNAL_CATCH_STRINGIFY( NULL ); - std::ostringstream oss; - oss << p; - return oss.str(); -} - -/////////////////////////////////////////////////////////////////////////////// -template -inline std::string toString -( - T* p -) -{ - return Catch::toString( static_cast( p ) ); -} - -/////////////////////////////////////////////////////////////////////////////// -template -inline std::string toString -( - const T* p -) -{ - return Catch::toString( static_cast( const_cast( p ) ) ); -} struct TestFailureException { diff --git a/include/internal/catch_objc.hpp b/include/internal/catch_objc.hpp index a2261788..a36d9555 100644 --- a/include/internal/catch_objc.hpp +++ b/include/internal/catch_objc.hpp @@ -171,8 +171,93 @@ namespace Catch } } return noTestMethods; - } -} + } + + template<> + inline std::string toString( NSString* const& nsstring ) + { + return std::string( "@\"" ) + [nsstring UTF8String] + "\""; + } + + namespace Matchers + { + namespace Impl + { + namespace NSStringMatchers + { + struct StringHolder + { + StringHolder( NSString* substr ) : m_substr( [substr copy] ){} + StringHolder() + { + [m_substr release]; + } + + NSString* m_substr; + }; + + struct Contains : StringHolder + { + Contains( NSString* substr ) : StringHolder( substr ){} + + bool operator()( NSString* str ) const + { + return [str rangeOfString:m_substr].location != NSNotFound; + } + + friend std::ostream& operator<<( std::ostream& os, const Contains& matcher ) + { + os << "contains: " << Catch::toString( matcher.m_substr ); + return os; + } + }; + + struct StartsWith : StringHolder + { + StartsWith( NSString* substr ) : StringHolder( substr ){} + + bool operator()( NSString* str ) const + { + return [str rangeOfString:m_substr].location == 0; + } + + friend std::ostream& operator<<( std::ostream& os, const StartsWith& matcher ) + { + os << "starts with: " << Catch::toString( matcher.m_substr ); + return os; + } + }; + struct EndsWith : StringHolder + { + EndsWith( NSString* substr ) : StringHolder( substr ){} + + bool operator()( NSString* str ) const + { + return [str rangeOfString:m_substr].location == [str length] - [m_substr length]; + } + + friend std::ostream& operator<<( std::ostream& os, const EndsWith& matcher ) + { + os << "ends with: " << Catch::toString( matcher.m_substr ); + return os; + } + }; + + } // namespace NSStringMatchers + } // namespace Impl + + inline Impl::NSStringMatchers::Contains + Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } + inline Impl::NSStringMatchers::StartsWith + StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } + inline Impl::NSStringMatchers::EndsWith + EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } + + } // namespace Matchers + + using namespace Matchers; + +} // namespace Catch /////////////////////////////////////////////////////////////////////////////// #define OC_TEST_CASE( name, desc )\ diff --git a/projects/SelfTest/TestMain.cpp b/projects/SelfTest/TestMain.cpp index 06956a58..c1ec34b7 100644 --- a/projects/SelfTest/TestMain.cpp +++ b/projects/SelfTest/TestMain.cpp @@ -32,7 +32,7 @@ TEST_CASE( "selftest/main", "Runs all Catch self tests and checks their results" MetaTestRunner::runMatching( "./succeeding/*", MetaTestRunner::Expected::ToSucceed ); } } - + /////////////////////////////////////////////////////////////////////////// SECTION( "selftest/test counts", "Number of test cases that run is fixed" ) diff --git a/projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm b/projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm index b07bf712..189903b2 100644 --- a/projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm +++ b/projects/XCode4/OCTest/OCTest/CatchOCTestCase.mm @@ -42,4 +42,12 @@ OC_TEST_CASE( "OCTest/test2", "This is another test case" ) REQUIRE( obj.int_val == 2 ); } +using namespace Catch::Matchers; +OC_TEST_CASE( "OCTest/matchers", "Matches work with OC types (NSString so far)" ) +{ + REQUIRE_THAT( @"This is a string", Contains( @"is a" ) ); + REQUIRE_THAT( @"This is a string", StartsWith( @"This" ) ); + REQUIRE_THAT( @"This is a string", EndsWith( @"string" ) ); +} + @end