mirror of
https://github.com/mat007/turtle.git
synced 2026-06-22 12:13:43 +00:00
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:
parent
4754a2a775
commit
cd8fde2ab7
3 changed files with 51 additions and 5 deletions
|
|
@ -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]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) \
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue