OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / test_libgoblin_objinfo.c
index b409911..d90a429 100644 (file)
@@ -78,7 +78,8 @@ void Test_ObjectInfo_InsetDelete_test00_001(
        LibGoblin_ObjectInfo    *p_objmaster;
 
        // Alloc ---
-       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, 0x00000000, 0x00100000, NULL, 0x00 );
+       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, 0x00000000, 0x00100000, NULL,
+                                               0x00, OBJINFO_TYPE_NONE, NULL );
        Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
        CU_ASSERT( 0 == p_pginfo->objinfo.i_topid );
 
@@ -87,12 +88,12 @@ void Test_ObjectInfo_InsetDelete_test00_001(
        Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 1, NO_OBJ, NO_OBJ );
 
        // Delete ---
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( 0 == p_pginfo->objinfo.i_topid );
        Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, NO_OBJ, NO_OBJ, NO_OBJ );
 
        p_objinfo       = OBJINFO( p_pginfo, 0 );
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
 
        return;
@@ -111,13 +112,15 @@ void Test_ObjectInfo_InsetDelete_test00_002(
        // Scenery 1 ......................................................
        // Alloc ---
        qw_addr = 0x0000000000000000;
-       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, qw_addr, 0x10000000, NULL, 0x00 );
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, qw_addr, 0x10000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
        Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
        qw_addr += 0x00100000;
 
        for( i_cnt = 2; i_cnt < 10000; i_cnt++ )        {
-               p_objinfo       = ObjectInfo_InsetObject( p_pginfo, qw_addr, 0x10000000, NULL, 0x00 );
+               p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, qw_addr, 0x10000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
                Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, i_cnt - 1, NO_OBJ );
 
                qw_addr += 0x00000100;
@@ -132,88 +135,94 @@ void Test_ObjectInfo_InsetDelete_test00_002(
                p_objinfo       = OBJINFO( p_pginfo, i_cnt );
                Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, (i_cnt + 1) );
 
-               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
                CU_ASSERT( (i_cnt + 1) == p_objmaster->grplink.i_child_topid );
        }
 
        p_objinfo       = OBJINFO( p_pginfo, i_cnt );
        Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_objmaster->grplink.i_child_topid );
        CU_ASSERT( NO_OBJ == p_objmaster->addrlink.i_next_id );
 
        // Scenery 2 ......................................................
        // Alloc ---
        qw_size         = 0x0000000000000001;
-       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, 0x1000000000000000, qw_size, NULL, 0x00 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x1000000000000000, qw_size, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9999, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
        for( i_cnt = 2; i_cnt < 10; i_cnt++ )   {
                qw_size         <<= 1;
-               p_objinfo       = ObjectInfo_InsetObject( p_pginfo,  0x1000000000000000, qw_size, NULL, 0x00 );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, i_cnt - 1 );
+               p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo,  0x1000000000000000, qw_size, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, (10000 - i_cnt), 0, NO_OBJ, NO_OBJ, (10001 - i_cnt) );
        }
 
        // Check ---
        p_objmaster     = OBJINFO( p_pginfo, 0 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 9, NO_OBJ, NO_OBJ );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 9991, NO_OBJ, NO_OBJ );
 
        // Delete ---
-       for( i_cnt = 9; i_cnt > 1; i_cnt-- )    {
+       //for( i_cnt = 9; i_cnt > 1; i_cnt-- )  {
+       for( i_cnt = 9991; i_cnt < 9999; i_cnt++ )      {
                p_objinfo       = OBJINFO( p_pginfo, i_cnt );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, (i_cnt - 1) );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, (i_cnt + 1) );
 
-               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
-               CU_ASSERT( (i_cnt - 1) == p_objmaster->grplink.i_child_topid );
+               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+               CU_ASSERT( (i_cnt + 1) == p_objmaster->grplink.i_child_topid );
        }
 
-       p_objinfo       = OBJINFO( p_pginfo, 1 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       p_objinfo       = OBJINFO( p_pginfo, 9999 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9999, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_objmaster->grplink.i_child_topid );
 
        // Scenery 3 ......................................................
        // Alloc ---
        qw_addr = 0x10000000;
-       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, qw_addr, 0x20000000, NULL, 0x00 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, qw_addr, 0x20000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9999, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
        for( i_cnt = 2; i_cnt < 10; i_cnt++ )   {
                qw_addr += 0x10000000;
-               p_objinfo       = ObjectInfo_InsetObject( p_pginfo, qw_addr, 0x20000000, NULL, 0x00 );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, (i_cnt - 1), NO_OBJ );
+               p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, qw_addr, 0x20000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, (10000 - i_cnt), 0, NO_OBJ, (10001 - i_cnt), NO_OBJ );
        }
 
        // Check ---
        p_objmaster     = OBJINFO( p_pginfo, 0 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 1, NO_OBJ, NO_OBJ );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 9999, NO_OBJ, NO_OBJ );
 
        // Delete ---
