/*
* 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.traverse.standard;
import java.util.Iterator;
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.structure.GraphVisitor;
import org.geotools.graph.structure.Graphable;
import org.geotools.graph.structure.Node;
import org.geotools.graph.traverse.GraphTraversal;
import org.geotools.graph.traverse.basic.BasicGraphTraversal;
import org.geotools.graph.traverse.basic.CountingWalker;
public class DepthFirstTopologicalIteratorTest extends TestCase {
private GraphBuilder m_builder;
public DepthFirstTopologicalIteratorTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
m_builder = createBuilder();
}
/**
* Create a graph with no bifurcations and do a full traversal. <BR>
* <BR>
* Expected: 1. Nodes should be visited from one end to other in order.
*/
public void test_0() {
int nnodes = 100;
GraphTestUtil.buildNoBifurcations(builder(), nnodes);
CountingWalker walker = new CountingWalker() {
public int visit(Graphable element, GraphTraversal traversal) {
element.setCount(getCount());
return super.visit(element, traversal);
}
};
DepthFirstTopologicalIterator iterator = createIterator();
BasicGraphTraversal traversal = new BasicGraphTraversal(
builder().getGraph(), walker, iterator
);
traversal.init();
traversal.traverse();
assertTrue(walker.getCount() == nnodes);
boolean flip = false;
for (
Iterator itr = builder().getGraph().getNodes().iterator();
itr.hasNext();
) {
Node node = (Node)itr.next();
if (node.getID() == 0 && node.getCount() != 0) {
flip = true;
break;
}
}
for (
Iterator itr = builder().getGraph().getNodes().iterator();
itr.hasNext();
) {
Node node = (Node)itr.next();
if (flip) assertTrue(node.getCount() == 100-1-node.getID());
else assertTrue(node.getCount() == node.getID());
}
}
/**
* Create a circular graph and do a full traversal. <BR>
* <BR>
* Expected: 1. No nodes should be visited.
*
*/
public void test_1() {
int nnodes = 100;
GraphTestUtil.buildCircular(builder(), nnodes);
CountingWalker walker = new CountingWalker();
BreadthFirstTopologicalIterator iterator = createIterator();
BasicGraphTraversal traversal = new BasicGraphTraversal(
builder().getGraph(), walker, iterator
);
traversal.init();
traversal.traverse();
GraphVisitor visitor = new GraphVisitor() {
public int visit(Graphable component) {
assertTrue(!component.isVisited());
return 0;
}
};
builder().getGraph().visitNodes(visitor);
assertTrue(walker.getCount() == 0);
}
protected GraphBuilder createBuilder() {
return(new BasicGraphBuilder());
}
protected GraphBuilder builder() {
return(m_builder);
}
protected DepthFirstTopologicalIterator createIterator() {
return(new DepthFirstTopologicalIterator());
}
}