// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.xml.v0_6.impl; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.BufferedWriter; import java.io.IOException; import java.io.StringWriter; import java.util.Calendar; import java.util.Date; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openstreetmap.osmosis.core.domain.v0_6.CommonEntityData; import org.openstreetmap.osmosis.core.domain.v0_6.OsmUser; import org.openstreetmap.osmosis.core.domain.v0_6.Tag; import org.openstreetmap.osmosis.core.domain.v0_6.Way; import org.openstreetmap.osmosis.core.domain.v0_6.WayNode; /** * Tests the XML way writer implementation. */ public class WayWriterTest { private StringWriter testWriter; private BufferedWriter testBufferedWriter; private WayWriter testWayWriter; private Date timestamp; // If any tests fail, it could be because the regexes have broken. There are a number of // variations which are valid XML which the regexes won't catch. They might need any number of // \\s* to account for variable whitespace, or the order of attributes may have shifted. private final String wayOpeningMatch = "^\\s*<way\\s*" + "id=['\"]1234['\"]\\s*" + "version=['\"]2['\"]\\s*" + "timestamp=['\"]2013-10-07T10:24:31Z?['\"]\\s*" + "uid=['\"]23['\"]\\s*" + "user=['\"]someuser['\"]\\s*" + ">\\s*"; private final String wayNode1Match = "\\s*<nd\\s*ref=['\"]1235['\"]\\s*/>\\s*"; private final String wayNode2Match = "\\s*<nd\\s*ref=['\"]1236['\"]\\s*/>\\s*"; private final String wayTagMatch = "\\s*<tag\\s*k=['\"]waykey['\"]\\s*v=['\"]wayvalue['\"]\\s*/>\\s*"; private final String wayClosingMatch = "\\s*</way>\\s*$"; /** * Performs pre-test activities. */ @Before public void setUp() { testWriter = new StringWriter(); testBufferedWriter = new BufferedWriter(testWriter); testWayWriter = new WayWriter("way", 2); testWayWriter.setWriter(testBufferedWriter); Calendar calendar; calendar = Calendar.getInstance(); calendar.set(Calendar.ZONE_OFFSET, 0); calendar.set(Calendar.DST_OFFSET, 0); calendar.set(Calendar.YEAR, 2013); calendar.set(Calendar.MONTH, Calendar.OCTOBER); calendar.set(Calendar.DAY_OF_MONTH, 7); calendar.set(Calendar.HOUR_OF_DAY, 10); calendar.set(Calendar.MINUTE, 24); calendar.set(Calendar.SECOND, 31); calendar.set(Calendar.MILLISECOND, 0); timestamp = calendar.getTime(); } /** * Performs post-test activities. * * @throws IOException * if stream cleanup fails. */ @After public void tearDown() throws IOException { testBufferedWriter.close(); testWriter.close(); } /** * Test writing out a normal Way element. */ @Test public final void testProcessNormalWay() { Way way = new Way(new CommonEntityData(1234, 2, timestamp, new OsmUser(23, "someuser"), 0)); way.getWayNodes().add(new WayNode(1235)); way.getWayNodes().add(new WayNode(1236)); way.getTags().add(new Tag("waykey", "wayvalue")); testWayWriter.process(way); try { testBufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); fail("IOException"); } String [] strArray = testWriter.toString().split("\\n", 5); assertTrue("Way opening element does not match.", strArray[0].matches(wayOpeningMatch)); assertTrue("Way node 1 does not match.", strArray[1].matches(wayNode1Match)); assertTrue("Way node 2 does not match.", strArray[2].matches(wayNode2Match)); assertTrue("Way tag does not match.", strArray[3].matches(wayTagMatch)); assertTrue("Way closing element does not match.", strArray[4].matches(wayClosingMatch)); } /** * Test writing of a Way element with no user. */ @Test public final void testProcessWayWithNoUser() { Way way = new Way(new CommonEntityData(1234, 2, timestamp, OsmUser.NONE, 0)); way.getWayNodes().add(new WayNode(1235)); way.getWayNodes().add(new WayNode(1236)); way.getTags().add(new Tag("waykey", "wayvalue")); testWayWriter.process(way); try { testBufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); fail("IOException"); } String wayOpeningNoUserMatch = "^\\s*<way\\s*" + "id=['\"]1234['\"]\\s*" + "version=['\"]2['\"]\\s*" + "timestamp=['\"]2013-10-07T10:24:31Z?['\"]\\s*" + ">\\s*"; String [] strArray = testWriter.toString().split("\\n", 5); assertTrue("Way opening element does not match.", strArray[0].matches(wayOpeningNoUserMatch)); assertTrue("Way node 1 does not match.", strArray[1].matches(wayNode1Match)); assertTrue("Way node 2 does not match.", strArray[2].matches(wayNode2Match)); assertTrue("Way tag does not match.", strArray[3].matches(wayTagMatch)); assertTrue("Way closing element does not match.", strArray[4].matches(wayClosingMatch)); } /** * Test writing out a Way element with no tags. */ @Test public final void testProcessWayNoTags() { Way way = new Way(new CommonEntityData(1234, 2, timestamp, new OsmUser(23, "someuser"), 0)); way.getWayNodes().add(new WayNode(1235)); way.getWayNodes().add(new WayNode(1236)); testWayWriter.process(way); try { testBufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); fail("IOException"); } String [] strArray = testWriter.toString().split("\\n", 4); assertTrue("Way opening element does not match.", strArray[0].matches(wayOpeningMatch)); assertTrue("Way node 1 does not match.", strArray[1].matches(wayNode1Match)); assertTrue("Way node 2 does not match.", strArray[2].matches(wayNode2Match)); assertTrue("Way closing element does not match.", strArray[3].matches(wayClosingMatch)); } }