-       for( i_cnt = 0; i_cnt < 7; i_cnt++ )    {
-               p_objinfo       = OBJINFO( p_pginfo, (2 + i_cnt) );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, (2 + i_cnt), 0, NO_OBJ, 1, (3 + i_cnt) );
+       //for( i_cnt = 0; i_cnt < 7; i_cnt++ )  {
+       for( i_cnt = 2; i_cnt < 9; i_cnt++ )    {
+               p_objinfo       = OBJINFO( p_pginfo, (10000 - i_cnt) );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, (10000 - i_cnt), 0, NO_OBJ, 9999, (9999 - i_cnt) );
 
-               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
-               CU_ASSERT( 1 == p_objmaster->grplink.i_child_topid );
+               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+               CU_ASSERT( 9999 == p_objmaster->grplink.i_child_topid );
        }
 
-       p_objinfo       = OBJINFO( p_pginfo, 1 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, 9 );
+       p_objinfo       = OBJINFO( p_pginfo, 9999 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9999, 0, NO_OBJ, NO_OBJ, 9991 );
 
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
-       CU_ASSERT( 9 == p_objmaster->grplink.i_child_topid );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       CU_ASSERT( 9991 == p_objmaster->grplink.i_child_topid );
 
-       p_objinfo       = OBJINFO( p_pginfo, 9 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       p_objinfo       = OBJINFO( p_pginfo, 9991 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9991, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_objmaster->grplink.i_child_topid );
 
        // Delete MasterObject 
        p_objinfo       = OBJINFO( p_pginfo, 0 );
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
 
        return;
@@ -227,21 +236,35 @@ void Test_ObjectInfo_InsetDelete_test00_003(
        QWord                                   qw_addr;
        QWord                                   qw_size;
        LibGoblin_ObjectInfo    *p_objinfo;
+       LibGoblin_ObjectInfo    *p_objparent;
        LibGoblin_ObjectInfo    *p_objmaster;
 
-       // Scenery 1 
+       // Scenery 1 .......................................................
        // Alloc ---
-       qw_addr = 0x0000000000000000;
-       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, qw_addr, 0x00100000, NULL, 0x00 );
+       qw_addr = 0x10000000;
+       qw_size = 0x10000000;
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, qw_addr, qw_size, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
        Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
 
-       qw_addr += 0x00100000;
-
-       for( i_cnt = 2; i_cnt < 10; i_cnt++ )   {
-               p_objinfo       = ObjectInfo_InsetObject( p_pginfo, qw_addr, 0x00100000, NULL, 0x00 );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, i_cnt - 1, NO_OBJ );
+       for( i_cnt = 2; i_cnt < 6; i_cnt++ )    {
+               qw_addr += 0x00010000;
+               qw_size >>= 1;
+               p_objparent     = p_objinfo;
+               p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, qw_addr, qw_size, p_objparent, 0x00, OBJINFO_TYPE_NONE, NULL );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, p_objparent->i_id, NO_OBJ, NO_OBJ, NO_OBJ );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objparent, (i_cnt - 1), (i_cnt - 2), i_cnt, NO_OBJ, NO_OBJ );
+       }
 
-               qw_addr += 0x00100000;
+       for( ; i_cnt < 10; i_cnt++ )    {
+               qw_addr += 0x00010000;
+               qw_size >>= 1;
+               p_objparent     = p_objinfo;
+               p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, qw_addr, qw_size, NULL, 0x01, OBJINFO_TYPE_NONE, NULL );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, p_objparent->i_id, NO_OBJ, NO_OBJ, NO_OBJ );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objparent, (i_cnt - 1), (i_cnt - 2), i_cnt, NO_OBJ, NO_OBJ );
        }
 
        // Check ---
@@ -249,56 +272,669 @@ void Test_ObjectInfo_InsetDelete_test00_003(
        Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 1, NO_OBJ, NO_OBJ );
 
        // Delete ---
-       for( i_cnt = 1; i_cnt < 9; i_cnt++ )    {
+       for( i_cnt = 9; i_cnt > 5; i_cnt-- )    {
                p_objinfo       = OBJINFO( p_pginfo, i_cnt );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, (i_cnt + 1) );
+               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, (i_cnt - 1), NO_OBJ, NO_OBJ, NO_OBJ );
 
-               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
-               CU_ASSERT( (i_cnt + 1) == p_objmaster->grplink.i_child_topid );
+               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        }
 
-       p_objinfo       = OBJINFO( p_pginfo, i_cnt );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       p_objinfo       = OBJINFO( p_pginfo, 1 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, 2, NO_OBJ, NO_OBJ );
 
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_objmaster->grplink.i_child_topid );
        CU_ASSERT( NO_OBJ == p_objmaster->addrlink.i_next_id );
 
-       // Scenery 2 
-       qw_size         = 0x0000000000000001;
-       p_objinfo       = ObjectInfo_InsetObject( p_pginfo, 0x1000000000000000, qw_size, NULL, 0x00 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       // Delete MasterObject 
+       p_objinfo       = OBJINFO( p_pginfo, 0 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
 
-       qw_size         <<= 1;
-       for( i_cnt = 2; i_cnt < 10; i_cnt++ )   {
-               p_objinfo       = ObjectInfo_InsetObject( p_pginfo,  0x1000000000000000, qw_size, NULL, 0x00 );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, i_cnt - 1 );
+       return;
+}
 
-               qw_size         <<= 1;
-       }
+/*--------------------------------------------------------------------*/
+void Test_ObjectInfo_InsetDelete_test00_004_Alloc(
+               LibGoblin_ProgramInfo   *p_pginfo )
+{
+       LibGoblin_ObjectInfo    *p_objinfo;
+       LibGoblin_ObjectInfo    *p_objparent;
+
+       //   ID01: 00000000h-40000000h
+       //     ID04: 20000000h-30000000h
+       //       ID10: 21000000h-25000000h
+       //       ID11: 25000000h-29000000h
+       //     ID05: 30000000h-40000000h
+       //       ID12: 38000000h-40000000h
+       //       ID13: 40000000h-44000000h
+       //     ID08: 70000000h-80000000h
+       //   ID06: 38000000h-58000000h
+       //     ID14: 80000000h-88000000h
+       //     ID15: 84000000h-8c000000h
+       //   ID03: 40000000h-80000000h
+       //     ID07: 60000000h-70000000h
+       //   ID02: 80000000h-c0000000h
+       //   ID09: 80000000h-a0000000h
+
+       // Scenery 1 ......................................................
+       // Alloc ---
+       //   ID01: 00000000h-40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x00000000, 0x40000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       //   ID02: 80000000h-c0000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x80000000, 0x40000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 0, NO_OBJ, 1, NO_OBJ );
+
+       //   ID03: 40000000h-80000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x40000000, 0x40000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 0, NO_OBJ, 1, 2 );
+
+       //   ID04: 20000000h-30000000h
+       p_objparent     = OBJINFO( p_pginfo, 1 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objparent, 1, 0, NO_OBJ, NO_OBJ, 3 );
+
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x20000000, 0x10000000, NULL, 0x01, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 1, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 4 == p_objparent->grplink.i_child_topid );
+
+       //   ID05: 30000000h-40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x30000000, 0x10000000, p_objparent, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 5, 1, NO_OBJ, 4, NO_OBJ );
+
+       //   ID06: 38000000h-58000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x38000000, 0x20000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 6, 0, NO_OBJ, 1, 3 );
+
+       //   ID07: 60000000h-70000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x60000000, 0x10000000, NULL, 0x01, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 7, 3, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       //   ID08: 70000000h-80000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x70000000, 0x10000000, p_objparent, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 8, 1, NO_OBJ, 5, NO_OBJ );
+
+       //   ID09: 80000000h-a0000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x80000000, 0x20000000, NULL, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 0, NO_OBJ, 2, NO_OBJ );
+
+       //   ID10: 21000000h-25000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x21000000, 0x04000000, NULL, 0x01, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 10, 4, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       //   ID11: 25000000h-29000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x25000000, 0x04000000, NULL, 0x01, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 11, 4, NO_OBJ, 10, NO_OBJ );
+
+       //   ID12: 38000000h-40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x38000000, 0x08000000, NULL, 0x01, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 12, 5, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       //   ID13: 40000000h-44000000h
+       p_objparent     = OBJINFO( p_pginfo, 5 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objparent, 5, 1, 12, 4, 8 );
+
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x40000000, 0x04000000, p_objparent, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 13, 5, NO_OBJ, 12, NO_OBJ );
+
+       //   ID14: 80000000h-88000000h
+       p_objparent     = OBJINFO( p_pginfo, 6 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objparent, 6, 0, NO_OBJ, 1, 3 );
+
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x80000000, 0x08000000, p_objparent, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 14, 6, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       //   ID15: 84000000h-8c000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                               p_pginfo, 0x84000000, 0x08000000, p_objparent, 0x00, OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 15, 6, NO_OBJ, 14, NO_OBJ );
 
        // Check ---
