blob: bd25707894f1f7872835479a93ec9669de6f776c [file] [log] [blame]
Stephen Hines87f34652014-02-14 18:00:16 -08001//===- GraphTest.cpp ------------------------------------------------------===//
2//
3// The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "GraphTest.h"
Stephen Hines37b74a32014-11-26 18:48:20 -080010#include "mcld/ADT/GraphLite/Digraph.h"
11#include "mcld/ADT/GraphLite/ListDigraph.h"
Stephen Hines87f34652014-02-14 18:00:16 -080012
13using namespace mcld;
14using namespace mcld::test;
15using namespace mcld::graph;
16
17// Constructor can do set-up work for all test here.
Stephen Hines37b74a32014-11-26 18:48:20 -080018GraphTest::GraphTest() {
Stephen Hines87f34652014-02-14 18:00:16 -080019}
20
21// Destructor can do clean-up work that doesn't throw exceptions here.
Stephen Hines37b74a32014-11-26 18:48:20 -080022GraphTest::~GraphTest() {
Stephen Hines87f34652014-02-14 18:00:16 -080023}
24
25// SetUp() will be called immediately before each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080026void GraphTest::SetUp() {
Stephen Hines87f34652014-02-14 18:00:16 -080027}
28
29// TearDown() will be called immediately after each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080030void GraphTest::TearDown() {
Stephen Hines87f34652014-02-14 18:00:16 -080031}
32
33//===----------------------------------------------------------------------===//
34// Testcases
35//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -080036TEST_F(GraphTest, list_digraph_add_n_erase_nodes_1) {
Stephen Hines87f34652014-02-14 18:00:16 -080037 ListDigraph graph;
38
39 ListDigraph::Node* u1 = graph.addNode();
40 ListDigraph::Node* u2 = graph.addNode();
41 ListDigraph::Node* u3 = graph.addNode();
42
43 ASSERT_TRUE(NULL == u1->first_in);
44 ASSERT_TRUE(NULL == u1->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080045 ASSERT_TRUE(u2 == u1->prev);
Stephen Hines87f34652014-02-14 18:00:16 -080046 ASSERT_TRUE(NULL == u1->next);
47
48 ASSERT_TRUE(NULL == u2->first_in);
49 ASSERT_TRUE(NULL == u2->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080050 ASSERT_TRUE(u3 == u2->prev);
51 ASSERT_TRUE(u1 == u2->next);
Stephen Hines87f34652014-02-14 18:00:16 -080052
53 ASSERT_TRUE(NULL == u3->first_in);
54 ASSERT_TRUE(NULL == u3->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080055 ASSERT_TRUE(u2 == u3->next);
Stephen Hines87f34652014-02-14 18:00:16 -080056 ASSERT_TRUE(NULL == u3->prev);
57
58 ListDigraph::Node* head = NULL;
59 graph.getHead(head);
60 ASSERT_TRUE(head == u3);
61
62 graph.erase(*u2);
63
64 ASSERT_TRUE(NULL == u1->first_in);
65 ASSERT_TRUE(NULL == u1->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080066 ASSERT_TRUE(u3 == u1->prev);
Stephen Hines87f34652014-02-14 18:00:16 -080067 ASSERT_TRUE(NULL == u1->next);
68
69 ASSERT_TRUE(NULL == u3->first_in);
70 ASSERT_TRUE(NULL == u3->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080071 ASSERT_TRUE(u1 == u3->next);
Stephen Hines87f34652014-02-14 18:00:16 -080072 ASSERT_TRUE(NULL == u3->prev);
73
74 ASSERT_TRUE(NULL == u2->first_in);
75 ASSERT_TRUE(NULL == u2->first_out);
76 ASSERT_TRUE(NULL == u2->prev);
77 ASSERT_TRUE(NULL == u2->next);
78
79 graph.getHead(head);
80 ASSERT_TRUE(head == u3);
81}
82
Stephen Hines37b74a32014-11-26 18:48:20 -080083TEST_F(GraphTest, list_digraph_add_n_erase_nodes_2) {
Stephen Hines87f34652014-02-14 18:00:16 -080084 ListDigraph graph;
85
86 ListDigraph::Node* u1 = graph.addNode();
87 ListDigraph::Node* u2 = graph.addNode();
88 ListDigraph::Node* u3 = graph.addNode();
89
90 ASSERT_TRUE(NULL == u1->first_in);
91 ASSERT_TRUE(NULL == u1->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080092 ASSERT_TRUE(u2 == u1->prev);
Stephen Hines87f34652014-02-14 18:00:16 -080093 ASSERT_TRUE(NULL == u1->next);
94
95 ASSERT_TRUE(NULL == u2->first_in);
96 ASSERT_TRUE(NULL == u2->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -080097 ASSERT_TRUE(u3 == u2->prev);
98 ASSERT_TRUE(u1 == u2->next);
Stephen Hines87f34652014-02-14 18:00:16 -080099
100 ASSERT_TRUE(NULL == u3->first_in);
101 ASSERT_TRUE(NULL == u3->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800102 ASSERT_TRUE(u2 == u3->next);
Stephen Hines87f34652014-02-14 18:00:16 -0800103 ASSERT_TRUE(NULL == u3->prev);
104
105 ListDigraph::Node* head = NULL;
106 graph.getHead(head);
107 ASSERT_TRUE(head == u3);
108
109 graph.erase(*u1);
110
111 ASSERT_TRUE(NULL == u1->first_in);
112 ASSERT_TRUE(NULL == u1->first_out);
113 ASSERT_TRUE(NULL == u1->prev);
114 ASSERT_TRUE(NULL == u1->next);
115
116 ASSERT_TRUE(NULL == u2->first_in);
117 ASSERT_TRUE(NULL == u2->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800118 ASSERT_TRUE(u3 == u2->prev);
Stephen Hines87f34652014-02-14 18:00:16 -0800119 ASSERT_TRUE(NULL == u2->next);
120
121 ASSERT_TRUE(NULL == u3->first_in);
122 ASSERT_TRUE(NULL == u3->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800123 ASSERT_TRUE(u2 == u3->next);
Stephen Hines87f34652014-02-14 18:00:16 -0800124 ASSERT_TRUE(NULL == u3->prev);
125
126 graph.getHead(head);
127 ASSERT_TRUE(head == u3);
128}
129
Stephen Hines37b74a32014-11-26 18:48:20 -0800130TEST_F(GraphTest, list_digraph_add_n_erase_nodes_3) {
Stephen Hines87f34652014-02-14 18:00:16 -0800131 ListDigraph graph;
132
133 ListDigraph::Node* u1 = graph.addNode();
134 ListDigraph::Node* u2 = graph.addNode();
135 ListDigraph::Node* u3 = graph.addNode();
136
137 ASSERT_TRUE(NULL == u1->first_in);
138 ASSERT_TRUE(NULL == u1->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800139 ASSERT_TRUE(u2 == u1->prev);
Stephen Hines87f34652014-02-14 18:00:16 -0800140 ASSERT_TRUE(NULL == u1->next);
141
142 ASSERT_TRUE(NULL == u2->first_in);
143 ASSERT_TRUE(NULL == u2->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800144 ASSERT_TRUE(u3 == u2->prev);
145 ASSERT_TRUE(u1 == u2->next);
Stephen Hines87f34652014-02-14 18:00:16 -0800146
147 ASSERT_TRUE(NULL == u3->first_in);
148 ASSERT_TRUE(NULL == u3->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800149 ASSERT_TRUE(u2 == u3->next);
Stephen Hines87f34652014-02-14 18:00:16 -0800150 ASSERT_TRUE(NULL == u3->prev);
151
152 ListDigraph::Node* head = NULL;
153 graph.getHead(head);
154 ASSERT_TRUE(head == u3);
155
156 graph.erase(*u3);
157
158 ASSERT_TRUE(NULL == u3->first_in);
159 ASSERT_TRUE(NULL == u3->first_out);
160 ASSERT_TRUE(NULL == u3->prev);
161 ASSERT_TRUE(NULL == u3->next);
162
163 ASSERT_TRUE(NULL == u1->first_in);
164 ASSERT_TRUE(NULL == u1->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800165 ASSERT_TRUE(u2 == u1->prev);
Stephen Hines87f34652014-02-14 18:00:16 -0800166 ASSERT_TRUE(NULL == u1->next);
167
168 ASSERT_TRUE(NULL == u2->first_in);
169 ASSERT_TRUE(NULL == u2->first_out);
Stephen Hines37b74a32014-11-26 18:48:20 -0800170 ASSERT_TRUE(u1 == u2->next);
Stephen Hines87f34652014-02-14 18:00:16 -0800171 ASSERT_TRUE(NULL == u2->prev);
172
173 graph.getHead(head);
174 ASSERT_TRUE(head == u2);
Stephen Hines87f34652014-02-14 18:00:16 -0800175}
176
Stephen Hines37b74a32014-11-26 18:48:20 -0800177TEST_F(GraphTest, list_digraph_add_arcs_1) {
Stephen Hines87f34652014-02-14 18:00:16 -0800178 ListDigraph graph;
179
180 ListDigraph::Node* u1 = graph.addNode();
181 ListDigraph::Node* u2 = graph.addNode();
182 ListDigraph::Node* u3 = graph.addNode();
183
184 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
185 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
186 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
187
188 ASSERT_TRUE(u1 == a1->source && u2 == a1->target);
189 ASSERT_TRUE(u2 == a2->source && u3 == a2->target);
190 ASSERT_TRUE(u3 == a3->source && u1 == a3->target);
191
192 ASSERT_TRUE(u1->first_in == a3 && u1->first_out == a1);
193 ASSERT_TRUE(u2->first_in == a1 && u2->first_out == a2);
194 ASSERT_TRUE(u3->first_in == a2 && u3->first_out == a3);
195}
196
Stephen Hines37b74a32014-11-26 18:48:20 -0800197TEST_F(GraphTest, list_digraph_add_arcs_2) {
Stephen Hines87f34652014-02-14 18:00:16 -0800198 ListDigraph graph;
199
200 ListDigraph::Node* u1 = graph.addNode();
201 ListDigraph::Node* u2 = graph.addNode();
202 ListDigraph::Node* u3 = graph.addNode();
203
204 ListDigraph::Arc* a1 = graph.addArc(*u1, *u1);
205 ListDigraph::Arc* a2 = graph.addArc(*u1, *u2);
206 ListDigraph::Arc* a3 = graph.addArc(*u1, *u3);
207
208 ASSERT_TRUE(u1 == a1->source && u1 == a1->target);
209 ASSERT_TRUE(u1 == a2->source && u2 == a2->target);
210 ASSERT_TRUE(u1 == a3->source && u3 == a3->target);
211
212 ASSERT_TRUE(u1->first_in == a1 && u1->first_out == a3);
213 ASSERT_TRUE(u2->first_in == a2 && u2->first_out == NULL);
214 ASSERT_TRUE(u3->first_in == a3 && u3->first_out == NULL);
215}
216
Stephen Hines37b74a32014-11-26 18:48:20 -0800217TEST_F(GraphTest, list_digraph_add_n_erase_arcs_1) {
Stephen Hines87f34652014-02-14 18:00:16 -0800218 ListDigraph graph;
219
220 ListDigraph::Node* u1 = graph.addNode();
221 ListDigraph::Node* u2 = graph.addNode();
222 ListDigraph::Node* u3 = graph.addNode();
223
224 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
225 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
226 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
227
228 graph.erase(*a2);
Stephen Hines551ae4e2014-04-24 14:41:24 -0700229
Stephen Hines87f34652014-02-14 18:00:16 -0800230 ASSERT_TRUE(u1 == a1->source && u2 == a1->target);
231 ASSERT_TRUE(u3 == a3->source && u1 == a3->target);
232
233 // remove from the fan-out list
234 ASSERT_TRUE(u2->first_in == a1 && u2->first_out == NULL);
235
236 // remove from the fan-in list
237 ASSERT_TRUE(u3->first_in == NULL && u3->first_out == a3);
238
239 // put into free list
240 ASSERT_TRUE(NULL == a2->next_in);
241}
242
Stephen Hines37b74a32014-11-26 18:48:20 -0800243TEST_F(GraphTest, list_digraph_add_n_erase_arcs_2) {
Stephen Hines87f34652014-02-14 18:00:16 -0800244 ListDigraph graph;
245
246 ListDigraph::Node* u1 = graph.addNode();
247 ListDigraph::Node* u2 = graph.addNode();
248 ListDigraph::Node* u3 = graph.addNode();
249
250 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
251 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
252 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
253
254 graph.erase(*a1);
Stephen Hines551ae4e2014-04-24 14:41:24 -0700255
Stephen Hines87f34652014-02-14 18:00:16 -0800256 ASSERT_TRUE(u2 == a2->source && u3 == a2->target);
257 ASSERT_TRUE(u3 == a3->source && u1 == a3->target);
258
259 // remove from the fan-out list
260 ASSERT_TRUE(u1->first_in == a3 && u1->first_out == NULL);
261
262 // remove from the fan-in list
263 ASSERT_TRUE(u2->first_in == NULL && u2->first_out == a2);
264
265 // put into free list
266 ASSERT_TRUE(NULL == a1->next_in);
267}
268
Stephen Hines37b74a32014-11-26 18:48:20 -0800269TEST_F(GraphTest, list_digraph_add_n_erase_arcs_3) {
Stephen Hines87f34652014-02-14 18:00:16 -0800270 ListDigraph graph;
271
272 ListDigraph::Node* u1 = graph.addNode();
273 ListDigraph::Node* u2 = graph.addNode();
274 ListDigraph::Node* u3 = graph.addNode();
275
276 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2);
277 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3);
278 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1);
279
280 graph.erase(*a3);
Stephen Hines551ae4e2014-04-24 14:41:24 -0700281
Stephen Hines87f34652014-02-14 18:00:16 -0800282 ASSERT_TRUE(u1 == a1->source && u2 == a1->target);
283 ASSERT_TRUE(u2 == a2->source && u3 == a2->target);
284
285 // remove from the fan-out list
286 ASSERT_TRUE(u1->first_in == NULL && u1->first_out == a1);
287
288 // remove from the fan-in list
289 ASSERT_TRUE(u3->first_in == a2 && u3->first_out == NULL);
290
291 // put into free list
292 ASSERT_TRUE(NULL == a3->next_in);
293}
294
Stephen Hines37b74a32014-11-26 18:48:20 -0800295TEST_F(GraphTest, list_digraph_add_n_erase_arcs_4) {
Stephen Hines87f34652014-02-14 18:00:16 -0800296 ListDigraph graph;
297
298 ListDigraph::Node* u1 = graph.addNode();
299 ListDigraph::Node* u2 = graph.addNode();
300 ListDigraph::Node* u3 = graph.addNode();
301
302 ListDigraph::Arc* a1 = graph.addArc(*u1, *u1);
303 graph.addArc(*u1, *u2);
304 graph.addArc(*u1, *u3);
305
306 graph.erase(*u1);
307
308 ASSERT_TRUE(u2->first_in == NULL);
309 ASSERT_TRUE(u3->first_in == NULL);
310 ASSERT_TRUE(a1->next_in == NULL);
Stephen Hines87f34652014-02-14 18:00:16 -0800311}
312
Stephen Hines37b74a32014-11-26 18:48:20 -0800313TEST_F(GraphTest, api_test) {
Stephen Hines87f34652014-02-14 18:00:16 -0800314 Digraph graph;
315
316 Digraph::Node node = graph.addNode();
317 graph.addNode();
318 graph.addNode();
319 graph.addNode();
320
321 ASSERT_EQ(4, graph.numOfNodes());
322 ASSERT_EQ(0, graph.numOfArcs());
323}