From 4c5bf30292fb18fa2906ae7e958492c3f9b37a9b Mon Sep 17 00:00:00 2001
From: Sam Yates <yates@cscs.ch>
Date: Thu, 6 Apr 2017 20:50:34 +0200
Subject: [PATCH] Fix issue #224 test assertion failure. (#225)
`cell_tree::depth_from_root()` was incorrectly traversing only
the first branch from the tree root, leading to uninitialized
values in the returned depth array.
This leads to an incorrect maximum leaf node in `find_minimum_root()`,
which then returns `no_parent`. This gets passed to
`tree::change_root(size_t)`.
* Correct `cell_tree::depth_from_root()` implementation.
* Re-enable curiously disabled test case in `cell_tree.from_parent_index`
* Add unit tests for `cell_tree::depth_from_root`.
---
src/cell_tree.hpp | 4 +++-
tests/unit/test_tree.cpp | 47 +++++++++++++++++++++++++++++++++++++---
2 files changed, 47 insertions(+), 4 deletions(-)
diff --git a/src/cell_tree.hpp b/src/cell_tree.hpp
index ec7491c4..26fe9575 100644
--- a/src/cell_tree.hpp
+++ b/src/cell_tree.hpp
@@ -173,7 +173,9 @@ public:
{
tree::iarray depth(num_segments());
depth[0] = 0;
- depth_from_root(depth, int_type{1});
+ for (auto c: children(0)) {
+ depth_from_root(depth, c);
+ }
return depth;
}
diff --git a/tests/unit/test_tree.cpp b/tests/unit/test_tree.cpp
index 610a2cab..49b36f75 100644
--- a/tests/unit/test_tree.cpp
+++ b/tests/unit/test_tree.cpp
@@ -168,7 +168,6 @@ TEST(cell_tree, from_parent_index) {
EXPECT_EQ(2u, tree.children(1)[0]);
EXPECT_EQ(3u, tree.children(1)[1]);
}
- /* FIXME
{
// 0
// / \.
@@ -177,7 +176,7 @@ TEST(cell_tree, from_parent_index) {
// 3 4
// / \.
// 5 6
- std::vector<int> parent_index = {0,0,0,1,1,4,4};
+ std::vector<int_type> parent_index = {0,0,0,1,1,4,4};
cell_tree tree(parent_index);
EXPECT_EQ(tree.num_segments(), 7u);
@@ -190,7 +189,49 @@ TEST(cell_tree, from_parent_index) {
EXPECT_EQ(tree.num_children(5), 0u);
EXPECT_EQ(tree.num_children(6), 0u);
}
- */
+}
+
+TEST(cell_tree, depth_from_root) {
+ {
+ // 0
+ // / \.
+ // 1 2
+ // / \.
+ // 3 4
+ // / \.
+ // 5 6
+ std::vector<int_type> parent_index = {0,0,0,1,1,4,4};
+ cell_tree tree(parent_index);
+ auto depth = tree.depth_from_root();
+
+ EXPECT_EQ(depth[0], 0u);
+ EXPECT_EQ(depth[1], 1u);
+ EXPECT_EQ(depth[2], 1u);
+ EXPECT_EQ(depth[3], 2u);
+ EXPECT_EQ(depth[4], 2u);
+ EXPECT_EQ(depth[5], 3u);
+ EXPECT_EQ(depth[6], 3u);
+ }
+ {
+ // 0
+ // / \.
+ // 1 2
+ // / \.
+ // 3 4
+ // / \.
+ // 5 6
+ std::vector<int_type> parent_index = {0,0,0,2,2,4,4};
+ cell_tree tree(parent_index);
+ auto depth = tree.depth_from_root();
+
+ EXPECT_EQ(depth[0], 0u);
+ EXPECT_EQ(depth[1], 1u);
+ EXPECT_EQ(depth[2], 1u);
+ EXPECT_EQ(depth[3], 2u);
+ EXPECT_EQ(depth[4], 2u);
+ EXPECT_EQ(depth[5], 3u);
+ EXPECT_EQ(depth[6], 3u);
+ }
}
TEST(tree, change_root) {
--
GitLab