-       p_objmaster     = OBJINFO( p_pginfo, 0 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objmaster, 0, NO_OBJ, 9, NO_OBJ, NO_OBJ );
+       p_objinfo       = OBJINFO( p_pginfo, 1 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 0 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 4 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, 4, NO_OBJ, 6 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 1 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 10 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 1, 10, NO_OBJ, 5 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 10 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 4 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 11 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 10, 4, NO_OBJ, NO_OBJ, 11 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 11 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 10 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 5 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 11, 4, NO_OBJ, 10, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 5 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 11 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 6 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 5, 1, 12, 4, 8 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 6 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 5 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 12 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 6, 0, 14, 1, 3 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 12 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 6 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 3 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 12, 5, NO_OBJ, NO_OBJ, 13 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 12 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 13 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 0, 7, 6, 2 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 13 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 7 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 13, 5, NO_OBJ, 12, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 13 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 8 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 7, 3, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 8 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 2 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 8, 1, NO_OBJ, 5, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 8 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 9 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 0, NO_OBJ, 3, 9 );
 
-       // Delete ---
-       for( i_cnt = 9; i_cnt > 1; i_cnt-- )    {
-               p_objinfo       = OBJINFO( p_pginfo, i_cnt );
-               Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, i_cnt, 0, NO_OBJ, NO_OBJ, (i_cnt - 1) );
+       p_objinfo       = OBJINFO( p_pginfo, 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 2 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 14 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 0, NO_OBJ, 2, NO_OBJ );
 
-               ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
-               CU_ASSERT( (i_cnt - 1) == p_objmaster->grplink.i_child_topid );
-       }
+       p_objinfo       = OBJINFO( p_pginfo, 14 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 15 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 14, 6, NO_OBJ, NO_OBJ, 15 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 15 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 14 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == NO_OBJ );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 15, 6, NO_OBJ, 14, NO_OBJ );
+
+       return;
+}
+
+/*--------------------------------------------------------------------*/
+void Test_ObjectInfo_InsetDelete_test00_004(
+               LibGoblin_ProgramInfo   *p_pginfo )
+{
+       LibGoblin_ObjectInfo    *p_objinfo;
 
+       // Scenery 1 ......................................................
+       Test_ObjectInfo_InsetDelete_test00_004_Alloc( p_pginfo );
+
+       // Delete 1 
+       p_objinfo       = OBJINFO( p_pginfo, 5 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 11 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 6 );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == NO_OBJ );
+       p_objinfo       = OBJINFO( p_pginfo, 6 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 11 );
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == 8 );
+       p_objinfo       = OBJINFO( p_pginfo, 8 );
+       CU_ASSERT( p_objinfo->grplink.i_prev_id == 4 );
+
+       // Delete 2
+       p_objinfo       = OBJINFO( p_pginfo, 6 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 11 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 3 );
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 11 );
        p_objinfo       = OBJINFO( p_pginfo, 1 );
-       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == 3 );
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->grplink.i_prev_id == 1 );
 
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
-       CU_ASSERT( NO_OBJ == p_objmaster->grplink.i_child_topid );
+       // Delete 3
+       p_objinfo       = OBJINFO( p_pginfo, 1 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 0 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 7 );
+       CU_ASSERT( p_objinfo->grplink.i_prev_id == NO_OBJ );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == 2 );
+       p_objinfo       = OBJINFO( p_pginfo, 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 3 );
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       CU_ASSERT( p_objinfo->grplink.i_prev_id == 3 );
+       p_objinfo       = OBJINFO( p_pginfo, 0 );
+       CU_ASSERT( p_objinfo->grplink.i_child_topid == 3 );
+
+       // Delete 4
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 7 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 0 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == NO_OBJ );
+       CU_ASSERT( p_objinfo->grplink.i_prev_id == NO_OBJ );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 9 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 0 );
+       CU_ASSERT( p_objinfo->grplink.i_child_topid == NO_OBJ);
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == NO_OBJ );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == NO_OBJ );
+       CU_ASSERT( p_objinfo->grplink.i_prev_id == NO_OBJ );
+       CU_ASSERT( p_objinfo->grplink.i_next_id == NO_OBJ );
 
        // Delete MasterObject 
        p_objinfo       = OBJINFO( p_pginfo, 0 );
