22 #include <gtest/gtest.h>
40 for (
auto* n : owned_)
delete n;
49 EXPECT_TRUE(t.
IsBST());
58 EXPECT_TRUE(t.
IsBST());
66 for (
int i = 0; i < 32; ++i) {
67 t.
Insert(
a.make((uint64_t)i, 1));
68 ASSERT_TRUE(t.
IsBST()) <<
"after inserting " << i;
69 ASSERT_TRUE(t.
IsSumCorrect()) <<
"after inserting " << i;
77 for (
int i = 31; i >= 0; --i) {
78 t.
Insert(
a.make((uint64_t)i, 1));
79 ASSERT_TRUE(t.
IsBST()) <<
"after inserting " << i;
80 ASSERT_TRUE(t.
IsSumCorrect()) <<
"after inserting " << i;
88 std::mt19937_64 rng(0xDEADBEEFULL);
89 std::set<uint64_t> keys;
91 while (keys.size() < 500) {
92 keys.insert(rng() % 10000);
94 for (uint64_t k : keys) {
97 EXPECT_TRUE(t.
IsBST());
105 std::vector<std::pair<uint64_t, uint32_t>>
data = {
106 {10, 3}, {5, 1}, {20, 4}, {2, 2}, {8, 5}, {15, 6}, {30, 7}};
109 for (
auto& kv :
data) {
110 inserted[idx] =
a.make(kv.first, kv.second);
117 for (uint64_t threshold : {0ull, 5ull, 10ull, 20ull, 100ull}) {
120 uint64_t expected = 0;
121 for (
auto& kv :
data) {
122 if (kv.first >= threshold) expected += kv.second;
127 if (threshold == 0 || threshold == 5 || threshold == 10 || threshold == 20) {
128 EXPECT_EQ(expected, got) <<
"threshold=" << threshold;
155 std::vector<uint64_t> keys;
156 for (
int i = 0; i <
N; ++i) {
157 uint64_t k = (uint64_t)(i * 3 + 7);
161 ASSERT_TRUE(t.
IsBST());
165 std::mt19937_64 rng(0xC0FFEE);
166 std::shuffle(keys.begin(), keys.end(), rng);
167 for (
size_t i = 0; i < keys.size(); ++i) {
168 uint64_t k = keys[i];
171 ASSERT_NE(found,
nullptr) <<
"key " << k <<
" missing from tree at i=" << i;
172 ASSERT_EQ(k, found->
key) <<
"found node has wrong key at i=" << i;
173 auto* victim = t.
Delete(found);
174 ASSERT_NE(victim,
nullptr) <<
"Delete returned null at i=" << i;
175 ASSERT_TRUE(t.
IsBST()) <<
"after delete " << i;
185 for (
int i = 0; i < 10; ++i) {
186 t.
Insert(
a.make((uint64_t)i, 1));
189 for (
int i = 0; i < 10; ++i) {
192 ASSERT_NE(found,
nullptr);
195 EXPECT_TRUE(t.
IsBST());
void Insert(TNKV *newNode)
TNKV * Delete(TNKV *node)
TNKV * FindSumGreaterEqual(K key, S *sum)
KV * make(uint64_t key, uint32_t value)
std::vector< KV * > owned_
TreeNode< uint64_t, uint32_t, uint64_t > KV
TEST(RBTree, InsertDeleteAllYieldsValidEmpty)
uint8_t value[MAX_WRITE_OP_LENGTH]