Written more test cases for DataInnerNode and refactored them a bit
This commit is contained in:
parent
a427b0e677
commit
dabe6e2567
@ -31,20 +31,22 @@ public:
|
|||||||
|
|
||||||
void InitializeNewNode(const DataNode &first_child_key);
|
void InitializeNewNode(const DataNode &first_child_key);
|
||||||
|
|
||||||
ChildEntry *ChildrenBegin();
|
|
||||||
ChildEntry *ChildrenEnd();
|
|
||||||
const ChildEntry *ChildrenBegin() const;
|
|
||||||
const ChildEntry *ChildrenEnd() const;
|
|
||||||
|
|
||||||
ChildEntry *getChild(unsigned int index);
|
ChildEntry *getChild(unsigned int index);
|
||||||
const ChildEntry *getChild(unsigned int index) const;
|
const ChildEntry *getChild(unsigned int index) const;
|
||||||
|
|
||||||
ChildEntry *LastChild();
|
|
||||||
const ChildEntry *LastChild() const;
|
|
||||||
|
|
||||||
uint32_t numChildren() const;
|
uint32_t numChildren() const;
|
||||||
|
|
||||||
void addChild(const DataNode &child_key);
|
void addChild(const DataNode &child_key);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
ChildEntry *LastChild();
|
||||||
|
const ChildEntry *LastChild() const;
|
||||||
|
|
||||||
|
ChildEntry *ChildrenBegin();
|
||||||
|
ChildEntry *ChildrenEnd();
|
||||||
|
const ChildEntry *ChildrenBegin() const;
|
||||||
|
const ChildEntry *ChildrenEnd() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,12 @@
|
|||||||
#include "blockstore/implementations/testfake/FakeBlock.h"
|
#include "blockstore/implementations/testfake/FakeBlock.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include "fspp/utils/pointer.h"
|
||||||
|
|
||||||
using ::testing::Test;
|
using ::testing::Test;
|
||||||
|
|
||||||
|
using fspp::dynamic_pointer_move;
|
||||||
|
|
||||||
using blockstore::Key;
|
using blockstore::Key;
|
||||||
using blockstore::testfake::FakeBlockStore;
|
using blockstore::testfake::FakeBlockStore;
|
||||||
using blockstore::BlockStore;
|
using blockstore::BlockStore;
|
||||||
@ -31,6 +34,46 @@ public:
|
|||||||
node(nodeStore->createNewInnerNode(*leaf)) {
|
node(nodeStore->createNewInnerNode(*leaf)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unique_ptr<DataInnerNode> LoadInnerNode(const Key &key) {
|
||||||
|
auto node = nodeStore->load(key);
|
||||||
|
return dynamic_pointer_move<DataInnerNode>(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
Key CreateNewInnerNodeReturnKey(const DataNode &firstChild) {
|
||||||
|
return nodeStore->createNewInnerNode(firstChild)->key();
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_ptr<DataInnerNode> CreateNewInnerNode() {
|
||||||
|
auto new_leaf = nodeStore->createNewLeafNode();
|
||||||
|
return nodeStore->createNewInnerNode(*new_leaf);
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_ptr<DataInnerNode> CreateAndLoadNewInnerNode(const DataNode &firstChild) {
|
||||||
|
auto key = CreateNewInnerNodeReturnKey(firstChild);
|
||||||
|
return LoadInnerNode(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_ptr<DataInnerNode> CreateNewInnerNode(const DataNode &firstChild, const DataNode &secondChild) {
|
||||||
|
auto node = nodeStore->createNewInnerNode(firstChild);
|
||||||
|
node->addChild(secondChild);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
Key CreateNewInnerNodeReturnKey(const DataNode &firstChild, const DataNode &secondChild) {
|
||||||
|
return CreateNewInnerNode(firstChild, secondChild)->key();
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_ptr<DataInnerNode> CreateAndLoadNewInnerNode(const DataNode &firstChild, const DataNode &secondChild) {
|
||||||
|
auto key = CreateNewInnerNodeReturnKey(firstChild, secondChild);
|
||||||
|
return LoadInnerNode(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
Key AddALeafTo(DataInnerNode *node) {
|
||||||
|
auto leaf2 = nodeStore->createNewLeafNode();
|
||||||
|
node->addChild(*leaf2);
|
||||||
|
return leaf2->key();
|
||||||
|
}
|
||||||
|
|
||||||
unique_ptr<BlockStore> _blockStore;
|
unique_ptr<BlockStore> _blockStore;
|
||||||
BlockStore *blockStore;
|
BlockStore *blockStore;
|
||||||
unique_ptr<DataNodeStore> nodeStore;
|
unique_ptr<DataNodeStore> nodeStore;
|
||||||
@ -40,25 +83,58 @@ public:
|
|||||||
|
|
||||||
TEST_F(DataInnerNodeTest, InitializesCorrectly) {
|
TEST_F(DataInnerNodeTest, InitializesCorrectly) {
|
||||||
node->InitializeNewNode(*leaf);
|
node->InitializeNewNode(*leaf);
|
||||||
|
|
||||||
EXPECT_EQ(1u, node->numChildren());
|
EXPECT_EQ(1u, node->numChildren());
|
||||||
EXPECT_EQ(leaf->key(), node->getChild(0)->key());
|
EXPECT_EQ(leaf->key(), node->getChild(0)->key());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DataInnerNodeTest, ReinitializesCorrectly) {
|
TEST_F(DataInnerNodeTest, ReinitializesCorrectly) {
|
||||||
node->InitializeNewNode(*leaf);
|
AddALeafTo(node.get());
|
||||||
auto leaf2 = nodeStore->createNewLeafNode();
|
|
||||||
node->addChild(*leaf2);
|
|
||||||
node->InitializeNewNode(*leaf);
|
node->InitializeNewNode(*leaf);
|
||||||
|
|
||||||
EXPECT_EQ(1u, node->numChildren());
|
EXPECT_EQ(1u, node->numChildren());
|
||||||
EXPECT_EQ(leaf->key(), node->getChild(0)->key());
|
EXPECT_EQ(leaf->key(), node->getChild(0)->key());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DataInnerNodeTest, IsCorrectlyInitializedAfterLoading) {
|
||||||
|
auto loaded = CreateAndLoadNewInnerNode(*leaf);
|
||||||
|
|
||||||
|
EXPECT_EQ(1u, loaded->numChildren());
|
||||||
|
EXPECT_EQ(leaf->key(), loaded->getChild(0)->key());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(DataInnerNodeTest, AddingASecondLeaf) {
|
TEST_F(DataInnerNodeTest, AddingASecondLeaf) {
|
||||||
auto leaf2 = nodeStore->createNewLeafNode();
|
Key leaf2_key = AddALeafTo(node.get());
|
||||||
node->addChild(*leaf2);
|
|
||||||
|
|
||||||
EXPECT_EQ(2u, node->numChildren());
|
EXPECT_EQ(2u, node->numChildren());
|
||||||
EXPECT_EQ(leaf->key(), node->getChild(0)->key());
|
EXPECT_EQ(leaf->key(), node->getChild(0)->key());
|
||||||
EXPECT_EQ(leaf2->key(), node->getChild(1)->key());
|
EXPECT_EQ(leaf2_key, node->getChild(1)->key());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DataInnerNodeTest, AddingASecondLeafAndReload) {
|
||||||
|
auto leaf2 = nodeStore->createNewLeafNode();
|
||||||
|
auto loaded = CreateAndLoadNewInnerNode(*leaf, *leaf2);
|
||||||
|
|
||||||
|
EXPECT_EQ(2u, loaded->numChildren());
|
||||||
|
EXPECT_EQ(leaf->key(), loaded->getChild(0)->key());
|
||||||
|
EXPECT_EQ(leaf2->key(), loaded->getChild(1)->key());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(DataInnerNodeTest, BuildingAThreeLevelTree) {
|
||||||
|
auto node2 = CreateNewInnerNode();
|
||||||
|
auto parent = CreateNewInnerNode(*node, *node2);
|
||||||
|
|
||||||
|
EXPECT_EQ(2u, parent->numChildren());
|
||||||
|
EXPECT_EQ(node->key(), parent->getChild(0)->key());
|
||||||
|
EXPECT_EQ(node2->key(), parent->getChild(1)->key());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(DataInnerNodeTest, BuildingAThreeLevelTreeAndReload) {
|
||||||
|
auto node2 = CreateNewInnerNode();
|
||||||
|
auto parent = CreateAndLoadNewInnerNode(*node, *node2);
|
||||||
|
|
||||||
|
EXPECT_EQ(2u, parent->numChildren());
|
||||||
|
EXPECT_EQ(node->key(), parent->getChild(0)->key());
|
||||||
|
EXPECT_EQ(node2->key(), parent->getChild(1)->key());
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user