osrm-backend/test/unit/fuzz_insert_erase.cpp
Siarhei Fedartsou f1087e81ec Squashed 'third_party/unordered_dense/' content from commit 231e48c94
git-subtree-dir: third_party/unordered_dense
git-subtree-split: 231e48c9426bd21c273669e5fdcd042c146975cf
2024-05-30 19:06:16 +02:00

53 lines
1.6 KiB
C++

#include <ankerl/unordered_dense.h>
#include <fuzz/run.h>
#include <app/doctest.h>
#include <unordered_map>
namespace {
// Using DummyHash to make it easier for the fuzzer
struct dummy_hash {
using is_avalanching = void;
auto operator()(uint64_t x) const noexcept -> size_t {
return static_cast<size_t>(x);
}
};
template <typename Map>
void insert_erase(fuzz::provider p) {
auto ank = Map();
auto ref = std::unordered_map<uint64_t, uint64_t>();
auto c = uint64_t();
while (p.has_remaining_bytes()) {
auto key = p.integral<uint64_t>();
ank[key] = c;
ref[key] = c;
++c;
key = p.integral<uint64_t>();
REQUIRE(ank.erase(key) == ref.erase(key));
REQUIRE(ank.size() == ref.size());
}
auto cpy = std::unordered_map(ank.begin(), ank.end());
REQUIRE(cpy == ref);
}
} // namespace
TEST_CASE("fuzz_insert_erase" * doctest::test_suite("fuzz")) {
fuzz::run([](fuzz::provider p) {
// try all 3 different map styles with the same input
insert_erase<ankerl::unordered_dense::map<uint64_t, uint64_t, dummy_hash>>(p.copy());
insert_erase<ankerl::unordered_dense::segmented_map<uint64_t, uint64_t, dummy_hash>>(p.copy());
insert_erase<ankerl::unordered_dense::map<uint64_t,
uint64_t,
ankerl::unordered_dense::hash<uint64_t>,
std::equal_to<uint64_t>,
std::deque<std::pair<uint64_t, uint64_t>>>>(p.copy());
});
}