From 51abd1084746a502f0e67e4b20cee66fe3ad2f0e Mon Sep 17 00:00:00 2001 From: mat007 Date: Fri, 8 Mar 2013 08:00:58 +0000 Subject: [PATCH] Added MOCK_CONVERSION_OPERATOR_TPL git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@603 860be788-9bd5-4423-9f1e-828f051e677b --- test/test_mock.cpp | 34 ++++++++++++++++++++++++- turtle/mock.hpp | 63 +++++++++++++++++++++++++++------------------- 2 files changed, 70 insertions(+), 27 deletions(-) diff --git a/test/test_mock.cpp b/test/test_mock.cpp index 6f5b5a8..6ccaedd 100644 --- a/test/test_mock.cpp +++ b/test/test_mock.cpp @@ -67,7 +67,7 @@ namespace template< typename T > MOCK_CLASS( mock_template_class_with_conversion_operator ) { - MOCK_CONVERSION_OPERATOR( T, conversion ) + MOCK_CONVERSION_OPERATOR_TPL( T, conversion ) }; } @@ -110,6 +110,38 @@ BOOST_AUTO_TEST_CASE( mock_non_const_conversion_operator ) BOOST_CHECK_EQUAL( 42, i ); } +namespace +{ + template< typename T > + MOCK_CLASS( mock_template_class_with_const_conversion_operator ) + { + MOCK_CONST_CONVERSION_OPERATOR_TPL( T, conversion ) + }; +} + +BOOST_AUTO_TEST_CASE( mock_template_const_conversion_operator ) +{ + mock_template_class_with_const_conversion_operator< int > m; + MOCK_EXPECT( m.conversion ).once().returns( 42 ); + BOOST_CHECK_EQUAL( 42, static_cast< int >( m ) ); +} + +namespace +{ + template< typename T > + MOCK_CLASS( mock_template_class_with_non_const_conversion_operator ) + { + MOCK_NON_CONST_CONVERSION_OPERATOR_TPL( T, conversion ) + }; +} + +BOOST_AUTO_TEST_CASE( mock_template_non_const_conversion_operator ) +{ + mock_template_class_with_non_const_conversion_operator< int > m; + MOCK_EXPECT( m.conversion ).once().returns( 42 ); + BOOST_CHECK_EQUAL( 42, static_cast< int >( m ) ); +} + namespace { MOCK_CLASS( my_mock ) diff --git a/turtle/mock.hpp b/turtle/mock.hpp index 9405848..b7aab3e 100644 --- a/turtle/mock.hpp +++ b/turtle/mock.hpp @@ -24,9 +24,9 @@ #include #include -#define MOCK_FUNCTION_TYPE(S) \ +#define MOCK_FUNCTION_TYPE(S, tpn) \ BOOST_DEDUCED_TYPENAME boost::remove_pointer< \ - BOOST_DEDUCED_TYPENAME BOOST_IDENTITY_TYPE((S)) >::type + tpn BOOST_IDENTITY_TYPE((S)) >::type #define MOCK_CLASS(T) \ struct T : mock::object @@ -36,14 +36,14 @@ #define MOCK_BASE_CLASS(T, I) \ struct T : I, mock::object, mock::detail::base< I > #define MOCK_FUNCTOR(f, S) \ - mock::detail::functor< MOCK_FUNCTION_TYPE(S) > f, f##_mock + mock::detail::functor< MOCK_FUNCTION_TYPE(S,) > f, f##_mock #else // BOOST_NO_VARIADIC_MACROS #define MOCK_BASE_CLASS(T, ...) \ struct T : __VA_ARGS__, mock::object, mock::detail::base< __VA_ARGS__ > #define MOCK_FUNCTOR(f, ...) \ - mock::detail::functor< MOCK_FUNCTION_TYPE((__VA_ARGS__)) > f, f##_mock + mock::detail::functor< MOCK_FUNCTION_TYPE((__VA_ARGS__),) > f, f##_mock #endif // BOOST_NO_VARIADIC_MACROS @@ -52,9 +52,9 @@ #define MOCK_ANONYMOUS_HELPER(t) \ t##_mock( mock::detail::root, "?." ) -#define MOCK_METHOD_HELPER(S, t) \ - mutable mock::detail::function< MOCK_FUNCTION_TYPE(S) > t##_mock_; \ - mock::detail::function< MOCK_FUNCTION_TYPE(S) >& t##_mock( \ +#define MOCK_METHOD_HELPER(S, t, tpn) \ + mutable mock::detail::function< MOCK_FUNCTION_TYPE(S, tpn) > t##_mock_; \ + mock::detail::function< MOCK_FUNCTION_TYPE(S, tpn) >& t##_mock( \ const mock::detail::context&, \ boost::unit_test::const_string instance ) const \ { \ @@ -69,10 +69,10 @@ BOOST_PP_COMMA_IF(n) d, n >::type p##n #define MOCK_PARAMS(n, S, tpn) \ BOOST_PP_REPEAT(n, MOCK_PARAM, \ - tpn mock::detail::parameter< MOCK_FUNCTION_TYPE(S)) + tpn mock::detail::parameter< MOCK_FUNCTION_TYPE(S, tpn)) #define MOCK_DECL(M, n, S, c, tpn) \ tpn boost::function_types::result_type< \ - MOCK_FUNCTION_TYPE(S) >::type M( \ + MOCK_FUNCTION_TYPE(S, tpn) >::type M( \ MOCK_PARAMS(n, S, tpn) ) c #define MOCK_METHOD_AUX(M, n, S, t, c, tpn) \ @@ -80,7 +80,7 @@ { \ BOOST_MPL_ASSERT_RELATION( n, ==, \ boost::function_types::function_arity< \ - MOCK_FUNCTION_TYPE(S) >::value ); \ + MOCK_FUNCTION_TYPE(S, tpn) >::value ); \ return MOCK_ANONYMOUS_HELPER(t)( \ BOOST_PP_ENUM_PARAMS(n, p) ); \ } @@ -88,47 +88,58 @@ #define MOCK_METHOD_EXT(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t,,) \ MOCK_METHOD_AUX(M, n, S, t, const,) \ - MOCK_METHOD_HELPER(S, t) + MOCK_METHOD_HELPER(S, t,) #define MOCK_CONST_METHOD_EXT(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t, const,) \ - MOCK_METHOD_HELPER(S, t) + MOCK_METHOD_HELPER(S, t,) #define MOCK_NON_CONST_METHOD_EXT(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t,,) \ - MOCK_METHOD_HELPER(S, t) + MOCK_METHOD_HELPER(S, t,) #define MOCK_METHOD_EXT_TPL(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t,, BOOST_DEDUCED_TYPENAME) \ MOCK_METHOD_AUX(M, n, S, t, const, BOOST_DEDUCED_TYPENAME) \ - MOCK_METHOD_HELPER(S, t) + MOCK_METHOD_HELPER(S, t, BOOST_DEDUCED_TYPENAME) #define MOCK_CONST_METHOD_EXT_TPL(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t, const, BOOST_DEDUCED_TYPENAME) \ - MOCK_METHOD_HELPER(S, t) + MOCK_METHOD_HELPER(S, t, BOOST_DEDUCED_TYPENAME) #define MOCK_NON_CONST_METHOD_EXT_TPL(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t,, BOOST_DEDUCED_TYPENAME) \ - MOCK_METHOD_HELPER(S, t) + MOCK_METHOD_HELPER(S, t, BOOST_DEDUCED_TYPENAME) #define MOCK_CONST_CONVERSION_OPERATOR(T, t) \ operator T() const { return MOCK_ANONYMOUS_HELPER(t)(); } \ - MOCK_METHOD_HELPER(T(), t) + MOCK_METHOD_HELPER(T(), t,) #define MOCK_NON_CONST_CONVERSION_OPERATOR(T, t) \ operator T() { return MOCK_ANONYMOUS_HELPER(t)(); } \ - MOCK_METHOD_HELPER(T(), t) + MOCK_METHOD_HELPER(T(), t,) #define MOCK_CONVERSION_OPERATOR(T, t) \ operator T() const { return MOCK_ANONYMOUS_HELPER(t)(); } \ operator T() { return MOCK_ANONYMOUS_HELPER(t)(); } \ - MOCK_METHOD_HELPER(T(), t) + MOCK_METHOD_HELPER(T(), t,) -#define MOCK_FUNCTION_HELPER(S, t, s) \ - s mock::detail::function< MOCK_FUNCTION_TYPE(S) >& t##_mock( \ +#define MOCK_CONST_CONVERSION_OPERATOR_TPL(T, t) \ + operator T() const { return MOCK_ANONYMOUS_HELPER(t)(); } \ + MOCK_METHOD_HELPER(T(), t, BOOST_DEDUCED_TYPENAME) +#define MOCK_NON_CONST_CONVERSION_OPERATOR_TPL(T, t) \ + operator T() { return MOCK_ANONYMOUS_HELPER(t)(); } \ + MOCK_METHOD_HELPER(T(), t, BOOST_DEDUCED_TYPENAME) +#define MOCK_CONVERSION_OPERATOR_TPL(T, t) \ + operator T() const { return MOCK_ANONYMOUS_HELPER(t)(); } \ + operator T() { return MOCK_ANONYMOUS_HELPER(t)(); } \ + MOCK_METHOD_HELPER(T(), t, BOOST_DEDUCED_TYPENAME) + +#define MOCK_FUNCTION_HELPER(S, t, s, tpn) \ + s mock::detail::function< MOCK_FUNCTION_TYPE(S, tpn) >& t##_mock( \ mock::detail::context& context, \ boost::unit_test::const_string instance ) \ { \ - static mock::detail::function< MOCK_FUNCTION_TYPE(S) > f; \ + static mock::detail::function< MOCK_FUNCTION_TYPE(S, tpn) > f; \ return f( context, instance ); \ } #define MOCK_CONSTRUCTOR_AUX(T, n, A, t, tpn) \ - MOCK_FUNCTION_HELPER(void A, t, static) \ + MOCK_FUNCTION_HELPER(void A, t, static, tpn) \ T( MOCK_PARAMS(n, void A, tpn) ) \ { \ MOCK_HELPER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \ @@ -140,16 +151,16 @@ MOCK_CONSTRUCTOR_AUX(T, n, A, t, BOOST_DEDUCED_TYPENAME) #define MOCK_DESTRUCTOR(T, t) \ - MOCK_METHOD_HELPER(void(), t) \ + MOCK_METHOD_HELPER(void(), t,) \ ~T() { try { MOCK_ANONYMOUS_HELPER(t)(); } catch( ... ) {} } #define MOCK_FUNCTION_AUX(F, n, S, t, s, tpn) \ - MOCK_FUNCTION_HELPER(S, t, s) \ + MOCK_FUNCTION_HELPER(S, t, s, tpn) \ s MOCK_DECL(F, n, S,,tpn) \ { \ BOOST_MPL_ASSERT_RELATION( n, ==, \ boost::function_types::function_arity< \ - MOCK_FUNCTION_TYPE(S) >::value ); \ + MOCK_FUNCTION_TYPE(S, tpn) >::value ); \ return MOCK_HELPER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \ }