package de.westnordost.streetcomplete.data.osm.download; import junit.framework.TestCase; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import de.westnordost.streetcomplete.data.osm.ElementGeometry; import de.westnordost.osmapi.map.data.Element; import de.westnordost.osmapi.map.data.LatLon; import de.westnordost.osmapi.map.data.Node; import de.westnordost.osmapi.map.data.OsmLatLon; import de.westnordost.osmapi.map.data.OsmNode; import de.westnordost.osmapi.map.data.OsmRelation; import de.westnordost.osmapi.map.data.OsmRelationMember; import de.westnordost.osmapi.map.data.OsmWay; import de.westnordost.osmapi.map.data.Relation; import de.westnordost.osmapi.map.data.RelationMember; import de.westnordost.osmapi.map.data.Way; public class ElementCreatorTestGeometry extends TestCase implements WayGeometrySource { private static final LatLon P0 = new OsmLatLon(0d,2d), P1 = new OsmLatLon(0d,0d), P2 = new OsmLatLon(2d,0d), P3 = new OsmLatLon(2d,2d); private static final Node N0 = new OsmNode(0L,0,P0,null), N1 = new OsmNode(1L,0,P1,null), N2 = new OsmNode(2L,0,P2,null), N3 = new OsmNode(3L,0,P3,null); private static final Map<String,String> wayArea = new HashMap<>(), relationArea = new HashMap<>(); static { wayArea.put("area", "yes"); relationArea.put("type","multipolygon"); } private static final Way W0 = new OsmWay(0L,0, Arrays.asList(0L,1L),null), W1 = new OsmWay(1L,0,Arrays.asList(1L,2L,0L),null), W2 = new OsmWay(2L,0,Arrays.asList(0L,1L,2L,0L),wayArea), W3 = new OsmWay(3L,0,Arrays.asList(3L,2L), null), W4 = new OsmWay(4L,0,Arrays.asList(0L,1L,1L,2L), null), W5 = new OsmWay(5L,0, Collections.<Long>emptyList(),null); private static final RelationMember RM0 = new OsmRelationMember(0L, "outer", Element.Type.WAY), RM1 = new OsmRelationMember(1L, "outer", Element.Type.WAY), RM2 = new OsmRelationMember(2L, "inner", Element.Type.WAY), RM3 = new OsmRelationMember(3L, "", Element.Type.WAY); private static final Relation R0 = new OsmRelation(0L, 0, Arrays.asList(RM0, RM1, RM2, RM3), relationArea), R1 = new OsmRelation(1L, 0, Arrays.asList(RM0, RM1, RM2, RM3), null); private static final List<Node> nodes = Arrays.asList(N0, N1, N2, N3); private static final List<Way> ways = Arrays.asList(W0, W1, W2, W3, W4, W5); @Override public List<LatLon> getNodePositions(long wayId) { List<Long> nodeIds = ways.get((int) wayId).getNodeIds(); List<LatLon> result = new ArrayList<>(); for(Long nodeId : nodeIds) { result.add(nodes.get(nodeId.intValue()).getPosition()); } return result; } private ElementGeometryCreator createCreator() { ElementGeometryCreator creator = new ElementGeometryCreator(); creator.setWayGeometryProvider(this); return creator; } public void testCreateForNode() { ElementGeometry geom = createCreator().create(N0); assertEquals(P0, geom.center); } public void testCreateForEmptyWay() { ElementGeometry geom = createCreator().create(W5); assertNull(geom); } public void testCreateForWayWithDuplicateNodes() { ElementGeometry geom = createCreator().create(W4); assertNotNull(geom.polylines); assertNotNull(geom.center); } public void testCreateForSimpleAreaWay() { ElementGeometry geom = createCreator().create(W2); assertNotNull(geom.polygons); assertEquals(1,geom.polygons.size()); List<LatLon> polygon = geom.polygons.get(0); for(int i=0; i<W2.getNodeIds().size(); ++i) { LatLon shouldBe = nodes.get(W2.getNodeIds().get(i).intValue()).getPosition(); assertEquals(shouldBe, polygon.get(i)); } } public void testCreateForSimpleNonAreaWay() { ElementGeometry geom = createCreator().create(W0); assertNotNull(geom.polylines); assertEquals(1,geom.polylines.size()); assertEquals(W0.getNodeIds().size(), geom.polylines.get(0).size()); List<LatLon> polyline = geom.polylines.get(0); for(int i=0; i<W0.getNodeIds().size(); ++i) { LatLon shouldBe = nodes.get(W0.getNodeIds().get(i).intValue()).getPosition(); assertEquals(shouldBe, polyline.get(i)); } } public void testCreateForMultipolygonRelation() { ElementGeometry geom = createCreator().create(R0); assertNotNull(geom.polygons); assertEquals(2, geom.polygons.size()); } public void testCreateForPolylineRelation() { ElementGeometry geom = createCreator().create(R1); assertNotNull(geom.polylines); assertEquals(3, geom.polylines.size()); } }