// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.io.session; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; import org.openstreetmap.josm.JOSMFixture; import org.openstreetmap.josm.data.coor.EastNorth; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.data.gpx.WayPoint; import org.openstreetmap.josm.data.imagery.ImageryInfo; import org.openstreetmap.josm.data.notes.Note; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.ImageryLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.NoteLayer; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.gui.layer.TMSLayer; import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference; import org.openstreetmap.josm.tools.MultiMap; import org.openstreetmap.josm.tools.Utils; /** * Unit tests for Session writing. */ public class SessionWriterTest { protected static final class OsmHeadlessJosExporter extends OsmDataSessionExporter { public OsmHeadlessJosExporter(OsmDataLayer layer) { super(layer); } @Override public boolean requiresZip() { return false; } } protected static final class OsmHeadlessJozExporter extends OsmDataSessionExporter { public OsmHeadlessJozExporter(OsmDataLayer layer) { super(layer); } @Override public boolean requiresZip() { return true; } } protected static final class GpxHeadlessJosExporter extends GpxTracksSessionExporter { public GpxHeadlessJosExporter(GpxLayer layer) { super(layer); } @Override public boolean requiresZip() { return false; } } protected static final class GpxHeadlessJozExporter extends GpxTracksSessionExporter { public GpxHeadlessJozExporter(GpxLayer layer) { super(layer); } @Override public boolean requiresZip() { return true; } } /** * Setup tests. */ @BeforeClass public static void setUpBeforeClass() { JOSMFixture.createUnitTestFixture().init(true); ProjectionPreference.setProjection(); } private void testWrite(List<Layer> layers, final boolean zip) throws IOException { Map<Layer, SessionLayerExporter> exporters = new HashMap<>(); if (zip) { SessionWriter.registerSessionLayerExporter(OsmDataLayer.class, OsmHeadlessJozExporter.class); SessionWriter.registerSessionLayerExporter(GpxLayer.class, GpxHeadlessJozExporter.class); } else { SessionWriter.registerSessionLayerExporter(OsmDataLayer.class, OsmHeadlessJosExporter.class); SessionWriter.registerSessionLayerExporter(GpxLayer.class, GpxHeadlessJosExporter.class); } for (final Layer l : layers) { exporters.put(l, SessionWriter.getSessionLayerExporter(l)); } SessionWriter sw = new SessionWriter(layers, -1, exporters, new MultiMap<Layer, Layer>(), zip); File file = new File(System.getProperty("java.io.tmpdir"), getClass().getName()+(zip ? ".joz" : ".jos")); try { sw.write(file); } finally { if (file.exists()) { Utils.deleteFile(file); } } } private OsmDataLayer createOsmLayer() { OsmDataLayer layer = new OsmDataLayer(new DataSet(), "OSM layer name", null); layer.setAssociatedFile(new File("data.osm")); return layer; } private GpxLayer createGpxLayer() { GpxData data = new GpxData(); data.waypoints.add(new WayPoint(new LatLon(42.72665, -0.00747))); data.waypoints.add(new WayPoint(new LatLon(42.72659, -0.00749))); GpxLayer layer = new GpxLayer(data, "GPX layer name"); layer.setAssociatedFile(new File("data.gpx")); return layer; } private MarkerLayer createMarkerLayer(GpxLayer gpx) { return new MarkerLayer(gpx.data, "Marker layer name", gpx.getAssociatedFile(), gpx); } private ImageryLayer createImageryLayer() { TMSLayer layer = new TMSLayer(new ImageryInfo("the name", "http://www.url.com/")); layer.getDisplaySettings().setDisplacement(new EastNorth(12, 34)); return layer; } private NoteLayer createNoteLayer() { return new NoteLayer(Arrays.asList(new Note(LatLon.ZERO)), "layer name"); } /** * Tests to write an empty .jos file. * @throws IOException if an I/O error occurs */ @Test public void testWriteEmptyJos() throws IOException { testWrite(Collections.<Layer>emptyList(), false); } /** * Tests to write an empty .joz file. * @throws IOException if an I/O error occurs */ @Test public void testWriteEmptyJoz() throws IOException { testWrite(Collections.<Layer>emptyList(), true); } /** * Tests to write a .jos file containing OSM data. * @throws IOException if an I/O error occurs */ @Test public void testWriteOsmJos() throws IOException { testWrite(Collections.<Layer>singletonList(createOsmLayer()), false); } /** * Tests to write a .joz file containing OSM data. * @throws IOException if an I/O error occurs */ @Test public void testWriteOsmJoz() throws IOException { testWrite(Collections.<Layer>singletonList(createOsmLayer()), true); } /** * Tests to write a .jos file containing GPX data. * @throws IOException if an I/O error occurs */ @Test public void testWriteGpxJos() throws IOException { testWrite(Collections.<Layer>singletonList(createGpxLayer()), false); } /** * Tests to write a .joz file containing GPX data. * @throws IOException if an I/O error occurs */ @Test public void testWriteGpxJoz() throws IOException { testWrite(Collections.<Layer>singletonList(createGpxLayer()), true); } /** * Tests to write a .joz file containing GPX and marker data. * @throws IOException if an I/O error occurs */ @Test public void testWriteGpxAndMarkerJoz() throws IOException { GpxLayer gpx = createGpxLayer(); testWrite(Arrays.asList(gpx, createMarkerLayer(gpx)), true); } /** * Tests to write a .joz file containing an imagery layer. * @throws IOException if an I/O error occurs */ @Test public void testWriteImageryLayer() throws IOException { final Layer layer = createImageryLayer(); testWrite(Collections.singletonList(layer), true); } /** * Tests to write a .joz file containing a note layer. * @throws IOException if an I/O error occurs */ @Test public void testWriteNoteLayer() throws IOException { final Layer layer = createNoteLayer(); testWrite(Collections.singletonList(layer), true); } }