Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
euclidian_graph_test.cc
Go to the documentation of this file.
1
6#include <gtest/gtest.h>
8#include <point.H>
9
10using namespace Aleph;
11
12// =============================================================================
13// Type Definitions
14// =============================================================================
15
20
21// =============================================================================
22// Test Fixture
23// =============================================================================
24
25class EuclidianGraphTest : public ::testing::Test
26{
27protected:
28 void SetUp() override {}
29 void TearDown() override {}
30};
31
32// =============================================================================
33// Node Tests
34// =============================================================================
35
37{
38 ENode node;
39 Point p = node.get_position();
40 EXPECT_EQ(p.get_x(), 0.0);
41 EXPECT_EQ(p.get_y(), 0.0);
42}
43
45{
46 ENode node(42);
47 EXPECT_EQ(node.get_info(), 42);
48}
49
51{
52 Point p(10.5, 20.3);
53 ENode node(p);
54
56 EXPECT_DOUBLE_EQ(retrieved.get_x().get_d(), 10.5);
57 EXPECT_DOUBLE_EQ(retrieved.get_y().get_d(), 20.3);
58}
59
61{
62 Point p(5.0, 15.0);
63 ENode node(100, p);
64
65 EXPECT_EQ(node.get_info(), 100);
67 EXPECT_DOUBLE_EQ(retrieved.get_x().get_d(), 5.0);
68 EXPECT_DOUBLE_EQ(retrieved.get_y().get_d(), 15.0);
69}
70
72{
73 Point p(7.5, 8.5);
74 ENode node1(50, p);
76
77 EXPECT_EQ(node2.get_info(), 50);
78 Point retrieved = node2.get_position();
79 EXPECT_DOUBLE_EQ(retrieved.get_x().get_d(), 7.5);
80 EXPECT_DOUBLE_EQ(retrieved.get_y().get_d(), 8.5);
81}
82
83// =============================================================================
84// Arc Tests
85// =============================================================================
86
92
94{
95 EArc arc(3.14);
96 EXPECT_DOUBLE_EQ(arc.get_info(), 3.14);
97}
98
99// =============================================================================
100// Graph Construction Tests
101// =============================================================================
102
109
111{
112 EGraph g;
113 auto node = g.insert_node(42);
114
115 ASSERT_NE(node, nullptr);
116 EXPECT_EQ(node->get_info(), 42);
117 EXPECT_EQ(g.get_num_nodes(), 1u);
118}
119
121{
122 EGraph g;
123 Point p(10.0, 20.0);
124 auto node = g.insert_node(p);
125
126 ASSERT_NE(node, nullptr);
127 Point retrieved = node->get_position();
128 EXPECT_DOUBLE_EQ(retrieved.get_x().get_d(), 10.0);
129 EXPECT_DOUBLE_EQ(retrieved.get_y().get_d(), 20.0);
130 EXPECT_EQ(g.get_num_nodes(), 1u);
131}
132
134{
135 EGraph g;
136 Point p(5.5, 7.5);
137 auto node = g.insert_node(100, p);
138
139 ASSERT_NE(node, nullptr);
140 EXPECT_EQ(node->get_info(), 100);
141 Point retrieved = node->get_position();
142 EXPECT_DOUBLE_EQ(retrieved.get_x().get_d(), 5.5);
143 EXPECT_DOUBLE_EQ(retrieved.get_y().get_d(), 7.5);
144 EXPECT_EQ(g.get_num_nodes(), 1u);
145}
146
148{
149 EGraph g;
150
151 auto n1 = g.insert_node(Point(0.0, 0.0));
152 auto n2 = g.insert_node(Point(10.0, 0.0));
153 auto n3 = g.insert_node(Point(10.0, 10.0));
154
155 ASSERT_NE(n1, nullptr);
156 ASSERT_NE(n2, nullptr);
157 ASSERT_NE(n3, nullptr);
158 EXPECT_EQ(g.get_num_nodes(), 3u);
159}
160
161// =============================================================================
162// Arc Insertion Tests
163// =============================================================================
164
166{
167 EGraph g;
168 auto n1 = g.insert_node(Point(0.0, 0.0));
169 auto n2 = g.insert_node(Point(3.0, 4.0));
170
171 auto arc = g.insert_arc(n1, n2);
172
173 ASSERT_NE(arc, nullptr);
174 EXPECT_EQ(g.get_num_arcs(), 1u);
175 EXPECT_EQ(g.get_src_node(arc), n1);
176 EXPECT_EQ(g.get_tgt_node(arc), n2);
177}
178
180{
181 EGraph g;
182 auto n1 = g.insert_node(Point(0.0, 0.0));
183 auto n2 = g.insert_node(Point(1.0, 1.0));
184
185 auto arc = g.insert_arc(n1, n2, 99.9);
186
187 ASSERT_NE(arc, nullptr);
188 EXPECT_DOUBLE_EQ(arc->get_info(), 99.9);
189}
190
192{
193 EGraph g;
194 auto n1 = g.insert_node(Point(0.0, 0.0));
195 auto n2 = g.insert_node(Point(1.0, 0.0));
196 auto n3 = g.insert_node(Point(1.0, 1.0));
197
198 g.insert_arc(n1, n2);
199 g.insert_arc(n2, n3);
200 g.insert_arc(n1, n3);
201
202 EXPECT_EQ(g.get_num_arcs(), 3u);
203}
204
205// =============================================================================
206// Distance Calculation Tests
207// =============================================================================
208
210{
211 EGraph g;
212 auto n1 = g.insert_node(Point(0.0, 0.0));
213 auto n2 = g.insert_node(Point(3.0, 4.0));
214
215 auto arc = g.insert_arc(n1, n2);
216 Geom_Number dist = g.get_distance(arc);
217
218 // Distance = sqrt(3^2 + 4^2) = 5.0
219 EXPECT_DOUBLE_EQ(dist.get_d(), 5.0);
220}
221
223{
224 EGraph g;
225 auto n1 = g.insert_node(Point(5.0, 5.0));
226 auto n2 = g.insert_node(Point(5.0, 5.0));
227
228 auto arc = g.insert_arc(n1, n2);
229 Geom_Number dist = g.get_distance(arc);
230
231 EXPECT_DOUBLE_EQ(dist.get_d(), 0.0);
232}
233
235{
236 EGraph g;
237 auto n1 = g.insert_node(Point(0.0, 5.0));
238 auto n2 = g.insert_node(Point(10.0, 5.0));
239
240 auto arc = g.insert_arc(n1, n2);
241 Geom_Number dist = g.get_distance(arc);
242
243 EXPECT_DOUBLE_EQ(dist.get_d(), 10.0);
244}
245
247{
248 EGraph g;
249 auto n1 = g.insert_node(Point(5.0, 0.0));
250 auto n2 = g.insert_node(Point(5.0, 8.0));
251
252 auto arc = g.insert_arc(n1, n2);
253 Geom_Number dist = g.get_distance(arc);
254
255 EXPECT_DOUBLE_EQ(dist.get_d(), 8.0);
256}
257
258// =============================================================================
259// Search Tests
260// =============================================================================
261
263{
264 EGraph g;
265 Point p1(10.0, 20.0);
266 Point p2(30.0, 40.0);
267
268 auto n1 = g.insert_node(p1);
269 auto n2 = g.insert_node(p2);
270
271 auto found1 = g.search_node(p1);
272 auto found2 = g.search_node(p2);
273
274 EXPECT_EQ(found1, n1);
275 EXPECT_EQ(found2, n2);
276}
277
279{
280 EGraph g;
281 g.insert_node(Point(10.0, 20.0));
282
283 Point search_point(99.0, 99.0);
284 auto found = g.search_node(search_point);
285
286 EXPECT_EQ(found, nullptr);
287}
288
290{
291 EGraph g;
292 Point p(5.0, 5.0);
293
294 auto found = g.search_node(p);
295 EXPECT_EQ(found, nullptr);
296}
297
298// =============================================================================
299// Copy Constructor Tests
300// =============================================================================
301
303{
304 EGraph g1;
305 auto n1 = g1.insert_node(Point(0.0, 0.0));
306 auto n2 = g1.insert_node(Point(1.0, 1.0));
307 g1.insert_arc(n1, n2);
308
309 EGraph g2(g1);
310
311 EXPECT_EQ(g2.get_num_nodes(), g1.get_num_nodes());
312 EXPECT_EQ(g2.get_num_arcs(), g1.get_num_arcs());
313}
314
315// =============================================================================
316// Assignment Operator Tests
317// =============================================================================
318
320{
321 EGraph g1;
322 auto n1 = g1.insert_node(Point(0.0, 0.0));
323 auto n2 = g1.insert_node(Point(5.0, 5.0));
324 g1.insert_arc(n1, n2);
325
326 EGraph g2;
327 g2 = g1;
328
329 EXPECT_EQ(g2.get_num_nodes(), 2u);
330 EXPECT_EQ(g2.get_num_arcs(), 1u);
331}
332
334{
335 EGraph g;
336 auto n1 = g.insert_node(Point(0.0, 0.0));
337 auto n2 = g.insert_node(Point(1.0, 1.0));
338 g.insert_arc(n1, n2);
339
340 g = g; // Self-assignment
341
342 EXPECT_EQ(g.get_num_nodes(), 2u);
343 EXPECT_EQ(g.get_num_arcs(), 1u);
344}
345
346// =============================================================================
347// Digraph Tests
348// =============================================================================
349
356
358{
359 EDigraph dg;
360 dg.insert_node(Point(0.0, 0.0));
361 dg.insert_node(Point(10.0, 10.0));
362
363 EXPECT_EQ(dg.get_num_nodes(), 2u);
365}
366
368{
369 EDigraph dg;
370 auto n1 = dg.insert_node(Point(0.0, 0.0));
371 auto n2 = dg.insert_node(Point(5.0, 5.0));
372
373 auto arc = dg.insert_arc(n1, n2);
374
375 ASSERT_NE(arc, nullptr);
376 EXPECT_EQ(dg.get_num_arcs(), 1u);
377}
378
380{
382 dg1.insert_node(Point(0.0, 0.0));
383 dg1.insert_node(Point(1.0, 1.0));
384
386
387 EXPECT_TRUE(dg2.is_digraph());
388 EXPECT_EQ(dg2.get_num_nodes(), dg1.get_num_nodes());
389}
390
391// =============================================================================
392// Stress Tests
393// =============================================================================
394
396{
397 EGraph g;
398 const size_t n = 1000;
399
400 for (size_t i = 0; i < n; ++i)
401 {
402 double x = static_cast<double>(i);
403 double y = static_cast<double>(i * 2);
404 g.insert_node(Point(x, y));
405 }
406
407 EXPECT_EQ(g.get_num_nodes(), n);
408}
409
411{
412 EGraph g;
413 const size_t n = 100;
414
415 std::vector<ENode*> nodes;
416 for (size_t i = 0; i < n; ++i)
417 {
418 nodes.push_back(g.insert_node(Point(i, i)));
419 }
420
421 // Create complete graph
422 for (size_t i = 0; i < n; ++i)
423 {
424 for (size_t j = i + 1; j < n; ++j)
425 {
426 g.insert_arc(nodes[i], nodes[j]);
427 }
428 }
429
430 size_t expected_arcs = n * (n - 1) / 2;
432}
433
434// =============================================================================
435// Edge Cases
436// =============================================================================
437
439{
440 EGraph g;
441 auto n1 = g.insert_node(Point(-5.0, -10.0));
442 auto n2 = g.insert_node(Point(-1.0, -2.0));
443
444 ASSERT_NE(n1, nullptr);
445 ASSERT_NE(n2, nullptr);
446
447 auto arc = g.insert_arc(n1, n2);
448 Geom_Number dist = g.get_distance(arc);
449
450 EXPECT_GT(dist.get_d(), 0.0);
451}
452
454{
455 EGraph g;
456 auto n1 = g.insert_node(Point(1e6, 1e6));
457 auto n2 = g.insert_node(Point(1e6 + 1, 1e6 + 1));
458
459 auto arc = g.insert_arc(n1, n2);
460 Geom_Number dist = g.get_distance(arc);
461
462 EXPECT_DOUBLE_EQ(dist.get_d(), std::sqrt(2.0));
463}
Geom_Number get_distance(Arc *arc)
Node * insert_node(Node *node) noexcept override
Insertion of a node already allocated.
Node * search_node(const Point &)
Arc * insert_arc(Node *src_node, Node *tgt_node, void *a)
Definition tpl_graph.H:604
ArcInfo & get_info() noexcept
Return a modifiable reference to the arc data.
Definition graph-dry.H:595
NodeInfo & get_info() noexcept
Return a modifiable reference to the data contained in the node.
Definition graph-dry.H:494
Node * get_src_node(Arc *arc) const noexcept
Return the source node of arc (only for directed graphs)
Definition graph-dry.H:731
constexpr size_t get_num_nodes() const noexcept
Return the total of nodes of graph.
Definition graph-dry.H:695
bool is_digraph() const noexcept
Return true if the graph this is directed.
Definition graph-dry.H:657
constexpr size_t get_num_arcs() const noexcept
Definition graph-dry.H:778
Node * get_tgt_node(Arc *arc) const noexcept
Return the target node of arc (only for directed graphs)
Definition graph-dry.H:737
Rectangular point in the plane.
Definition point.H:156
const Geom_Number & get_y() const
Returns y value.
Definition point.H:226
const Geom_Number & get_x() const
Returns x value.
Definition point.H:221
TEST_F(EuclidianGraphTest, NodeDefaultConstructor)
DynArray< Graph::Node * > nodes
Definition graphpic.C:406
static mpfr_t y
Definition mpfr_mul_d.c:3
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
DynList< T > maps(const C &c, Op op)
Classic map operation.
2D point and geometric utilities.
Euclidean graph with 2D coordinates.