From a1436f26e632c0bd785fa80d9fa17dc1f904a997 Mon Sep 17 00:00:00 2001 From: mat007 Date: Thu, 7 Mar 2013 07:16:40 +0000 Subject: [PATCH] Added variadic macro support for MOCK_FUNCTION and all the MOCK_METHOD family git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@598 860be788-9bd5-4423-9f1e-828f051e677b --- test/test_mock.cpp | 43 +++++++++++++++++++++++++++++++++ turtle/mock.hpp | 60 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 101 insertions(+), 2 deletions(-) diff --git a/test/test_mock.cpp b/test/test_mock.cpp index 3005691..a62c0cb 100644 --- a/test/test_mock.cpp +++ b/test/test_mock.cpp @@ -290,3 +290,46 @@ BOOST_AUTO_TEST_CASE( mock_static_function_is_named ) { BOOST_CHECK_EQUAL( "static_function_class::f", to_string( MOCK_HELPER( static_function_class::f ) ) ); } + +#ifndef BOOST_NO_VARIADIC_MACROS + +namespace +{ + struct base + { + virtual ~base() + {} + virtual void m1() = 0; + }; + + MOCK_BASE_CLASS( variadic, base ) + { + MOCK_METHOD( m1, 0 ) + MOCK_METHOD( m2, 0, void() ) + MOCK_METHOD( m3, 0, void(), m3 ) + MOCK_CONST_METHOD( m4, 0, void() ) + MOCK_CONST_METHOD( m5, 0, void(), m5 ) + MOCK_NON_CONST_METHOD( m6, 0, void() ) + MOCK_NON_CONST_METHOD( m7, 0, void(), m7 ) + MOCK_STATIC_METHOD( m8, 0, void() ) + MOCK_STATIC_METHOD( m9, 0, void(), m9 ) + }; + + template< typename T > + MOCK_CLASS( variadic_tpl ) + { + MOCK_METHOD_TPL( m2, 0, T() ) + MOCK_METHOD_TPL( m3, 0, T(), m3 ) + MOCK_CONST_METHOD_TPL( m4, 0, T() ) + MOCK_CONST_METHOD_TPL( m5, 0, T(), m5 ) + MOCK_NON_CONST_METHOD_TPL( m6, 0, T() ) + MOCK_NON_CONST_METHOD_TPL( m7, 0, T(), m7 ) + MOCK_STATIC_METHOD_TPL( m8, 0, T() ) + MOCK_STATIC_METHOD_TPL( m9, 0, T(), m9 ) + }; + + MOCK_FUNCTION( fun1, 0, void() ) + MOCK_FUNCTION( fun2, 0, void(), fun2 ) +} + +#endif //BOOST_NO_VARIADIC_MACROS diff --git a/turtle/mock.hpp b/turtle/mock.hpp index 04c4e83..d582e78 100644 --- a/turtle/mock.hpp +++ b/turtle/mock.hpp @@ -75,8 +75,6 @@ #define MOCK_NON_CONST_METHOD_EXT(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t,,) \ MOCK_METHOD_HELPER(S, t) -#define MOCK_METHOD(M, n) \ - MOCK_METHOD_EXT(M, n, MOCK_SIGNATURE(M), M) #define MOCK_METHOD_EXT_TPL(M, n, S, t) \ MOCK_METHOD_AUX(M, n, S, t,, BOOST_DEDUCED_TYPENAME) \ @@ -133,13 +131,71 @@ boost::function_types::function_arity< S >::value ); \ return MOCK_HELPER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \ } + +#ifdef BOOST_NO_VARIADIC_MACROS + +#define MOCK_METHOD(M, n) \ + MOCK_METHOD_EXT(M, n, MOCK_SIGNATURE(M), M) + #define MOCK_FUNCTION(F, n, S, t) \ MOCK_FUNCTION_AUX(F, n, S, t,,) + #define MOCK_STATIC_METHOD(F, n, S, t) \ MOCK_FUNCTION_AUX(F, n, S, t, static,) #define MOCK_STATIC_METHOD_TPL(F, n, S, t) \ MOCK_FUNCTION_AUX(F, n, S, t, static, BOOST_DEDUCED_TYPENAME) +#else // BOOST_NO_VARIADIC_MACROS + +#define MOCK_VARIADIC_ELEM_0(e0, ...) e0 +#define MOCK_VARIADIC_ELEM_1(e0, e1, ...) e1 +#define MOCK_VARIADIC_ELEM_2(e0, e1, e2, ...) e2 + +#define MOCK_METHOD(M, ... ) \ + MOCK_METHOD_EXT(M, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__ ), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, MOCK_SIGNATURE(M)), \ + MOCK_VARIADIC_ELEM_2(__VA_ARGS__, M, M)) +#define MOCK_CONST_METHOD(M, n, ... ) \ + MOCK_CONST_METHOD_EXT(M, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, M)) +#define MOCK_NON_CONST_METHOD(M, n, ... ) \ + MOCK_NON_CONST_METHOD_EXT(M, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, M)) + +#define MOCK_METHOD_TPL(M, n, ... ) \ + MOCK_METHOD_EXT_TPL(M, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, M)) +#define MOCK_CONST_METHOD_TPL(M, n, ... ) \ + MOCK_CONST_METHOD_EXT_TPL(M, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, M)) +#define MOCK_NON_CONST_METHOD_TPL(M, n, ... ) \ + MOCK_NON_CONST_METHOD_EXT_TPL(M, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, M)) + +#define MOCK_FUNCTION(F, n, ...) \ + MOCK_FUNCTION_AUX(F, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, F),,) + +#define MOCK_STATIC_METHOD(F, n, ...) \ + MOCK_FUNCTION_AUX(F, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, F), static,) + +#define MOCK_STATIC_METHOD_TPL(F, n, ...) \ + MOCK_FUNCTION_AUX(F, n, \ + MOCK_VARIADIC_ELEM_0(__VA_ARGS__), \ + MOCK_VARIADIC_ELEM_1(__VA_ARGS__, F), \ + static, BOOST_DEDUCED_TYPENAME) + +#endif // BOOST_NO_VARIADIC_MACROS + #define MOCK_EXPECT(t) MOCK_HELPER(t).expect( __FILE__, __LINE__ ) #define MOCK_RESET(t) MOCK_HELPER(t).reset( __FILE__, __LINE__ ) #define MOCK_VERIFY(t) MOCK_HELPER(t).verify( __FILE__, __LINE__ )