TEST (PCL, Octree2Buf_Test) { // create octree instances Octree2BufBase<int> octreeA; Octree2BufBase<int> octreeB; // set octree depth octreeA.setTreeDepth (8); octreeB.setTreeDepth (8); struct MyVoxel { unsigned int x;unsigned int y;unsigned int z; }; unsigned int i, j; int data[256]; MyVoxel voxels[256]; srand (time (NULL)); // generate some voxel indices for (i = 0; i < 256; i++) { data[i] = i; voxels[i].x = i; voxels[i].y = 255 - i; voxels[i].z = i; // add data to leaf node voxel octreeA.add (voxels[i].x, voxels[i].y, voxels[i].z, data[i]); } ASSERT_EQ (256, octreeA.getLeafCount()); int TreeData; for (i=0; i<128; i++) { // retrieve and check data from leaf voxel octreeA.get(voxels[i].x,voxels[i].y,voxels[i].z, TreeData); ASSERT_EQ (TreeData, data[i]); } for (i=128; i<256; i++) { // check if leaf node exists in tree ASSERT_EQ ( octreeA.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , true); // remove leaf node octreeA.removeLeaf(voxels[i].x,voxels[i].y,voxels[i].z); // leaf node shouldn't exist in tree anymore ASSERT_EQ ( octreeA.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , false); } //////////// // test serialization std::vector<char> treeBinaryA; std::vector<char> treeBinaryB; std::vector<int> leafVectorA; std::vector<int> leafVectorB; // serialize tree - generate binary octree description octreeA.serializeTree(treeBinaryA); // deserialize tree - rebuild octree based on binary octree description octreeB.deserializeTree(treeBinaryA); // check if leafs exist in octrees for (i=0; i<128; i++) { ASSERT_EQ ( octreeB.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , true); } // these leafs should not exist.. for (i=128; i<256; i++) { ASSERT_EQ ( octreeB.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , false); } // checking deleteTree(); octreeB.deleteTree(); octreeB.setTreeDepth (8); // octreeB.getLeafCount() should be zero now; ASSERT_EQ (0,octreeB.getLeafCount()); for (i=0; i<128; i++) { ASSERT_EQ ( octreeB.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , false); } // test tree serialization octreeA.serializeTree(treeBinaryA, leafVectorA); // make sure, we retrieved all data objects ASSERT_EQ (leafVectorA.size(), octreeA.getLeafCount()); // check if leaf data is found in octree input data bool bFound; for (i=0; i<128; i++) { int leafInt = leafVectorA.back(); leafVectorA.pop_back(); bFound = false; for (j=0; j<256; j++) if ( data[j]==leafInt ) { bFound = true; break; } ASSERT_EQ (bFound, true); } // test tree serialization octreeA.serializeLeafs(leafVectorA); for (i=0; i<128; i++) { int leafInt = leafVectorA.back(); leafVectorA.pop_back(); bFound = false; for (j=0; j<256; j++) if ( data[j]==leafInt ) { bFound = true; break; } ASSERT_EQ (bFound, true); } // test tree serialization with leaf data vectors octreeA.serializeTree(treeBinaryA, leafVectorA); octreeB.deserializeTree(treeBinaryA, leafVectorA); ASSERT_EQ (octreeA.getLeafCount(),octreeB.getLeafCount()); ASSERT_EQ (128,octreeB.getLeafCount()); octreeB.serializeTree(treeBinaryB, leafVectorB); // test size and leaf count of reconstructed octree ASSERT_EQ (leafVectorB.size(), octreeB.getLeafCount()); ASSERT_EQ (leafVectorA.size(), leafVectorB.size()); for (i=0; i<leafVectorB.size(); i++) { ASSERT_EQ ( (leafVectorA[i] == leafVectorB[i]), true ); } }
TEST (PCL, Octree2Buf_Base_Double_Buffering_XOR_Test) { #define TESTPOINTS 3000 // create octree instances Octree2BufBase<int> octreeA; Octree2BufBase<int> octreeB; std::vector<char> treeBinaryA; std::vector<char> treeBinaryB; std::vector<int> leafVectorA; std::vector<int> leafVectorB; octreeA.setTreeDepth (5); octreeB.setTreeDepth (5); struct MyVoxel { unsigned int x;unsigned int y;unsigned int z; }; unsigned int i, j; int data[TESTPOINTS]; MyVoxel voxels[TESTPOINTS]; srand (time (NULL)); const unsigned int test_runs = 15; for (j = 0; j < test_runs; j++) { for (i = 0; i < TESTPOINTS; i++) { data[i] = rand (); voxels[i].x = rand () % 4096; voxels[i].y = rand () % 4096; voxels[i].z = rand () % 4096; // add data to octree octreeA.add (voxels[i].x, voxels[i].y, voxels[i].z, data[i]); } // test serialization - XOR tree binary data octreeA.serializeTree (treeBinaryA, leafVectorA, true); octreeB.deserializeTree (treeBinaryA, leafVectorA, true); octreeB.serializeTree (treeBinaryB, leafVectorB, true); // check leaf count of rebuilt octree ASSERT_EQ (octreeA.getLeafCount(),octreeB.getLeafCount()); ASSERT_EQ (leafVectorB.size(), octreeB.getLeafCount()); ASSERT_EQ (leafVectorA.size(), leafVectorB.size()); ASSERT_EQ (treeBinaryA.size(), octreeB.getBranchCount()); ASSERT_EQ (treeBinaryA.size(), treeBinaryB.size()); // check if octree octree structure is consistent. for (i=0; i<leafVectorB.size(); i++) { ASSERT_EQ ( (leafVectorA[i] == leafVectorB[i]), true ); } // switch buffers octreeA.switchBuffers(); octreeB.switchBuffers(); } }
TEST (PCL, Octree2Buf_Base_Double_Buffering_Test) { #define TESTPOINTS 3000 // create octree instances Octree2BufBase<int> octreeA; Octree2BufBase<int> octreeB; std::vector<char> treeBinaryA; std::vector<char> treeBinaryB; std::vector<int*> leafVectorA; std::vector<int*> leafVectorB; octreeA.setTreeDepth (5); octreeB.setTreeDepth (5); struct MyVoxel { unsigned int x; unsigned int y; unsigned int z; }; unsigned int i, j, k, runs; int data[TESTPOINTS]; MyVoxel voxels[TESTPOINTS]; srand (static_cast<unsigned int> (time (NULL))); const unsigned int test_runs = 20; for (j = 0; j < test_runs; j++) { octreeA.deleteTree (); octreeB.deleteTree (); octreeA.setTreeDepth (5); octreeB.setTreeDepth (5); runs = rand () % 20 + 1; for (k = 0; k < runs; k++) { // switch buffers octreeA.switchBuffers (); octreeB.switchBuffers (); for (i = 0; i < TESTPOINTS; i++) { data[i] = rand (); voxels[i].x = rand () % 4096; voxels[i].y = rand () % 4096; voxels[i].z = rand () % 4096; // add data to octree int* container = octreeA.createLeaf(voxels[i].x, voxels[i].y, voxels[i].z); *container = data[i]; } // test serialization octreeA.serializeTree (treeBinaryA, leafVectorA, true); octreeB.deserializeTree (treeBinaryA, leafVectorA, true); } octreeB.serializeTree (treeBinaryB, leafVectorB, true); // check leaf count of rebuilt octree ASSERT_EQ (octreeA.getLeafCount (), octreeB.getLeafCount ()); ASSERT_EQ (leafVectorB.size (), octreeB.getLeafCount ()); ASSERT_EQ (leafVectorA.size (), leafVectorB.size ()); // check if octree octree structure is consistent. for (i = 0; i < leafVectorB.size (); i++) { ASSERT_EQ (*leafVectorA[i], *leafVectorB[i]); } } }