#include #include #include #include #include #include "kutil/linked_list.h" #include "catch.hpp" using namespace kutil; const int test_list_size = 100; struct unsortableT { int value; }; struct sortableT { int value; int compare(const sortableT *other) { return value - other->value; } }; template class ListVectorCompare : public Catch::MatcherBase>> { public: using item = list_node; using vector = std::vector; ListVectorCompare(const linked_list &list, bool reversed) : m_list(list), m_reverse(reversed) {} virtual bool match (vector const& vec) const override { size_t index = m_reverse ? vec.size() - 1 : 0; for (const T &i : m_list) { if (&i != &vec[index]) return false; index += m_reverse ? -1 : 1; } return true; } virtual std::string describe() const override { return "is the same as the given linked list"; } private: const linked_list &m_list; bool m_reverse; }; template class IsSorted : public Catch::MatcherBase> { public: using item = list_node; using list = linked_list; IsSorted() {} virtual bool match (list const& l) const override { int big = std::numeric_limits::min(); for (const T &i : l) { if (i.value < big) return false; big = i.value; } return true; } virtual std::string describe() const override { return "is sorted"; } }; template ListVectorCompare IsSameAsList(const linked_list &list, bool reversed = false) { return ListVectorCompare(list, reversed); } TEST_CASE( "Linked list tests", "[containers list]" ) { using clock = std::chrono::system_clock; unsigned seed = clock::now().time_since_epoch().count(); std::default_random_engine rng(seed); std::uniform_int_distribution gen(1, 1000); linked_list ulist; std::vector> unsortables(test_list_size); for (auto &i : unsortables) { i.value = gen(rng); ulist.push_back(&i); } CHECK( ulist.length() == test_list_size ); CHECK_THAT( unsortables, IsSameAsList(ulist) ); linked_list ulist_reversed; for (auto &i : unsortables) { i.remove(); ulist_reversed.push_front(&i); } CHECK( ulist_reversed.length() == test_list_size ); CHECK_THAT( unsortables, IsSameAsList(ulist_reversed, true) ); linked_list slist; std::vector> sortables(test_list_size); for (auto &i : sortables) { i.value = gen(rng); slist.sorted_insert(&i); } CHECK( slist.length() == test_list_size ); CHECK_THAT( slist, IsSorted() ); }