Added detection for a pointer in mock::assign to dereference it before performing the assignment

git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@158 860be788-9bd5-4423-9f1e-828f051e677b
This commit is contained in:
mat007 2010-05-31 11:36:05 +00:00
parent a4b061184c
commit df46dec9e0
3 changed files with 28 additions and 15 deletions

View file

@ -57,8 +57,7 @@ namespace detail
template< typename T > template< typename T >
detail::placeholder< detail::same< T > > same( T& t ) detail::placeholder< detail::same< T > > same( T& t )
{ {
return constraint( detail::same< T >( boost::ref( t ) ), return constraint( detail::same< T >( t ), "same", &t );
"same", &t );
} }
template< typename T > template< typename T >
@ -100,8 +99,7 @@ namespace detail
template< typename T > template< typename T >
detail::placeholder< detail::retrieve< T > > retrieve( T& t ) detail::placeholder< detail::retrieve< T > > retrieve( T& t )
{ {
return constraint( detail::retrieve< T >( boost::ref( t ) ), return constraint( detail::retrieve< T >( t ), "retrieve", t );
"retrieve", t );
} }
template< typename T > template< typename T >

View file

@ -9,7 +9,6 @@
#ifndef MOCK_FUNCTIONAL_HPP_INCLUDED #ifndef MOCK_FUNCTIONAL_HPP_INCLUDED
#define MOCK_FUNCTIONAL_HPP_INCLUDED #define MOCK_FUNCTIONAL_HPP_INCLUDED
#include <boost/ref.hpp>
#include <boost/utility/enable_if.hpp> #include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_convertible.hpp> #include <boost/type_traits/is_convertible.hpp>
#include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/predicate.hpp>
@ -68,16 +67,16 @@ namespace detail
class same class same
{ {
public: public:
explicit same( const boost::reference_wrapper< Expected >& expected ) explicit same( const Expected& expected )
: expected_( expected ) : expected_( &expected )
{} {}
template< typename Actual > template< typename Actual >
bool operator()( const Actual& actual ) const bool operator()( const Actual& actual ) const
{ {
return &actual == expected_.get_pointer(); return &actual == expected_;
} }
private: private:
boost::reference_wrapper< Expected > expected_; const Expected* expected_;
}; };
template< typename Expected > template< typename Expected >
@ -119,12 +118,23 @@ namespace detail
explicit assign( const Expected& expected ) explicit assign( const Expected& expected )
: expected_( expected ) : expected_( expected )
{} {}
template< typename Actual > template< typename Actual >
bool operator()( Actual& actual ) const bool operator()( Actual& actual,
BOOST_DEDUCED_TYPENAME boost::disable_if<
boost::is_convertible< Expected*, Actual >, Actual >::type* = 0 ) const
{ {
actual = expected_; actual = expected_;
return true; return true;
} }
template< typename Actual >
bool operator()( Actual* actual,
BOOST_DEDUCED_TYPENAME boost::enable_if<
boost::is_convertible< Expected, Actual >, Actual >::type* = 0 ) const
{
*actual = expected_;
return true;
}
private: private:
Expected expected_; Expected expected_;
}; };
@ -133,15 +143,15 @@ namespace detail
class retrieve class retrieve
{ {
public: public:
explicit retrieve( const boost::reference_wrapper< Expected >& expected ) explicit retrieve( Expected& expected )
: expected_( expected ) : expected_( &expected )
{} {}
template< typename Actual > template< typename Actual >
bool operator()( const Actual& actual, bool operator()( const Actual& actual,
BOOST_DEDUCED_TYPENAME boost::disable_if< BOOST_DEDUCED_TYPENAME boost::disable_if<
boost::is_convertible< const Actual*, Expected >, Actual >::type* = 0 ) const boost::is_convertible< const Actual*, Expected >, Actual >::type* = 0 ) const
{ {
expected_.get() = actual; *expected_ = actual;
return true; return true;
} }
template< typename Actual > template< typename Actual >
@ -149,11 +159,11 @@ namespace detail
BOOST_DEDUCED_TYPENAME boost::enable_if< BOOST_DEDUCED_TYPENAME boost::enable_if<
boost::is_convertible< Actual*, Expected >, Actual >::type* = 0 ) const boost::is_convertible< Actual*, Expected >, Actual >::type* = 0 ) const
{ {
expected_.get() = &actual; *expected_ = &actual;
return true; return true;
} }
private: private:
boost::reference_wrapper< Expected > expected_; Expected* expected_;
}; };
template< typename Expected > template< typename Expected >

View file

@ -59,6 +59,11 @@ BOOST_AUTO_TEST_CASE( assign )
BOOST_CHECK( mock::assign( 3 ).f_( i ) ); BOOST_CHECK( mock::assign( 3 ).f_( i ) );
BOOST_CHECK_EQUAL( 3, i ); BOOST_CHECK_EQUAL( 3, i );
} }
{
int i = 0;
BOOST_CHECK( mock::assign( 3 ).f_( &i ) );
BOOST_CHECK_EQUAL( 3, i );
}
{ {
const int* i = 0; const int* i = 0;
const int j = 1; const int j = 1;