| //===- GraphTest.cpp ------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "GraphTest.h" |
| #include "mcld/ADT/GraphLite/Digraph.h" |
| #include "mcld/ADT/GraphLite/ListDigraph.h" |
| |
| using namespace mcld; |
| using namespace mcld::test; |
| using namespace mcld::graph; |
| |
| // Constructor can do set-up work for all test here. |
| GraphTest::GraphTest() { |
| } |
| |
| // Destructor can do clean-up work that doesn't throw exceptions here. |
| GraphTest::~GraphTest() { |
| } |
| |
| // SetUp() will be called immediately before each test. |
| void GraphTest::SetUp() { |
| } |
| |
| // TearDown() will be called immediately after each test. |
| void GraphTest::TearDown() { |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // Testcases |
| //===----------------------------------------------------------------------===// |
| TEST_F(GraphTest, list_digraph_add_n_erase_nodes_1) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ASSERT_TRUE(NULL == u1->first_in); |
| ASSERT_TRUE(NULL == u1->first_out); |
| ASSERT_TRUE(u2 == u1->prev); |
| ASSERT_TRUE(NULL == u1->next); |
| |
| ASSERT_TRUE(NULL == u2->first_in); |
| ASSERT_TRUE(NULL == u2->first_out); |
| ASSERT_TRUE(u3 == u2->prev); |
| ASSERT_TRUE(u1 == u2->next); |
| |
| ASSERT_TRUE(NULL == u3->first_in); |
| ASSERT_TRUE(NULL == u3->first_out); |
| ASSERT_TRUE(u2 == u3->next); |
| ASSERT_TRUE(NULL == u3->prev); |
| |
| ListDigraph::Node* head = NULL; |
| graph.getHead(head); |
| ASSERT_TRUE(head == u3); |
| |
| graph.erase(*u2); |
| |
| ASSERT_TRUE(NULL == u1->first_in); |
| ASSERT_TRUE(NULL == u1->first_out); |
| ASSERT_TRUE(u3 == u1->prev); |
| ASSERT_TRUE(NULL == u1->next); |
| |
| ASSERT_TRUE(NULL == u3->first_in); |
| ASSERT_TRUE(NULL == u3->first_out); |
| ASSERT_TRUE(u1 == u3->next); |
| ASSERT_TRUE(NULL == u3->prev); |
| |
| ASSERT_TRUE(NULL == u2->first_in); |
| ASSERT_TRUE(NULL == u2->first_out); |
| ASSERT_TRUE(NULL == u2->prev); |
| ASSERT_TRUE(NULL == u2->next); |
| |
| graph.getHead(head); |
| ASSERT_TRUE(head == u3); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_n_erase_nodes_2) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ASSERT_TRUE(NULL == u1->first_in); |
| ASSERT_TRUE(NULL == u1->first_out); |
| ASSERT_TRUE(u2 == u1->prev); |
| ASSERT_TRUE(NULL == u1->next); |
| |
| ASSERT_TRUE(NULL == u2->first_in); |
| ASSERT_TRUE(NULL == u2->first_out); |
| ASSERT_TRUE(u3 == u2->prev); |
| ASSERT_TRUE(u1 == u2->next); |
| |
| ASSERT_TRUE(NULL == u3->first_in); |
| ASSERT_TRUE(NULL == u3->first_out); |
| ASSERT_TRUE(u2 == u3->next); |
| ASSERT_TRUE(NULL == u3->prev); |
| |
| ListDigraph::Node* head = NULL; |
| graph.getHead(head); |
| ASSERT_TRUE(head == u3); |
| |
| graph.erase(*u1); |
| |
| ASSERT_TRUE(NULL == u1->first_in); |
| ASSERT_TRUE(NULL == u1->first_out); |
| ASSERT_TRUE(NULL == u1->prev); |
| ASSERT_TRUE(NULL == u1->next); |
| |
| ASSERT_TRUE(NULL == u2->first_in); |
| ASSERT_TRUE(NULL == u2->first_out); |
| ASSERT_TRUE(u3 == u2->prev); |
| ASSERT_TRUE(NULL == u2->next); |
| |
| ASSERT_TRUE(NULL == u3->first_in); |
| ASSERT_TRUE(NULL == u3->first_out); |
| ASSERT_TRUE(u2 == u3->next); |
| ASSERT_TRUE(NULL == u3->prev); |
| |
| graph.getHead(head); |
| ASSERT_TRUE(head == u3); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_n_erase_nodes_3) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ASSERT_TRUE(NULL == u1->first_in); |
| ASSERT_TRUE(NULL == u1->first_out); |
| ASSERT_TRUE(u2 == u1->prev); |
| ASSERT_TRUE(NULL == u1->next); |
| |
| ASSERT_TRUE(NULL == u2->first_in); |
| ASSERT_TRUE(NULL == u2->first_out); |
| ASSERT_TRUE(u3 == u2->prev); |
| ASSERT_TRUE(u1 == u2->next); |
| |
| ASSERT_TRUE(NULL == u3->first_in); |
| ASSERT_TRUE(NULL == u3->first_out); |
| ASSERT_TRUE(u2 == u3->next); |
| ASSERT_TRUE(NULL == u3->prev); |
| |
| ListDigraph::Node* head = NULL; |
| graph.getHead(head); |
| ASSERT_TRUE(head == u3); |
| |
| graph.erase(*u3); |
| |
| ASSERT_TRUE(NULL == u3->first_in); |
| ASSERT_TRUE(NULL == u3->first_out); |
| ASSERT_TRUE(NULL == u3->prev); |
| ASSERT_TRUE(NULL == u3->next); |
| |
| ASSERT_TRUE(NULL == u1->first_in); |
| ASSERT_TRUE(NULL == u1->first_out); |
| ASSERT_TRUE(u2 == u1->prev); |
| ASSERT_TRUE(NULL == u1->next); |
| |
| ASSERT_TRUE(NULL == u2->first_in); |
| ASSERT_TRUE(NULL == u2->first_out); |
| ASSERT_TRUE(u1 == u2->next); |
| ASSERT_TRUE(NULL == u2->prev); |
| |
| graph.getHead(head); |
| ASSERT_TRUE(head == u2); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_arcs_1) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); |
| ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); |
| ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); |
| |
| ASSERT_TRUE(u1 == a1->source && u2 == a1->target); |
| ASSERT_TRUE(u2 == a2->source && u3 == a2->target); |
| ASSERT_TRUE(u3 == a3->source && u1 == a3->target); |
| |
| ASSERT_TRUE(u1->first_in == a3 && u1->first_out == a1); |
| ASSERT_TRUE(u2->first_in == a1 && u2->first_out == a2); |
| ASSERT_TRUE(u3->first_in == a2 && u3->first_out == a3); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_arcs_2) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ListDigraph::Arc* a1 = graph.addArc(*u1, *u1); |
| ListDigraph::Arc* a2 = graph.addArc(*u1, *u2); |
| ListDigraph::Arc* a3 = graph.addArc(*u1, *u3); |
| |
| ASSERT_TRUE(u1 == a1->source && u1 == a1->target); |
| ASSERT_TRUE(u1 == a2->source && u2 == a2->target); |
| ASSERT_TRUE(u1 == a3->source && u3 == a3->target); |
| |
| ASSERT_TRUE(u1->first_in == a1 && u1->first_out == a3); |
| ASSERT_TRUE(u2->first_in == a2 && u2->first_out == NULL); |
| ASSERT_TRUE(u3->first_in == a3 && u3->first_out == NULL); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_n_erase_arcs_1) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); |
| ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); |
| ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); |
| |
| graph.erase(*a2); |
| |
| ASSERT_TRUE(u1 == a1->source && u2 == a1->target); |
| ASSERT_TRUE(u3 == a3->source && u1 == a3->target); |
| |
| // remove from the fan-out list |
| ASSERT_TRUE(u2->first_in == a1 && u2->first_out == NULL); |
| |
| // remove from the fan-in list |
| ASSERT_TRUE(u3->first_in == NULL && u3->first_out == a3); |
| |
| // put into free list |
| ASSERT_TRUE(NULL == a2->next_in); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_n_erase_arcs_2) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); |
| ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); |
| ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); |
| |
| graph.erase(*a1); |
| |
| ASSERT_TRUE(u2 == a2->source && u3 == a2->target); |
| ASSERT_TRUE(u3 == a3->source && u1 == a3->target); |
| |
| // remove from the fan-out list |
| ASSERT_TRUE(u1->first_in == a3 && u1->first_out == NULL); |
| |
| // remove from the fan-in list |
| ASSERT_TRUE(u2->first_in == NULL && u2->first_out == a2); |
| |
| // put into free list |
| ASSERT_TRUE(NULL == a1->next_in); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_n_erase_arcs_3) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ListDigraph::Arc* a1 = graph.addArc(*u1, *u2); |
| ListDigraph::Arc* a2 = graph.addArc(*u2, *u3); |
| ListDigraph::Arc* a3 = graph.addArc(*u3, *u1); |
| |
| graph.erase(*a3); |
| |
| ASSERT_TRUE(u1 == a1->source && u2 == a1->target); |
| ASSERT_TRUE(u2 == a2->source && u3 == a2->target); |
| |
| // remove from the fan-out list |
| ASSERT_TRUE(u1->first_in == NULL && u1->first_out == a1); |
| |
| // remove from the fan-in list |
| ASSERT_TRUE(u3->first_in == a2 && u3->first_out == NULL); |
| |
| // put into free list |
| ASSERT_TRUE(NULL == a3->next_in); |
| } |
| |
| TEST_F(GraphTest, list_digraph_add_n_erase_arcs_4) { |
| ListDigraph graph; |
| |
| ListDigraph::Node* u1 = graph.addNode(); |
| ListDigraph::Node* u2 = graph.addNode(); |
| ListDigraph::Node* u3 = graph.addNode(); |
| |
| ListDigraph::Arc* a1 = graph.addArc(*u1, *u1); |
| graph.addArc(*u1, *u2); |
| graph.addArc(*u1, *u3); |
| |
| graph.erase(*u1); |
| |
| ASSERT_TRUE(u2->first_in == NULL); |
| ASSERT_TRUE(u3->first_in == NULL); |
| ASSERT_TRUE(a1->next_in == NULL); |
| } |
| |
| TEST_F(GraphTest, api_test) { |
| Digraph graph; |
| |
| Digraph::Node node = graph.addNode(); |
| graph.addNode(); |
| graph.addNode(); |
| graph.addNode(); |
| |
| ASSERT_EQ(4, graph.numOfNodes()); |
| ASSERT_EQ(0, graph.numOfArcs()); |
| } |