Refactoring

git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@721 860be788-9bd5-4423-9f1e-828f051e677b
This commit is contained in:
mat007 2014-04-26 07:06:28 +00:00
parent 598ce50405
commit c91d425d87
5 changed files with 83 additions and 121 deletions

View file

@ -27,7 +27,6 @@
<ClInclude Include="..\..\turtle\detail\child.hpp" /> <ClInclude Include="..\..\turtle\detail\child.hpp" />
<ClInclude Include="..\..\turtle\detail\cleanup.hpp" /> <ClInclude Include="..\..\turtle\detail\cleanup.hpp" />
<ClInclude Include="..\..\turtle\detail\context.hpp" /> <ClInclude Include="..\..\turtle\detail\context.hpp" />
<ClInclude Include="..\..\turtle\detail\expectation_base.hpp" />
<ClInclude Include="..\..\turtle\detail\expectation_template.hpp" /> <ClInclude Include="..\..\turtle\detail\expectation_template.hpp" />
<ClInclude Include="..\..\turtle\detail\formatter.hpp" /> <ClInclude Include="..\..\turtle\detail\formatter.hpp" />
<ClInclude Include="..\..\turtle\detail\function.hpp" /> <ClInclude Include="..\..\turtle\detail\function.hpp" />

View file

@ -76,9 +76,6 @@
<ClInclude Include="..\..\turtle\detail\function_template.hpp"> <ClInclude Include="..\..\turtle\detail\function_template.hpp">
<Filter>Source Files\detail</Filter> <Filter>Source Files\detail</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\turtle\detail\expectation_base.hpp">
<Filter>Source Files\detail</Filter>
</ClInclude>
<ClInclude Include="..\..\turtle\detail\invocation.hpp"> <ClInclude Include="..\..\turtle\detail\invocation.hpp">
<Filter>Source Files\detail</Filter> <Filter>Source Files\detail</Filter>
</ClInclude> </ClInclude>

View file

@ -1,92 +0,0 @@
// http://turtle.sourceforge.net
//
// Copyright Mathieu Champlon 2012
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef MOCK_EXPECTATION_BASE_HPP_INCLUDED
#define MOCK_EXPECTATION_BASE_HPP_INCLUDED
#include "../config.hpp"
#include "../sequence.hpp"
#include "invocation.hpp"
#include <boost/make_shared.hpp>
#include <vector>
namespace mock
{
namespace detail
{
class expectation_base
{
public:
void set_location( const char* file, int line )
{
file_ = file;
line_ = line;
}
bool verify() const
{
return i_->verify();
}
bool invoke() const
{
for( sequences_cit it = sequences_.begin();
it != sequences_.end(); ++it )
if( ! (*it)->is_valid( this ) )
return false;
bool result = i_->invoke();
for( sequences_cit it = sequences_.begin();
it != sequences_.end(); ++it )
(*it)->invalidate( this );
return result;
}
const char* file() const
{
return file_;
}
int line() const
{
return line_;
}
protected:
expectation_base()
: i_( boost::make_shared< unlimited >() )
, file_( "unknown location" )
, line_( 0 )
{}
~expectation_base()
{
for( sequences_cit it = sequences_.begin();
it != sequences_.end(); ++it )
(*it)->remove( this );
}
void add( const boost::shared_ptr< sequence_impl >& s )
{
s->add( this );
sequences_.push_back( s );
}
boost::shared_ptr< invocation > i_;
private:
typedef std::vector<
boost::shared_ptr< sequence_impl >
> sequences_type;
typedef sequences_type::const_iterator sequences_cit;
sequences_type sequences_;
const char* file_;
int line_;
};
}
} // mock
#endif // MOCK_EXPECTATION_BASE_HPP_INCLUDED

View file

