/* ==========================================
* JGraphT : a free Java graph-theory library
* ==========================================
*
* Project Info: http://jgrapht.sourceforge.net/
* Project Creator: Barak Naveh (http://sourceforge.net/users/barak_naveh)
*
* (C) Copyright 2003-2008, by Barak Naveh and Contributors.
*
* This program and the accompanying materials are dual-licensed under
* either
*
* (a) the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation, or (at your option) any
* later version.
*
* or (per the licensee's choosing)
*
* (b) the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation.
*/
/* ----------------------------
* SimpleDirectedGraphTest.java
* ----------------------------
* (C) Copyright 2003-2008, by Barak Naveh and Contributors.
*
* Original Author: Barak Naveh
* Contributor(s): -
*
* $Id$
*
* Changes
* -------
* 25-Jul-2003 : Initial revision (BN);
*
*/
package org.jgrapht.graph;
import java.util.*;
import org.jgrapht.*;
/**
* A unit test for simple directed graph.
*
* @author Barak Naveh
* @since Jul 25, 2003
*/
public class SimpleDirectedGraphTest
extends EnhancedTestCase
{
//~ Instance fields --------------------------------------------------------
DirectedGraph<String, DefaultEdge> gEmpty;
private DirectedGraph<String, DefaultEdge> g1;
private DirectedGraph<String, DefaultEdge> g2;
private DirectedGraph<String, DefaultEdge> g3;
private DirectedGraph<String, DefaultEdge> g4;
private DefaultEdge eLoop;
private EdgeFactory<String, DefaultEdge> eFactory;
private String v1 = "v1";
private String v2 = "v2";
private String v3 = "v3";
private String v4 = "v4";
//~ Constructors -----------------------------------------------------------
/**
* @see junit.framework.TestCase#TestCase(java.lang.String)
*/
public SimpleDirectedGraphTest(String name)
{
super(name);
}
//~ Methods ----------------------------------------------------------------
/**
* Class to test for boolean addEdge(V, V, E)
*/
public void testAddEdgeEdge()
{
init();
try {
g1.addEdge(v1, v1, eLoop); // loops not allowed
assertFalse();
} catch (IllegalArgumentException e) {
assertTrue();
}
try {
g3.addEdge(v1, v1, null);
assertFalse(); // NPE
} catch (NullPointerException e) {
assertTrue();
}
DefaultEdge e = eFactory.createEdge(v2, v1);
try {
g1.addEdge("ya", "ya", e); // no such vertex in graph
assertFalse();
} catch (IllegalArgumentException ile) {
assertTrue();
}
assertEquals(false, g2.addEdge(v2, v1, e));
assertEquals(false, g3.addEdge(v2, v1, e));
assertEquals(true, g4.addEdge(v2, v1, e));
}
/**
* Class to test for Edge addEdge(Object, Object)
*/
public void testAddEdgeObjectObject()
{
init();
try {
g1.addEdge(v1, v1); // loops not allowed
assertFalse();
} catch (IllegalArgumentException e) {
assertTrue();
}
try {
g3.addEdge(null, null);
assertFalse(); // NPE
} catch (NullPointerException e) {
assertTrue();
}
try {
g1.addEdge(v2, v1); // no such vertex in graph
assertFalse();
} catch (IllegalArgumentException ile) {
assertTrue();
}
assertNull(g2.addEdge(v2, v1));
assertNull(g3.addEdge(v2, v1));
assertNotNull(g4.addEdge(v2, v1));
}
/**
* .
*/
public void testAddVertex()
{
init();
assertEquals(1, g1.vertexSet().size());
assertEquals(2, g2.vertexSet().size());
assertEquals(3, g3.vertexSet().size());
assertEquals(4, g4.vertexSet().size());
assertFalse(g1.addVertex(v1));
assertTrue(g1.addVertex(v2));
assertEquals(2, g1.vertexSet().size());
}
/**
* Class to test for boolean containsEdge(Edge)
*/
public void testContainsEdgeEdge()
{
init();
// TODO Implement containsEdge().
}
/**
* Class to test for boolean containsEdge(Object, Object)
*/
public void testContainsEdgeObjectObject()
{
init();
assertFalse(g1.containsEdge(v1, v2));
assertFalse(g1.containsEdge(v1, v1));
assertTrue(g2.containsEdge(v1, v2));
assertTrue(g2.containsEdge(v2, v1));
assertTrue(g3.containsEdge(v1, v2));
assertTrue(g3.containsEdge(v2, v1));
assertTrue(g3.containsEdge(v3, v2));
assertTrue(g3.containsEdge(v2, v3));
assertTrue(g3.containsEdge(v1, v3));
assertTrue(g3.containsEdge(v3, v1));
assertFalse(g4.containsEdge(v1, v4));
g4.addEdge(v1, v4);
assertTrue(g4.containsEdge(v1, v4));
assertFalse(g3.containsEdge(v4, v2));
assertFalse(g3.containsEdge(null, null));
}
/**
* .
*/
public void testContainsVertex()
{
init();
// TODO Implement containsVertex().
}
/**
* .
*/
public void testEdgeSet()
{
init();
// TODO Implement edgeSet().
}
/**
* .
*/
public void testEdgesOf()
{
init();
assertEquals(g4.edgesOf(v1).size(), 2);
assertEquals(g3.edgesOf(v1).size(), 4);
Iterator<DefaultEdge> iter = g3.edgesOf(v1).iterator();
int count = 0;
while (iter.hasNext()) {
iter.next();
count++;
}
assertEquals(count, 4);
}
/**
* .
*/
public void testGetAllEdges()
{
init(); // TODO Implement getAllEdges().
}
/**
* .
*/
public void testGetEdge()
{
init(); // TODO Implement getEdge().
}
/**
* .
*/
public void testGetEdgeFactory()
{
init(); // TODO Implement getEdgeFactory().
}
/**
* .
*/
public void testInDegreeOf()
{
init();
assertEquals(0, g1.inDegreeOf(v1));
assertEquals(1, g2.inDegreeOf(v1));
assertEquals(1, g2.inDegreeOf(v2));
assertEquals(2, g3.inDegreeOf(v1));
assertEquals(2, g3.inDegreeOf(v2));
assertEquals(2, g3.inDegreeOf(v3));
assertEquals(1, g4.inDegreeOf(v1));
assertEquals(1, g4.inDegreeOf(v2));
assertEquals(1, g4.inDegreeOf(v3));
assertEquals(1, g4.inDegreeOf(v4));
try {
g3.inDegreeOf(new String());
assertFalse();
} catch (IllegalArgumentException e) {
assertTrue();
}
try {
g3.inDegreeOf(null);
assertFalse();
} catch (NullPointerException e) {
assertTrue();
}
}
/**
* .
*/
public void testIncomingOutgoingEdgesOf()
{
init();
Set<DefaultEdge> e1to2 = g2.outgoingEdgesOf(v1);
Set<DefaultEdge> e2from1 = g2.incomingEdgesOf(v2);
assertEquals(e1to2, e2from1);
}
/**
* .
*/
public void testOutDegreeOf()
{
init(); // TODO Implement outDegreeOf().
}
/**
* .
*/
public void testOutgoingEdgesOf()
{
init(); // TODO Implement outgoingEdgesOf().
}
/**
* Class to test for boolean removeEdge(Edge)
*/
public void testRemoveEdgeEdge()
{
init();
assertEquals(g4.edgeSet().size(), 4);
g4.removeEdge(v1, v2);
assertEquals(g4.edgeSet().size(), 3);
assertFalse(g4.removeEdge(eLoop));
assertTrue(g4.removeEdge(g4.getEdge(v2, v3)));
assertEquals(g4.edgeSet().size(), 2);
}
/**
* Class to test for Edge removeEdge(Object, Object)
*/
public void testRemoveEdgeObjectObject()
{
init(); // TODO Implement removeEdge().
}
public void testRemoveAllEdgesObjectObject()
{
init();
assertEquals(2, g2.edgeSet().size());
assertTrue(g2.containsEdge(v1, v2));
Set<DefaultEdge> edges = g2.getAllEdges(v1, v2);
assertEquals(edges, g2.removeAllEdges(v1, v2));
assertEquals(1, g2.edgeSet().size());
assertFalse(g2.containsEdge(v1, v2));
assertEquals(4, g4.edgeSet().size());
edges = g4.getAllEdges(v3, v4);
assertEquals(edges, g4.removeAllEdges(v3, v4));
assertEquals(3, g4.edgeSet().size());
assertFalse(g4.containsEdge(v3, v4));
// No edge to remove.
assertEquals(Collections.emptySet(), g4.removeAllEdges(v3, v2));
assertEquals(3, g4.edgeSet().size());
// Missing vertex.
assertEquals(null, g4.removeAllEdges(v1, "v5"));
}
/**
* .
*/
public void testRemoveVertex()
{
init();
assertEquals(4, g4.vertexSet().size());
assertTrue(g4.removeVertex(v1));
assertEquals(3, g4.vertexSet().size());
assertEquals(2, g4.edgeSet().size());
assertFalse(g4.removeVertex(v1));
assertTrue(g4.removeVertex(v2));
assertEquals(1, g4.edgeSet().size());
assertTrue(g4.removeVertex(v3));
assertEquals(0, g4.edgeSet().size());
assertEquals(1, g4.vertexSet().size());
assertTrue(g4.removeVertex(v4));
assertEquals(0, g4.vertexSet().size());
}
/**
* .
*/
public void testVertexSet()
{
init(); // TODO Implement vertexSet().
}
public void testReversedView()
{
init();
DirectedGraph<String, DefaultEdge> g =
new SimpleDirectedGraph<String, DefaultEdge>(DefaultEdge.class);
DirectedGraph<String, DefaultEdge> r =
new EdgeReversedGraph<String, DefaultEdge>(g);
g.addVertex(v1);
g.addVertex(v2);
DefaultEdge e = g.addEdge(v1, v2);
verifyReversal(g, r, e);
// We have implicitly verified that r is backed by g for additive
// operations (since we constructed it before adding anything to g).
// Now verify for deletion.
g.removeEdge(e);
assertTrue(r.edgeSet().isEmpty());
assertEquals(0, r.inDegreeOf(v1));
assertEquals(0, r.outDegreeOf(v1));
assertEquals(0, r.inDegreeOf(v2));
assertEquals(0, r.outDegreeOf(v2));
assertTrue(r.incomingEdgesOf(v1).isEmpty());
assertTrue(r.outgoingEdgesOf(v1).isEmpty());
assertTrue(r.incomingEdgesOf(v2).isEmpty());
assertTrue(r.outgoingEdgesOf(v2).isEmpty());
}
private void verifyReversal(
DirectedGraph<String, DefaultEdge> g,
DirectedGraph<String, DefaultEdge> r,
DefaultEdge e)
{
assertTrue(r.containsVertex(v1));
assertTrue(r.containsVertex(v2));
assertEquals(g.vertexSet(), r.vertexSet());
assertEquals(g.edgeSet(), r.edgeSet());
assertTrue(r.containsEdge(v2, v1));
assertSame(e, r.getEdge(v2, v1));
assertFalse(r.containsEdge(v1, v2));
assertNull(r.getEdge(v1, v2));
Set<DefaultEdge> s = r.getAllEdges(v1, v2);
assertEquals(0, s.size());
s = r.getAllEdges(v2, v1);
assertEquals(1, s.size());
assertSame(e, s.iterator().next());
assertEquals(1, r.inDegreeOf(v1));
assertEquals(0, r.inDegreeOf(v2));
assertEquals(0, r.outDegreeOf(v1));
assertEquals(1, r.outDegreeOf(v2));
assertEquals(g.edgeSet(), r.incomingEdgesOf(v1));
assertTrue(r.outgoingEdgesOf(v1).isEmpty());
assertTrue(r.incomingEdgesOf(v2).isEmpty());
assertEquals(g.edgeSet(), r.outgoingEdgesOf(v2));
assertSame(v2, r.getEdgeSource(e));
assertSame(v1, r.getEdgeTarget(e));
assertEquals("([v1, v2], [(v2,v1)])", r.toString());
}
private void init()
{
gEmpty =
new SimpleDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
g1 = new SimpleDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
g2 = new SimpleDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
g3 = new SimpleDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
g4 = new SimpleDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
eFactory = g1.getEdgeFactory();
eLoop = eFactory.createEdge(v1, v1);
g1.addVertex(v1);
g2.addVertex(v1);
g2.addVertex(v2);
g2.addEdge(v1, v2);
g2.addEdge(v2, v1);
g3.addVertex(v1);
g3.addVertex(v2);
g3.addVertex(v3);
g3.addEdge(v1, v2);
g3.addEdge(v2, v1);
g3.addEdge(v2, v3);
g3.addEdge(v3, v2);
g3.addEdge(v3, v1);
g3.addEdge(v1, v3);
g4.addVertex(v1);
g4.addVertex(v2);
g4.addVertex(v3);
g4.addVertex(v4);
g4.addEdge(v1, v2);
g4.addEdge(v2, v3);
g4.addEdge(v3, v4);
g4.addEdge(v4, v1);
}
}
// End SimpleDirectedGraphTest.java