/* Copyright (c) 2013 Boundless and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/edl-v10.html * * Contributors: * Victor Olaya (Boundless) - initial implementation */ package org.locationtech.geogig.osm.internal.history; import static org.locationtech.geogig.osm.internal.history.Change.Type.create; import static org.locationtech.geogig.osm.internal.history.Change.Type.delete; import static org.locationtech.geogig.osm.internal.history.Change.Type.modify; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; import javax.annotation.Nullable; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.junit.Assert; import org.junit.Test; import org.locationtech.geogig.osm.internal.history.Relation.Member; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; /** * */ public class ChangesetContentsScannerTest extends Assert { @Test public void testChange1100() throws XMLStreamException { Iterator<Change> iterator = parse("1100/download.xml"); ArrayList<Change> list = Lists.newArrayList(iterator); assertEquals(100, list.size()); } @Test public void testChange1624() throws XMLStreamException { Iterator<Change> iterator = parse("1624/download.xml"); ArrayList<Change> list = Lists.newArrayList(iterator); assertEquals(4, list.size()); assertEquals(create, list.get(0).getType()); assertEquals(modify, list.get(1).getType()); assertEquals(modify, list.get(2).getType()); assertEquals(delete, list.get(3).getType()); assertTrue(list.get(0).getNode().isPresent()); assertTrue(list.get(1).getNode().isPresent()); assertTrue(list.get(2).getNode().isPresent()); assertTrue(list.get(3).getNode().isPresent()); } @Test public void testChange1864() throws XMLStreamException { Iterator<Change> iterator = parse("1864/download.xml"); ArrayList<Change> list = Lists.newArrayList(iterator); assertEquals(22, list.size()); assertEquals(create, list.get(0).getType()); assertEquals(create, list.get(1).getType()); assertEquals(modify, list.get(2).getType()); assertEquals(delete, list.get(3).getType()); assertTrue(list.get(0).getRelation().isPresent()); assertTrue(list.get(1).getRelation().isPresent()); assertTrue(list.get(2).getRelation().isPresent()); assertTrue(list.get(3).getWay().isPresent()); assertTrue(list.get(4).getNode().isPresent()); } @Test public void testParseNodeNoLocation() throws Exception { String nodeDef = "<node id=\"1082496\" changeset=\"1864\" user=\"jttt\" uid=\"48\" visible=\"false\" timestamp=\"2009-11-21T09:05:57Z\" version=\"2\"/>"; Node node = (Node) new ChangesetContentsScanner().parsePrimitive(reader(nodeDef)); assertPrimitive(node, 1082496L, 1864, "jttt", 48, false, "2009-11-21T09:05:57Z", 2, null); assertFalse(node.getLocation().isPresent()); } @Test public void testParseNode() throws Exception { String nodeDef = "<node id=\"1082496\" lat=\"48.4056473\" lon=\"-4.4621888\" changeset=\"1864\" user=\"jttt\" uid=\"48\" visible=\"false\" timestamp=\"2009-11-21T09:05:57Z\" version=\"2\"/>"; Node node = (Node) new ChangesetContentsScanner().parsePrimitive(reader(nodeDef)); assertPrimitive(node, 1082496L, 1864, "jttt", 48, false, "2009-11-21T09:05:57Z", 2, null); assertTrue(node.getLocation().isPresent()); assertEquals(-4.4621888, node.getLocation().get().getX(), 1E-6); assertEquals(48.4056473, node.getLocation().get().getY(), 1E-6); } @Test public void testParseWay() throws Exception { String wayDef = "<way id=\"49393\" visible=\"true\" timestamp=\"2009-11-21T09:12:53Z\" user=\"jttt\" uid=\"48\" version=\"1\" changeset=\"1864\">" + " <nd ref=\"1082500\"/>"// + " <nd ref=\"1082501\"/>"// + " <nd ref=\"1082502\"/>"// + " <nd ref=\"1082503\"/>"// + " <tag k=\"type\" v=\"road\" />"// + "</way>"; Way way = (Way) new ChangesetContentsScanner().parsePrimitive(reader(wayDef)); assertPrimitive(way, 49393L, 1864, "jttt", 48, true, "2009-11-21T09:12:53Z", 1, ImmutableMap.of("type", "road")); assertEquals(ImmutableList.of(1082500L, 1082501L, 1082502L, 1082503L), way.getNodes()); } @Test public void testParseRelation() throws Exception { String relationDef = "<relation id=\"4394\" visible=\"true\" timestamp=\"2009-11-21T09:21:31Z\" user=\"jttt\" uid=\"48\" version=\"2\" changeset=\"1864\">"// + " <member type=\"relation\" ref=\"4393\" role=\"\"/>"// + " <member type=\"relation\" ref=\"4395\" role=\"testRole1\"/>"// + " <member type=\"relation\" ref=\"4396\" role=\"testRole2\"/>"// + " <tag k=\"eouaoeu\" v=\"oeueaoeu\"/>"// + "</relation>"; Relation rel = (Relation) new ChangesetContentsScanner() .parsePrimitive(reader(relationDef)); assertPrimitive(rel, 4394L, 1864, "jttt", 48, true, "2009-11-21T09:21:31Z", 2, ImmutableMap.of("eouaoeu", "oeueaoeu")); assertEquals(3, rel.getMembers().size()); assertMember(rel.getMembers().get(0), "relation", 4393, null); assertMember(rel.getMembers().get(1), "relation", 4395, "testRole1"); assertMember(rel.getMembers().get(2), "relation", 4396, "testRole2"); } private void assertMember(Member member, String type, int ref, String role) { assertEquals(type, member.getType()); assertEquals(ref, member.getRef()); if (role == null) { assertFalse(member.getRole().isPresent()); } else { assertEquals(role, member.getRole().get()); } } private void assertPrimitive(Primitive p, long id, long changesetid, String user, int uid, boolean visible, String timestamp, int version, @Nullable Map<String, String> tags) { assertEquals(id, p.getId()); assertEquals(changesetid, p.getChangesetId()); assertEquals(user, p.getUserName()); assertEquals(uid, p.getUserId()); assertEquals(visible, p.isVisible()); long t = ParsingUtils.parseDateTime(timestamp); assertEquals(t, p.getTimestamp()); assertEquals(version, p.getVersion()); if (tags == null) { assertTrue(p.getTags().isEmpty()); } else { assertEquals(tags, p.getTags()); } } private XMLStreamReader reader(String node) throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(node.getBytes("UTF-8")); XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(in); reader.nextTag(); return reader; } private Iterator<Change> parse(String resource) throws XMLStreamException { InputStream in = getClass().getResourceAsStream(resource); assertNotNull(in); return new ChangesetContentsScanner().parse(in); } }