@ -31,7 +31,7 @@
BOOST_PP_IF(n, << ", " <<,) *m.c##n##_ BOOST_PP_IF(n, << ", " <<,) *m.c##n##_
#define MOCK_EXPECTATION_IN_ADD(z, n, d ) \ #define MOCK_EXPECTATION_IN_ADD(z, n, d ) \
add( s##n.impl_ ); s##n.impl_->add( this ); sequences_.push_back( s##n.impl_ );
#define MOCK_EXPECTATION_IN(z, n, d) \ #define MOCK_EXPECTATION_IN(z, n, d) \
expectation& in( BOOST_PP_ENUM_PARAMS(n, sequence& s) ) \ expectation& in( BOOST_PP_ENUM_PARAMS(n, sequence& s) ) \
@ -49,37 +49,26 @@ namespace detail
template< typename R template< typename R
BOOST_PP_ENUM_TRAILING_PARAMS(MOCK_NUM_ARGS, typename T) > BOOST_PP_ENUM_TRAILING_PARAMS(MOCK_NUM_ARGS, typename T) >
class expectation< R (BOOST_PP_ENUM_PARAMS(MOCK_NUM_ARGS,T)) > class expectation< R (BOOST_PP_ENUM_PARAMS(MOCK_NUM_ARGS,T)) >
: public expectation_base : public action< R, R (BOOST_PP_ENUM_PARAMS(MOCK_NUM_ARGS,T)) >
, public action< R, R (BOOST_PP_ENUM_PARAMS(MOCK_NUM_ARGS,T)) >
{ {
BOOST_PP_REPEAT(MOCK_NUM_ARGS, BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_TYPEDEF, _) MOCK_EXPECTATION_TYPEDEF, _)
public: public:
#ifndef MOCK_NUM_ARGS_0
expectation() expectation()
: BOOST_PP_REPEAT(MOCK_NUM_ARGS, : BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_INITIALIZE, _) MOCK_EXPECTATION_INITIALIZE, _)
BOOST_PP_COMMA_IF(MOCK_NUM_ARGS)
i_( boost::make_shared< unlimited >() )
, file_( "unknown location" )
, line_( 0 )
{} {}
template< BOOST_PP_ENUM_PARAMS(MOCK_NUM_ARGS, typename Constraint_) >
expectation& with(
BOOST_PP_ENUM_BINARY_PARAMS(MOCK_NUM_ARGS, Constraint_, c) )
{
BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_WITH, _)
return *this;
}
#endif
bool is_valid(
BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_ARGS, _) ) const
{
return ! i_->exhausted()
BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_IS_VALID, _);
}
BOOST_PP_REPEAT(MOCK_MAX_SEQUENCES, ~expectation()
MOCK_EXPECTATION_IN, _) {
for( sequences_cit it = sequences_.begin();
it != sequences_.end(); ++it )
(*it)->remove( this );
}
expectation& once() expectation& once()
{ {
@ -112,6 +101,64 @@ namespace detail
return *this; return *this;
} }
#ifndef MOCK_NUM_ARGS_0
template<
BOOST_PP_ENUM_PARAMS(MOCK_NUM_ARGS, typename Constraint_)
>
expectation& with(
BOOST_PP_ENUM_BINARY_PARAMS(MOCK_NUM_ARGS, Constraint_, c) )
{
BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_WITH, _)
return *this;
}
#endif
BOOST_PP_REPEAT(MOCK_MAX_SEQUENCES,
MOCK_EXPECTATION_IN, _)
void set_location( const char* file, int line )
{
file_ = file;
line_ = line;
}
bool verify() const
{
return i_->verify();
}
bool is_valid(
BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_ARGS, _) ) const
{
return ! i_->exhausted()
BOOST_PP_REPEAT(MOCK_NUM_ARGS,
MOCK_EXPECTATION_IS_VALID, _);
}
bool invoke() const
{
for( sequences_cit it = sequences_.begin();
it != sequences_.end(); ++it )
if( ! (*it)->is_valid( this ) )
return false;
bool result = i_->invoke();
for( sequences_cit it = sequences_.begin();
it != sequences_.end(); ++it )
(*it)->invalidate( this );
return result;
}
const char* file() const
{
return file_;
}
int line() const
{
return line_;
}
friend std::ostream& operator<<( friend std::ostream& operator<<(
std::ostream& s, const expectation& m ) std::ostream& s, const expectation& m )
{ {
@ -125,9 +172,19 @@ namespace detail
#endif #endif
; ;
} }
private: private:
typedef std::vector<
boost::shared_ptr< sequence_impl >
> sequences_type;
typedef sequences_type::const_iterator sequences_cit;
BOOST_PP_REPEAT( BOOST_PP_REPEAT(
MOCK_NUM_ARGS, MOCK_EXPECTATION_MEMBER, _) MOCK_NUM_ARGS, MOCK_EXPECTATION_MEMBER, _)
boost::shared_ptr< invocation > i_;
sequences_type sequences_;
const char* file_;
int line_;
}; };
} }
} // mock } // mock

View file

@ -13,13 +13,13 @@
#include "../error.hpp" #include "../error.hpp"
#include "../log.hpp" #include "../log.hpp"
#include "../constraints.hpp" #include "../constraints.hpp"
#include "../sequence.hpp"
#include "../matcher.hpp" #include "../matcher.hpp"
#include "action.hpp" #include "action.hpp"
#include "verifiable.hpp" #include "verifiable.hpp"
#include "invocation.hpp"
#include "type_name.hpp" #include "type_name.hpp"
#include "context.hpp" #include "context.hpp"
#include "invocation.hpp"
#include "expectation_base.hpp"
#include <boost/preprocessor/iteration/iterate.hpp> #include <boost/preprocessor/iteration/iterate.hpp>
#include <boost/preprocessor/repetition/repeat_from_to.hpp> #include <boost/preprocessor/repetition/repeat_from_to.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_params.hpp>
@ -28,6 +28,7 @@
#include <boost/test/utils/basic_cstring/basic_cstring.hpp> #include <boost/test/utils/basic_cstring/basic_cstring.hpp>
#include <boost/test/utils/lazy_ostream.hpp> #include <boost/test/utils/lazy_ostream.hpp>
#include <boost/enable_shared_from_this.hpp> #include <boost/enable_shared_from_this.hpp>
#include <boost/make_shared.hpp>
#include <boost/call_traits.hpp> #include <boost/call_traits.hpp>
#include <boost/optional.hpp> #include <boost/optional.hpp>
#include <ostream> #include <ostream>