fixture.hpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*=============================================================================
  2. Copyright (c) 2016 Lee Clagett
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. ==============================================================================*/
  6. #include <boost/fusion/sequence/comparison.hpp>
  7. #include <boost/mpl/identity.hpp>
  8. namespace test_detail
  9. {
  10. struct convertible
  11. {
  12. convertible() : value_() {}
  13. convertible(int value) : value_(value) {}
  14. int value_;
  15. };
  16. bool operator==(convertible const& lhs, convertible const& rhs)
  17. {
  18. return lhs.value_ == rhs.value_;
  19. }
  20. bool operator!=(convertible const& lhs, convertible const& rhs)
  21. {
  22. return lhs.value_ != rhs.value_;
  23. }
  24. // Testing conversion at function call allows for testing mutable lvalue,
  25. // const lvalue, and rvalue as the source. mpl::identity prevents deduction
  26. template <typename T>
  27. T implicit_construct(typename boost::mpl::identity<T>::type source)
  28. {
  29. return source;
  30. }
  31. template <typename F, typename Source, typename Expected>
  32. bool run(Source const& source, Expected const& expected)
  33. {
  34. return F()(source, expected);
  35. }
  36. template <typename F, typename Source>
  37. bool run(Source const& source)
  38. {
  39. return run<F>(source, source);
  40. }
  41. template <typename T>
  42. struct can_rvalue_implicit_construct
  43. {
  44. template<typename Source, typename Expected>
  45. bool operator()(Source const& source, Expected const& expected) const
  46. {
  47. return expected == implicit_construct<T>(implicit_construct<Source>(source));
  48. }
  49. };
  50. template <typename T>
  51. struct can_lvalue_implicit_construct
  52. {
  53. template <typename Source, typename Expected>
  54. bool operator()(Source source, Expected const& expected) const
  55. {
  56. return expected == implicit_construct<T>(source);
  57. }
  58. };
  59. template <typename T>
  60. struct can_const_lvalue_implicit_construct
  61. {
  62. template <typename Source, typename Expected>
  63. bool operator()(Source const& source, Expected const& expected) const
  64. {
  65. return expected == implicit_construct<T>(source);
  66. }
  67. };
  68. template <typename T>
  69. struct can_implicit_construct
  70. {
  71. template <typename Source, typename Expected>
  72. bool operator()(Source const& source, Expected const& expected) const
  73. {
  74. return
  75. run< can_rvalue_implicit_construct<T> >(source, expected) &&
  76. run< can_lvalue_implicit_construct<T> >(source, expected) &&
  77. run< can_const_lvalue_implicit_construct<T> >(source, expected);
  78. }
  79. };
  80. template <typename T>
  81. struct can_rvalue_construct
  82. {
  83. template<typename Source, typename Expected>
  84. bool operator()(Source const& source, Expected const& expected) const
  85. {
  86. return expected == T(implicit_construct<Source>(source));
  87. }
  88. };
  89. template <typename T>
  90. struct can_lvalue_construct
  91. {
  92. template <typename Source, typename Expected>
  93. bool operator()(Source source, Expected const& expected) const
  94. {
  95. return expected == T(source);
  96. }
  97. };
  98. template <typename T>
  99. struct can_const_lvalue_construct
  100. {
  101. template <typename Source, typename Expected>
  102. bool operator()(Source const& source, Expected const& expected) const
  103. {
  104. return expected == T(source);
  105. }
  106. };
  107. template <typename T>
  108. struct can_construct
  109. {
  110. template <typename Source, typename Expected>
  111. bool operator()(Source const& source, Expected const& expected) const
  112. {
  113. return
  114. run< can_rvalue_construct<T> >(source, expected) &&
  115. run< can_lvalue_construct<T> >(source, expected) &&
  116. run< can_const_lvalue_construct<T> >(source, expected);
  117. }
  118. };
  119. template <typename T>
  120. struct can_rvalue_assign
  121. {
  122. template <typename Source, typename Expected>
  123. bool operator()(Source const& source, Expected const& expected) const
  124. {
  125. bool result = true;
  126. {
  127. T seq;
  128. result &= (seq == expected || seq != expected);
  129. seq = implicit_construct<Source>(source);
  130. result &= (seq == expected);
  131. }
  132. return result;
  133. }
  134. };
  135. template <typename T>
  136. struct can_lvalue_assign
  137. {
  138. template <typename Source, typename Expected>
  139. bool operator()(Source source, Expected const& expected) const
  140. {
  141. bool result = true;
  142. {
  143. T seq;
  144. result &= (seq == expected || seq != expected);
  145. seq = source;
  146. result &= (seq == expected);
  147. }
  148. return result;
  149. }
  150. };
  151. template <typename T>
  152. struct can_const_lvalue_assign
  153. {
  154. template <typename Source, typename Expected>
  155. bool operator()(Source const& source, Expected const& expected) const
  156. {
  157. bool result = true;
  158. {
  159. T seq;
  160. result &= (seq == expected || seq != expected);
  161. seq = source;
  162. result &= (seq == expected);
  163. }
  164. return result;
  165. }
  166. };
  167. template <typename T>
  168. struct can_assign
  169. {
  170. template <typename Source, typename Expected>
  171. bool operator()(Source const& source, Expected const& expected) const
  172. {
  173. return
  174. run< can_rvalue_assign<T> >(source, expected) &&
  175. run< can_lvalue_assign<T> >(source, expected) &&
  176. run< can_const_lvalue_assign<T> >(source, expected);
  177. }
  178. };
  179. template <typename T>
  180. struct can_copy
  181. {
  182. template <typename Source, typename Expected>
  183. bool operator()(Source const& source, Expected const& expected) const
  184. {
  185. return
  186. run< can_construct<T> >(source, expected) &&
  187. run< can_implicit_construct<T> >(source, expected) &&
  188. run< can_assign<T> >(source, expected);
  189. }
  190. };
  191. } // test_detail