Added MOCK_CONVERSION_OPERATOR_TPL

git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@603 860be788-9bd5-4423-9f1e-828f051e677b
This commit is contained in:
mat007 2013-03-08 08:00:58 +00:00
parent 87ea27b96c
commit 51abd10847
2 changed files with 70 additions and 27 deletions

View file

@ -67,7 +67,7 @@ namespace
template< typename T > template< typename T >
MOCK_CLASS( mock_template_class_with_conversion_operator ) 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 ); 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 namespace
{ {
MOCK_CLASS( my_mock ) MOCK_CLASS( my_mock )

View file

@ -24,9 +24,9 @@
#include <boost/utility/identity_type.hpp> #include <boost/utility/identity_type.hpp>
#include <boost/mpl/assert.hpp> #include <boost/mpl/assert.hpp>
#define MOCK_FUNCTION_TYPE(S) \ #define MOCK_FUNCTION_TYPE(S, tpn) \
BOOST_DEDUCED_TYPENAME boost::remove_pointer< \ BOOST_DEDUCED_TYPENAME boost::remove_pointer< \
BOOST_DEDUCED_TYPENAME BOOST_IDENTITY_TYPE((S)) >::type tpn BOOST_IDENTITY_TYPE((S)) >::type
#define MOCK_CLASS(T) \ #define MOCK_CLASS(T) \
struct T : mock::object struct T : mock::object
@ -36,14 +36,14 @@
#define MOCK_BASE_CLASS(T, I) \ #define MOCK_BASE_CLASS(T, I) \
struct T : I, mock::object, mock::detail::base< I > struct T : I, mock::object, mock::detail::base< I >
#define MOCK_FUNCTOR(f, S) \ #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 #else // BOOST_NO_VARIADIC_MACROS
#define MOCK_BASE_CLASS(T, ...) \ #define MOCK_BASE_CLASS(T, ...) \
struct T : __VA_ARGS__, mock::object, mock::detail::base< __VA_ARGS__ > struct T : __VA_ARGS__, mock::object, mock::detail::base< __VA_ARGS__ >
#define MOCK_FUNCTOR(f, ...) \ #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 #endif // BOOST_NO_VARIADIC_MACROS
@ -52,9 +52,9 @@
#define MOCK_ANONYMOUS_HELPER(t) \ #define MOCK_ANONYMOUS_HELPER(t) \
t##_mock( mock::detail::root, "?." ) t##_mock( mock::detail::root, "?." )
#define MOCK_METHOD_HELPER(S, t) \ #define MOCK_METHOD_HELPER(S, t, tpn) \
mutable mock::detail::function< MOCK_FUNCTION_TYPE(S) > t##_mock_; \ mutable mock::detail::function< MOCK_FUNCTION_TYPE(S, tpn) > t##_mock_; \
mock::detail::function< MOCK_FUNCTION_TYPE(S) >& t##_mock( \ mock::detail::function< MOCK_FUNCTION_TYPE(S, tpn) >& t##_mock( \
const mock::detail::context&, \ const mock::detail::context&, \
boost::unit_test::const_string instance ) const \ boost::unit_test::const_string instance ) const \
{ \ { \
@ -69,10 +69,10 @@
BOOST_PP_COMMA_IF(n) d, n >::type p##n BOOST_PP_COMMA_IF(n) d, n >::type p##n
#define MOCK_PARAMS(n, S, tpn) \ #define MOCK_PARAMS(n, S, tpn) \
BOOST_PP_REPEAT(n, MOCK_PARAM, \ 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) \ #define MOCK_DECL(M, n, S, c, tpn) \
tpn boost::function_types::result_type< \ 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 MOCK_PARAMS(n, S, tpn) ) c
#define MOCK_METHOD_AUX(M, n, S, t, c, tpn) \ #define MOCK_METHOD_AUX(M, n, S, t, c, tpn) \
@ -80,7 +80,7 @@
{ \ { \
BOOST_MPL_ASSERT_RELATION( n, ==, \ BOOST_MPL_ASSERT_RELATION( n, ==, \
boost::function_types::function_arity< \ boost::function_types::function_arity< \
MOCK_FUNCTION_TYPE(S) >::value ); \ MOCK_FUNCTION_TYPE(S, tpn) >::value ); \
return MOCK_ANONYMOUS_HELPER(t)( \ return MOCK_ANONYMOUS_HELPER(t)( \
BOOST_PP_ENUM_PARAMS(n, p) ); \ BOOST_PP_ENUM_PARAMS(n, p) ); \
} }
@ -88,47 +88,58 @@
#define MOCK_METHOD_EXT(M, n, S, t) \ #define MOCK_METHOD_EXT(M, n, S, t) \
MOCK_METHOD_AUX(M, n, S, t,,) \ MOCK_METHOD_AUX(M, n, S, t,,) \
MOCK_METHOD_AUX(M, n, S, t, const,) \ 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) \ #define MOCK_CONST_METHOD_EXT(M, n, S, t) \
MOCK_METHOD_AUX(M, n, S, t, const,) \ 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) \ #define MOCK_NON_CONST_METHOD_EXT(M, n, S, t) \
MOCK_METHOD_AUX(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) \ #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,, BOOST_DEDUCED_TYPENAME) \
MOCK_METHOD_AUX(M, n, S, t, const, 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) \ #define MOCK_CONST_METHOD_EXT_TPL(M, n, S, t) \
MOCK_METHOD_AUX(M, n, S, t, const, 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_NON_CONST_METHOD_EXT_TPL(M, n, S, t) \ #define MOCK_NON_CONST_METHOD_EXT_TPL(M, n, S, t) \
MOCK_METHOD_AUX(M, n, S, t,, BOOST_DEDUCED_TYPENAME) \ 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) \ #define MOCK_CONST_CONVERSION_OPERATOR(T, t) \
operator T() const { return MOCK_ANONYMOUS_HELPER(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) \ #define MOCK_NON_CONST_CONVERSION_OPERATOR(T, t) \
operator T() { return MOCK_ANONYMOUS_HELPER(t)(); } \ operator T() { return MOCK_ANONYMOUS_HELPER(t)(); } \
MOCK_METHOD_HELPER(T(), t) MOCK_METHOD_HELPER(T(), t,)
#define MOCK_CONVERSION_OPERATOR(T, t) \ #define MOCK_CONVERSION_OPERATOR(T, t) \
operator T() const { return MOCK_ANONYMOUS_HELPER(t)(); } \ operator T() const { return MOCK_ANONYMOUS_HELPER(t)(); } \
operator T() { 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) \ #define MOCK_CONST_CONVERSION_OPERATOR_TPL(T, t) \
s mock::detail::function< MOCK_FUNCTION_TYPE(S) >& t##_mock( \ 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, \ mock::detail::context& context, \
boost::unit_test::const_string instance ) \ 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 ); \ return f( context, instance ); \
} }
#define MOCK_CONSTRUCTOR_AUX(T, n, A, t, tpn) \ #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) ) \ T( MOCK_PARAMS(n, void A, tpn) ) \
{ \ { \
MOCK_HELPER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \ MOCK_HELPER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \
@ -140,16 +151,16 @@
MOCK_CONSTRUCTOR_AUX(T, n, A, t, BOOST_DEDUCED_TYPENAME) MOCK_CONSTRUCTOR_AUX(T, n, A, t, BOOST_DEDUCED_TYPENAME)
#define MOCK_DESTRUCTOR(T, t) \ #define MOCK_DESTRUCTOR(T, t) \
MOCK_METHOD_HELPER(void(), t) \ MOCK_METHOD_HELPER(void(), t,) \
~T() { try { MOCK_ANONYMOUS_HELPER(t)(); } catch( ... ) {} } ~T() { try { MOCK_ANONYMOUS_HELPER(t)(); } catch( ... ) {} }
#define MOCK_FUNCTION_AUX(F, n, S, t, s, tpn) \ #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) \ s MOCK_DECL(F, n, S,,tpn) \
{ \ { \
BOOST_MPL_ASSERT_RELATION( n, ==, \ BOOST_MPL_ASSERT_RELATION( n, ==, \
boost::function_types::function_arity< \ 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) ); \ return MOCK_HELPER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \
} }