diff --git a/README.md b/README.md index dba8e0c2..14a391d0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![catch logo](catch-logo-small.png) -*v1.0 build 23 (master branch)* +*v1.0 build 25 (master branch)* Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch) diff --git a/include/internal/catch_debugger.hpp b/include/internal/catch_debugger.hpp index 0223e58f..fe0fc8a0 100644 --- a/include/internal/catch_debugger.hpp +++ b/include/internal/catch_debugger.hpp @@ -30,7 +30,6 @@ // running under the debugger or has a debugger attached post facto). INTERNAL_CATCH_INLINE bool isDebuggerActive(){ - int junk; int mib[4]; struct kinfo_proc info; size_t size; @@ -51,8 +50,10 @@ // Call sysctl. size = sizeof(info); - junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); - assert(junk == 0); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { + std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } // We're being debugged if the P_TRACED flag is set. diff --git a/include/internal/catch_tostring.hpp b/include/internal/catch_tostring.hpp index 5e098aa6..c081e944 100644 --- a/include/internal/catch_tostring.hpp +++ b/include/internal/catch_tostring.hpp @@ -79,6 +79,24 @@ namespace Detail { } }; + // For display purposes only. + // Does not consider endian-ness + template + std::string rawMemoryToString( T value ) { + union { + T typedValue; + unsigned char bytes[sizeof(T)]; + }; + + typedValue = value; + + std::ostringstream oss; + oss << "0x"; + for( unsigned char* cp = bytes; cp < bytes+sizeof(T); ++cp ) + oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)*cp; + return oss.str(); + } + } // end namespace Detail template @@ -94,13 +112,18 @@ struct StringMaker { static std::string convert( U* p ) { if( !p ) return INTERNAL_CATCH_STRINGIFY( NULL ); - std::ostringstream oss; -#ifdef _MSC_VER - oss << "0x" << p; -#else - oss << p; -#endif - return oss.str(); + else + return Detail::rawMemoryToString( p ); + } +}; + +template +struct StringMaker { + static std::string convert( R C::* p ) { + if( !p ) + return INTERNAL_CATCH_STRINGIFY( NULL ); + else + return Detail::rawMemoryToString( p ); } }; diff --git a/include/internal/catch_version.hpp b/include/internal/catch_version.hpp index 4542254c..c970ee3c 100644 --- a/include/internal/catch_version.hpp +++ b/include/internal/catch_version.hpp @@ -14,7 +14,7 @@ namespace Catch { // These numbers are maintained by a script template - const T LibraryVersionInfo::value( 1, 0, 23, "master" ); + const T LibraryVersionInfo::value( 1, 0, 25, "master" ); } #endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED diff --git a/projects/SelfTest/Baselines/console.std.approved.txt b/projects/SelfTest/Baselines/console.std.approved.txt index 52b4db55..3bf4d6c2 100644 --- a/projects/SelfTest/Baselines/console.std.approved.txt +++ b/projects/SelfTest/Baselines/console.std.approved.txt @@ -750,5 +750,5 @@ with expansion: "first" == "second" =============================================================================== -122 test cases - 36 failed (675 assertions - 91 failed) +123 test cases - 36 failed (676 assertions - 91 failed) diff --git a/projects/SelfTest/Baselines/console.sw.approved.txt b/projects/SelfTest/Baselines/console.sw.approved.txt index 81ee03db..64ed0577 100644 --- a/projects/SelfTest/Baselines/console.sw.approved.txt +++ b/projects/SelfTest/Baselines/console.sw.approved.txt @@ -6366,7 +6366,21 @@ TrickyTests.cpp:: PASSED: REQUIRE( a == &foo ) with expansion: - 1 == 1 + 0x == 0x + +------------------------------------------------------------------------------- +Comparing member function pointers +------------------------------------------------------------------------------- +TrickyTests.cpp: +............................................................................... + +TrickyTests.cpp:: +PASSED: + CHECK( m == &S::f ) +with expansion: + 0x + == + 0x ------------------------------------------------------------------------------- pointer to class @@ -7144,5 +7158,5 @@ with expansion: true =============================================================================== -122 test cases - 51 failed (694 assertions - 110 failed) +123 test cases - 51 failed (695 assertions - 110 failed) diff --git a/projects/SelfTest/Baselines/junit.sw.approved.txt b/projects/SelfTest/Baselines/junit.sw.approved.txt index e28449ca..58a1d151 100644 --- a/projects/SelfTest/Baselines/junit.sw.approved.txt +++ b/projects/SelfTest/Baselines/junit.sw.approved.txt @@ -1,5 +1,5 @@ - + @@ -514,6 +514,7 @@ TrickyTests.cpp: + diff --git a/projects/SelfTest/Baselines/xml.sw.approved.txt b/projects/SelfTest/Baselines/xml.sw.approved.txt index 9bebc628..efbb16d3 100644 --- a/projects/SelfTest/Baselines/xml.sw.approved.txt +++ b/projects/SelfTest/Baselines/xml.sw.approved.txt @@ -6637,7 +6637,20 @@ there" a == &foo - 1 == 1 + 0x == 0x + + + + + + + + m == &S::f + + + 0x +== +0x @@ -7405,7 +7418,7 @@ there" - + - + diff --git a/projects/SelfTest/TrickyTests.cpp b/projects/SelfTest/TrickyTests.cpp index acb1a611..d30ff429 100644 --- a/projects/SelfTest/TrickyTests.cpp +++ b/projects/SelfTest/TrickyTests.cpp @@ -361,6 +361,20 @@ namespace TrickyTests REQUIRE( a == &foo ); } + struct S + { + void f() {} + }; + + + TEST_CASE( "Comparing member function pointers", "[Tricky][member function pointer]" ) + { + typedef void (S::*MF)(); + MF m = &S::f; + + CHECK( m == &S::f ); + } + class ClassName {}; TEST_CASE( "pointer to class", "[Tricky]" ) diff --git a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj b/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj index e8848237..e61b82de 100644 --- a/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj +++ b/projects/XCode4/CatchSelfTest/CatchSelfTest.xcodeproj/project.pbxproj @@ -581,7 +581,7 @@ GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = ""; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "\"$(PROJECT_DIR)/../../../include\""; @@ -624,7 +624,7 @@ GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = ""; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = "\"$(PROJECT_DIR)/../../../include\""; }; diff --git a/single_include/catch.hpp b/single_include/catch.hpp index 770b3537..746e9f4e 100644 --- a/single_include/catch.hpp +++ b/single_include/catch.hpp @@ -1,6 +1,6 @@ /* - * CATCH v1.0 build 23 (master branch) - * Generated: 2013-12-23 10:22:45.547645 + * CATCH v1.0 build 25 (master branch) + * Generated: 2014-01-08 17:16:38.496390 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. @@ -681,6 +681,24 @@ namespace Detail { } }; + // For display purposes only. + // Does not consider endian-ness + template + std::string rawMemoryToString( T value ) { + union { + T typedValue; + unsigned char bytes[sizeof(T)]; + }; + + typedValue = value; + + std::ostringstream oss; + oss << "0x"; + for( unsigned char* cp = bytes; cp < bytes+sizeof(T); ++cp ) + oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)*cp; + return oss.str(); + } + } // end namespace Detail template @@ -696,9 +714,18 @@ struct StringMaker { static std::string convert( U* p ) { if( !p ) return INTERNAL_CATCH_STRINGIFY( NULL ); - std::ostringstream oss; - oss << p; - return oss.str(); + else + return Detail::rawMemoryToString( p ); + } +}; + +template +struct StringMaker { + static std::string convert( R C::* p ) { + if( !p ) + return INTERNAL_CATCH_STRINGIFY( NULL ); + else + return Detail::rawMemoryToString( p ); } }; @@ -6179,7 +6206,7 @@ namespace Catch { namespace Catch { // These numbers are maintained by a script - Version libraryVersion( 1, 0, 23, "master" ); + Version libraryVersion( 1, 0, 25, "master" ); } // #included from: catch_text.hpp @@ -6598,7 +6625,6 @@ namespace Catch { // running under the debugger or has a debugger attached post facto). bool isDebuggerActive(){ - int junk; int mib[4]; struct kinfo_proc info; size_t size; @@ -6619,8 +6645,10 @@ namespace Catch { // Call sysctl. size = sizeof(info); - junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); - assert(junk == 0); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0) != 0 ) { + std::cerr << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } // We're being debugged if the P_TRACED flag is set.