/* This program 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, either version 3 of the License, or (at your option) any later version. 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.opentripplanner.routing.vertextype; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.LineString; import org.junit.Test; import org.opentripplanner.common.geometry.GeometryUtils; import org.opentripplanner.graph_builder.module.osm.OSMFilter; import org.opentripplanner.openstreetmap.model.OSMNode; import org.opentripplanner.routing.core.TraverseMode; import org.opentripplanner.routing.core.TraverseModeSet; import org.opentripplanner.routing.edgetype.StreetEdge; import org.opentripplanner.routing.edgetype.StreetTraversalPermission; import org.opentripplanner.routing.graph.Graph; import static org.junit.Assert.*; /** * Created by mabu on 17.8.2015. */ public class BarrierVertexTest { @Test public void testBarrierPermissions() throws Exception { OSMNode simpleBarier = new OSMNode(); assertFalse(simpleBarier.isBollard()); simpleBarier.addTag("barrier", "bollard"); assertTrue(simpleBarier.isBollard()); Graph graph = new Graph(); String label = "simpleBarrier"; BarrierVertex bv = new BarrierVertex(graph, label, simpleBarier.lon, simpleBarier.lat, 0); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(simpleBarier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE, bv.getBarrierPermissions()); simpleBarier.addTag("foot", "yes"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(simpleBarier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE, bv.getBarrierPermissions()); simpleBarier.addTag("bicycle", "yes"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(simpleBarier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE, bv.getBarrierPermissions()); simpleBarier.addTag("access", "no"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(simpleBarier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE, bv.getBarrierPermissions()); simpleBarier.addTag("motor_vehicle", "no"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(simpleBarier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE, bv.getBarrierPermissions()); simpleBarier.addTag("bicycle", "no"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(simpleBarier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN, bv.getBarrierPermissions()); OSMNode complexBarrier = new OSMNode(); complexBarrier.addTag("barrier", "bollard"); complexBarrier.addTag("access", "no"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(complexBarrier, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.NONE, bv.getBarrierPermissions()); OSMNode noBikeBollard = new OSMNode(); noBikeBollard.addTag("barrier", "bollard"); noBikeBollard.addTag("bicycle", "no"); bv.setBarrierPermissions(OSMFilter .getPermissionsForEntity(noBikeBollard, BarrierVertex.defaultBarrierPermissions)); assertEquals(StreetTraversalPermission.PEDESTRIAN, bv.getBarrierPermissions()); } /** * Create an edge. If twoWay, create two edges (back and forth). * * @param vA * @param vB * @param length * @param back true if this is a reverse edge */ private StreetEdge edge(StreetVertex vA, StreetVertex vB, double length, boolean back) { String labelA = vA.getLabel(); String labelB = vB.getLabel(); String name = String.format("%s_%s", labelA, labelB); Coordinate[] coords = new Coordinate[2]; coords[0] = vA.getCoordinate(); coords[1] = vB.getCoordinate(); LineString geom = GeometryUtils.getGeometryFactory().createLineString(coords); StreetTraversalPermission perm = StreetTraversalPermission.ALL; return new StreetEdge(vA, vB, geom, name, length, perm, back); } @Test public void testStreetsWithBollard() { Graph _graph = new Graph(); //default permissions are PEDESTRIAND and BICYCLE BarrierVertex bv = new BarrierVertex(_graph, "start_bollard", 2.0, 2.0, 0); StreetVertex endVertex = new IntersectionVertex(_graph, "end_vertex", 1.0, 2.0); StreetEdge bv_to_endVertex_forward = edge(bv, endVertex, 100, false); assertTrue(bv_to_endVertex_forward.canTraverse(new TraverseModeSet("CAR"))); assertTrue(bv_to_endVertex_forward.canTraverse(new TraverseModeSet("BICYCLE"))); assertTrue(bv_to_endVertex_forward.canTraverse(new TraverseModeSet("WALK"))); assertFalse(bv_to_endVertex_forward.canTraverseIncludingBarrier(TraverseMode.CAR)); assertTrue(bv_to_endVertex_forward.canTraverseIncludingBarrier(TraverseMode.BICYCLE)); assertTrue(bv_to_endVertex_forward.canTraverseIncludingBarrier(TraverseMode.WALK)); StreetEdge endVertex_to_bv_backward = edge(endVertex, bv, 100, true); assertTrue(endVertex_to_bv_backward.canTraverse(new TraverseModeSet("CAR"))); assertTrue(endVertex_to_bv_backward.canTraverse(new TraverseModeSet("BICYCLE"))); assertTrue(endVertex_to_bv_backward.canTraverse(new TraverseModeSet("WALK"))); assertFalse(endVertex_to_bv_backward.canTraverseIncludingBarrier(TraverseMode.CAR)); assertTrue(endVertex_to_bv_backward.canTraverseIncludingBarrier(TraverseMode.BICYCLE)); assertTrue(endVertex_to_bv_backward.canTraverseIncludingBarrier(TraverseMode.WALK)); StreetEdge bv_to_endVertex_backward = edge(bv, endVertex, 100, true); assertTrue(bv_to_endVertex_backward.canTraverse(new TraverseModeSet("CAR"))); assertTrue(bv_to_endVertex_backward.canTraverse(new TraverseModeSet("BICYCLE"))); assertTrue(bv_to_endVertex_backward.canTraverse(new TraverseModeSet("WALK"))); assertFalse(bv_to_endVertex_backward.canTraverseIncludingBarrier(TraverseMode.CAR)); assertTrue(bv_to_endVertex_backward.canTraverseIncludingBarrier(TraverseMode.BICYCLE)); assertTrue(bv_to_endVertex_backward.canTraverseIncludingBarrier(TraverseMode.WALK)); StreetEdge endVertex_to_bv_forward = edge(endVertex, bv, 100, false); assertTrue(endVertex_to_bv_forward.canTraverse(new TraverseModeSet("CAR"))); assertTrue(endVertex_to_bv_forward.canTraverse(new TraverseModeSet("BICYCLE"))); assertTrue(endVertex_to_bv_forward.canTraverse(new TraverseModeSet("WALK"))); assertFalse(endVertex_to_bv_forward.canTraverseIncludingBarrier(TraverseMode.CAR)); assertTrue(endVertex_to_bv_forward.canTraverseIncludingBarrier(TraverseMode.BICYCLE)); assertTrue(endVertex_to_bv_forward.canTraverseIncludingBarrier(TraverseMode.WALK)); //tests bollard which doesn't allow cycling BarrierVertex noBicycleBollard = new BarrierVertex(_graph, "no_bike_bollard", 1.5, 1, 0); noBicycleBollard.setBarrierPermissions(StreetTraversalPermission.PEDESTRIAN); StreetEdge no_bike_to_endVertex = edge(noBicycleBollard, endVertex, 100, false); assertTrue(no_bike_to_endVertex.canTraverse(new TraverseModeSet("CAR"))); assertTrue(no_bike_to_endVertex.canTraverse(new TraverseModeSet("BICYCLE"))); assertTrue(no_bike_to_endVertex.canTraverse(new TraverseModeSet("WALK"))); assertFalse(no_bike_to_endVertex.canTraverseIncludingBarrier(TraverseMode.CAR)); assertFalse(no_bike_to_endVertex.canTraverseIncludingBarrier(TraverseMode.BICYCLE)); assertTrue(no_bike_to_endVertex.canTraverseIncludingBarrier(TraverseMode.WALK)); } }