mock_object.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. // (C) Copyright Gennadiy Rozental 2005-2008.
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // See http://www.boost.org/libs/test for the library home page.
  6. //
  7. // File : $RCSfile$
  8. //
  9. // Version : $Revision: 54633 $
  10. //
  11. // Description : Facilities to perform exception safety_tests
  12. // ***************************************************************************
  13. #ifndef BOOST_TEST_MOCK_OBJECT_HPP_112205GER
  14. #define BOOST_TEST_MOCK_OBJECT_HPP_112205GER
  15. // Boost.Test
  16. #include <boost/test/detail/config.hpp>
  17. #include <boost/test/interaction_based.hpp>
  18. // Boost
  19. #include <boost/preprocessor/punctuation/comma.hpp>
  20. #include <boost/test/detail/suppress_warnings.hpp>
  21. //____________________________________________________________________________//
  22. namespace boost {
  23. namespace itest {
  24. // ************************************************************************** //
  25. // ************** mock_object_base ************** //
  26. // ************************************************************************** //
  27. class mock_object_base {
  28. public:
  29. mock_object_base() {}
  30. template<typename T1>
  31. mock_object_base( T1 const& ) {}
  32. template<typename T1, typename T2>
  33. mock_object_base( T1 const&, T2 const& ) {}
  34. template<typename T1, typename T2, typename T3>
  35. mock_object_base( T1 const&, T2 const&, T3 const& ) {}
  36. template<typename T1, typename T2, typename T3, typename T4>
  37. mock_object_base( T1 const&, T2 const&, T3 const&, T4 const& ) {}
  38. template<typename T1, typename T2, typename T3, typename T4, typename T5>
  39. mock_object_base( T1 const&, T2 const&, T3 const&, T4 const&, T5 const& ) {}
  40. };
  41. // ************************************************************************** //
  42. // ************** mock_object implementation helpers ************** //
  43. // ************************************************************************** //
  44. #define MO_OP_IMPL( op, descr, ret ) \
  45. BOOST_ITEST_SCOPE( mock_object::operator op ); \
  46. BOOST_ITEST_EPOINT( descr ); \
  47. return ret \
  48. /**/
  49. #define MO_UNARY_OP( op, descr ) \
  50. self_type const& operator op() const \
  51. { \
  52. MO_OP_IMPL( op, descr, prototype() ); \
  53. } \
  54. /**/
  55. #define MO_UNARY_BOOL_OP( op, descr ) \
  56. bool operator op() const \
  57. { \
  58. MO_OP_IMPL( op, descr, (!!BOOST_ITEST_DPOINT()) ); \
  59. } \
  60. /**/
  61. #define MO_BINARY_OP( op, descr ) \
  62. template<int i1, typename Base1,int i2, typename Base2> \
  63. inline mock_object<i1,Base1> const& \
  64. operator op( mock_object<i1,Base1> const& mo, \
  65. mock_object<i2,Base2> const& ) \
  66. { \
  67. MO_OP_IMPL( op, descr, mo ); \
  68. } \
  69. \
  70. template<int i, typename Base, typename T> \
  71. inline mock_object<i,Base> const& \
  72. operator op( mock_object<i,Base> const& mo, T const& ) \
  73. { \
  74. MO_OP_IMPL( op, descr, mo ); \
  75. } \
  76. \
  77. template<int i, typename Base, typename T> \
  78. inline mock_object<i,Base> const& \
  79. operator op( T const&, mock_object<i,Base> const& mo ) \
  80. { \
  81. MO_OP_IMPL( op, descr, mo ); \
  82. } \
  83. /**/
  84. #define MO_BINARY_BOOL_OP( op, descr ) \
  85. template<int i1, typename Base1,int i2, typename Base2> \
  86. inline bool \
  87. operator op( mock_object<i1,Base1> const&, \
  88. mock_object<i2,Base2> const& ) \
  89. { \
  90. MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() ); \
  91. } \
  92. \
  93. template<int i, typename Base, typename T> \
  94. inline bool \
  95. operator op( mock_object<i,Base> const&, T const& ) \
  96. { \
  97. MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() ); \
  98. } \
  99. \
  100. template<int i, typename Base, typename T> \
  101. inline bool \
  102. operator op( T const&, mock_object<i,Base> const& ) \
  103. { \
  104. MO_OP_IMPL( op, descr, BOOST_ITEST_DPOINT() ); \
  105. } \
  106. /**/
  107. // ************************************************************************** //
  108. // ************** mock_object ************** //
  109. // ************************************************************************** //
  110. template<int i = 0, typename Base=mock_object_base>
  111. class mock_object;
  112. template<int i, typename Base>
  113. class mock_object : public Base {
  114. // Private typeefs
  115. typedef mock_object<i,Base> self_type;
  116. struct dummy { void nonnull() {}; };
  117. typedef void (dummy::*safe_bool)();
  118. // prototype constructor
  119. mock_object( dummy* ) {}
  120. public:
  121. static mock_object& prototype()
  122. {
  123. static mock_object p( reinterpret_cast<dummy*>(0) );
  124. return p;
  125. }
  126. // Constructors
  127. mock_object()
  128. {
  129. BOOST_ITEST_SCOPE( mock_object::mock_object );
  130. BOOST_ITEST_EPOINT( "Mock object default constructor" );
  131. }
  132. template<typename T1>
  133. mock_object( T1 const& arg1 )
  134. : mock_object_base( arg1 )
  135. {
  136. BOOST_ITEST_SCOPE( mock_object::mock_object );
  137. BOOST_ITEST_EPOINT( "Mock object constructor" );
  138. }
  139. template<typename T1, typename T2>
  140. mock_object( T1 const& arg1, T2 const& arg2 )
  141. : mock_object_base( arg1, arg2 )
  142. {
  143. BOOST_ITEST_SCOPE( mock_object::mock_object );
  144. BOOST_ITEST_EPOINT( "Mock object constructor" );
  145. }
  146. template<typename T1, typename T2, typename T3>
  147. mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3 )
  148. : mock_object_base( arg1, arg2, arg3 )
  149. {
  150. BOOST_ITEST_SCOPE( mock_object::mock_object );
  151. BOOST_ITEST_EPOINT( "Mock object constructor" );
  152. }
  153. template<typename T1, typename T2, typename T3, typename T4>
  154. mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3, T4 const& arg4 )
  155. : mock_object_base( arg1, arg2, arg3, arg4 )
  156. {
  157. BOOST_ITEST_SCOPE( mock_object::mock_object );
  158. BOOST_ITEST_EPOINT( "Mock object constructor" );
  159. }
  160. template<typename T1, typename T2, typename T3, typename T4, typename T5>
  161. mock_object( T1 const& arg1, T2 const& arg2, T3 const& arg3, T4 const& arg4, T5 const& arg5 )
  162. : mock_object_base( arg1, arg2, arg3, arg4, arg5 )
  163. {
  164. BOOST_ITEST_SCOPE( mock_object::mock_object );
  165. BOOST_ITEST_EPOINT( "Mock object constructor" );
  166. }
  167. mock_object( mock_object const& )
  168. {
  169. BOOST_ITEST_SCOPE( mock_object::mock_object );
  170. BOOST_ITEST_EPOINT( "Mock object copy constructor" );
  171. }
  172. // assignment
  173. self_type const& operator =( mock_object const& ) const
  174. {
  175. MO_OP_IMPL( =, "Copy assignment", prototype() );
  176. }
  177. template <typename T>
  178. self_type const& operator =( T const& ) const
  179. {
  180. MO_OP_IMPL( =, "Copy assignment", prototype() );
  181. }
  182. // Unary operators
  183. MO_UNARY_BOOL_OP( !, "Logical NOT operator" )
  184. MO_UNARY_OP( &, "Address-of operator" )
  185. MO_UNARY_OP( ~, "One's complement operator" )
  186. MO_UNARY_OP( *, "Pointer dereference" )
  187. MO_UNARY_OP( +, "Unary plus" )
  188. // Increment and Decrement
  189. MO_UNARY_OP( ++, "Prefix increment" )
  190. MO_UNARY_OP( --, "Prefix decrement" )
  191. self_type const& operator ++(int) const
  192. {
  193. MO_OP_IMPL( ++, "Postfix increment", prototype() );
  194. }
  195. self_type const& operator --(int) const
  196. {
  197. MO_OP_IMPL( --, "Postfix decrement", prototype() );
  198. }
  199. // Bool context convertion
  200. operator safe_bool() const
  201. {
  202. MO_OP_IMPL( safe_bool, "Bool context conversion",
  203. (BOOST_ITEST_DPOINT() ? 0 : &dummy::nonnull) );
  204. }
  205. // Function-call operators
  206. self_type const& operator ()() const
  207. {
  208. MO_OP_IMPL( (), "0-arity function-call", prototype() );
  209. }
  210. template<typename T1>
  211. self_type const& operator ()( T1 const& arg1 ) const
  212. {
  213. MO_OP_IMPL( (), "1-arity function-call", prototype() );
  214. }
  215. template<typename T1, typename T2>
  216. self_type const& operator ()( T1 const&, T2 const& ) const
  217. {
  218. MO_OP_IMPL( (), "2-arity function-call", prototype() );
  219. }
  220. template<typename T1, typename T2, typename T3>
  221. self_type const& operator ()( T1 const&, T2 const&, T3 const& ) const
  222. {
  223. MO_OP_IMPL( (), "3-arity function-call", prototype() );
  224. }
  225. template<typename T1, typename T2, typename T3, typename T4>
  226. self_type const& operator ()( T1 const&, T2 const&, T3 const&, T4 const& ) const
  227. {
  228. MO_OP_IMPL( (), "4-arity function-call", prototype() );
  229. }
  230. template<typename T1, typename T2, typename T3, typename T4, typename T5>
  231. self_type const& operator ()( T1 const&, T2 const&, T3 const&, T4 const&, T5 const& ) const
  232. {
  233. MO_OP_IMPL( (), "5-arity function-call", prototype() );
  234. }
  235. // Substripting
  236. template<typename T>
  237. self_type const& operator []( T const& ) const
  238. {
  239. MO_OP_IMPL( [], "Substripting", prototype() );
  240. }
  241. // Class member access
  242. self_type const* operator->() const
  243. {
  244. MO_OP_IMPL( ->, "Class member access", this );
  245. }
  246. };
  247. // !! MO_BINARY_OP( BOOST_PP_COMMA(), "Comma operator" )
  248. MO_BINARY_BOOL_OP( !=, "Inequality" )
  249. MO_BINARY_OP( %, "Modulus" )
  250. MO_BINARY_OP( %=, "Modulus/assignment" )
  251. MO_BINARY_OP( &, "Bitwise AND" )
  252. MO_BINARY_BOOL_OP( &&, "Logical AND" )
  253. MO_BINARY_OP( &=, "Bitwise AND/assignment" )
  254. MO_BINARY_OP( *, "Multiplication" )
  255. MO_BINARY_OP( *=, "Multiplication/assignment" )
  256. MO_BINARY_OP( +, "Addition" )
  257. MO_BINARY_OP( +=, "Addition/assignment" )
  258. //MO_BINARY_OP( -, "Subtraction" )
  259. MO_BINARY_OP( -=, "Subtraction/assignment" )
  260. MO_BINARY_OP( ->*, "Pointer-to-member selection" )
  261. MO_BINARY_OP( /, "Division" )
  262. MO_BINARY_OP( /=, "Division/assignment" )
  263. MO_BINARY_BOOL_OP( <, "Less than" )
  264. MO_BINARY_OP( <<=, "Left shift/assignment" )
  265. MO_BINARY_BOOL_OP( <=, "Less than or equal to" )
  266. MO_BINARY_BOOL_OP( ==, "Equality" )
  267. MO_BINARY_BOOL_OP( >, "Greater than" )
  268. MO_BINARY_BOOL_OP( >=, "Greater than or equal to" )
  269. MO_BINARY_OP( >>=, "Right shift/assignment" )
  270. MO_BINARY_OP( ^, "Exclusive OR" )
  271. MO_BINARY_OP( ^=, "Exclusive OR/assignment" )
  272. MO_BINARY_OP( |, "Bitwise inclusive OR" )
  273. MO_BINARY_OP( |=, "Bitwise inclusive OR/assignment" )
  274. MO_BINARY_BOOL_OP( ||, "Logical OR" )
  275. MO_BINARY_OP( <<, "Left shift" )
  276. MO_BINARY_OP( >>, "Right shift" )
  277. } // namespace itest
  278. } // namespace boost
  279. #include <boost/test/detail/enable_warnings.hpp>
  280. #endif // BOOST_TEST_MOCK_OBJECT_HPP_112205GER