-       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo, 0x00 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
+
+       return;
+}
+
+/*--------------------------------------------------------------------*/
+void Test_ObjectInfo_InsetDelete_test00_005(
+               LibGoblin_ProgramInfo   *p_pginfo )
+{
+       LibGoblin_ObjectInfo    *p_objinfo;
+
+       // ID10: 00000000h - f0000000h
+       //   ID02: 10000000h - 20000000h
+       //     ID01: 10000000h - 10100000h
+       //   ID03: 30000000h - 40000000h
+       //   ID04: 50000000h - 60000000h
+       //   ID11: 65000000h - b5000000h
+       //     ID09: 70000000h - 80000000h
+       //       ID05: 70000000h - 70001000h
+       //     ID08: 90000000h - a0000000h
+       //       ID07: 90100000h - 90200000h
+       //         ID06: 90101000h - 90102000h
+
+
+       // Alloc ---
+       //     ID01: 10000000h - 10100000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x10000000, 0x00100000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       //   ID02: 10000000h - 20000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x10000000, 0x10000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 0, 1, NO_OBJ, NO_OBJ );
+
+       //   ID03: 30000000h - 40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x30000000, 0x10000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 0, NO_OBJ, 2, NO_OBJ );
+
+       //   ID04: 50000000h - 60000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x50000000, 0x10000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 0, NO_OBJ, 3, NO_OBJ );
+
+       //       ID05: 70000000h - 70001000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x70000000, 0x00001000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 5, 0, NO_OBJ, 4, NO_OBJ );
+
+       //         ID06: 90101000h - 90102000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x90101000, 0x00001000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 6, 0, NO_OBJ, 5, NO_OBJ );
+
+       //       ID07: 90100000h - 90200000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x90100000, 0x00100000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 7, 0, 6, 5, NO_OBJ );
+
+       //     ID08: 90000000h - a0000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x90000000, 0x10000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 8, 0, 7, 5, NO_OBJ );
+
+       //     ID09: 70000000h - 80000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x70000000, 0x10000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 0, 5, 4, 8 );
+
+       // ID10: 00000000h - f0000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x00000000, 0xf0000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 10, 0, 2, NO_OBJ, NO_OBJ );
+
+       //   ID11: 65000000h - b5000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                                       p_pginfo, 0x65000000, 0x50000000, NULL,
+                                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 11, 10, 9, 4, NO_OBJ );
+
+
+       // Check ---
+       p_objinfo       = OBJINFO( p_pginfo, 1 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 2 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 3 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 2, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 10 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 1 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 10, 1, NO_OBJ, 3 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 1 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 4 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 10, NO_OBJ, 2, 4 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 11 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 10, NO_OBJ, 3, 11 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 5 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 8 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 5, 9, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 6 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == NO_OBJ );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 6, 7, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 8 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 6 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 7, 8, 6, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 8 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 5 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 7 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 8, 11, 7, 9, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 11 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 5 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 11, 5, NO_OBJ, 8 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 10 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 0 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 2 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 10, 0, 2, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 11 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 4 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 9 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 11, 10, 9, 4, NO_OBJ );
+
+
+       // Delete --- 
+       p_objinfo       = OBJINFO( p_pginfo, 11 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 10, NO_OBJ, 3, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 10, 1, NO_OBJ, 4 );
+
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 10, NO_OBJ, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 10 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+
+       // Delete MasterObject ---
+       p_objinfo       = OBJINFO( p_pginfo, 0 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+       CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
+
+       return;
+}
+
+/*--------------------------------------------------------------------*/
+void Test_ObjectInfo_InsetDelete_test00_006(
+               LibGoblin_ProgramInfo   *p_pginfo )
+{
+       LibGoblin_ObjectInfo    *p_objinfo;
+
+       // ID05: 00000000h - f0000000h                  NULL
+       //   ID02: 10000000h - 20000000h                "function02"
+       //     ID01: 10000000h - 10100000h              "function01"
+       //   ID03: 30000000h - 40000000h                "function03"
+       //     ID07: 30000000h - 40000000h              "function03"
+       //       ID08: 30000000h - 40000000h    "function07"
+       //   ID04: 50000000h - 60000000h                NULL
+       //     ID09: 50000000h - 60000000h              "function09"
+       //   ID06: 70000000h - 70001000h                "function01"
+
+
+       // ------------------------------------------------------------------
+       //     ID01: 10000000h - 10100000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x10000000, 0x00100000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function01" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 0, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function01", 256) );
+
+       //   ID02: 10000000h - 20000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x10000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function02" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 0, 1, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function02", 256) );
+
+       //   ID03: 30000000h - 40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x30000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                       OBJINFO_TYPE_NONE, "function03" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 0, NO_OBJ, 2, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function03", 256) );
+
+       //   ID04: 50000000h - 60000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x50000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 0, NO_OBJ, 3, NO_OBJ );
+
+       // ID05: 00000000h - f0000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x00000000, 0xf0000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                       OBJINFO_TYPE_NONE, NULL );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 5, 0, 2, NO_OBJ, NO_OBJ );
+
+
+       // ------------------------------------------------------------------
+       //   ID06: 70000000h - 70001000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x70000000, 0x00001000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function01" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 6, 5, NO_OBJ, 4, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function01", 256) );
+
+       //   ID07: 30000000h - 40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x30000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET,
+                                       OBJINFO_TYPE_NONE, "function03" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 7, 3, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function03", 256) );
+
+       //   ID08: 30000000h - 40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x30000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function07" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 8, 7, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function07", 256) );
+
+       //   ID09: 50000000h - 60000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x50000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function09" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 4, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function09", 256) );
+
+
+       // ------------------------------------------------------------------
+       //   IDxx=03: 30000000h - 40000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x30000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function03" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 5, 7, 2, 4 );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function03", 256) );
+
+       //   IDxx=09: 50000000h - 60000000h
+       p_objinfo       = ObjectInfo_InsetObject(
+                                       p_pginfo, 0x50000000, 0x10000000, NULL,
+                                       OBJINFO_INSETMODE_ADOPT | OBJINFO_INSETMODE_INSET | OBJINFO_INSETMODE_CHKNAME,
+                                       OBJINFO_TYPE_NONE, "function09" );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 4, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function09", 256) );
+
+       // Check ---
+       p_objinfo       = OBJINFO( p_pginfo, 1 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 2 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 3 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 1, 2, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function01", 256) );
+
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 5 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 1 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 2, 5, 1, NO_OBJ, 3 );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function02", 256) );
+
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 1 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 7 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 3, 5, 7, 2, 4 );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function03", 256) );
+
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 8 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 9);
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 5, 9, 3, 6 );
+       CU_ASSERT( NULL == p_objinfo->pstr_name );
+
+       p_objinfo       = OBJINFO( p_pginfo, 5 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 0 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 2 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 5, 0, 2, NO_OBJ, NO_OBJ );
+       CU_ASSERT( NULL == p_objinfo->pstr_name );
+
+       p_objinfo       = OBJINFO( p_pginfo, 6 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == NO_OBJ );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 6, 5, NO_OBJ, 4, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function01", 256) );
+
+       p_objinfo       = OBJINFO( p_pginfo, 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 3 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 8 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 7, 3, 8, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function03", 256) );
+
+       p_objinfo       = OBJINFO( p_pginfo, 8 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 7 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 4 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 8, 7, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function07", 256) );
+
+       p_objinfo       = OBJINFO( p_pginfo, 9 );
+       CU_ASSERT( p_objinfo->addrlink.i_prev_id == 4 );
+       CU_ASSERT( p_objinfo->addrlink.i_next_id == 6 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 9, 4, NO_OBJ, NO_OBJ, NO_OBJ );
+       CU_ASSERT( 0x00 == strncmp( p_objinfo->pstr_name, "function09", 256) );
+
+       // Delete --- 
+       p_objinfo       = OBJINFO( p_pginfo, 3 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 2 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 6 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       p_objinfo       = OBJINFO( p_pginfo, 4 );
+       Test_ObjectInfo_CUAssert_GrpLink( p_objinfo, 4, 5, 9, NO_OBJ, NO_OBJ );
+
+       p_objinfo       = OBJINFO( p_pginfo, 5 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
+
+       // Delete MasterObject ---
+       p_objinfo       = OBJINFO( p_pginfo, 0 );
+       ObjectInfo_DeleteObjectInfo( p_pginfo, p_objinfo );
        CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
 
        return;
@@ -311,30 +947,74 @@ void Test_ObjectInfo_InsetDelete_test00( void )
        LibGoblin_ProgramInfo   *p_pginfo;
 
        // Init ----
+       i_result        = LibBrownie_Init();
+       CU_ASSERT( 0x00 == i_result );
+
        i_result        = ProgInfo_Init();
        CU_ASSERT( 0x00 == i_result );
 
        p_pginfo        = ProgInfo_AllocProgInfo();
        CU_ASSERT( NULL != p_pginfo );
 
+
+       // -----------------
        i_result        = ObjectInfo_Init( p_pginfo, 0 );
        CU_ASSERT( 0x00 == i_result );
 
-       // Alloc Test ---
        Test_ObjectInfo_InsetDelete_test00_001( p_pginfo );
        Test_ObjectInfo_InsetDelete_test00_002( p_pginfo );
+
+       i_result        = ObjectInfo_Term( p_pginfo );
+       CU_ASSERT( 0x00 == i_result );
+
+
+       // -----------------
+       i_result        = ObjectInfo_Init( p_pginfo, 0 );
+       CU_ASSERT( 0x00 == i_result );
+
        Test_ObjectInfo_InsetDelete_test00_003( p_pginfo );
 
-       // Term ---
        i_result        = ObjectInfo_Term( p_pginfo );
        CU_ASSERT( 0x00 == i_result );
 
+
+       // -----------------
+       i_result        = ObjectInfo_Init( p_pginfo, 0 );
+       CU_ASSERT( 0x00 == i_result );
+
+       Test_ObjectInfo_InsetDelete_test00_004( p_pginfo );
+
+       i_result        = ObjectInfo_Term( p_pginfo );
+       CU_ASSERT( 0x00 == i_result );
+
+       // -----------------
+       i_result        = ObjectInfo_Init( p_pginfo, 0 );
+       CU_ASSERT( 0x00 == i_result );
+
+       Test_ObjectInfo_InsetDelete_test00_005( p_pginfo );
+
+       i_result        = ObjectInfo_Term( p_pginfo );
+       CU_ASSERT( 0x00 == i_result );
+
+       // -----------------
+       i_result        = ObjectInfo_Init( p_pginfo, 0 );
+       CU_ASSERT( 0x00 == i_result );
+
+       Test_ObjectInfo_InsetDelete_test00_006( p_pginfo );
+
+       i_result        = ObjectInfo_Term( p_pginfo );
+       CU_ASSERT( 0x00 == i_result );
+
+
+       // Term -----------
        i_result        = ProgInfo_FreeProgInfo( p_pginfo );
        CU_ASSERT( 0x00 == i_result );
 
        i_result        = ProgInfo_Term();
        CU_ASSERT( 0x00 == i_result );
 
+       LibBrownie_Term();
+
        return;
 }
 
@@ -351,6 +1031,9 @@ void Test_ObjectInfo_AllocFree_test00_001( void )
        LibGoblin_ObjectInfo    *p_objinfo;
 
        // Init ----
+       i_result        = LibBrownie_Init();
+       CU_ASSERT( 0x00 == i_result );
+
        i_result        = ProgInfo_Init();
        CU_ASSERT( 0x00 == i_result );
 
@@ -362,15 +1045,31 @@ void Test_ObjectInfo_AllocFree_test00_001( void )
        i_result        = ObjectInfo_Init( p_pginfo, 0 );
        CU_ASSERT( 0x00 == i_result );
        CU_ASSERT( i_max == p_pginfo->objinfo.i_alloced );
+       CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_topid );
+       CU_ASSERT( 0x00 == p_pginfo->objinfo.i_empty );
 
        // Alloc Test ---
-       for( i_cnt = 0; i_cnt <= i_max; i_cnt++ )       {
+       for( i_cnt = 0; i_cnt < (i_max - 1); i_cnt++ )  {
                p_objinfo       = ObjectInfo_AllocObjectInfo( p_pginfo );
                CU_ASSERT( NULL != p_objinfo );
                CU_ASSERT(  i_cnt      == p_objinfo->i_id );
-               CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_maxid );
                CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_used );
+               CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_empty );
        }
