// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm.visitor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Collection; import org.junit.Rule; import org.junit.Test; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.osm.Changeset; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.OsmPrimitiveType; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.testutils.JOSMTestRules; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * Unit tests for class {@link MergeSourceBuildingVisitor}. */ public class MergeSourceBuildingVisitorTest { protected OsmPrimitive lookupByName(Collection<? extends OsmPrimitive> primitives, String name) { if (primitives == null) return null; if (name == null) return null; for (OsmPrimitive primitive: primitives) { if (name.equals(primitive.get("name"))) return primitive; } return null; } /** * Setup test. */ @Rule @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public JOSMTestRules test = new JOSMTestRules(); @Test public void testNodes() { DataSet source = new DataSet(); Node n1 = new Node(1); Node n2 = new Node(new LatLon(10.0, 10.0)); n2.put("name", "n2"); Node n3 = new Node(3); Node n4 = new Node(new LatLon(20.0, 20.0)); n4.put("name", "n4"); source.addPrimitive(n1); source.addPrimitive(n2); source.addPrimitive(n3); source.addPrimitive(n4); source.setSelected(n1, n2); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(2, hull.getNodes().size()); OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.NODE); assertNotNull(p); assertEquals(p.getClass(), Node.class); p = hull.getPrimitiveById(3, OsmPrimitiveType.NODE); assertNull(p); p = lookupByName(hull.getNodes(), "n2"); assertNotNull(p); p = lookupByName(hull.getNodes(), "n4"); assertNull(p); } @Test public void testOneWay() { DataSet source = new DataSet(); Node n1 = new Node(1); Node n2 = new Node(2); Way w1 = new Way(3, 1); w1.addNode(n1); w1.addNode(n2); source.addPrimitive(n1); source.addPrimitive(n2); source.addPrimitive(w1); source.setSelected(w1); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getWays().size()); assertEquals(2, hull.getNodes().size()); OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.NODE); assertNotNull(p); assertEquals(p.getClass(), Node.class); p = hull.getPrimitiveById(2, OsmPrimitiveType.NODE); assertNotNull(p); assertEquals(p.getClass(), Node.class); p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY); assertNotNull(p); assertEquals(p.getClass(), Way.class); } @Test public void testOneWayNodesSelectedToo() { DataSet source = new DataSet(); Node n1 = new Node(1); Node n2 = new Node(2); Way w1 = new Way(3, 1); w1.addNode(n1); w1.addNode(n2); source.addPrimitive(n1); source.addPrimitive(n2); source.addPrimitive(w1); source.setSelected(w1, n1, n2); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getWays().size()); assertEquals(2, hull.getNodes().size()); OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.NODE); assertNotNull(p); assertEquals(p.getClass(), Node.class); p = hull.getPrimitiveById(2, OsmPrimitiveType.NODE); assertNotNull(p); assertEquals(p.getClass(), Node.class); p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY); assertNotNull(p); assertEquals(p.getClass(), Way.class); } @Test public void testOneWayIncomplete() { DataSet source = new DataSet(); Way w1 = new Way(3); source.addPrimitive(w1); source.setSelected(w1); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getWays().size()); OsmPrimitive p = hull.getPrimitiveById(3, OsmPrimitiveType.WAY); assertNotNull(p); assertEquals(p.getClass(), Way.class); assertTrue(p.isIncomplete()); } @Test public void testOneRelationExistingMembersSelected() { DataSet source = new DataSet(); Relation r1 = new Relation(1, 1); Node n20 = new Node(20, 1); n20.setCoor(LatLon.ZERO); r1.addMember(new RelationMember("node-20", n20)); Way w30 = new Way(30, 1); Node n21 = new Node(21); w30.addNode(n21); Node n22 = new Node(22); w30.addNode(n22); r1.addMember(new RelationMember("way-30", w30)); Relation r40 = new Relation(40); r1.addMember(new RelationMember("relation-40", r40)); source.addPrimitive(n20); source.addPrimitive(n21); source.addPrimitive(n22); source.addPrimitive(w30); source.addPrimitive(r40); source.addPrimitive(r1); source.setSelected(r1, n20, w30, r40); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getWays().size()); assertEquals(3, hull.getNodes().size()); assertEquals(2, hull.getRelations().size()); OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.RELATION); assertNotNull(p); assertEquals(p.getClass(), Relation.class); Way w = (Way) hull.getPrimitiveById(30, OsmPrimitiveType.WAY); assertNotNull(w); assertEquals(2, w.getNodesCount()); Node n = (Node) hull.getPrimitiveById(21, OsmPrimitiveType.NODE); assertNotNull(n); assertTrue(w.containsNode(n)); n = (Node) hull.getPrimitiveById(22, OsmPrimitiveType.NODE); assertNotNull(n); assertTrue(w.containsNode(n)); Relation r = (Relation) hull.getPrimitiveById(40, OsmPrimitiveType.RELATION); assertNotNull(r); r = (Relation) hull.getPrimitiveById(1, OsmPrimitiveType.RELATION); assertNotNull(r); assertEquals(3, r.getMembersCount()); RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20, OsmPrimitiveType.NODE)); assertTrue(r.getMembers().contains(m)); m = new RelationMember("way-30", hull.getPrimitiveById(30, OsmPrimitiveType.WAY)); assertTrue(r.getMembers().contains(m)); m = new RelationMember("relation-40", hull.getPrimitiveById(40, OsmPrimitiveType.RELATION)); assertTrue(r.getMembers().contains(m)); } @Test public void testOneRelationExistingMembersNotSelected() { DataSet source = new DataSet(); Relation r1 = new Relation(1, 1); Node n20 = new Node(20); r1.addMember(new RelationMember("node-20", n20)); Way w30 = new Way(30, 1); Node n21; w30.addNode(n21 = new Node(21)); Node n22; w30.addNode(n22 = new Node(22)); r1.addMember(new RelationMember("way-30", w30)); Relation r40 = new Relation(40); r1.addMember(new RelationMember("relation-40", r40)); source.addPrimitive(n20); source.addPrimitive(n21); source.addPrimitive(n22); source.addPrimitive(w30); source.addPrimitive(r40); source.addPrimitive(r1); source.setSelected(r1); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getWays().size()); assertEquals(1, hull.getNodes().size()); assertEquals(2, hull.getRelations().size()); OsmPrimitive p = hull.getPrimitiveById(1, OsmPrimitiveType.RELATION); assertNotNull(p); assertEquals(p.getClass(), Relation.class); Way w = (Way) hull.getPrimitiveById(30, OsmPrimitiveType.WAY); assertNotNull(w); assertTrue(w.isIncomplete()); Node n = (Node) hull.getPrimitiveById(21, OsmPrimitiveType.NODE); assertNull(n); n = (Node) hull.getPrimitiveById(22, OsmPrimitiveType.NODE); assertNull(n); Relation r = (Relation) hull.getPrimitiveById(40, OsmPrimitiveType.RELATION); assertNotNull(r); assertTrue(r.isIncomplete()); r = (Relation) hull.getPrimitiveById(1, OsmPrimitiveType.RELATION); assertNotNull(r); assertEquals(3, r.getMembersCount()); RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20, OsmPrimitiveType.NODE)); assertTrue(r.getMembers().contains(m)); m = new RelationMember("way-30", hull.getPrimitiveById(30, OsmPrimitiveType.WAY)); assertTrue(r.getMembers().contains(m)); m = new RelationMember("relation-40", hull.getPrimitiveById(40, OsmPrimitiveType.RELATION)); assertTrue(r.getMembers().contains(m)); } @Test public void testOneRelationNewMembersNotSelected() { DataSet source = new DataSet(); Relation r1 = new Relation(); r1.put("name", "r1"); Node n20 = new Node(new LatLon(20.0, 20.0)); n20.put("name", "n20"); r1.addMember(new RelationMember("node-20", n20)); Way w30 = new Way(); w30.put("name", "w30"); Node n21; w30.addNode(n21 = new Node(new LatLon(21.0, 21.0))); n21.put("name", "n21"); Node n22; w30.addNode(n22 = new Node(new LatLon(22.0, 22.0))); n22.put("name", "n22"); r1.addMember(new RelationMember("way-30", w30)); Relation r40 = new Relation(); r40.put("name", "r40"); r1.addMember(new RelationMember("relation-40", r40)); source.addPrimitive(n20); source.addPrimitive(n21); source.addPrimitive(n22); source.addPrimitive(w30); source.addPrimitive(r40); source.addPrimitive(r1); source.setSelected(r1); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getWays().size()); assertEquals(3, hull.getNodes().size()); assertEquals(2, hull.getRelations().size()); OsmPrimitive p = lookupByName(hull.getRelations(), "r1"); assertNotNull(p); assertEquals(p.getClass(), Relation.class); Way w = (Way) lookupByName(hull.getWays(), "w30"); assertNotNull(w); assertEquals(2, w.getNodesCount()); Node n = (Node) lookupByName(hull.getNodes(), "n21"); assertNotNull(n); assertTrue(w.containsNode(n)); n = (Node) lookupByName(hull.getNodes(), "n22"); assertNotNull(n); assertTrue(w.containsNode(n)); Relation r = (Relation) lookupByName(hull.getRelations(), "r40"); assertNotNull(r); r = (Relation) lookupByName(hull.getRelations(), "r1"); assertNotNull(r); assertEquals(3, r.getMembersCount()); RelationMember m = new RelationMember("node-20", lookupByName(hull.getNodes(), "n20")); assertTrue(r.getMembers().contains(m)); m = new RelationMember("way-30", lookupByName(hull.getWays(), "w30")); assertTrue(r.getMembers().contains(m)); m = new RelationMember("relation-40", lookupByName(hull.getRelations(), "r40")); assertTrue(r.getMembers().contains(m)); } @Test public void testOneRelationExistingRecursive() { DataSet source = new DataSet(); Relation r1 = new Relation(1, 1); r1.addMember(new RelationMember("relation-1", r1)); source.addPrimitive(r1); source.setSelected(r1); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getRelations().size()); Relation r = (Relation) hull.getPrimitiveById(1, OsmPrimitiveType.RELATION); assertNotNull(r); assertEquals(1, r.getMembersCount()); assertTrue(r.getMembers().contains(new RelationMember("relation-1", r))); } @Test public void testOneRelationNewRecursive() { DataSet source = new DataSet(); Relation r1 = new Relation(); r1.put("name", "r1"); r1.addMember(new RelationMember("relation-1", r1)); source.addPrimitive(r1); source.setSelected(r1); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(1, hull.getRelations().size()); Relation r = (Relation) lookupByName(hull.getRelations(), "r1"); assertNotNull(r); assertEquals(1, r.getMembersCount()); assertTrue(r.getMembers().contains(new RelationMember("relation-1", r))); } @Test public void testTwoRelationExistingCircular() { DataSet source = new DataSet(); Relation r1 = new Relation(1, 1); source.addPrimitive(r1); Relation r2 = new Relation(2, 3); source.addPrimitive(r2); r1.addMember(new RelationMember("relation-2", r2)); r2.addMember(new RelationMember("relation-1", r1)); source.setSelected(r1, r2); MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(source); DataSet hull = builder.build(); assertNotNull(hull); assertEquals(2, hull.getRelations().size()); r1 = (Relation) hull.getPrimitiveById(1, OsmPrimitiveType.RELATION); assertNotNull(r1); r2 = (Relation) hull.getPrimitiveById(2, OsmPrimitiveType.RELATION); assertNotNull(r2); assertEquals(1, r1.getMembersCount()); assertTrue(r1.getMembers().contains(new RelationMember("relation-2", r2))); assertEquals(1, r2.getMembersCount()); assertTrue(r2.getMembers().contains(new RelationMember("relation-1", r1))); } /** * Unit test of {@code AbstractVisitor#visit(org.openstreetmap.josm.data.osm.Changeset)}. */ @Test public void testVisitChangeset() { new MergeSourceBuildingVisitor(new DataSet()).visit(new Changeset()); } }