//===- 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());
}