// 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.ArrayList; 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.Node; import org.openstreetmap.osmosis.core.domain.v0_6.OsmUser; import org.openstreetmap.osmosis.core.domain.v0_6.Tag; /** * Tests the XML node writer implementation. */ public class NodeWriterTest { private StringWriter testWriter; private BufferedWriter testBufferedWriter; private NodeWriter testNodeWriter; 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 nodeOpeningMatch = "^\\s*<node\\s*" + "id=['\"]1234['\"]\\s*" + "version=['\"]2['\"]\\s*" + "timestamp=['\"]2013-10-07T10:24:31Z?['\"]\\s*" + "uid=['\"]23['\"]\\s*" + "user=['\"]someuser['\"]\\s*" + "lat=['\"]20.1234568['\"]\\s*" + "lon=['\"]-21.9876543['\"]\\s*" + ">\\s*"; private final String nodeTagMatch = "\\s*<tag\\s*" + "k=['\"]nodekey['\"]\\s*" + "v=['\"]nodevalue['\"]\\s*/>\\s*"; private final String nodeClosingMatch = "\\s*</node>\\s*$"; /** * Performs pre-test activities. */ @Before public void setUp() { testWriter = new StringWriter(); testBufferedWriter = new BufferedWriter(testWriter); testNodeWriter = new NodeWriter("node", 2); testNodeWriter.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 Node element. */ @Test public final void testProcessNormalNode() { Node node = new Node( new CommonEntityData(1234, 2, timestamp, new OsmUser(23, "someuser"), 0), 20.12345678, -21.98765432); node.getTags().add(new Tag("nodekey", "nodevalue")); testNodeWriter.process(node); try { testBufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); fail("IOException"); } String [] strArray = testWriter.toString().split("\\n", 3); assertTrue("Node opening element does not match.", strArray[0].matches(nodeOpeningMatch)); assertTrue("Node tag does not match.", strArray[1].matches(nodeTagMatch)); assertTrue("Node closing element does not match.", strArray[2].matches(nodeClosingMatch)); } /** * Test writing out a Node element with no tags. */ @Test public final void testProcessNodeNoTags() { testNodeWriter.process( new Node( new CommonEntityData( 1234, 2, timestamp, new OsmUser(23, "someuser"), 0, new ArrayList<Tag>()), 20.12345678, -21.98765432)); try { testBufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); fail("IOException"); } String regexMatch = "^\\s*<node\\s*" + "id=['\"]1234['\"]\\s*" + "version=['\"]2['\"]\\s*" + "timestamp=['\"]2013-10-07T10:24:31Z?['\"]\\s*" + "uid=['\"]23['\"]\\s*" + "user=['\"]someuser['\"]\\s*" + "lat=['\"]20.1234568['\"]\\s*" + "lon=['\"]-21.9876543['\"]\\s*" + "/>\\s*$"; assertTrue(testWriter.toString().matches(regexMatch)); } /** * Test writing of a Node element with no user. */ @Test public final void testProcessNodeWithNoUser() { Node node = new Node(new CommonEntityData(1234, 2, timestamp, OsmUser.NONE, 0), 20.12345678, -21.98765432); node.getTags().add(new Tag("nodekey", "nodevalue")); testNodeWriter.process(node); try { testBufferedWriter.flush(); } catch (IOException e) { e.printStackTrace(); fail("IOException"); } String nodeOpeningNoUserMatch = "^\\s*<node\\s*" + "id=['\"]1234['\"]\\s*" + "version=['\"]2['\"]\\s*" + "timestamp=['\"]2013-10-07T10:24:31Z?['\"]\\s*" + "lat=['\"]20.1234568['\"]\\s*" + "lon=['\"]-21.9876543['\"]\\s*" + ">\\s*"; String [] strArray = testWriter.toString().split("\\n", 3); assertTrue("Node opening element does not match.", strArray[0].matches(nodeOpeningNoUserMatch)); assertTrue("Node tag does not match.", strArray[1].matches(nodeTagMatch)); assertTrue("Node closing element does not match.", strArray[2].matches(nodeClosingMatch)); } }