OSDN Git Service

fix bug updating first child in insertbefore.
authorornse01 <ornse01@users.sourceforge.jp>
Fri, 21 Nov 2014 17:36:26 +0000 (17:36 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Fri, 21 Nov 2014 17:36:26 +0000 (17:36 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@643 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/coll/test_treebase.c
src/coll/treebase.c

index 2eab809..25fd945 100644 (file)
@@ -378,6 +378,75 @@ LOCAL UNITTEST_RESULT test_treebase_node_7()
        return ret;
 }
 
        return ret;
 }
 
+LOCAL UNITTEST_RESULT test_treebase_node_8()
+{
+       treebase_node_t node0, node1, node2, node3;
+       test_treebase_node_expected_t expected;
+       Bool ok;
+       UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
+
+       treebase_node_initialize(&node0);
+       treebase_node_initialize(&node1);
+       treebase_node_initialize(&node2);
+       treebase_node_initialize(&node3);
+
+       treebase_node_insertbefore(&node0, &node1, NULL);
+       treebase_node_insertbefore(&node0, &node2, &node1);
+       treebase_node_insertbefore(&node0, &node3, NULL);
+
+       /**/
+       expected.parent = NULL;
+       expected.next = NULL;
+       expected.prev = NULL;
+       expected.first = &node2;
+       expected.last = &node3;
+       expected.has_child = True;
+       ok = test_treebase_node_commoncheck(&node0, &expected, "node0");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+       /**/
+       expected.parent = &node0;
+       expected.next = &node3;
+       expected.prev = &node2;
+       expected.first = NULL;
+       expected.last = NULL;
+       expected.has_child = False;
+       ok = test_treebase_node_commoncheck(&node1, &expected, "node1");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+       /**/
+       expected.parent = &node0;
+       expected.next = &node1;
+       expected.prev = NULL;
+       expected.first = NULL;
+       expected.last = NULL;
+       expected.has_child = False;
+       ok = test_treebase_node_commoncheck(&node2, &expected, "node2");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+       /**/
+       expected.parent = &node0;
+       expected.next = NULL;
+       expected.prev = &node1;
+       expected.first = NULL;
+       expected.last = NULL;
+       expected.has_child = False;
+       ok = test_treebase_node_commoncheck(&node3, &expected, "node3");
+       if (ok == False) {
+               ret = UNITTEST_RESULT_FAIL;
+       }
+
+       treebase_node_finalize(&node3);
+       treebase_node_finalize(&node2);
+       treebase_node_finalize(&node1);
+       treebase_node_finalize(&node0);
+
+       return ret;
+}
+
 /* treebase_preordertraversal_t */
 
 typedef struct {
 /* treebase_preordertraversal_t */
 
 typedef struct {
@@ -478,5 +547,6 @@ EXPORT VOID test_treebase_main(unittest_driver_t *driver)
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_7);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_5);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_6);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_node_7);
+       UNITTEST_DRIVER_REGIST(driver, test_treebase_node_8);
        UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1);
 }
        UNITTEST_DRIVER_REGIST(driver, test_treebase_preordertraversal_1);
 }
index a599a06..c70e726 100644 (file)
@@ -53,6 +53,9 @@ EXPORT W treebase_node_insertbefore(treebase_node_t *node, treebase_node_t *chil
                return -1; /* TODO */
        }
 
                return -1; /* TODO */
        }
 
+       if (node->firstchild == ref) {
+               node->firstchild = child;
+       }
        QueInsert(&child->sibling, &ref->sibling);
        child->parent = node;
 
        QueInsert(&child->sibling, &ref->sibling);
        child->parent = node;