test_insertion_sort.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //---------------------------------------------------------------------------//
  2. // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // See http://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #define BOOST_TEST_MODULE TestInsertionSort
  11. #include <boost/test/unit_test.hpp>
  12. #include <boost/compute/system.hpp>
  13. #include <boost/compute/algorithm/is_sorted.hpp>
  14. #include <boost/compute/algorithm/detail/insertion_sort.hpp>
  15. #include <boost/compute/container/vector.hpp>
  16. #include "check_macros.hpp"
  17. #include "context_setup.hpp"
  18. namespace bc = boost::compute;
  19. BOOST_AUTO_TEST_CASE(sort_char_vector)
  20. {
  21. using boost::compute::char_;
  22. char_ data[] = { 'c', 'a', '0', '7', 'B', 'F', '\0', '$' };
  23. boost::compute::vector<char_> vector(data, data + 8, queue);
  24. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  25. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  26. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  27. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  28. CHECK_RANGE_EQUAL(char_, 8, vector, ('\0', '$', '0', '7', 'B', 'F', 'a', 'c'));
  29. }
  30. BOOST_AUTO_TEST_CASE(sort_uchar_vector)
  31. {
  32. using boost::compute::uchar_;
  33. uchar_ data[] = { 0x12, 0x00, 0xFF, 0xB4, 0x80, 0x32, 0x64, 0xA2 };
  34. boost::compute::vector<uchar_> vector(data, data + 8, queue);
  35. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  36. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  37. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  38. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  39. CHECK_RANGE_EQUAL(uchar_, 8, vector, (0x00, 0x12, 0x32, 0x64, 0x80, 0xA2, 0xB4, 0xFF));
  40. }
  41. BOOST_AUTO_TEST_CASE(sort_short_vector)
  42. {
  43. using boost::compute::short_;
  44. short_ data[] = { -4, 152, -94, 963, 31002, -456, 0, -2113 };
  45. boost::compute::vector<short_> vector(data, data + 8, queue);
  46. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  47. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  48. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  49. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  50. CHECK_RANGE_EQUAL(short_, 8, vector, (-2113, -456, -94, -4, 0, 152, 963, 31002));
  51. }
  52. BOOST_AUTO_TEST_CASE(sort_ushort_vector)
  53. {
  54. using boost::compute::ushort_;
  55. ushort_ data[] = { 4, 152, 94, 963, 63202, 34560, 0, 2113 };
  56. boost::compute::vector<ushort_> vector(data, data + 8, queue);
  57. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  58. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  59. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  60. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  61. CHECK_RANGE_EQUAL(ushort_, 8, vector, (0, 4, 94, 152, 963, 2113, 34560, 63202));
  62. }
  63. BOOST_AUTO_TEST_CASE(sort_int_vector)
  64. {
  65. int data[] = { -4, 152, -5000, 963, 75321, -456, 0, 1112 };
  66. boost::compute::vector<int> vector(data, data + 8, queue);
  67. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  68. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  69. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  70. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  71. CHECK_RANGE_EQUAL(int, 8, vector, (-5000, -456, -4, 0, 152, 963, 1112, 75321));
  72. }
  73. BOOST_AUTO_TEST_CASE(sort_uint_vector)
  74. {
  75. using boost::compute::uint_;
  76. uint_ data[] = { 500, 1988, 123456, 562, 0, 4000000, 9852, 102030 };
  77. boost::compute::vector<uint_> vector(data, data + 8, queue);
  78. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  79. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  80. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  81. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  82. CHECK_RANGE_EQUAL(uint_, 8, vector, (0, 500, 562, 1988, 9852, 102030, 123456, 4000000));
  83. }
  84. BOOST_AUTO_TEST_CASE(sort_long_vector)
  85. {
  86. using boost::compute::long_;
  87. long_ data[] = { 500, 1988, 123456, 562, 0, 4000000, 9852, 102030 };
  88. boost::compute::vector<long_> vector(data, data + 8, queue);
  89. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  90. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  91. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  92. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  93. CHECK_RANGE_EQUAL(long_, 8, vector, (0, 500, 562, 1988, 9852, 102030, 123456, 4000000));
  94. }
  95. BOOST_AUTO_TEST_CASE(sort_ulong_vector)
  96. {
  97. using boost::compute::ulong_;
  98. ulong_ data[] = { 500, 1988, 123456, 562, 0, 4000000, 9852, 102030 };
  99. boost::compute::vector<ulong_> vector(data, data + 8, queue);
  100. BOOST_CHECK_EQUAL(vector.size(), size_t(8));
  101. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  102. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  103. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  104. CHECK_RANGE_EQUAL(ulong_, 8, vector, (0, 500, 562, 1988, 9852, 102030, 123456, 4000000));
  105. }
  106. BOOST_AUTO_TEST_CASE(sort_float_vector)
  107. {
  108. float data[] = { -6023.0f, 152.5f, -63.0f, 1234567.0f, 11.2f,
  109. -5000.1f, 0.0f, 14.0f, -8.25f, -0.0f };
  110. boost::compute::vector<float> vector(data, data + 10, queue);
  111. BOOST_CHECK_EQUAL(vector.size(), size_t(10));
  112. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  113. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  114. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  115. CHECK_RANGE_EQUAL(
  116. float, 10, vector,
  117. (-6023.0f, -5000.1f, -63.0f, -8.25f, -0.0f, 0.0f, 11.2f, 14.0f, 152.5f, 1234567.0f)
  118. );
  119. }
  120. BOOST_AUTO_TEST_CASE(sort_double_vector)
  121. {
  122. if(!device.supports_extension("cl_khr_fp64")){
  123. std::cout << "skipping test: device does not support double" << std::endl;
  124. return;
  125. }
  126. double data[] = { -6023.0, 152.5, -63.0, 1234567.0, 11.2,
  127. -5000.1, 0.0, 14.0, -8.25, -0.0 };
  128. boost::compute::vector<double> vector(data, data + 10, queue);
  129. BOOST_CHECK_EQUAL(vector.size(), size_t(10));
  130. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == false);
  131. boost::compute::detail::serial_insertion_sort(vector.begin(), vector.end(), queue);
  132. BOOST_CHECK(boost::compute::is_sorted(vector.begin(), vector.end(), queue) == true);
  133. CHECK_RANGE_EQUAL(
  134. double, 10, vector,
  135. (-6023.0, -5000.1, -63.0, -8.25, -0.0, 0.0, 11.2, 14.0, 152.5, 1234567.0)
  136. );
  137. }
  138. BOOST_AUTO_TEST_SUITE_END()