Added virtual inheritance to mock::object defined with MOCK_BASE_CLASS and MOCK_CLASS

Added virtual to destructors defined with MOCK_DESTRUCTOR

This makes it more convenient to set up complex hierarchies of classes for testing.
This commit is contained in:
Mathieu Champlon 2017-02-21 10:02:18 +01:00 committed by Mathieu Champlon
parent 4754a2a775
commit cd8fde2ab7
3 changed files with 51 additions and 5 deletions

View file

@ -18,6 +18,8 @@ Not yet released
* Added support for dereferencing in mock::equal * Added support for dereferencing in mock::equal
* Added support for movable objects in mock::retrieve * Added support for movable objects in mock::retrieve
* Fixed deprecation warning about std::uncaught_exception in c++17 for msvc * Fixed deprecation warning about std::uncaught_exception in c++17 for msvc
* Added virtual inheritance to mock::object defined with MOCK_BASE_CLASS and MOCK_CLASS
* Added virtual to destructors defined with MOCK_DESTRUCTOR
[endsect] [endsect]

View file

@ -25,7 +25,7 @@
#include <boost/mpl/assert.hpp> #include <boost/mpl/assert.hpp>
#define MOCK_CLASS(T) \ #define MOCK_CLASS(T) \
struct T : mock::object struct T : virtual mock::object
#define MOCK_FUNCTION_TYPE(S, tpn) \ #define MOCK_FUNCTION_TYPE(S, tpn) \
tpn boost::remove_pointer< tpn BOOST_IDENTITY_TYPE(S) >::type tpn boost::remove_pointer< tpn BOOST_IDENTITY_TYPE(S) >::type
@ -33,7 +33,8 @@
#ifdef MOCK_VARIADIC_MACROS #ifdef MOCK_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__, virtual mock::object, \
virtual 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
@ -43,8 +44,8 @@
#else // MOCK_VARIADIC_MACROS #else // MOCK_VARIADIC_MACROS
#define MOCK_BASE_CLASS(T, I) \ #define MOCK_BASE_CLASS(T, B) \
struct T : I, mock::object, mock::detail::base< I > struct T : B, virtual mock::object, virtual mock::detail::base< B >
#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
@ -164,7 +165,7 @@
MOCK_CONSTRUCTOR_AUX(T, n, A, t, typename) MOCK_CONSTRUCTOR_AUX(T, n, A, t, typename)
#define MOCK_DESTRUCTOR(T, t) \ #define MOCK_DESTRUCTOR(T, t) \
T() { try { MOCK_ANONYMOUS_HELPER(t)(); } catch( ... ) {} } \ virtual T() { try { MOCK_ANONYMOUS_HELPER(t)(); } catch( ... ) {} } \
MOCK_METHOD_HELPER(void(), t,) MOCK_METHOD_HELPER(void(), t,)
#define MOCK_FUNCTION_AUX(F, n, S, t, s, tpn) \ #define MOCK_FUNCTION_AUX(F, n, S, t, s, tpn) \

View file

@ -462,3 +462,46 @@ namespace stdcall
MOCK_FUNCTION( MOCK_STDCALL f, 0, void(), f ) MOCK_FUNCTION( MOCK_STDCALL f, 0, void(), f )
} }
namespace
{
MOCK_CLASS( base_1 )
{
MOCK_DESTRUCTOR( ~base_1, base_1_destructor )
virtual void f_1() = 0;
};
MOCK_CLASS( base_2 )
{
MOCK_DESTRUCTOR( ~base_2, base_2_destructor )
virtual void f_2() = 0;
};
MOCK_BASE_CLASS( mock_1, base_1 )
{
MOCK_DESTRUCTOR( ~mock_1, mock_1_destructor )
MOCK_METHOD( f_1, 0 )
};
MOCK_BASE_CLASS( mock_2, base_2 ), mock_1
{
MOCK_DESTRUCTOR( ~mock_2, mock_2_destructor )
MOCK_METHOD( f_2, 0 )
};
}
BOOST_AUTO_TEST_CASE( mock_object_can_inherit_from_another_mock_object )
{
mock_2 m;
MOCK_EXPECT( m.f_1 ).once();
MOCK_EXPECT( m.f_2 ).once();
m.f_1();
m.f_2();
mock::verify( m );
mock::reset( m );
MOCK_EXPECT( m.mock_2_destructor ).once();
MOCK_EXPECT( m.mock_1_destructor ).once();
MOCK_EXPECT( m.base_2_destructor ).once();
MOCK_EXPECT( m.base_1_destructor ).once();
}