/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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.
*/
package org.geotools.graph.io.standard;
import java.io.File;
import java.util.Map;
import junit.framework.TestCase;
import org.geotools.graph.GraphTestUtil;
import org.geotools.graph.build.opt.OptDirectedGraphBuilder;
import org.geotools.graph.build.opt.OptGraphBuilder;
import org.geotools.graph.structure.DirectedNode;
import org.geotools.graph.structure.Graph;
import org.geotools.graph.structure.GraphVisitor;
import org.geotools.graph.structure.Graphable;
public class OptDirectedGraphSerializerTest extends TestCase {
private OptDirectedGraphBuilder m_builder;
private OptDirectedGraphBuilder m_rebuilder;
private SerializedReaderWriter m_serializer;
public OptDirectedGraphSerializerTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
m_builder = createBuilder();
m_rebuilder = createBuilder();
m_serializer = new SerializedReaderWriter();
m_serializer.setProperty(SerializedReaderWriter.BUILDER, rebuilder());
}
/**
* Create a simple graph with no bifurcations and serialize, then deserialize
* <BR>
* <BR>
* Expected: 1. before and after graph should have same structure.
*
*/
public void test_0() {
final int nnodes = 100;
Object[] obj = GraphTestUtil.buildNoBifurcations(builder(), nnodes);
final Map node2id = (Map)obj[2];
final Map edge2id = (Map)obj[3];
try {
File victim = File.createTempFile( "graph", null );
victim.deleteOnExit();
serializer().setProperty(SerializedReaderWriter.FILENAME, victim.getAbsolutePath());
serializer().write(builder().getGraph());
Graph before = builder().getGraph();
Graph after = serializer().read();
//ensure same number of nodes and edges
assertTrue(before.getNodes().size() == after.getNodes().size());
assertTrue(before.getEdges().size() == after.getEdges().size());
//ensure two nodes of degree 1, and nnodes-2 nodes of degree 2
GraphVisitor visitor = new GraphVisitor() {
public int visit(Graphable component) {
DirectedNode node = (DirectedNode)component;
if (node.getInDegree() == 0 || node.getOutDegree() == 0)
return(Graph.PASS_AND_CONTINUE);
return(Graph.FAIL_QUERY);
}
};
assertTrue(after.queryNodes(visitor).size() == 2);
visitor = new GraphVisitor() {
public int visit(Graphable component) {
DirectedNode node = (DirectedNode)component;
if (node.getInDegree() == 1 || node.getOutDegree() == 1)
return(Graph.PASS_AND_CONTINUE);
return(Graph.FAIL_QUERY);
}
};
assertTrue(after.getNodesOfDegree(2).size() == nnodes-2);
}
catch(Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
/**
* Create a perfect binary tree, serialize it and deserialize it. <BR>
* <BR>
* Expected: 1. Same structure before and after.
*
*/
public void test_1() {
final int k = 5;
GraphTestUtil.buildPerfectBinaryTree(builder(), k);
try {
File victim = File.createTempFile( "graph", null );
victim.deleteOnExit();
serializer().setProperty(SerializedReaderWriter.FILENAME, victim.getAbsolutePath());
serializer().write(builder().getGraph());
Graph before = builder().getGraph();
Graph after = serializer().read();
//ensure same number of nodes and edges
assertTrue(before.getNodes().size() == after.getNodes().size());
assertTrue(before.getEdges().size() == after.getEdges().size());
GraphVisitor visitor = new GraphVisitor() {
public int visit(Graphable component) {
DirectedNode node = (DirectedNode)component;
if (node.getInDegree() == 0 && node.getOutDegree() == 2)
return(Graph.PASS_AND_CONTINUE);
return(Graph.FAIL_QUERY);
}
};
assertTrue(after.queryNodes(visitor).size() == 1); //root
visitor = new GraphVisitor() {
public int visit(Graphable component) {
DirectedNode node = (DirectedNode)component;
if (node.getInDegree() == 1 && node.getOutDegree() == 2)
return(Graph.PASS_AND_CONTINUE);
return(Graph.FAIL_QUERY);
}
};
assertTrue(after.queryNodes(visitor).size() == Math.pow(2,k)-2); //internal
visitor = new GraphVisitor() {
public int visit(Graphable component) {
DirectedNode node = (DirectedNode)component;
if (node.getInDegree() == 1 && node.getOutDegree() == 0)
return(Graph.PASS_AND_CONTINUE);
return(Graph.FAIL_QUERY);
}
};
assertTrue(after.queryNodes(visitor).size() == Math.pow(2,k)); //leaves
}
catch(Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
protected OptDirectedGraphBuilder createBuilder() {
return(new OptDirectedGraphBuilder());
}
protected OptDirectedGraphBuilder builder() {
return(m_builder);
}
protected OptGraphBuilder createRebuilder() {
return(new OptGraphBuilder());
}
protected OptDirectedGraphBuilder rebuilder() {
return(m_rebuilder);
}
protected SerializedReaderWriter serializer() {
return(m_serializer);
}
}