mismatch_test.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*
  2. Copyright (c) Marshall Clow 2013.
  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. For more information, see http://www.boost.org
  6. */
  7. #include <boost/config.hpp>
  8. #include <boost/algorithm/cxx14/mismatch.hpp>
  9. #include "iterator_test.hpp"
  10. #define BOOST_TEST_MAIN
  11. #include <boost/test/unit_test.hpp>
  12. template <typename T>
  13. BOOST_CXX14_CONSTEXPR bool eq ( const T& a, const T& b ) { return a == b; }
  14. template <typename T>
  15. BOOST_CXX14_CONSTEXPR bool never_eq ( const T&, const T& ) { return false; }
  16. namespace ba = boost::algorithm;
  17. template <typename Iter1, typename Iter2>
  18. BOOST_CXX14_CONSTEXPR bool iter_eq ( std::pair<Iter1, Iter2> pr, Iter1 first, Iter2 second ) {
  19. return pr.first == first && pr.second == second;
  20. }
  21. void test_mismatch ()
  22. {
  23. // Note: The literal values here are tested against directly, careful if you change them:
  24. BOOST_CXX14_CONSTEXPR int num[] = { 1, 1, 2, 3, 5 };
  25. const int sz = sizeof (num)/sizeof(num[0]);
  26. // No mismatch for empty sequences
  27. BOOST_CHECK ( iter_eq (
  28. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
  29. input_iterator<const int *>(num), input_iterator<const int *>(num)),
  30. input_iterator<const int *>(num), input_iterator<const int *>(num)));
  31. BOOST_CHECK ( iter_eq (
  32. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
  33. input_iterator<const int *>(num), input_iterator<const int *>(num),
  34. never_eq<int> ),
  35. input_iterator<const int *>(num), input_iterator<const int *>(num)));
  36. BOOST_CHECK ( iter_eq (
  37. ba::mismatch ( random_access_iterator<const int *>(num), random_access_iterator<const int *>(num),
  38. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num),
  39. never_eq<int> ),
  40. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)));
  41. // Empty vs. non-empty mismatch immediately
  42. BOOST_CHECK ( iter_eq (
  43. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
  44. input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
  45. input_iterator<const int *>(num), input_iterator<const int *>(num)));
  46. BOOST_CHECK ( iter_eq (
  47. ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2),
  48. input_iterator<const int *>(num), input_iterator<const int *>(num)),
  49. input_iterator<const int *>(num + 1), input_iterator<const int *>(num)));
  50. BOOST_CHECK ( iter_eq (
  51. ba::mismatch ( random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num + 2),
  52. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)),
  53. random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num)));
  54. // Single element sequences are equal if they contain the same value
  55. BOOST_CHECK ( iter_eq (
  56. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  57. input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
  58. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1)));
  59. BOOST_CHECK ( iter_eq (
  60. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  61. input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  62. eq<int> ),
  63. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1)));
  64. BOOST_CHECK ( iter_eq (
  65. ba::mismatch ( random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
  66. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
  67. eq<int> ),
  68. random_access_iterator<const int *>(num + 1), random_access_iterator<const int *>(num + 1)));
  69. BOOST_CHECK ( iter_eq (
  70. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  71. input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  72. never_eq<int> ),
  73. input_iterator<const int *>(num), input_iterator<const int *>(num)));
  74. BOOST_CHECK ( iter_eq (
  75. ba::mismatch ( random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
  76. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + 1),
  77. never_eq<int> ),
  78. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num)));
  79. BOOST_CHECK ( iter_eq (
  80. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  81. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)),
  82. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)));
  83. BOOST_CHECK ( iter_eq (
  84. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  85. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2),
  86. eq<int> ),
  87. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 2)));
  88. BOOST_CHECK ( iter_eq (
  89. ba::mismatch ( input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 3),
  90. input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
  91. input_iterator<const int *>(num + 2), input_iterator<const int *>(num)));
  92. BOOST_CHECK ( iter_eq (
  93. ba::mismatch ( input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 3),
  94. input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  95. eq<int> ),
  96. input_iterator<const int *>(num + 2), input_iterator<const int *>(num)));
  97. // Identical long sequences are equal.
  98. BOOST_CHECK ( iter_eq (
  99. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  100. input_iterator<const int *>(num), input_iterator<const int *>(num + sz)),
  101. input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz)));
  102. BOOST_CHECK ( iter_eq (
  103. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  104. input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  105. eq<int> ),
  106. input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz)));
  107. BOOST_CHECK ( iter_eq (
  108. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  109. input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  110. never_eq<int> ),
  111. input_iterator<const int *>(num), input_iterator<const int *>(num)));
  112. BOOST_CHECK ( iter_eq (
  113. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  114. random_access_iterator<const int *>(num), random_access_iterator<const int *>(num + sz),
  115. never_eq<int> ),
  116. input_iterator<const int *>(num), random_access_iterator<const int *>(num)));
  117. // Different sequences are different
  118. BOOST_CHECK ( iter_eq (
  119. ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + sz),
  120. input_iterator<const int *>(num), input_iterator<const int *>(num + sz)),
  121. input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 1)));
  122. BOOST_CHECK ( iter_eq (
  123. ba::mismatch ( input_iterator<const int *>(num + 1), input_iterator<const int *>(num + sz),
  124. input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  125. eq<int> ),
  126. input_iterator<const int *>(num + 2), input_iterator<const int *>(num + 1)));
  127. // Checks constexpr
  128. BOOST_CXX14_CONSTEXPR bool res = (
  129. // No mismatch for empty
  130. iter_eq (
  131. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
  132. input_iterator<const int *>(num), input_iterator<const int *>(num)),
  133. input_iterator<const int *>(num), input_iterator<const int *>(num))
  134. // Empty vs. non-empty mismatch immediately
  135. && iter_eq (
  136. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num),
  137. input_iterator<const int *>(num), input_iterator<const int *>(num + 1)),
  138. input_iterator<const int *>(num), input_iterator<const int *>(num))
  139. // Single element sequences are equal if they contain the same value
  140. && iter_eq (
  141. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  142. input_iterator<const int *>(num), input_iterator<const int *>(num + 1),
  143. eq<int>),
  144. input_iterator<const int *>(num + 1), input_iterator<const int *>(num + 1))
  145. // Identical long sequences are equal.
  146. && iter_eq (
  147. ba::mismatch ( input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  148. input_iterator<const int *>(num), input_iterator<const int *>(num + sz),
  149. eq<int> ),
  150. input_iterator<const int *>(num + sz), input_iterator<const int *>(num + sz))
  151. );
  152. BOOST_CHECK ( res );
  153. }
  154. BOOST_AUTO_TEST_CASE( test_main )
  155. {
  156. test_mismatch ();
  157. }