16 #include <gtest/gtest.h>
38 if (*rootp ==
nullptr) {
46 if (key < found->key) {
48 newNode->
right = found;
49 found->
left =
nullptr;
51 newNode->
left = found;
53 found->
right =
nullptr;
60 if (!out.insert(root->
key).second)
return;
66 if (!*rootp)
return false;
67 *rootp =
splay(*rootp, key);
68 return (*rootp)->key == key;
72 size_t missing_reachable = 0;
73 size_t missing_splay = 0;
78 for (
size_t i = 0; i < seq.size(); ++i) {
79 insert(&root, seq[i], (
int)i, apply_fix);
81 std::set<uintptr_t> reachable;
84 for (uintptr_t k : seq) {
87 for (uintptr_t k : seq) {
104 <<
"buggy variant unexpectedly did not lose any keys -- fix may be "
105 "unnecessary or the test scenario is too weak";
111 std::vector<uintptr_t>{100, 200, 300, 400, 500, 600, 700, 800},
112 std::vector<uintptr_t>{800, 700, 600, 500, 400, 300, 200, 100},
113 std::vector<uintptr_t>{500, 100, 900, 300, 700, 200, 800, 400, 600}
TEST_P(SplayDeserialize, BuggyLosesKeys)
INSTANTIATE_TEST_SUITE_P(Scenarios, SplayDeserialize, ::testing::Values(std::vector< uintptr_t >{100, 200, 300, 400, 500, 600, 700, 800}, std::vector< uintptr_t >{800, 700, 600, 500, 400, 300, 200, 100}, std::vector< uintptr_t >{500, 100, 900, 300, 700, 200, 800, 400, 600}))
Diagnosis run(bool apply_fix, const std::vector< uintptr_t > &seq)
uint8_t value[MAX_WRITE_OP_LENGTH]
#define REGULAR_SPLAY_TREE(type, root, key, value, left, right)
static void insert(TraceSplay **rootp, uintptr_t key, int value, bool apply_fix)
static bool splay_finds(TraceSplay **rootp, uintptr_t key)
static void collect_keys(TraceSplay *root, std::set< uintptr_t > &out)
static TraceSplay * splay(TraceSplay *root, uintptr_t key)