/*
* EuroCarbDB, a framework for carbohydrate bioinformatics
*
* Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
* A copy of this license accompanies this distribution in the file LICENSE.txt.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* Last commit: $Rev: 1394 $ by $Author: glycoslave $ on $Date:: 2009-07-03 #$
*/
package test.eurocarbdb.util.graph;
import java.util.*;
import org.apache.log4j.Logger;
import org.testng.annotations.*;
import org.eurocarbdb.util.graph.*;
import static java.lang.System.out;
//import static org.eurocarbdb.util.StringUtils.join;
import static org.eurocarbdb.util.graph.Graphs.isConnected;
import static org.eurocarbdb.util.graph.Graphs.getConnectedSubgraphs;
public class GraphsTest
{
@Test
(
groups={"util.graphs"}
)
public void graphConnectivity()
{
out.println( "determining if a graph is connected or not" );
Graph<String,String> g = new Graph<String,String>();
// 0 vertices, 0 edges - unconnected
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 0;
assert g.countEdges() == 0;
assert ! isConnected(g);
out.println();
// 1 vertex, 0 edges - connected
// graph API defines isConnected to be true when there is a single vertex.
g.addVertex( "aaa" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 1;
assert g.countEdges() == 0;
assert isConnected(g);
out.println();
// 2 vertices, 0 edges - unconnected
g.addVertex( "bbb" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 2;
assert g.countEdges() == 0;
assert ! isConnected(g);
out.println();
// 2 vertices, 1 edge - connected
g.addEdge( "aaa", "bbb" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 2;
assert g.countEdges() == 1;
assert isConnected(g);
out.println();
// 3 vertices, 1 edge - unconnected
g.addVertex( "ccc" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 3;
assert g.countEdges() == 1;
assert ! isConnected(g);
out.println();
// 4 vertices, 2 edges - unconnected
g.addVertex( "ddd" );
g.addEdge( "ccc", "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 2;
assert ! isConnected(g);
out.println();
// 4 vertices, 4 edges - unconnected
g.addEdge( "ccc", "ddd" );
g.addEdge( "ccc", "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 4;
assert ! isConnected(g);
out.println();
// 4 vertices, 5 edges - connected
g.addEdge( "aaa", "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 5;
assert isConnected(g);
}
@Test
(
groups={"util.graphs"}
)
public void graphConnectivitySubgraphs()
{
out.println( "deriving connected subgraphs for a graph" );
Graph<String,String> g = new Graph<String,String>();
List<Graph<String,String>> subgraphs;
// 0 vertices, 0 edges - unconnected
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 0;
assert g.countEdges() == 0;
assert ! isConnected(g);
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 0;
// 1 vertex, 0 edges - connected
// graph API defines isConnected to be true when there is a single vertex.
g.addVertex( "aaa" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 1;
assert g.countEdges() == 0;
assert isConnected(g);
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 1;
// 2 vertices, 0 edges - unconnected
g.addVertex( "bbb" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 2;
assert g.countEdges() == 0;
assert ! isConnected(g);
out.println();
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 2;
// 2 vertices, 1 edge - connected
g.addEdge( "aaa", "bbb" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 2;
assert g.countEdges() == 1;
assert isConnected(g);
out.println();
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 1;
// 3 vertices, 1 edge - unconnected
g.addVertex( "ccc" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 3;
assert g.countEdges() == 1;
assert ! isConnected(g);
out.println();
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 2;
// 4 vertices, 1 edges - unconnected
g.addVertex( "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 1;
assert ! isConnected(g);
out.println();
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 3;
// 4 vertices, 2 edges - unconnected
g.addEdge( "ccc", "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 2;
assert ! isConnected(g);
out.println();
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 2;
// 4 vertices, 4 edges - unconnected
g.addEdge( "ccc", "ddd" );
g.addEdge( "ccc", "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 4;
assert ! isConnected(g);
out.println();
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 2;
// 4 vertices, 5 edges - connected
g.addEdge( "aaa", "ddd" );
out.println( "graph is now:" );
out.println( g.toString() );
out.println( "isConnected = " + isConnected(g) );
assert g.countVertices() == 4;
assert g.countEdges() == 5;
assert isConnected(g);
subgraphs = getConnectedSubgraphs( g );
reportSubgraphs( subgraphs );
assert subgraphs.size() == 1;
}
private <E,V> void reportSubgraphs( List<Graph<E,V>> graphlist )
{
out.println( "List of subgraphs:" );
if ( graphlist.size() == 0 )
{
out.println( "(no subgraphs)" );
out.println();
return;
}
int i = 1;
for ( Graph<E,V> g : graphlist )
{
out.println( "subgraph " + i + ":" );
out.println( g );
out.println();
i++;
}
}
} // end class