+
+       p_objinfo       = ObjectInfo_AllocObjectInfo( p_pginfo );
+       CU_ASSERT( NULL != p_objinfo );
+       CU_ASSERT(  i_cnt      == p_objinfo->i_id );
+       CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_used );
+       CU_ASSERT( NO_OBJ == p_pginfo->objinfo.i_empty );
+
+       i_cnt++;
+       p_objinfo       = ObjectInfo_AllocObjectInfo( p_pginfo );
+       CU_ASSERT( NULL != p_objinfo );
+       CU_ASSERT(  i_cnt      == p_objinfo->i_id );
+       CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_used );
+       CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_empty );
+
        CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
 
        i_used  = i_max + 1;
@@ -382,19 +1081,27 @@ void Test_ObjectInfo_AllocFree_test00_001( void )
                i_result        = ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo );
                CU_ASSERT( 0x00 == i_result );
                i_used--;
-               CU_ASSERT( (i_max + 1) == p_pginfo->objinfo.i_maxid );
                CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
+               CU_ASSERT( i_cnt == p_pginfo->objinfo.i_empty );
        }
        CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
 
-       for( i_cnt = 0; i_cnt <= (i_max/2); i_cnt++ )   {
+       for( i_cnt = 0; i_cnt < (i_max/2); i_cnt++ )    {
                p_objinfo       = ObjectInfo_AllocObjectInfo( p_pginfo );
                CU_ASSERT( NULL != p_objinfo );
                CU_ASSERT( p_objinfo->i_id == i_cnt );
-               CU_ASSERT( (i_max + 1) == p_pginfo->objinfo.i_maxid );
                i_used++;
                CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
+               CU_ASSERT( (i_cnt + 1) == p_pginfo->objinfo.i_empty );
        }
+
+       p_objinfo       = ObjectInfo_AllocObjectInfo( p_pginfo );
+       CU_ASSERT( NULL != p_objinfo );
+       CU_ASSERT( p_objinfo->i_id == i_cnt );
+       i_used++;
+       CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
+       CU_ASSERT( (i_max + 1) == p_pginfo->objinfo.i_empty );
+
        CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
 
        for( i_cnt = i_max; i_cnt >= 0; i_cnt-- )       {
@@ -405,7 +1112,6 @@ void Test_ObjectInfo_AllocFree_test00_001( void )
                i_result        = ObjectInfo_FreeObjectInfo( p_pginfo, p_objinfo );
                CU_ASSERT( 0x00 == i_result );
                i_used--;
-               CU_ASSERT( i_used == p_pginfo->objinfo.i_maxid );
                CU_ASSERT( i_used == p_pginfo->objinfo.i_used );
        }
        CU_ASSERT( (i_max + LIBGOBLIN_OBJINFO_UNITS) == p_pginfo->objinfo.i_alloced );
@@ -420,6 +1126,8 @@ void Test_ObjectInfo_AllocFree_test00_001( void )
        i_result        = ProgInfo_Term();
        CU_ASSERT( 0x00 == i_result );
 
+       LibBrownie_Term();
+
        return;
 }
 
@@ -431,6 +1139,9 @@ void Test_ObjectInfo_InitTerm_test00_001( void )
        int             i_result;
        LibGoblin_ProgramInfo   *p_pginfo;
 
+       i_result        = LibBrownie_Init();
+       CU_ASSERT( 0x00 == i_result );
+
        i_result        = ProgInfo_Init();
        CU_ASSERT( 0x00 == i_result );
 
@@ -449,6 +1160,8 @@ void Test_ObjectInfo_InitTerm_test00_001( void )
        i_result        = ProgInfo_Term();
        CU_ASSERT( 0x00 == i_result );
 
+       LibBrownie_Term();
+
        return;
 }
 
@@ -467,6 +1180,7 @@ int
                                                                 Test_ObjectInfo_InitTerm_test00_001 );
        CU_add_test( pt_goblin, "ObjectInfo_AllocFree_test00_001",
                                                                 Test_ObjectInfo_AllocFree_test00_001 );
+
        CU_add_test( pt_goblin, "ObjectInfo_InsetDelete_test00",
                                                                 Test_ObjectInfo_InsetDelete_test00 );