Added lazy formatting for actual parameters

git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@206 860be788-9bd5-4423-9f1e-828f051e677b
This commit is contained in:
mat007 2011-01-22 18:40:22 +00:00
parent 6722d7b04e
commit fbd78450e8

View file

@ -9,13 +9,20 @@
#ifndef MOCK_CHECK_HPP_INCLUDED #ifndef MOCK_CHECK_HPP_INCLUDED
#define MOCK_CHECK_HPP_INCLUDED #define MOCK_CHECK_HPP_INCLUDED
#include "config.hpp"
#include "is_functor.hpp" #include "is_functor.hpp"
#include "constraints.hpp" #include "constraints.hpp"
#include "operators.hpp" #include "operators.hpp"
#include "format.hpp" #include "format.hpp"
#include <boost/function.hpp>
#include <boost/utility/enable_if.hpp> #include <boost/utility/enable_if.hpp>
#include <boost/concept_check.hpp> #include <boost/concept_check.hpp>
#ifdef MOCK_USE_BOOST_BIND
#include <boost/bind.hpp>
#else
#include <boost/spirit/home/phoenix/bind.hpp>
#include <boost/spirit/home/phoenix/core/argument.hpp>
#endif
#include <boost/function.hpp>
#include <stdexcept> #include <stdexcept>
#include <ostream> #include <ostream>
@ -30,8 +37,8 @@ namespace detail
BOOST_CONCEPT_USAGE( FunctorCompatible ) BOOST_CONCEPT_USAGE( FunctorCompatible )
{ {
boost::require_boolean_expr( boost::require_boolean_expr(
// if an error is generated by the line below it means an argument // if an error is generated by the line below it means
// passed to 'with' was of the wrong type. // an argument passed to 'with' was of the wrong type.
functor_accepts( actual_argument_type ) functor_accepts( actual_argument_type )
); );
} }
@ -48,8 +55,8 @@ namespace detail
BOOST_CONCEPT_USAGE( EqualityComparable ) BOOST_CONCEPT_USAGE( EqualityComparable )
{ {
boost::require_boolean_expr( boost::require_boolean_expr(
// if an error is generated by the line below it means an argument // if an error is generated by the line below it means
// passed to 'with' was of the wrong type. // an argument passed to 'with' was of the wrong type.
actual_argument_type == expected_argument_type actual_argument_type == expected_argument_type
); );
} }
@ -59,6 +66,28 @@ namespace detail
Actual actual_argument_type; Actual actual_argument_type;
}; };
template< typename T >
void log( std::ostream& s, const T& t )
{
s << mock::format( t );
}
#ifdef MOCK_USE_BOOST_BIND
template< typename T >
boost::function< void( std::ostream& ) > lazy_format( T t )
{
return boost::bind( &log< T >, _1, t );
}
#else
template< typename T >
boost::function< void( std::ostream& ) > lazy_format( T t )
{
return boost::phoenix::bind(
&log< T >,
boost::phoenix::arg_names::_1, t );
}
#endif
template< typename Actual > template< typename Actual >
class check class check
{ {
@ -68,7 +97,7 @@ namespace detail
BOOST_DEDUCED_TYPENAME boost::enable_if< BOOST_DEDUCED_TYPENAME boost::enable_if<
BOOST_DEDUCED_TYPENAME detail::is_functor< Functor > BOOST_DEDUCED_TYPENAME detail::is_functor< Functor >
>::type* = 0 ) >::type* = 0 )
: desc_( mock::format( f ) ) : desc_( lazy_format( f ) )
{ {
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > )); BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
f_ = f; f_ = f;
@ -80,19 +109,19 @@ namespace detail
BOOST_DEDUCED_TYPENAME boost::disable_if< BOOST_DEDUCED_TYPENAME boost::disable_if<
BOOST_DEDUCED_TYPENAME detail::is_functor< Expected > BOOST_DEDUCED_TYPENAME detail::is_functor< Expected >
>::type* = 0 ) >::type* = 0 )
: desc_( mock::format( expected ) ) : desc_( lazy_format( expected ) )
{ {
BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > )); BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > ));
f_ = mock::equal( expected ).f_; f_ = mock::equal( expected ).f_;
if( ! f_ ) if( ! f_ )
std::invalid_argument( "invalid constraint" ); std::invalid_argument( "invalid constraint" );
} }
template< typename Functor > template< typename Constraint >
explicit check( const constraint< Functor >& ph ) explicit check( const constraint< Constraint >& c )
: desc_( mock::format( ph.f_ ) ) : desc_( lazy_format( c.f_ ) )
{ {
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > )); BOOST_CONCEPT_ASSERT(( FunctorCompatible< Constraint, Actual > ));
f_ = ph.f_; f_ = c.f_;
if( ! f_ ) if( ! f_ )
std::invalid_argument( "invalid constraint" ); std::invalid_argument( "invalid constraint" );
} }
@ -104,12 +133,13 @@ namespace detail
friend std::ostream& operator<<( std::ostream& s, const check& c ) friend std::ostream& operator<<( std::ostream& s, const check& c )
{ {
return s << c.desc_; c.desc_( s );
return s;
} }
private: private:
boost::function< bool( Actual ) > f_; boost::function< bool( Actual ) > f_;
std::string desc_; boost::function< void( std::ostream& ) > desc_;
}; };
} }
} }