package test.prefuse.data;
import java.util.Iterator;
import junit.framework.TestCase;
import prefuse.data.Edge;
import prefuse.data.Graph;
import prefuse.data.Node;
import prefuse.data.Table;
import prefuse.util.GraphLib;
import test.prefuse.TestConfig;
public class GraphTest extends TestCase implements GraphTestData {
public static Graph getTestCaseGraph() {
Table nodes = new Table(NNODES, NNODECOLS);
for ( int c=0; c<NNODECOLS; ++c ) {
nodes.addColumn(NHEADERS[c], NTYPES[c]);
for ( int r=0; r<NNODES; ++r ) {
nodes.set(r, NHEADERS[c], NODES[c][r]);
}
}
Table edges = new Table(NEDGES, NEDGECOLS);
for ( int c=0; c<NEDGECOLS; ++c ) {
edges.addColumn(EHEADERS[c], ETYPES[c]);
for ( int r=0; r<NEDGES; ++r ) {
edges.set(r, EHEADERS[c], EDGES[c][r]);
}
}
return new Graph(nodes, edges, false,
NHEADERS[0], EHEADERS[0], EHEADERS[1]);
}
private Graph graph;
protected void setUp() throws Exception {
super.setUp();
graph = getTestCaseGraph();
}
/**
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
graph = null;
}
public void testGraph() {
boolean verbose = TestConfig.verbose();
Table nodes = graph.getNodeTable();
Table edges = graph.getEdgeTable();
// check the basics
assertEquals(NNODES, graph.getNodeCount());
assertEquals(NEDGES, graph.getEdgeCount());
assertEquals(NHEADERS[0], graph.getNodeKeyField());
assertEquals(EHEADERS[0], graph.getEdgeSourceField());
assertEquals(EHEADERS[1], graph.getEdgeTargetField());
// check all nodes, basic data
Iterator niter = graph.nodes();
while ( niter.hasNext() ) {
Node node = (Node)niter.next();
int nrow = node.getRow();
if ( verbose ) System.out.print(nrow+"\t");
// check data members
for ( int i=0; i<NNODECOLS; ++i ) {
assertEquals(NODES[i][nrow], node.get(NHEADERS[i]));
assertEquals(NODES[i][nrow], nodes.get(nrow, NHEADERS[i]));
if ( verbose ) System.out.print(NHEADERS[i]+":"+NODES[i][nrow]+"\t");
}
if ( verbose ) {
System.out.print("in:"+node.getInDegree());
System.out.print("\t");
System.out.print("out:"+node.getOutDegree());
System.out.println();
}
// check degrees
assertEquals(node.getInDegree(), INDEGREE[nrow]);
assertEquals(graph.getInDegree(nrow), INDEGREE[nrow]);
assertEquals(node.getOutDegree(), OUTDEGREE[nrow]);
assertEquals(graph.getOutDegree(nrow), OUTDEGREE[nrow]);
// check edges
Iterator eiter = node.inEdges();
while ( eiter.hasNext() ) {
Edge edge = (Edge)eiter.next();
int erow = edge.getRow();
assertEquals(nrow, edge.getTargetNode().getRow());
assertEquals(nrow, graph.getTargetNode(erow));
}
eiter = node.outEdges();
while ( eiter.hasNext() ) {
Edge edge = (Edge)eiter.next();
int erow = edge.getRow();
assertEquals(nrow, edge.getSourceNode().getRow());
assertEquals(nrow, graph.getSourceNode(erow));
}
}
// check all edges, basic data
Iterator eiter = graph.edges();
while ( eiter.hasNext() ) {
Edge edge = (Edge)eiter.next();
int erow = edge.getRow();
// check data members
for ( int i=0; i<NEDGECOLS; ++i ) {
assertEquals(EDGES[i][erow], edge.get(EHEADERS[i]));
assertEquals(EDGES[i][erow], edges.get(erow, EHEADERS[i]));
}
// check nodes
Node s = edge.getSourceNode();
int srow = s.getRow();
assertEquals(srow, graph.getSourceNode(erow));
int sk = nodes.getInt(srow, NHEADERS[0]);
assertEquals(sk, edges.getInt(erow, EHEADERS[0]));
Node t = edge.getTargetNode();
int trow = t.getRow();
assertEquals(trow, graph.getTargetNode(erow));
int tk = nodes.getInt(trow, NHEADERS[0]);
assertEquals(tk, edges.getInt(erow, EHEADERS[1]));
assertEquals(srow, edge.getAdjacentNode(t).getRow());
assertEquals(trow, edge.getAdjacentNode(s).getRow());
assertEquals(srow, graph.getAdjacentNode(erow, trow));
assertEquals(trow, graph.getAdjacentNode(erow, srow));
}
}
public void testRemoveNode() {
int cliqueSize = 5;
Graph g = GraphLib.getClique(cliqueSize);
Edge[] edges = new Edge[4];
Node rem = (Node)g.nodes().next();
Iterator it = rem.edges();
for ( int i=0; it.hasNext(); ++i ) {
edges[i] = (Edge)it.next();
}
assertEquals(true, g.removeNode(rem));
assertEquals(false, rem.isValid());
Iterator nodes = g.nodes();
while ( nodes.hasNext() ) {
assertEquals(cliqueSize-2, ((Node)nodes.next()).getDegree());
}
for ( int i=0; i<edges.length; ++i ) {
assertEquals(false, edges[i].isValid());
}
}
}