Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
random_tree_test.cc
Go to the documentation of this file.
1
6#include <gtest/gtest.h>
7#include <random_tree.H>
8#include <tpl_tree_node.H>
9#include <tpl_binNodeUtils.H>
10
11using namespace Aleph;
12
13// =============================================================================
14// Test Fixture
15// =============================================================================
16
17class RandomTreeTest : public ::testing::Test
18{
19protected:
20 void SetUp() override {}
21 void TearDown() override {}
22
23 // Helper: count nodes in a tree (template)
24 template <typename T>
26 {
27 if (root == nullptr)
28 return 0;
29
30 size_t count = 1;
31 for (Tree_Node<T>* child = root->get_left_child();
32 child != nullptr;
33 child = child->get_right_sibling())
34 count += count_nodes(child);
35
36 return count;
37 }
38
39 // Helper: calculate tree height (template)
40 template <typename T>
42 {
43 if (root == nullptr)
44 return 0;
45
46 size_t max_child_height = 0;
47 for (Tree_Node<T>* child = root->get_left_child();
48 child != nullptr;
49 child = child->get_right_sibling())
50 {
51 size_t h = tree_height(child);
52 if (h > max_child_height)
54 }
55
56 return 1 + max_child_height;
57 }
58
59 // Helper: destroy tree recursively
60 template <typename T>
62 {
63 if (root == nullptr)
64 return;
65
66 // Delete all children first
68 while (child != nullptr)
69 {
71 destroy_tree(child);
72 child = next;
73 }
74
75 delete root;
76 }
77};
78
79// =============================================================================
80// Basic Functionality Tests
81// =============================================================================
82
84{
86 Tree_Node<int>* tree = gen(1);
87
88 ASSERT_NE(tree, nullptr);
89 EXPECT_EQ(count_nodes(tree), 1u);
90 EXPECT_EQ(tree_height(tree), 1u);
91 EXPECT_EQ(tree->get_left_child(), nullptr);
92
93 destroy_tree(tree);
94}
95
97{
98 RandTree<int> gen(123);
99 Tree_Node<int>* tree = gen(5);
100
101 ASSERT_NE(tree, nullptr);
102 EXPECT_EQ(count_nodes(tree), 5u);
103 EXPECT_GT(tree_height(tree), 0u);
104
105 destroy_tree(tree);
106}
107
109{
110 RandTree<int> gen(456);
111 Tree_Node<int>* tree = gen(50);
112
113 ASSERT_NE(tree, nullptr);
114 EXPECT_EQ(count_nodes(tree), 50u);
115
116 destroy_tree(tree);
117}
118
120{
121 RandTree<int> gen(789);
122 Tree_Node<int>* tree = gen(500);
123
124 ASSERT_NE(tree, nullptr);
125 EXPECT_EQ(count_nodes(tree), 500u);
126
127 destroy_tree(tree);
128}
129
130// =============================================================================
131// Determinism Tests
132// =============================================================================
133
135{
136 const unsigned seed = 12345;
137 const size_t n = 20;
138
139 RandTree<int> gen1(seed);
141
142 RandTree<int> gen2(seed);
144
145 ASSERT_NE(tree1, nullptr);
146 ASSERT_NE(tree2, nullptr);
147
148 // Same number of nodes
149 EXPECT_EQ(count_nodes(tree1), count_nodes(tree2));
150
151 // Same height (deterministic generation)
152 EXPECT_EQ(tree_height(tree1), tree_height(tree2));
153
156}
157
159{
160 const size_t n = 30;
161
162 RandTree<int> gen1(111);
164
165 RandTree<int> gen2(222);
167
168 ASSERT_NE(tree1, nullptr);
169 ASSERT_NE(tree2, nullptr);
170
171 // Same size but likely different structure
172 EXPECT_EQ(count_nodes(tree1), n);
173 EXPECT_EQ(count_nodes(tree2), n);
174
175 // Heights are likely different (not guaranteed but very probable)
176 // Just check both are valid
177 EXPECT_GT(tree_height(tree1), 0u);
178 EXPECT_GT(tree_height(tree2), 0u);
179
182}
183
184// =============================================================================
185// Stress Tests
186// =============================================================================
187
189{
190 RandTree<int> gen(999);
191
192 for (int i = 0; i < 10; ++i)
193 {
194 Tree_Node<int>* tree = gen(10 + i * 5);
195 ASSERT_NE(tree, nullptr);
196 EXPECT_EQ(count_nodes(tree), static_cast<size_t>(10 + i * 5));
197 destroy_tree(tree);
198 }
199}
200
202{
203 RandTree<int> gen(7777);
204 Tree_Node<int>* tree = gen(2000);
205
206 ASSERT_NE(tree, nullptr);
207 EXPECT_EQ(count_nodes(tree), 2000u);
208
209 destroy_tree(tree);
210}
211
212// =============================================================================
213// Edge Cases
214// =============================================================================
215
217{
218 RandTree<int> gen(42);
219 Tree_Node<int>* tree = gen(2);
220
221 ASSERT_NE(tree, nullptr);
222 EXPECT_EQ(count_nodes(tree), 2u);
223
224 // Root must have exactly one child
225 Tree_Node<int>* child = tree->get_left_child();
226 ASSERT_NE(child, nullptr);
227 EXPECT_EQ(child->get_right_sibling(), nullptr);
228 EXPECT_EQ(child->get_left_child(), nullptr);
229
230 destroy_tree(tree);
231}
232
234{
235 RandTree<int> gen(42);
236 Tree_Node<int>* tree = gen(3);
237
238 ASSERT_NE(tree, nullptr);
239 EXPECT_EQ(count_nodes(tree), 3u);
240
241 destroy_tree(tree);
242}
243
244// =============================================================================
245// Different Data Types
246// =============================================================================
247
249{
251 Tree_Node<std::string>* tree = gen(20);
252
253 ASSERT_NE(tree, nullptr);
254 EXPECT_EQ(count_nodes(tree), 20u);
255
256 destroy_tree(tree);
257}
258
260{
261 RandTree<double> gen(54321);
262 Tree_Node<double>* tree = gen(15);
263
264 ASSERT_NE(tree, nullptr);
265 EXPECT_EQ(count_nodes(tree), 15u);
266
267 destroy_tree(tree);
268}
269
270// =============================================================================
271// Constructor Tests
272// =============================================================================
273
275{
278
281
282 ASSERT_NE(tree1, nullptr);
283 ASSERT_NE(tree2, nullptr);
284
285 // Both should succeed
286 EXPECT_EQ(count_nodes(tree1), 10u);
287 EXPECT_EQ(count_nodes(tree2), 10u);
288
291}
292
293// =============================================================================
294// Structure Validation Tests
295// =============================================================================
296
298{
299 RandTree<int> gen(888);
300 Tree_Node<int>* tree = gen(100);
301
302 ASSERT_NE(tree, nullptr);
303
304 // Verify tree structure integrity using traversal
305 std::function<bool(Tree_Node<int>*)> validate = [&](Tree_Node<int>* node) -> bool
306 {
307 if (node == nullptr)
308 return true;
309
310 for (Tree_Node<int>* child = node->get_left_child();
311 child != nullptr;
312 child = child->get_right_sibling())
313 {
314 if (not validate(child))
315 return false;
316 }
317
318 return true;
319 };
320
321 EXPECT_TRUE(validate(tree));
322 EXPECT_EQ(count_nodes(tree), 100u);
323
324 destroy_tree(tree);
325}
326
327// =============================================================================
328// Performance/Scalability Tests
329// =============================================================================
330
332{
333 RandTree<int> gen(11111);
334
335 std::vector<size_t> sizes = {10, 50, 100, 500, 1000};
336
337 for (size_t n : sizes)
338 {
339 Tree_Node<int>* tree = gen(n);
340 ASSERT_NE(tree, nullptr);
341 EXPECT_EQ(count_nodes(tree), n);
342 destroy_tree(tree);
343 }
344}
long double h
Definition btreepic.C:154
Generic m-ary trees.
Tree_Node * get_left_child() const noexcept
Returns the leftmost child of this.
Tree_Node * get_right_sibling() const noexcept
Returns the right sibling of this.
Generator for uniformly random trees.
void destroy_tree(Tree_Node< T > *root)
size_t count_nodes(Tree_Node< T > *root)
void TearDown() override
size_t tree_height(Tree_Node< T > *root)
void SetUp() override
__gmp_expr< T, __gmp_binary_expr< __gmp_expr< T, U >, unsigned long int, __gmp_root_function > > root(const __gmp_expr< T, U > &expr, unsigned long int l)
Definition gmpfrxx.h:4060
void destroy_tree(Node *root)
Destroys (frees memory) the tree whose root is root.
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
void next()
Advance all underlying iterators (bounds-checked).
Definition ah-zip.H:175
DynList< T > maps(const C &c, Op op)
Classic map operation.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
Definition ahAlgo.H:127
Random tree generation using GSL random number generator.
TEST_F(RandomTreeTest, GenerateSingleNode)
Utility functions for binary tree operations.
General tree (n-ary tree) node.