00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef MOCKPP_ABSTRACTINVOCATIONDISPATCHER_H
00035 #define MOCKPP_ABSTRACTINVOCATIONDISPATCHER_H
00036
00037 #include <mockpp/mockpp.h>
00038
00039 #include MOCKPP_VECTOR_H
00040
00041 #include <mockpp/chaining/InvocationDispatcher.h>
00042 #include <mockpp/chaining/Invokable.h>
00043
00044 #include <mockpp/stub/StubHolder.h>
00045
00046 #include <mockpp/stub/TestFailureStub.h>
00047
00048
00049 MOCKPP_NS_START
00050
00051
00054 template <typename R,
00055 typename I>
00056 class AbstractInvocationDispatcher : public InvocationDispatcher<R, I>
00057 {
00058 protected:
00059
00060 typedef Invokable<R, I> Item;
00061 typedef MOCKPP_STL::vector<Item*> List;
00062
00063 typedef typename List::iterator Iterator;
00064 typedef typename List::reverse_iterator ReverseIterator;
00065 typedef typename List::const_iterator ConstIterator;
00066
00067 public:
00068
00071 AbstractInvocationDispatcher()
00072 : defaultStub( new TestFailureStub<R, I>( MOCKPP_PCHAR( "unexpected invocation" ) ) )
00073 {}
00074
00077 virtual ~AbstractInvocationDispatcher()
00078 {
00079 for ( unsigned i = 0; i < invokables.size(); ++i )
00080 delete invokables[ i ];
00081 invokables.clear();
00082 }
00083
00087 virtual void setDefaultStub( const MOCKPP_NS::StubHolder<R, I> &in_defaultStub )
00088 {
00089 defaultStub = in_defaultStub;
00090 }
00091
00095 virtual void add( typename Invokable<R, I>::AP invokable )
00096 {
00097 invokables.push_back( invokable.release() );
00098 }
00099
00103 virtual void verify()
00104 {
00105 for ( unsigned i = 0; i < invokables.size(); ++i )
00106 invokables[ i ] ->verify();
00107 }
00108
00111 virtual void reset()
00112 {
00113 for ( unsigned i = 0; i < invokables.size(); ++i )
00114 delete invokables[ i ];
00115 invokables.clear();
00116 }
00117
00122 virtual String describeTo( String &buffer ) const
00123 {
00124 if ( anyInvokableHasDescription() )
00125 writeInvokablesTo( buffer );
00126 else
00127 buffer += MOCKPP_PCHAR( "no expectations set" );
00128
00129 return buffer;
00130 }
00131
00132 private:
00133
00137 void writeInvokablesTo( String &out_result ) const
00138 {
00139 unsigned lines = 0;
00140 String result;
00141 for ( unsigned i = 0; i < invokables.size(); ++i )
00142 {
00143 if ( invokables[ i ] ->hasDescription() )
00144 {
00145 ++lines;
00146 String s;
00147 invokables[ i ] ->describeTo( s );
00148 if (lines > 1)
00149 s.insert(0, MOCKPP_PCHAR(" - "));
00150 result += s + MOCKPP_PCHAR( "\n" );
00151 }
00152 }
00153
00154 if (lines > 1)
00155 out_result += MOCKPP_PCHAR("\n - ");
00156 out_result += result;
00157 }
00158
00163 bool anyInvokableHasDescription() const
00164 {
00165 for ( unsigned i = 0; i < invokables.size(); ++i )
00166 if ( invokables[ i ] ->hasDescription() )
00167 return true;
00168 return false;
00169 }
00170
00171 protected:
00172
00173 typename Stub<R, I>::AP defaultStub;
00174 List invokables;
00175 };
00176
00177
00178 MOCKPP_NS_END
00179
00180
00181 #endif // MOCKPP_ABSTRACTINVOCATIONDISPATCHER_H
00182