/*
* 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.util;
import java.util.Iterator;
import java.util.Map;
import junit.framework.TestCase;
import org.geotools.graph.GraphTestUtil;
import org.geotools.graph.build.GraphBuilder;
import org.geotools.graph.build.basic.BasicGraphBuilder;
import org.geotools.graph.path.DijkstraShortestPathFinder;
import org.geotools.graph.path.Path;
import org.geotools.graph.structure.Edge;
import org.geotools.graph.structure.Node;
import org.geotools.graph.traverse.standard.DijkstraIterator;
public class DijkstraShortestPathFinderTest extends TestCase {
private GraphBuilder m_builder;
public DijkstraShortestPathFinderTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
m_builder = createBuilder();
}
/**
* Create a graph with no bifurcations and calculate path from beginning
* to end. <BR>
* <BR>
* Expected: 1. Path should contain every node in graph in order.
*/
public void test_0() {
int nnodes = 100;
Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), nnodes);
DijkstraShortestPathFinder pfinder = new DijkstraShortestPathFinder(
builder().getGraph(), ends[0], costFunction()
);
pfinder.calculate();
Path p = pfinder.getPath(ends[1]);
int count = 99;
for (Iterator itr = p.iterator(); itr.hasNext();) {
Node n = (Node)itr.next();
assertTrue(n.getID() == count--);
}
}
/**
* Create a circular graph and calculate a path from beginning to end. <BR>
* <BR>
* Expected: 1. Path should just contain end nodes.
*
*/
public void test_1() {
int nnodes = 100;
Node[] ends = GraphTestUtil.buildCircular(builder(), nnodes);
DijkstraShortestPathFinder pfinder = new DijkstraShortestPathFinder(
builder().getGraph(), ends[0], costFunction()
);
pfinder.calculate();
Path p = pfinder.getPath(ends[1]);
assertTrue(p.size() == 2);
assertTrue(p.get(0) == ends[1]);
assertTrue(p.get(1) == ends[0]);
}
/**
* Create a balanced binary tree and calculate a path from root to a leaf. <BR>
* <BR>
* Expected 1. Path should be links from leaf to root.
*/
public void test_2() {
int k = 4;
Object[] obj = GraphTestUtil.buildPerfectBinaryTree(builder(), k);
Node root = (Node)obj[0];
Map id2node = (Map)obj[1];
DijkstraShortestPathFinder pfinder = new DijkstraShortestPathFinder(
builder().getGraph(), root, costFunction()
);
pfinder.calculate();
for (Iterator itr = builder().getGraph().getNodes().iterator(); itr.hasNext();) {
Node node = (Node)itr.next();
String id = node.getObject().toString();
if (id2node.get(id + ".0") == null) {
Path p = pfinder.getPath(node);
assertTrue(p.size() == k+1);
for (Iterator pitr = p.iterator(); pitr.hasNext();) {
Node n = (Node)pitr.next();
assertTrue(n.getObject().toString().equals(id));
if (id.length() > 2) id = id.substring(0, id.length()-2);
}
}
}
}
protected DijkstraIterator.EdgeWeighter costFunction() {
return(
new DijkstraIterator.EdgeWeighter() {
public double getWeight(Edge e) {
return 1;
}
}
);
}
protected GraphBuilder createBuilder() {
return(new BasicGraphBuilder());
}
protected GraphBuilder builder() {
return(m_builder);
}
}