@@ -163,7 +163,118 @@ int main(int argc, char** argv) {
163163 EXPECT_TRUE (graph.readBinary (" test.graph" ));
164164 // ------------------------------------------------------------
165165
166- } else if (test_name == " StampedTree" ) {
166+ } else if (test_name == " OcTreeStructure" ) {
167+ // test essential tree structure
168+ OcTree tree (0.2 );
169+ size_t expectedNumNodes = 0 ;
170+ size_t expectedNumLeafs = 0 ;
171+ EXPECT_EQ (tree.getTreeDepth (), 16 );
172+ EXPECT_EQ (tree.size (), expectedNumNodes);
173+ EXPECT_EQ (tree.getNumLeafNodes (), expectedNumLeafs);
174+
175+ auto checkPruneExpandConstant = [&](OcTree& t, size_t expectedNumNodes, size_t expectedNumLeafs){
176+ EXPECT_EQ (t.calcNumNodes (), t.size ()); // check for size inconsistencies
177+ t.prune ();
178+ EXPECT_EQ (t.size (), expectedNumNodes);
179+ EXPECT_EQ (t.getNumLeafNodes (), expectedNumLeafs);
180+ EXPECT_EQ (t.calcNumNodes (), t.size ());
181+
182+ t.toMaxLikelihood ();
183+ EXPECT_EQ (t.size (), expectedNumNodes);
184+ EXPECT_EQ (t.getNumLeafNodes (), expectedNumLeafs);
185+ t.prune ();
186+ EXPECT_EQ (t.size (), expectedNumNodes);
187+ EXPECT_EQ (t.getNumLeafNodes (), expectedNumLeafs);
188+ EXPECT_EQ (t.calcNumNodes (), t.size ());
189+
190+ t.expand ();
191+ EXPECT_EQ (t.size (), expectedNumNodes);
192+ EXPECT_EQ (t.getNumLeafNodes (), expectedNumLeafs);
193+ EXPECT_EQ (t.calcNumNodes (), t.size ());
194+ };
195+
196+ checkPruneExpandConstant (tree, expectedNumNodes, expectedNumLeafs);
197+
198+
199+
200+ point3d pt1 (0 .1f , 0 .1f , 0 .1f );
201+ OcTreeKey key1;
202+ EXPECT_TRUE (tree.search (pt1) == NULL );
203+ EXPECT_TRUE (tree.coordToKeyChecked (pt1, key1));
204+ OcTreeNode* node1 = tree.updateNode (key1, true );
205+ EXPECT_TRUE (node1);
206+ EXPECT_EQ (node1, tree.search (pt1));
207+ expectedNumNodes += 17 ; // inserting first node creates 17 nodes in total (root + 16 levels)
208+ expectedNumLeafs += 1 ; // one new leaf node
209+ EXPECT_EQ (tree.size (), expectedNumNodes);
210+ EXPECT_EQ (tree.getNumLeafNodes (), expectedNumLeafs);
211+ // second update of same coordinate should not change size
212+ OcTreeNode* node1new = tree.updateNode (key1, true );
213+ EXPECT_EQ (node1, node1new);
214+ EXPECT_EQ (tree.size (), expectedNumNodes);
215+ EXPECT_EQ (tree.getNumLeafNodes (), expectedNumLeafs);
216+
217+ checkPruneExpandConstant (tree, expectedNumNodes, expectedNumLeafs);
218+
219+
220+ // second point in octree coordinate next to first (common parent), expected result: one more leaf, 18 nodes total
221+ expectedNumNodes += 1 ;
222+ expectedNumLeafs += 1 ;
223+ point3d pt2 (0 .3f , 0 .3f , 0 .3f );
224+ EXPECT_TRUE (tree.search (pt2) == NULL );
225+ OcTreeKey key2;
226+ EXPECT_TRUE (tree.coordToKeyChecked (pt2, key2));
227+ OcTreeNode* node2 = tree.updateNode (key2, true );
228+ EXPECT_TRUE (node2);
229+ EXPECT_EQ (node2, tree.search (pt2));
230+ EXPECT_EQ (tree.size (), expectedNumNodes);
231+ EXPECT_EQ (tree.getNumLeafNodes (), expectedNumLeafs);
232+
233+ // third point in different octant right after root, expected result: 16 more nodes, 1 more leaf
234+ expectedNumNodes += 16 ;
235+ expectedNumLeafs += 1 ;
236+ point3d pt3 (-0 .1f , -0 .1f , -0 .1f );
237+ OcTreeKey key3;
238+ EXPECT_TRUE (tree.search (pt3) == NULL );
239+ EXPECT_TRUE (tree.coordToKeyChecked (pt3, key3));
240+ OcTreeNode* node3 = tree.updateNode (key3, false );
241+ EXPECT_TRUE (node3);
242+ // tree.write("octree_structure_test.ot"); // DEBUGGING
243+
244+ EXPECT_EQ (node3, tree.search (pt3));
245+ EXPECT_EQ (tree.size (), expectedNumNodes);
246+ EXPECT_EQ (tree.getNumLeafNodes (), expectedNumLeafs);
247+
248+ checkPruneExpandConstant (tree, expectedNumNodes, expectedNumLeafs);
249+
250+ // delete last added node, expect 1 fewer leaf, 16 fewer nodes
251+ expectedNumNodes -= 16 ;
252+ expectedNumLeafs -= 1 ;
253+ EXPECT_TRUE (tree.search (key3) != NULL );
254+ EXPECT_TRUE (tree.deleteNode (key3) == false );
255+ EXPECT_TRUE (tree.search (pt3) == NULL );
256+ EXPECT_EQ (tree.size (), expectedNumNodes);
257+ EXPECT_EQ (tree.getNumLeafNodes (), expectedNumLeafs);
258+
259+ checkPruneExpandConstant (tree, expectedNumNodes, expectedNumLeafs);
260+
261+ // delete all remaining nodes
262+ for (OcTree::leaf_iterator it = tree.begin_leafs (), end = tree.end_leafs (); it != end; ++it) {
263+ tree.deleteNode (it.getKey (),it.getDepth ());
264+ }
265+ /* *
266+ FIXME: Failing test disabled for now - root node remains after deletetion
267+
268+ expectedNumNodes = 0;
269+ expectedNumLeafs = 0;
270+ EXPECT_EQ (tree.size(), expectedNumNodes);
271+ EXPECT_EQ (tree.getNumLeafNodes(), expectedNumLeafs);
272+
273+ checkPruneExpandConstant(tree, expectedNumNodes, expectedNumLeafs);
274+ */
275+
276+ // ------------------------------------------------------------
277+ } else if (test_name == " StampedTree" ) {
167278 OcTreeStamped stamped_tree (0.05 );
168279 // fill tree
169280 for (int x=-20 ; x<20 ; x++)
0 commit comments