mirror of
https://github.com/mat007/turtle.git
synced 2026-06-22 12:13:43 +00:00
Replaced object tags with better logs
git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@68 860be788-9bd5-4423-9f1e-828f051e677b
This commit is contained in:
parent
6ff9fc5564
commit
a21ded7948
6 changed files with 69 additions and 79 deletions
|
|
@ -29,6 +29,7 @@
|
||||||
#include <boost/mpl/back_inserter.hpp>
|
#include <boost/mpl/back_inserter.hpp>
|
||||||
#define BOOST_TYPEOF_SILENT
|
#define BOOST_TYPEOF_SILENT
|
||||||
#include <boost/typeof/typeof.hpp>
|
#include <boost/typeof/typeof.hpp>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
namespace mock
|
namespace mock
|
||||||
|
|
@ -86,45 +87,57 @@ namespace detail
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename E >
|
template< typename E >
|
||||||
void set_parent( E& e, const object& o )
|
E& set_parent( E& e, const object& o )
|
||||||
{
|
{
|
||||||
o.set_parent( e );
|
o.set_parent( e );
|
||||||
}
|
|
||||||
template< typename E, typename T >
|
|
||||||
void set_parent( E&, const T&,
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::is_base_of< object, T >::type
|
|
||||||
>::type* = 0 )
|
|
||||||
{}
|
|
||||||
template< typename E >
|
|
||||||
void tag( E& e, const object& o, const std::string& type_name,
|
|
||||||
const std::string& name )
|
|
||||||
{
|
|
||||||
e.tag( type_name + o.tag() + "::" + name );
|
|
||||||
}
|
|
||||||
template< typename E, typename T >
|
|
||||||
void tag( E& e, const T&, const std::string& type_name,
|
|
||||||
const std::string& name,
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::is_base_of< object, T >::type
|
|
||||||
>::type* = 0 )
|
|
||||||
{
|
|
||||||
e.tag( type_name + "::" + name );
|
|
||||||
}
|
|
||||||
|
|
||||||
template< typename E >
|
|
||||||
E& configure( typename E::expectation_tag, const std::string& object,
|
|
||||||
const std::string& name, E& e )
|
|
||||||
{
|
|
||||||
e.tag( name == "_" ? object : name );
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
template< typename E, typename T >
|
template< typename E, typename T >
|
||||||
E& configure( E& e, const std::string& /*object*/,
|
E& set_parent( E& e, const T&,
|
||||||
|
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
||||||
|
BOOST_DEDUCED_TYPENAME boost::is_base_of< object, T >::type
|
||||||
|
>::type* = 0 )
|
||||||
|
{
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
std::string op( T& )
|
||||||
|
{
|
||||||
|
return ".";
|
||||||
|
}
|
||||||
|
template< typename T >
|
||||||
|
std::string op( T* )
|
||||||
|
{
|
||||||
|
return "->";
|
||||||
|
}
|
||||||
|
template< typename T >
|
||||||
|
std::string op( std::auto_ptr< T >& )
|
||||||
|
{
|
||||||
|
return "->";
|
||||||
|
}
|
||||||
|
template< typename T >
|
||||||
|
std::string op( boost::shared_ptr< T >& )
|
||||||
|
{
|
||||||
|
return "->";
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename E >
|
||||||
|
E& configure( BOOST_DEDUCED_TYPENAME E::expectation_tag,
|
||||||
|
const std::string& object, const std::string& /*op*/,
|
||||||
|
const std::string& /*name*/, E& e )
|
||||||
|
{
|
||||||
|
if( object != "?" || e.tag() == "?" )
|
||||||
|
e.tag( object );
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
template< typename E, typename T >
|
||||||
|
E& configure( E& e, const std::string& object, const std::string& op,
|
||||||
const std::string& name, const T& t )
|
const std::string& name, const T& t )
|
||||||
{
|
{
|
||||||
set_parent( e, t );
|
set_parent( e, t );
|
||||||
tag( e, t, type_name< T >(), name );
|
if( object != "?" || e.tag() == "?" )
|
||||||
|
e.tag( object + op + type_name< T >() + "::" + name );
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,7 +158,11 @@ namespace detail
|
||||||
|
|
||||||
#define MOCK_MOCKER(o, t) \
|
#define MOCK_MOCKER(o, t) \
|
||||||
mock::detail::configure( mock::detail::ref( o ).exp##t, \
|
mock::detail::configure( mock::detail::ref( o ).exp##t, \
|
||||||
BOOST_PP_STRINGIZE(o), BOOST_PP_STRINGIZE(t), mock::detail::ref( o ) )
|
BOOST_PP_STRINGIZE(o), mock::detail::op( o ), \
|
||||||
|
BOOST_PP_STRINGIZE(t), mock::detail::ref( o ) )
|
||||||
|
#define MOCK_ANONYMOUS_MOCKER(o, t) \
|
||||||
|
mock::detail::configure( mock::detail::ref( o ).exp##t, \
|
||||||
|
"?", ".", BOOST_PP_STRINGIZE(t), mock::detail::ref( o ) )
|
||||||
|
|
||||||
#define MOCK_METHOD_ARG(z, n, arg) BOOST_PP_COMMA_IF(n) \
|
#define MOCK_METHOD_ARG(z, n, arg) BOOST_PP_COMMA_IF(n) \
|
||||||
BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(n)),_type) \
|
BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(n)),_type) \
|
||||||
|
|
@ -163,7 +180,7 @@ namespace detail
|
||||||
tpn boost::function< S >::result_type M( \
|
tpn boost::function< S >::result_type M( \
|
||||||
MOCK_METHOD_ARGS(n, tpn boost::function< S >::arg) ) c \
|
MOCK_METHOD_ARGS(n, tpn boost::function< S >::arg) ) c \
|
||||||
{ \
|
{ \
|
||||||
return MOCK_MOCKER(this, t)( MOCK_MOCKER_ARGS(n) ); \
|
return MOCK_ANONYMOUS_MOCKER(this, t)( MOCK_MOCKER_ARGS(n) ); \
|
||||||
}
|
}
|
||||||
#define MOCK_SIGNATURE(M) \
|
#define MOCK_SIGNATURE(M) \
|
||||||
mock::detail::signature< BOOST_TYPEOF(&base_type::M) >::type
|
mock::detail::signature< BOOST_TYPEOF(&base_type::M) >::type
|
||||||
|
|
|
||||||
|
|
@ -44,18 +44,10 @@ namespace mock
|
||||||
std::mem_fun( &verifiable::reset ) );
|
std::mem_fun( &verifiable::reset ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
friend std::ostream& operator<<( std::ostream& s, const node& n )
|
|
||||||
{
|
|
||||||
n.serialize( s );
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~node()
|
virtual ~node()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual void serialize( std::ostream& s ) const = 0;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::vector< verifiable* > verifiables_type;
|
typedef std::vector< verifiable* > verifiables_type;
|
||||||
typedef verifiables_type::const_iterator verifiables_cit;
|
typedef verifiables_type::const_iterator verifiables_cit;
|
||||||
|
|
|
||||||
|
|
@ -24,15 +24,6 @@ namespace mock
|
||||||
: impl_( new object_impl() )
|
: impl_( new object_impl() )
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void tag( const std::string& name )
|
|
||||||
{
|
|
||||||
impl_->name_ = name;
|
|
||||||
}
|
|
||||||
const std::string& tag() const
|
|
||||||
{
|
|
||||||
return impl_->name_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
void set_parent( T& t ) const
|
void set_parent( T& t ) const
|
||||||
{
|
{
|
||||||
|
|
@ -60,14 +51,6 @@ namespace mock
|
||||||
{
|
{
|
||||||
root.remove( *this );
|
root.remove( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string name_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual void serialize( std::ostream& s ) const
|
|
||||||
{
|
|
||||||
s << (name_.empty() ? "?" : name_) << "::";
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
boost::shared_ptr< object_impl > impl_;
|
boost::shared_ptr< object_impl > impl_;
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,6 @@ namespace mock
|
||||||
class root_t : public boost::unit_test::singleton< root_t >, public node
|
class root_t : public boost::unit_test::singleton< root_t >, public node
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
virtual void serialize( std::ostream& /*s*/ ) const
|
|
||||||
{}
|
|
||||||
BOOST_TEST_SINGLETON_CONS( root_t );
|
BOOST_TEST_SINGLETON_CONS( root_t );
|
||||||
};
|
};
|
||||||
BOOST_TEST_SINGLETON_INST( root )
|
BOOST_TEST_SINGLETON_INST( root )
|
||||||
|
|
|
||||||
|
|
@ -243,10 +243,6 @@ namespace
|
||||||
|
|
||||||
struct fixture
|
struct fixture
|
||||||
{
|
{
|
||||||
fixture()
|
|
||||||
{
|
|
||||||
manager.tag( "(the only one)" );
|
|
||||||
}
|
|
||||||
my_mock_manager manager;
|
my_mock_manager manager;
|
||||||
my_mock_observer observer;
|
my_mock_observer observer;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -152,14 +152,19 @@ namespace
|
||||||
BOOST_AUTO_TEST_CASE( mock_object_is_named )
|
BOOST_AUTO_TEST_CASE( mock_object_is_named )
|
||||||
{
|
{
|
||||||
my_mock m;
|
my_mock m;
|
||||||
BOOST_CHECK_EQUAL( "my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( mock_object_with_tag_is_named )
|
BOOST_AUTO_TEST_CASE( mock_object_pointer_is_named )
|
||||||
{
|
{
|
||||||
my_mock m;
|
std::auto_ptr< my_mock > m( new my_mock );
|
||||||
m.tag( "(my tag)" );
|
BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
BOOST_CHECK_EQUAL( "my_mock(my tag)::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
|
@ -173,7 +178,10 @@ namespace
|
||||||
BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_and_without_inheriting_from_object_is_named )
|
BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_and_without_inheriting_from_object_is_named )
|
||||||
{
|
{
|
||||||
my_custom_mock m;
|
my_custom_mock m;
|
||||||
BOOST_CHECK_EQUAL( "my_custom_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
BOOST_CHECK_EQUAL( "?.my_custom_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
|
@ -187,7 +195,10 @@ namespace
|
||||||
BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_is_named )
|
BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_is_named )
|
||||||
{
|
{
|
||||||
my_custom_mock_object m;
|
my_custom_mock_object m;
|
||||||
BOOST_CHECK_EQUAL( "my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
BOOST_CHECK_EQUAL( "?.my_custom_mock_object::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) );
|
||||||
|
BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m, my_method ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( mock_functor_is_named )
|
BOOST_AUTO_TEST_CASE( mock_functor_is_named )
|
||||||
|
|
@ -196,13 +207,6 @@ BOOST_AUTO_TEST_CASE( mock_functor_is_named )
|
||||||
BOOST_CHECK_EQUAL( "f", to_string( MOCK_MOCKER( f, _ ) ) );
|
BOOST_CHECK_EQUAL( "f", to_string( MOCK_MOCKER( f, _ ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( mock_functor_with_tag_has_no_effect )
|
|
||||||
{
|
|
||||||
MOCK_FUNCTOR( int( float, const std::string& ) ) f;
|
|
||||||
f.tag( "my functor" );
|
|
||||||
BOOST_CHECK_EQUAL( "f", to_string( MOCK_MOCKER( f, _ ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
MOCK_CLASS( my_destroyed_class )
|
MOCK_CLASS( my_destroyed_class )
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue