mirror of
https://github.com/mat007/turtle.git
synced 2026-06-22 12:13:43 +00:00
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:
parent
6722d7b04e
commit
fbd78450e8
1 changed files with 44 additions and 14 deletions
|
|
@ -9,13 +9,20 @@
|
|||
#ifndef MOCK_CHECK_HPP_INCLUDED
|
||||
#define MOCK_CHECK_HPP_INCLUDED
|
||||
|
||||
#include "config.hpp"
|
||||
#include "is_functor.hpp"
|
||||
#include "constraints.hpp"
|
||||
#include "operators.hpp"
|
||||
#include "format.hpp"
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/utility/enable_if.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 <ostream>
|
||||
|
||||
|
|
@ -30,8 +37,8 @@ namespace detail
|
|||
BOOST_CONCEPT_USAGE( FunctorCompatible )
|
||||
{
|
||||
boost::require_boolean_expr(
|
||||
// if an error is generated by the line below it means an argument
|
||||
// passed to 'with' was of the wrong type.
|
||||
// if an error is generated by the line below it means
|
||||
// an argument passed to 'with' was of the wrong type.
|
||||
functor_accepts( actual_argument_type )
|
||||
);
|
||||
}
|
||||
|
|
@ -48,8 +55,8 @@ namespace detail
|
|||
BOOST_CONCEPT_USAGE( EqualityComparable )
|
||||
{
|
||||
boost::require_boolean_expr(
|
||||
// if an error is generated by the line below it means an argument
|
||||
// passed to 'with' was of the wrong type.
|
||||
// if an error is generated by the line below it means
|
||||
// an argument passed to 'with' was of the wrong type.
|
||||
actual_argument_type == expected_argument_type
|
||||
);
|
||||
}
|
||||
|
|
@ -59,6 +66,28 @@ namespace detail
|
|||
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 >
|
||||
class check
|
||||
{
|
||||
|
|
@ -68,7 +97,7 @@ namespace detail
|
|||
BOOST_DEDUCED_TYPENAME boost::enable_if<
|
||||
BOOST_DEDUCED_TYPENAME detail::is_functor< Functor >
|
||||
>::type* = 0 )
|
||||
: desc_( mock::format( f ) )
|
||||
: desc_( lazy_format( f ) )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
||||
f_ = f;
|
||||
|
|
@ -80,19 +109,19 @@ namespace detail
|
|||
BOOST_DEDUCED_TYPENAME boost::disable_if<
|
||||
BOOST_DEDUCED_TYPENAME detail::is_functor< Expected >
|
||||
>::type* = 0 )
|
||||
: desc_( mock::format( expected ) )
|
||||
: desc_( lazy_format( expected ) )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT(( EqualityComparable< Expected, Actual > ));
|
||||
f_ = mock::equal( expected ).f_;
|
||||
if( ! f_ )
|
||||
std::invalid_argument( "invalid constraint" );
|
||||
}
|
||||
template< typename Functor >
|
||||
explicit check( const constraint< Functor >& ph )
|
||||
: desc_( mock::format( ph.f_ ) )
|
||||
template< typename Constraint >
|
||||
explicit check( const constraint< Constraint >& c )
|
||||
: desc_( lazy_format( c.f_ ) )
|
||||
{
|
||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Functor, Actual > ));
|
||||
f_ = ph.f_;
|
||||
BOOST_CONCEPT_ASSERT(( FunctorCompatible< Constraint, Actual > ));
|
||||
f_ = c.f_;
|
||||
if( ! f_ )
|
||||
std::invalid_argument( "invalid constraint" );
|
||||
}
|
||||
|
|
@ -104,12 +133,13 @@ namespace detail
|
|||
|
||||
friend std::ostream& operator<<( std::ostream& s, const check& c )
|
||||
{
|
||||
return s << c.desc_;
|
||||
c.desc_( s );
|
||||
return s;
|
||||
}
|
||||
|
||||
private:
|
||||
boost::function< bool( Actual ) > f_;
|
||||
std::string desc_;
|
||||
boost::function< void( std::ostream& ) > desc_;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue