/* * 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.path; import java.util.ArrayList; 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.Edge; import org.geotools.graph.structure.Graphable; import org.geotools.graph.structure.Node; import org.geotools.graph.traverse.GraphTraversal; import org.geotools.graph.traverse.GraphWalker; import org.geotools.graph.traverse.basic.BasicGraphTraversal; import org.geotools.graph.traverse.standard.NoBifurcationIterator; public class WalkTest extends TestCase { private GraphBuilder m_builder; public WalkTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); m_builder = createBuilder(); } public void test_add() { Node n = builder().buildNode(); Walk walk = new Walk(); walk.add(n); assertTrue(walk.size() == 1); assertTrue(walk.get(0).equals(n)); } public void test_remove() { Node n = builder().buildNode(); Walk walk = new Walk(); walk.add(n); assertTrue(!walk.isEmpty()); walk.remove(n); assertTrue(walk.isEmpty()); } public void test_reverse() { ArrayList nodes = new ArrayList(); Walk walk = new Walk(); for (int i = 0; i < 10; i++) { Node n = builder().buildNode(); nodes.add(n); walk.add(n); } Iterator itr = walk.iterator(); for (int i = 0; i < nodes.size();i++) { Node n1 = (Node)nodes.get(i); Node n2 = (Node)itr.next(); assertTrue(n1 == n2); } walk.reverse(); itr = walk.iterator(); for (int i = nodes.size()-1; i >= 0; i--) { Node n1 = (Node)nodes.get(i); Node n2 = (Node)itr.next(); assertTrue(n1 == n2); } } public void test_isClosed() { Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), 10); final Walk walk = new Walk(); NoBifurcationIterator iterator = new NoBifurcationIterator(); iterator.setSource(ends[0]); GraphWalker walker = new GraphWalker() { public int visit(Graphable element, GraphTraversal traversal) { walk.add(element); return(GraphTraversal.CONTINUE); } public void finish() { } }; BasicGraphTraversal traversal = new BasicGraphTraversal( builder().getGraph(), walker, iterator ); traversal.init(); traversal.traverse(); assertTrue(walk.size() == builder().getGraph().getNodes().size()); assertTrue(walk.isValid() && !walk.isClosed()); //create a new edges in the graph making the graph a cycle Edge e = builder().buildEdge(ends[0], ends[1]); builder().addEdge(e); walk.add(ends[0]); assertTrue(walk.isValid() && walk.isClosed()); } public void test_getEdges() { Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), 10); final Walk walk = new Walk(); NoBifurcationIterator iterator = new NoBifurcationIterator(); iterator.setSource(ends[0]); GraphWalker walker = new GraphWalker() { public int visit(Graphable element, GraphTraversal traversal) { walk.add(element); return(GraphTraversal.CONTINUE); } public void finish() { } }; BasicGraphTraversal traversal = new BasicGraphTraversal( builder().getGraph(), walker, iterator ); traversal.init(); traversal.traverse(); assertTrue(walk.getEdges() != null); assertTrue(walk.isValid()); } public void test_truncate_0() { Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), 10); final Walk walk = new Walk(); NoBifurcationIterator iterator = new NoBifurcationIterator(); iterator.setSource(ends[0]); GraphWalker walker = new GraphWalker() { public int visit(Graphable element, GraphTraversal traversal) { walk.add(element); return(GraphTraversal.CONTINUE); } public void finish() { } }; BasicGraphTraversal traversal = new BasicGraphTraversal( builder().getGraph(), walker, iterator ); traversal.init(); traversal.traverse(); walk.truncate(0); assertTrue(walk.isEmpty()); assertTrue(walk.isValid()); } public void test_truncate_1() { Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), 10); final Walk walk = new Walk(); NoBifurcationIterator iterator = new NoBifurcationIterator(); iterator.setSource(ends[0]); GraphWalker walker = new GraphWalker() { int count = 0; public int visit(Graphable element, GraphTraversal traversal) { walk.add(element); return(GraphTraversal.CONTINUE); } public void finish() { } }; BasicGraphTraversal traversal = new BasicGraphTraversal( builder().getGraph(), walker, iterator ); traversal.init(); traversal.traverse(); int size = walk.size(); walk.truncate(size / 2); assertTrue(walk.size() == size / 2); } public void test_truncate_2() { Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), 11); final Walk walk = new Walk(); NoBifurcationIterator iterator = new NoBifurcationIterator(); iterator.setSource(ends[0]); GraphWalker walker = new GraphWalker() { int count = 0; public int visit(Graphable element, GraphTraversal traversal) { walk.add(element); return(GraphTraversal.CONTINUE); } public void finish() { } }; BasicGraphTraversal traversal = new BasicGraphTraversal( builder().getGraph(), walker, iterator ); traversal.init(); traversal.traverse(); int size = walk.size(); walk.truncate(size / 2); assertTrue(walk.size() == size / 2); } protected GraphBuilder createBuilder() { return(new BasicGraphBuilder()); } protected GraphBuilder builder() { return(m_builder); } }