#include #include #include #include #include #include using namespace psemek::util; test_case(util_flat__list_empty) { flat_list l; expect(l.empty()); expect_equal(l.size(), 0); expect_equal(l.capacity(), 0); } test_case(util_flat__list_sequential) { auto p = std::make_shared(42); flat_list> l; std::vector h; for (std::size_t i = 0; i < 1024*1024; ++i) { h.push_back(l.insert(p)); expect_equal(*l[h.back()], *p); expect_equal(l.size(), i + 1); expect_gequal(l.capacity(), l.size()); expect_equal(p.use_count(), i + 2); } for (std::size_t i = 0; i < h.size(); ++i) { l.erase(h[i]); expect_equal(l.size(), h.size() - i - 1); expect_gequal(l.capacity(), l.size()); expect_equal(p.use_count(), h.size() - i); } expect(l.empty()); l.clear(); expect(l.empty()); } test_case(util_flat__list_shuffle) { auto p = std::make_shared(42); flat_list> l; std::vector h; for (std::size_t i = 0; i < 1024*1024; ++i) { h.push_back(l.insert(p)); expect_equal(l[h.back()], p); expect_equal(l.size(), i + 1); expect_gequal(l.capacity(), l.size()); expect_equal(p.use_count(), i + 2); } std::default_random_engine rng{42}; std::shuffle(h.begin(), h.end(), rng); for (std::size_t i = 0; i < h.size(); ++i) { l.erase(h[i]); expect_equal(l.size(), h.size() - i - 1); expect_gequal(l.capacity(), l.size()); expect_equal(p.use_count(), h.size() - i); } expect(l.empty()); l.clear(); expect(l.empty()); } test_case(util_flat__list_random) { auto p = std::make_shared(42); flat_list> l; std::vector h; std::default_random_engine rng{42}; std::uniform_int_distribution action{0, 1}; for (std::size_t i = 0; i < 1024*1024; ++i) { if (h.empty() || action(rng) == 0) { h.push_back(l.insert(p)); expect_equal(l[h.back()], p); } else { auto index = std::uniform_int_distribution{0, h.size() - 1}(rng); expect_equal(l[h[index]], p); l.erase(h[index]); h.erase(h.begin() + index); } expect_equal(l.size(), h.size()); expect_gequal(l.capacity(), l.size()); expect_equal(p.use_count(), h.size() + 1); } l.clear(); expect(l.empty()); }