Archived
1
0
Fork 0

tree: Adding N-tree module.

This commit is contained in:
Henrik Hautakoski 2011-02-14 08:09:42 +01:00
parent 546e7c50f1
commit 171c764691
4 changed files with 396 additions and 0 deletions

228
test/t_tree.c Normal file
View file

@ -0,0 +1,228 @@
#include <assert.h>
#include "../src/tree.h"
void test_link() {
struct tree nodes[6] = { TREE_INIT };
tree_link(&nodes[0], &nodes[1]);
tree_link(&nodes[0], &nodes[2]);
tree_link(&nodes[0], &nodes[3]);
tree_link(&nodes[1], &nodes[4]);
tree_link(&nodes[2], &nodes[5]);
/* check the root node */
assert(nodes[0].parent == NULL);
assert(nodes[0].next == NULL);
assert(nodes[0].child == &nodes[1]);
/* move to depth 2 */
assert(nodes[1].parent == &nodes[0]);
assert(nodes[2].parent == &nodes[0]);
assert(nodes[3].parent == &nodes[0]);
assert(nodes[1].next == &nodes[2]);
assert(nodes[2].next == &nodes[3]);
assert(nodes[3].next == NULL);
assert(nodes[1].child == &nodes[4]);
assert(nodes[2].child == &nodes[5]);
/* move to depth 3 */
assert(nodes[4].parent == &nodes[1]);
assert(nodes[5].parent == &nodes[2]);
assert(nodes[4].next == NULL);
assert(nodes[5].next == NULL);
assert(nodes[4].child == NULL);
assert(nodes[5].child == NULL);
}
void test_unlink() {
struct tree nodes[6] = { TREE_INIT };
tree_link(&nodes[0], &nodes[1]);
tree_link(&nodes[0], &nodes[2]);
tree_link(&nodes[1], &nodes[3]);
tree_link(&nodes[1], &nodes[4]);
tree_link(&nodes[2], &nodes[5]);
/* check the tree */
assert(nodes[0].parent == NULL);
assert(nodes[0].next == NULL);
assert(nodes[0].child == &nodes[1]);
/* move to depth 2 */
assert(nodes[1].parent == &nodes[0]);
assert(nodes[2].parent == &nodes[0]);
assert(nodes[1].next == &nodes[2]);
assert(nodes[2].next == NULL);
assert(nodes[1].child == &nodes[3]);
assert(nodes[2].child == &nodes[5]);
/* move to depth 3 */
assert(nodes[3].parent == &nodes[1]);
assert(nodes[4].parent == &nodes[1]);
assert(nodes[5].parent == &nodes[2]);
assert(nodes[3].next == &nodes[4]);
assert(nodes[4].next == NULL);
assert(nodes[5].next == NULL);
assert(nodes[3].child == NULL);
assert(nodes[4].child == NULL);
assert(nodes[5].child == NULL);
tree_unlink(&nodes[1]);
/* check the new tree */
assert(nodes[0].parent == NULL);
assert(nodes[0].next == NULL);
assert(nodes[0].child == &nodes[2]);
/* move to depth 2 */
assert(nodes[2].parent == &nodes[0]);
assert(nodes[3].parent == &nodes[0]);
assert(nodes[4].parent == &nodes[0]);
assert(nodes[2].next == &nodes[3]);
assert(nodes[3].next == &nodes[4]);
assert(nodes[4].next == NULL);
assert(nodes[2].child == &nodes[5]);
assert(nodes[3].child == NULL);
assert(nodes[4].child == NULL);
/* move to depth 3 */
assert(nodes[5].parent == &nodes[2]);
assert(nodes[5].next == NULL);
assert(nodes[5].child == NULL);
}
void test_detach() {
struct tree nodes[6] = { TREE_INIT };
tree_link(&nodes[0], &nodes[1]);
tree_link(&nodes[0], &nodes[2]);
tree_link(&nodes[1], &nodes[3]);
tree_link(&nodes[1], &nodes[4]);
tree_link(&nodes[2], &nodes[5]);
/* check the tree */
assert(nodes[0].parent == NULL);
assert(nodes[0].next == NULL);
assert(nodes[0].child == &nodes[1]);
/* move to depth 2 */
assert(nodes[1].parent == &nodes[0]);
assert(nodes[2].parent == &nodes[0]);
assert(nodes[1].next == &nodes[2]);
assert(nodes[2].next == NULL);
assert(nodes[1].child == &nodes[3]);
assert(nodes[2].child == &nodes[5]);
/* move to depth 3 */
assert(nodes[3].parent == &nodes[1]);
assert(nodes[4].parent == &nodes[1]);
assert(nodes[5].parent == &nodes[2]);
assert(nodes[3].next == &nodes[4]);
assert(nodes[4].next == NULL);
assert(nodes[5].next == NULL);
assert(nodes[3].child == NULL);
assert(nodes[4].child == NULL);
assert(nodes[5].child == NULL);
tree_detach(&nodes[1]);
/* check the tree */
assert(nodes[0].parent == NULL);
assert(nodes[0].next == NULL);
assert(nodes[0].child == &nodes[2]);
/* move to depth 2 */
assert(nodes[2].parent == &nodes[0]);
assert(nodes[2].next == NULL);
assert(nodes[2].child == &nodes[5]);
/* move to depth 3 */
assert(nodes[5].parent == &nodes[2]);
assert(nodes[5].next == NULL);
assert(nodes[5].child == NULL);
/* detached tree */
assert(nodes[1].parent == NULL);
assert(nodes[1].next == NULL);
assert(nodes[1].child == &nodes[3]);
assert(nodes[3].parent == &nodes[1]);
assert(nodes[4].parent == &nodes[1]);
assert(nodes[3].next == &nodes[4]);
assert(nodes[4].next == NULL);
assert(nodes[3].child == NULL);
assert(nodes[4].child == NULL);
}
void test_move() {
struct tree nodes[7] = { TREE_INIT };
tree_link(&nodes[0], &nodes[1]);
tree_link(&nodes[0], &nodes[2]);
tree_link(&nodes[0], &nodes[3]);
tree_link(&nodes[1], &nodes[4]);
tree_link(&nodes[2], &nodes[5]);
tree_link(&nodes[2], &nodes[6]);
tree_move(&nodes[5], &nodes[1]);
assert(nodes[0].parent == NULL);
assert(nodes[0].next == NULL);
assert(nodes[0].child == &nodes[2]);
assert(nodes[3].parent == &nodes[0]);
assert(nodes[2].parent == &nodes[0]);
assert(nodes[2].next == &nodes[3]);
assert(nodes[3].next == NULL);
assert(nodes[2].child == &nodes[5]);
assert(nodes[3].child == NULL);
assert(nodes[5].parent == &nodes[2]);
assert(nodes[6].parent == &nodes[2]);
assert(nodes[5].next == &nodes[6]);
assert(nodes[6].next == NULL);
assert(nodes[5].child == &nodes[1]);
assert(nodes[6].child == NULL);
assert(nodes[1].parent == &nodes[5]);
assert(nodes[1].next == NULL);
assert(nodes[1].child == &nodes[4]);
assert(nodes[4].parent == &nodes[1]);
assert(nodes[4].next == NULL);
assert(nodes[4].child == NULL);
}
void test_parent_count() {
struct tree nodes[6] = { TREE_INIT };
tree_link(&nodes[0], &nodes[1]);
tree_link(&nodes[0], &nodes[2]);
tree_link(&nodes[1], &nodes[3]);
tree_link(&nodes[1], &nodes[4]);
tree_link(&nodes[2], &nodes[5]);
assert(tree_parent_count(&nodes[5]) == 2);
}
int main() {
test_link();
test_unlink();
test_detach();
test_move();
test_parent_count();
return 0;
}