diff --git a/Tests/BaseLib/TestQuicksort.cpp b/Tests/BaseLib/TestQuicksort.cpp index 9af42d1232d1f27ba5144b5258dfb16472bfa21c..68660ed0e2f55ae7a3efa5f03d782662793fbc44 100644 --- a/Tests/BaseLib/TestQuicksort.cpp +++ b/Tests/BaseLib/TestQuicksort.cpp @@ -17,6 +17,7 @@ #include "quicksort.h" #include <algorithm> +#include <sstream> #include <string> #include <vector> @@ -58,3 +59,74 @@ TEST(BaseLib, QuicksortSortsCorrectly) { ASSERT_TRUE(quicksortSortsAsSTLSort.check()); } +// Permutations of sorted, unique vector remain untouched. +class QuicksortCheckPermutations : public Property<std::vector<int>> { + bool accepts(const std::vector<int>& xs) + { + return xs.size() > 2 && + std::is_sorted(xs.begin(), xs.end()) && + (std::adjacent_find(xs.begin(), xs.end()) == xs.end()); + } + + bool holdsFor(const std::vector<int>& xs) + { + std::vector<size_t> perm(xs.size()); + for (size_t i = 0; i < perm.size(); ++i) + perm[i] = i; + + BaseLib::quicksort((int*)&(xs[0]), 0, xs.size(), &(perm[0])); + + for (size_t i = 0; i < perm.size(); ++i) + if (perm[i] != i) + return false; + return true; + } + + const std::string classify(const std::vector<int>& xs) + { + std::stringstream ss; + ss << "size " << xs.size(); + return ss.str(); + } +}; + +TEST(BaseLib, QuicksortReportCorrectPermutations) { + QuicksortCheckPermutations quicksortCheckPermutations; + ASSERT_TRUE(quicksortCheckPermutations.check(200, 100000)); +} + +// Permutations of reverse sorted, unique vector is also reversed. +class QuicksortCheckPermutationsReverse : public Property<std::vector<int>> { + bool accepts(const std::vector<int>& xs) + { + return xs.size() > 2 && + std::is_sorted(xs.rbegin(), xs.rend()) && + (std::adjacent_find(xs.rbegin(), xs.rend()) == xs.rend()); + } + + bool holdsFor(const std::vector<int>& xs) + { + std::vector<size_t> perm(xs.size()); + for (size_t i = 0; i < perm.size(); ++i) + perm[i] = i; + + BaseLib::quicksort((int*)&(xs[0]), 0, xs.size(), &(perm[0])); + + for (size_t i = 0; i < perm.size(); ++i) + if (perm[i] != perm.size() - i - 1) + return false; + return true; + } + + const std::string classify(const std::vector<int>& xs) + { + std::stringstream ss; + ss << "size " << xs.size(); + return ss.str(); + } +}; + +TEST(BaseLib, QuicksortReportCorrectPermutationsReverse) { + QuicksortCheckPermutationsReverse quicksortCheckPermutationsReverse; + ASSERT_TRUE(quicksortCheckPermutationsReverse.check(200, 100000)); +}