EXPECT_EQ(Name("w.y"), cdtnode->getName());
}
+TEST_F(DomainTreeTest, nodeFusionMultiple) {
+ // Test that node fusion occurs up the tree multiple times when
+ // conditions permit.
+
+ /* Original tree:
+ * .
+ * |
+ * b
+ * / \
+ * a d.e.f
+ * / | \
+ * c | g.h
+ * | |
+ * w.y i
+ * / | \ \
+ * x | z k
+ * | |
+ * p j
+ * / \
+ * o q
+ *
+ */
+
+ // Set data (some value 42) in the "d.e.f" node
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("d.e.f"), &dtnode));
+ EXPECT_EQ(static_cast<int*>(NULL),
+ dtnode->setData(new int(42)));
+
+ // Now, delete "x" and "z" nodes.
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("x.d.e.f"), &dtnode));
+ dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("z.d.e.f"), &dtnode));
+ dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+ /* Deleting 'x' and 'z' should not cause "w.y" to be fused with
+ * "d.e.f" because "d.e.f" is not empty (has data) in this case.
+ * .
+ * |
+ * b
+ * / \
+ * a d.e.f
+ * / | \
+ * c | g.h
+ * | |
+ * w.y i
+ * | \
+ * | k
+ * |
+ * p
+ * / \
+ * o q
+ *
+ */
+
+ // Check that "w.y" did not get fused with "d.e.f"
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("d.e.f"), &cdtnode));
+ EXPECT_EQ(Name("d.e.f"), cdtnode->getName());
+
+ // Now, clear the data on "d.e.f". (Ideally, this itself should
+ // cause fusion of "d.e.f" and "w.y" to occur, but we only do fusion
+ // during deletion in our DomainTree implementation.)
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("d.e.f"), &dtnode));
+ delete dtnode->setData(NULL);
+
+ // Check that "p" exists independently.
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("p.w.y.d.e.f"), &cdtnode));
+ EXPECT_EQ(Name("p"), cdtnode->getName());
+
+ // Now, delete "o" and "q" nodes.
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("o.w.y.d.e.f"), &dtnode));
+ dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("q.w.y.d.e.f"), &dtnode));
+ dtree_expose_empty_node.remove(mem_sgmt_, dtnode, deleteData);
+
+ // The deletion of "o" and "q" should cause "p" to fuse with "w.y"
+ // to form "p.w.y". Then, as "d.e.f" is now empty and conditions
+ // permit, for a second time up the forest, "p.w.y" is fused with
+ // "d.e.f" to form "p.w.y.d.e.f".
+ EXPECT_EQ(TestDomainTree::EXACTMATCH,
+ dtree_expose_empty_node.find(Name("p.w.y.d.e.f"), &cdtnode));
+ EXPECT_EQ(Name("p.w.y.d.e.f"), cdtnode->getName());
+}
+
TEST_F(DomainTreeTest, DISABLED_remove1) {
ofstream o1("d1.dot");
dtree_expose_empty_node.dumpDot(o1);