File: trees.cpp

package info (click to toggle)
iqtree 2.0.7%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,700 kB
  • sloc: cpp: 142,571; ansic: 57,789; sh: 275; python: 242; makefile: 95
file content (95 lines) | stat: -rw-r--r-- 2,972 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <catch.hpp>

#include <algorithm>

#include "../lib/trees_impl.hpp"

namespace terraces {
namespace tests {

TEST_CASE("is_root(root)", "[trees]") {
	auto root_node = terraces::node{none, 1, 2, none};
	CHECK(terraces::is_root(root_node));
}

TEST_CASE("is_root(non_root)", "[trees]") {
	auto non_root_node = terraces::node{1, 2, 3, none};
	CHECK(!terraces::is_root(non_root_node));
}

TEST_CASE("is_leaf(leaf)", "[trees]") {
	auto leaf_node = terraces::node{0, none, none, none};
	CHECK(terraces::is_leaf(leaf_node));
}

TEST_CASE("is_leaf(non_leaf)", "[trees]") {
	auto non_leaf_node = terraces::node{0, 1, 2, none};
	CHECK(!terraces::is_leaf(non_leaf_node));
}

TEST_CASE("is_rooted_tree(valid)", "[trees]") {
	tree t{
	        {none, 1, 2, none},    {0, 9, 6, none},       {0, 3, 4, none},
	        {2, 5, 8, none},       {2, none, none, none}, {3, none, none, none},
	        {1, none, none, none}, {9, none, none, none}, {3, none, none, none},
	        {1, 10, 7, none},      {9, none, none, none},
	};
	check_rooted_tree(t);
}

TEST_CASE("foreach_postorder(example)", "[trees]") {
	tree t{
	        {none, 1, 2, none},    {0, 9, 6, none},       {0, 3, 4, none},
	        {2, 5, 8, none},       {2, none, none, none}, {3, none, none, none},
	        {1, none, none, none}, {9, none, none, none}, {3, none, none, none},
	        {1, 10, 7, none},      {9, none, none, none},
	};
	std::vector<index> expected{10, 7, 9, 6, 1, 5, 8, 3, 4, 2, 0};
	std::vector<index> result;
	foreach_postorder(t, [&](index i) { result.push_back(i); });
	CHECK(result == expected);
}

TEST_CASE("foreach_preorder(example)", "[trees]") {
	tree t{
	        {none, 1, 2, none},    {0, 9, 6, none},       {0, 3, 4, none},
	        {2, 5, 8, none},       {2, none, none, none}, {3, none, none, none},
	        {1, none, none, none}, {9, none, none, none}, {3, none, none, none},
	        {1, 10, 7, none},      {9, none, none, none},
	};
	std::vector<index> expected{0, 1, 9, 10, 7, 6, 2, 3, 5, 8, 4};
	std::vector<index> result;
	foreach_preorder(t, [&](index i) { result.push_back(i); });
	CHECK(result == expected);
}

TEST_CASE("foreach_postorder(trivial)", "[trees]") {
	tree t{{}};
	std::vector<index> result;
	foreach_postorder(t, [&](index i) { result.push_back(i); });
	CHECK(result.size() == 1);
	CHECK(result[0] == 0);
}

TEST_CASE("foreach_preorder(trivial)", "[trees]") {
	tree t{{}};
	std::vector<index> result;
	foreach_preorder(t, [&](index i) { result.push_back(i); });
	CHECK(result.size() == 1);
	CHECK(result[0] == 0);
}

TEST_CASE("tree_printing", "[trees][tree-printing]") {
	auto t = tree{{none, 1, 2, none},
	              {0, none, none, 1},
	              {0, 3, 4, none},
	              {2, none, none, 3},
	              {2, none, none, 4}};
	const auto names = name_map{"root", "foo", "", "bar", "baz"};
	std::ostringstream stream;
	stream << as_newick(t, names);
	CHECK(stream.str() == "(foo,(bar,baz));");
}

} // namespace tests
} // namespace terraces