GraphTest.cpp revision 87f34658dec9097d987d254a990ea7f311bfc95f
1//===- 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" 10#include <mcld/ADT/GraphLite/Digraph.h> 11#include <mcld/ADT/GraphLite/ListDigraph.h> 12 13using namespace mcld; 14using namespace mcld::test; 15using namespace mcld::graph; 16 17// Constructor can do set-up work for all test here. 18GraphTest::GraphTest() 19{ 20} 21 22// Destructor can do clean-up work that doesn't throw exceptions here. 23GraphTest::~GraphTest() 24{ 25} 26 27// SetUp() will be called immediately before each test. 28void GraphTest::SetUp() 29{ 30} 31 32// TearDown() will be called immediately after each test. 33void GraphTest::TearDown() 34{ 35} 36 37//===----------------------------------------------------------------------===// 38// Testcases 39//===----------------------------------------------------------------------===// 40TEST_F(GraphTest, list_digraph_add_n_erase_nodes_1) 41{ 42 ListDigraph graph; 43 44 ListDigraph::Node* u1 = graph.addNode(); 45 ListDigraph::Node* u2 = graph.addNode(); 46 ListDigraph::Node* u3 = graph.addNode(); 47 48 ASSERT_TRUE(NULL == u1->first_in); 49 ASSERT_TRUE(NULL == u1->first_out); 50 ASSERT_TRUE(u2 == u1->prev); 51 ASSERT_TRUE(NULL == u1->next); 52 53 ASSERT_TRUE(NULL == u2->first_in); 54 ASSERT_TRUE(NULL == u2->first_out); 55 ASSERT_TRUE(u3 == u2->prev); 56 ASSERT_TRUE(u1 == u2->next); 57 58 ASSERT_TRUE(NULL == u3->first_in); 59 ASSERT_TRUE(NULL == u3->first_out); 60 ASSERT_TRUE(u2 == u3->next); 61 ASSERT_TRUE(NULL == u3->prev); 62 63 ListDigraph::Node* head = NULL; 64 graph.getHead(head); 65 ASSERT_TRUE(head == u3); 66 67 graph.erase(*u2); 68 69 ASSERT_TRUE(NULL == u1->first_in); 70 ASSERT_TRUE(NULL == u1->first_out); 71 ASSERT_TRUE(u3 == u1->prev); 72 ASSERT_TRUE(NULL == u1->next); 73 74 ASSERT_TRUE(NULL == u3->first_in); 75 ASSERT_TRUE(NULL == u3->first_out); 76 ASSERT_TRUE(u1 == u3->next); 77 ASSERT_TRUE(NULL == u3->prev); 78 79 ASSERT_TRUE(NULL == u2->first_in); 80 ASSERT_TRUE(NULL == u2->first_out); 81 ASSERT_TRUE(NULL == u2->prev); 82 ASSERT_TRUE(NULL == u2->next); 83 84 graph.getHead(head); 85 ASSERT_TRUE(head == u3); 86} 87 88TEST_F(GraphTest, list_digraph_add_n_erase_nodes_2) 89{ 90 ListDigraph graph; 91 92 ListDigraph::Node* u1 = graph.addNode(); 93 ListDigraph::Node* u2 = graph.addNode(); 94 ListDigraph::Node* u3 = graph.addNode(); 95 96 ASSERT_TRUE(NULL == u1->first_in); 97 ASSERT_TRUE(NULL == u1->first_out); 98 ASSERT_TRUE(u2 == u1->prev); 99 ASSERT_TRUE(NULL == u1->next); 100 101 ASSERT_TRUE(NULL == u2->first_in); 102 ASSERT_TRUE(NULL == u2->first_out); 103 ASSERT_TRUE(u3 == u2->prev); 104 ASSERT_TRUE(u1 == u2->next); 105 106 ASSERT_TRUE(NULL == u3->first_in); 107 ASSERT_TRUE(NULL == u3->first_out); 108 ASSERT_TRUE(u2 == u3->next); 109 ASSERT_TRUE(NULL == u3->prev); 110 111 ListDigraph::Node* head = NULL; 112 graph.getHead(head); 113 ASSERT_TRUE(head == u3); 114 115 graph.erase(*u1); 116 117 ASSERT_TRUE(NULL == u1->first_in); 118 ASSERT_TRUE(NULL == u1->first_out); 119 ASSERT_TRUE(NULL == u1->prev); 120 ASSERT_TRUE(NULL == u1->next); 121 122 ASSERT_TRUE(NULL == u2->first_in); 123 ASSERT_TRUE(NULL == u2->first_out); 124 ASSERT_TRUE(u3 == u2->prev); 125 ASSERT_TRUE(NULL == u2->next); 126 127 ASSERT_TRUE(NULL == u3->first_in); 128 ASSERT_TRUE(NULL == u3->first_out); 129 ASSERT_TRUE(u2 == u3->next); 130 ASSERT_TRUE(NULL == u3->prev); 131 132 graph.getHead(head); 133 ASSERT_TRUE(head == u3); 134} 135 136TEST_F(GraphTest, list_digraph_add_n_erase_nodes_3) 137{ 138 ListDigraph graph; 139 140 ListDigraph::Node* u1 = graph.addNode(); 141 ListDigraph::Node* u2 = graph.addNode(); 142 ListDigraph::Node* u3 = graph.addNode(); 143 144 ASSERT_TRUE(NULL == u1->first_in); 145 ASSERT_TRUE(NULL == u1->first_out); 146 ASSERT_TRUE(u2 == u1->prev); 147 ASSERT_TRUE(NULL == u1->next); 148 149 ASSERT_TRUE(NULL == u2->first_in); 150 ASSERT_TRUE(NULL == u2->first_out); 151 ASSERT_TRUE(u3 == u2->prev); 152 ASSERT_TRUE(u1 == u2->next); 153 154 ASSERT_TRUE(NULL == u3->first_in); 155 ASSERT_TRUE(NULL == u3->first_out); 156 ASSERT_TRUE(u2 == u3->next); 157 ASSERT_TRUE(NULL == u3->prev); 158 159 ListDigraph::Node* head = NULL; 160 graph.getHead(head); 161 ASSERT_TRUE(head == u3); 162 163 graph.erase(*u3); 164 165 ASSERT_TRUE(NULL == u3->first_in); 166 ASSERT_TRUE(NULL == u3->first_out); 167 ASSERT_TRUE(NULL == u3->prev); 168 ASSERT_TRUE(NULL == u3->next); 169 170 ASSERT_TRUE(NULL == u1->first_in); 171 ASSERT_TRUE(NULL == u1->first_out); 172 ASSERT_TRUE(u2 == u1->prev); 173 ASSERT_TRUE(NULL == u1->next); 174 175 ASSERT_TRUE(NULL == u2->first_in); 176 ASSERT_TRUE(NULL == u2->first_out); 177 ASSERT_TRUE(u1 == u2->next); 178 ASSERT_TRUE(NULL == u2->prev); 179 180 graph.getHead(head); 181 ASSERT_TRUE(head == u2); 182 183} 184 185TEST_F(GraphTest, list_digraph_add_arcs_1) 186{ 187 ListDigraph graph; 188 189 ListDigraph::Node* u1 = graph.addNode(); 190 ListDigraph::Node* u2 = graph.addNode(); 191 ListDigraph::Node* u3 = graph.addNode(); 192 193 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); 194 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); 195 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); 196 197 ASSERT_TRUE(u1 == a1->source && u2 == a1->target); 198 ASSERT_TRUE(u2 == a2->source && u3 == a2->target); 199 ASSERT_TRUE(u3 == a3->source && u1 == a3->target); 200 201 ASSERT_TRUE(u1->first_in == a3 && u1->first_out == a1); 202 ASSERT_TRUE(u2->first_in == a1 && u2->first_out == a2); 203 ASSERT_TRUE(u3->first_in == a2 && u3->first_out == a3); 204} 205 206TEST_F(GraphTest, list_digraph_add_arcs_2) 207{ 208 ListDigraph graph; 209 210 ListDigraph::Node* u1 = graph.addNode(); 211 ListDigraph::Node* u2 = graph.addNode(); 212 ListDigraph::Node* u3 = graph.addNode(); 213 214 ListDigraph::Arc* a1 = graph.addArc(*u1, *u1); 215 ListDigraph::Arc* a2 = graph.addArc(*u1, *u2); 216 ListDigraph::Arc* a3 = graph.addArc(*u1, *u3); 217 218 ASSERT_TRUE(u1 == a1->source && u1 == a1->target); 219 ASSERT_TRUE(u1 == a2->source && u2 == a2->target); 220 ASSERT_TRUE(u1 == a3->source && u3 == a3->target); 221 222 ASSERT_TRUE(u1->first_in == a1 && u1->first_out == a3); 223 ASSERT_TRUE(u2->first_in == a2 && u2->first_out == NULL); 224 ASSERT_TRUE(u3->first_in == a3 && u3->first_out == NULL); 225} 226 227TEST_F(GraphTest, list_digraph_add_n_erase_arcs_1) 228{ 229 ListDigraph graph; 230 231 ListDigraph::Node* u1 = graph.addNode(); 232 ListDigraph::Node* u2 = graph.addNode(); 233 ListDigraph::Node* u3 = graph.addNode(); 234 235 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); 236 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); 237 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); 238 239 graph.erase(*a2); 240 241 ASSERT_TRUE(u1 == a1->source && u2 == a1->target); 242 ASSERT_TRUE(u3 == a3->source && u1 == a3->target); 243 244 // remove from the fan-out list 245 ASSERT_TRUE(u2->first_in == a1 && u2->first_out == NULL); 246 247 // remove from the fan-in list 248 ASSERT_TRUE(u3->first_in == NULL && u3->first_out == a3); 249 250 // put into free list 251 ASSERT_TRUE(NULL == a2->next_in); 252} 253 254 255TEST_F(GraphTest, list_digraph_add_n_erase_arcs_2) 256{ 257 ListDigraph graph; 258 259 ListDigraph::Node* u1 = graph.addNode(); 260 ListDigraph::Node* u2 = graph.addNode(); 261 ListDigraph::Node* u3 = graph.addNode(); 262 263 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); 264 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); 265 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); 266 267 graph.erase(*a1); 268 269 ASSERT_TRUE(u2 == a2->source && u3 == a2->target); 270 ASSERT_TRUE(u3 == a3->source && u1 == a3->target); 271 272 // remove from the fan-out list 273 ASSERT_TRUE(u1->first_in == a3 && u1->first_out == NULL); 274 275 // remove from the fan-in list 276 ASSERT_TRUE(u2->first_in == NULL && u2->first_out == a2); 277 278 // put into free list 279 ASSERT_TRUE(NULL == a1->next_in); 280} 281 282TEST_F(GraphTest, list_digraph_add_n_erase_arcs_3) 283{ 284 ListDigraph graph; 285 286 ListDigraph::Node* u1 = graph.addNode(); 287 ListDigraph::Node* u2 = graph.addNode(); 288 ListDigraph::Node* u3 = graph.addNode(); 289 290 ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); 291 ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); 292 ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); 293 294 graph.erase(*a3); 295 296 ASSERT_TRUE(u1 == a1->source && u2 == a1->target); 297 ASSERT_TRUE(u2 == a2->source && u3 == a2->target); 298 299 // remove from the fan-out list 300 ASSERT_TRUE(u1->first_in == NULL && u1->first_out == a1); 301 302 // remove from the fan-in list 303 ASSERT_TRUE(u3->first_in == a2 && u3->first_out == NULL); 304 305 // put into free list 306 ASSERT_TRUE(NULL == a3->next_in); 307} 308 309TEST_F(GraphTest, list_digraph_add_n_erase_arcs_4) 310{ 311 ListDigraph graph; 312 313 ListDigraph::Node* u1 = graph.addNode(); 314 ListDigraph::Node* u2 = graph.addNode(); 315 ListDigraph::Node* u3 = graph.addNode(); 316 317 ListDigraph::Arc* a1 = graph.addArc(*u1, *u1); 318 graph.addArc(*u1, *u2); 319 graph.addArc(*u1, *u3); 320 321 graph.erase(*u1); 322 323 ASSERT_TRUE(u2->first_in == NULL); 324 ASSERT_TRUE(u3->first_in == NULL); 325 ASSERT_TRUE(a1->next_in == NULL); 326 327} 328 329TEST_F(GraphTest, api_test) 330{ 331 Digraph graph; 332 333 Digraph::Node node = graph.addNode(); 334 graph.addNode(); 335 graph.addNode(); 336 graph.addNode(); 337 338 ASSERT_EQ(4, graph.numOfNodes()); 339 ASSERT_EQ(0, graph.numOfArcs()); 340} 341