apply_permutation_test.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. Copyright (c) Alexander Zaitsev <zamazan4ik@gmail.com>, 2017
  3. Distributed under the Boost Software License, Version 1.0. (See
  4. accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt)
  6. See http://www.boost.org/ for latest version.
  7. */
  8. #include <vector>
  9. #include <boost/algorithm/apply_permutation.hpp>
  10. #define BOOST_TEST_MAIN
  11. #include <boost/test/included/unit_test.hpp>
  12. namespace ba = boost::algorithm;
  13. BOOST_AUTO_TEST_CASE(test_apply_permutation)
  14. {
  15. //Empty
  16. {
  17. std::vector<int> vec, order, result;
  18. ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  19. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  20. }
  21. //1 element
  22. {
  23. std::vector<int> vec, order, result;
  24. vec.push_back(1);
  25. order.push_back(0);
  26. result = vec;
  27. ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  28. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  29. }
  30. //2 elements, no changes
  31. {
  32. std::vector<int> vec, order, result;
  33. vec.push_back(1); vec.push_back(2);
  34. order.push_back(0); order.push_back(1);
  35. result = vec;
  36. ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  37. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  38. }
  39. //2 elements, changed
  40. {
  41. std::vector<int> vec, order, result;
  42. vec.push_back(1); vec.push_back(2);
  43. order.push_back(1); order.push_back(0);
  44. result.push_back(2); result.push_back(1);
  45. ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  46. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  47. }
  48. //Multiple elements, no changes
  49. {
  50. std::vector<int> vec, order, result;
  51. vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
  52. order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
  53. result = vec;
  54. ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  55. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  56. }
  57. //Multiple elements, changed
  58. {
  59. std::vector<int> vec, order, result;
  60. vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
  61. order.push_back(4); order.push_back(3); order.push_back(2); order.push_back(1); order.push_back(0);
  62. result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1);
  63. ba::apply_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  64. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  65. }
  66. //Just test range interface
  67. {
  68. std::vector<int> vec, order, result;
  69. vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
  70. order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
  71. result = vec;
  72. ba::apply_permutation(vec, order);
  73. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  74. }
  75. }
  76. BOOST_AUTO_TEST_CASE(test_apply_reverse_permutation)
  77. {
  78. //Empty
  79. {
  80. std::vector<int> vec, order, result;
  81. ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  82. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  83. }
  84. //1 element
  85. {
  86. std::vector<int> vec, order, result;
  87. vec.push_back(1);
  88. order.push_back(0);
  89. result = vec;
  90. ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  91. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  92. }
  93. //2 elements, no changes
  94. {
  95. std::vector<int> vec, order, result;
  96. vec.push_back(1); vec.push_back(2);
  97. order.push_back(0); order.push_back(1);
  98. result = vec;
  99. ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  100. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  101. }
  102. //2 elements, changed
  103. {
  104. std::vector<int> vec, order, result;
  105. vec.push_back(1); vec.push_back(2);
  106. order.push_back(1); order.push_back(0);
  107. result.push_back(2); result.push_back(1);
  108. ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  109. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  110. }
  111. //Multiple elements, no changes
  112. {
  113. std::vector<int> vec, order, result;
  114. vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
  115. order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
  116. result = vec;
  117. ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  118. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  119. }
  120. //Multiple elements, changed
  121. {
  122. std::vector<int> vec, order, result;
  123. vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
  124. order.push_back(4); order.push_back(3); order.push_back(2); order.push_back(1); order.push_back(0);
  125. result.push_back(5); result.push_back(4); result.push_back(3); result.push_back(2); result.push_back(1);
  126. ba::apply_reverse_permutation(vec.begin(), vec.end(), order.begin(), order.end());
  127. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  128. }
  129. //Just test range interface
  130. {
  131. std::vector<int> vec, order, result;
  132. vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(4); vec.push_back(5);
  133. order.push_back(0); order.push_back(1); order.push_back(2); order.push_back(3); order.push_back(4);
  134. result = vec;
  135. ba::apply_reverse_permutation(vec, order);
  136. BOOST_CHECK_EQUAL_COLLECTIONS(vec.begin(), vec.end(), result.begin(), result.end());
  137. }
  138. }