source: josm/trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java@ 15496

Last change on this file since 15496 was 15496, checked in by Don-vip, 4 years ago

fix #16796 - Rework of GPX track colors / layer preferences (patch by Bjoeni)

  • Property svn:eol-style set to native
File size: 11.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertNotNull;
7import static org.junit.Assert.assertTrue;
8
9import java.io.ByteArrayInputStream;
10import java.io.File;
11import java.nio.charset.StandardCharsets;
12import java.text.DateFormat;
13import java.util.Collection;
14import java.util.Iterator;
15
16import org.junit.Before;
17import org.junit.Rule;
18import org.junit.Test;
19import org.openstreetmap.josm.TestUtils;
20import org.openstreetmap.josm.actions.ExpertToggleAction;
21import org.openstreetmap.josm.data.Bounds;
22import org.openstreetmap.josm.data.coor.LatLon;
23import org.openstreetmap.josm.data.gpx.GpxConstants;
24import org.openstreetmap.josm.data.gpx.GpxData;
25import org.openstreetmap.josm.data.gpx.GpxTrack;
26import org.openstreetmap.josm.data.gpx.IGpxTrackSegment;
27import org.openstreetmap.josm.data.gpx.WayPoint;
28import org.openstreetmap.josm.data.osm.DataSet;
29import org.openstreetmap.josm.data.osm.Node;
30import org.openstreetmap.josm.data.osm.OsmPrimitive;
31import org.openstreetmap.josm.data.osm.Relation;
32import org.openstreetmap.josm.data.osm.Way;
33import org.openstreetmap.josm.gui.MainApplication;
34import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
35import org.openstreetmap.josm.io.IllegalDataException;
36import org.openstreetmap.josm.io.OsmReader;
37import org.openstreetmap.josm.testutils.JOSMTestRules;
38import org.openstreetmap.josm.testutils.mockers.ExtendedDialogMocker;
39import org.openstreetmap.josm.tools.Logging;
40import org.openstreetmap.josm.tools.date.DateUtils;
41
42import com.google.common.collect.ImmutableMap;
43
44import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
45
46/**
47 * Unit tests of {@link OsmDataLayer} class.
48 */
49public class OsmDataLayerTest {
50
51 /**
52 * Setup tests
53 */
54 @Rule
55 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
56 public JOSMTestRules test = new JOSMTestRules().projection().main();
57
58 private DataSet ds;
59 private OsmDataLayer layer;
60
61 /**
62 * Setup tests
63 */
64 @Before
65 public void setUp() {
66 ds = new DataSet();
67 layer = new OsmDataLayer(ds, "", null);
68 MainApplication.getLayerManager().addLayer(layer);
69 }
70
71 /**
72 * Unit test of {@link OsmDataLayer#setRecentRelation} and {@link OsmDataLayer#getRecentRelations}.
73 */
74 @Test
75 public void testRecentRelation() {
76 int n = OsmDataLayer.PROPERTY_RECENT_RELATIONS_NUMBER.get();
77 assertTrue(n > 0);
78 for (int i = 0; i < 2*n; i++) {
79 Relation r = new Relation(i, 1);
80 ds.addPrimitive(r);
81 layer.setRecentRelation(r);
82 }
83 assertEquals(n, layer.getRecentRelations().size());
84 for (OsmPrimitive r : ds.allPrimitives()) {
85 if (r instanceof Relation) {
86 layer.removeRecentRelation((Relation) r);
87 }
88 }
89 assertTrue(layer.getRecentRelations().isEmpty());
90 }
91
92 /**
93 * Unit test of {@link OsmDataLayer#getInfoComponent}.
94 */
95 @Test
96 public void testGetInfoComponent() {
97 assertNotNull(layer.getInfoComponent());
98
99 layer.setUploadDiscouraged(true);
100
101 fillDataSet(ds);
102
103 assertNotNull(layer.getInfoComponent());
104 }
105
106 private void fillDataSet(DataSet ds) {
107 Node n = new Node(1, 2);
108 n.setCoor(LatLon.ZERO);
109 n.setDeleted(true);
110 n.setVisible(false);
111 ds.addPrimitive(n);
112 n = new Node(2, 2);
113 n.setCoor(LatLon.ZERO);
114 ds.addPrimitive(n);
115
116 Way w = new Way(1, 2);
117 w.setDeleted(true);
118 w.setVisible(false);
119 ds.addPrimitive(w);
120 ds.addPrimitive(new Way(2, 2));
121
122 Relation r = new Relation(1, 2);
123 r.setDeleted(true);
124 r.setVisible(false);
125 ds.addPrimitive(r);
126 ds.addPrimitive(new Relation(2, 2));
127 }
128
129 /**
130 * Unit test of {@link OsmDataLayer#addLayerStateChangeListener}.
131 */
132 @Test
133 public void testLayerStateChangeListenerNull() {
134 layer.addLayerStateChangeListener(null);
135 }
136
137 /**
138 * Unit test of {@link OsmDataLayer#getIcon}.
139 */
140 @Test
141 public void testGetIcon() {
142 assertNotNull(layer.getIcon());
143 layer.setUploadDiscouraged(true);
144 assertNotNull(layer.getIcon());
145 }
146
147 /**
148 * Unit test of {@link OsmDataLayer#paint}.
149 */
150 @Test
151 public void testPaint() {
152 fillDataSet(ds);
153 assertNotNull(MainApplication.getMap());
154 layer.paint(TestUtils.newGraphics(), MainApplication.getMap().mapView, new Bounds(LatLon.ZERO));
155 }
156
157 /**
158 * Unit test of {@link OsmDataLayer#getToolTipText}.
159 */
160 @Test
161 public void testGetToolTipText() {
162 assertEquals("<html>0 nodes<br>0 ways<br>0 relations</html>", new OsmDataLayer(ds, "", null).getToolTipText());
163 fillDataSet(ds);
164 assertEquals("<html>1 node<br>1 way<br>1 relation</html>", new OsmDataLayer(ds, "", null).getToolTipText());
165 assertEquals("<html>1 node<br>1 way<br>1 relation<br>data.osm</html>", new OsmDataLayer(ds, "", new File("data.osm")).getToolTipText());
166 }
167
168 /**
169 * Unit test of {@link OsmDataLayer#mergeFrom}.
170 */
171 @Test
172 public void testMergeFrom() {
173 fillDataSet(ds);
174 OsmDataLayer layer2 = new OsmDataLayer(new DataSet(), "", null);
175 MainApplication.getLayerManager().addLayer(layer2);
176 assertTrue(layer2.data.allPrimitives().isEmpty());
177 assertTrue(layer2.isMergable(layer));
178 layer2.mergeFrom(layer);
179 assertEquals(6, layer2.data.allPrimitives().size());
180 layer.setUploadDiscouraged(true);
181 layer2.mergeFrom(layer);
182 assertTrue(layer2.isUploadDiscouraged());
183 }
184
185 /**
186 * Unit test of {@link OsmDataLayer#cleanupAfterUpload}.
187 */
188 @Test
189 public void testCleanupAfterUpload() {
190 fillDataSet(ds);
191 assertEquals(6, layer.data.allPrimitives().size());
192 layer.cleanupAfterUpload(ds.allPrimitives());
193 assertEquals(3, layer.data.allPrimitives().size());
194 }
195
196 /**
197 * Unit test of {@link OsmDataLayer#getMenuEntries}.
198 */
199 @Test
200 public void testGetMenuEntries() {
201 ExpertToggleAction.getInstance().setExpert(true);
202 assertEquals(16, layer.getMenuEntries().length);
203
204 ExpertToggleAction.getInstance().setExpert(false);
205 assertEquals(13, layer.getMenuEntries().length);
206 }
207
208 /**
209 * Unit test of {@link OsmDataLayer#toGpxData}.
210 * @throws IllegalDataException never
211 */
212 @Test
213 public void testToGpxData() throws IllegalDataException {
214 ds.mergeFrom(OsmReader.parseDataSet(new ByteArrayInputStream((
215 "<?xml version='1.0' encoding='UTF-8'?>\n" +
216 "<osm version='0.6' upload='false' generator='JOSM'>\n" +
217 " <node id='-546306' timestamp='2018-08-01T10:00:00Z' lat='47.0' lon='9.0'>\n" +
218 " <tag k='gpx:ele' v='123' />\n" +
219 " <tag k='gpx:time' v='2018-08-01T10:00:00Z' />\n" +
220 " </node>\n" +
221 " <node id='-546307' timestamp='2018-08-01T10:01:00Z' lat='47.1' lon='9.1'>\n" +
222 " <tag k='ele' v='456' />\n" +
223 " <tag k='gpx:time' v='2018-08-01T10:01:00Z' />\n" +
224 " </node>\n" +
225 " <node id='-546308' timestamp='2018-08-01T10:02:00Z' lat='47.05' lon='9.05'>\n" +
226 " <tag k='ele' v='789' />\n" +
227 " </node>\n" +
228 " <way id='-546309'>\n" +
229 " <nd ref='-546306' />\n" +
230 " <nd ref='-546307' />\n" +
231 " <nd ref='-546308' />\n" +
232 " </way>\r\n" +
233 "</osm>").getBytes(StandardCharsets.UTF_8)), null));
234 GpxData gpx = layer.toGpxData();
235 assertNotNull(gpx);
236 // Check metadata
237 assertEquals(new Bounds(47.0, 9.0, 47.1, 9.1), gpx.recalculateBounds());
238 // Check there is no waypoint
239 assertTrue(gpx.getWaypoints().isEmpty());
240 // Check that track is correct
241 assertEquals(1, gpx.getTrackCount());
242 GpxTrack track = gpx.getTracks().iterator().next();
243 Collection<IGpxTrackSegment> segments = track.getSegments();
244 assertEquals(1, segments.size());
245 Collection<WayPoint> trackpoints = segments.iterator().next().getWayPoints();
246 assertEquals(3, trackpoints.size());
247 Iterator<WayPoint> it = trackpoints.iterator();
248 DateFormat gpxFormat = DateUtils.getGpxFormat();
249 WayPoint p1 = it.next();
250 assertEquals(new LatLon(47.0, 9.0), p1.getCoor());
251 assertEquals("123", p1.get(GpxConstants.PT_ELE));
252 assertEquals("2018-08-01T10:00:00.000Z", gpxFormat.format(p1.get(GpxConstants.PT_TIME)));
253 WayPoint p2 = it.next();
254 assertEquals(new LatLon(47.1, 9.1), p2.getCoor());
255 assertEquals("456", p2.get(GpxConstants.PT_ELE));
256 assertEquals("2018-08-01T10:01:00.000Z", gpxFormat.format(p2.get(GpxConstants.PT_TIME)));
257 WayPoint p3 = it.next();
258 assertEquals(new LatLon(47.05, 9.05), p3.getCoor());
259 assertEquals("789", p3.get(GpxConstants.PT_ELE));
260 assertEquals("2018-08-01T10:02:00.000Z", gpxFormat.format(p3.get(GpxConstants.PT_TIME)));
261 }
262
263 /**
264 * Unit test of {@link OsmDataLayer#containsPoint}.
265 */
266 @Test
267 public void testContainsPoint() {
268 fillDataSet(ds);
269 assertTrue(layer.containsPoint(LatLon.ZERO));
270 }
271
272 /**
273 * Unit test of {@link OsmDataLayer#isModified}.
274 */
275 @Test
276 public void testIsModified() {
277 assertFalse(layer.isModified());
278 fillDataSet(ds);
279 assertTrue(layer.isModified());
280 }
281
282 /**
283 * Unit test of {@link OsmDataLayer#projectionChanged}.
284 */
285 @Test
286 public void testProjectionChanged() {
287 layer.projectionChanged(null, null);
288 }
289
290 /**
291 * Unit test of {@link OsmDataLayer#checkSaveConditions}.
292 */
293 @Test
294 public void testCheckSaveConditions() {
295 TestUtils.assumeWorkingJMockit();
296 final ExtendedDialogMocker edMocker = new ExtendedDialogMocker(
297 ImmutableMap.<String, Object>of("The document contains no data.", "Cancel")
298 );
299
300 assertFalse(layer.checkSaveConditions());
301 fillDataSet(ds);
302 assertTrue(layer.checkSaveConditions());
303
304 assertEquals(1, edMocker.getInvocationLog().size());
305 Object[] invocationLogEntry = edMocker.getInvocationLog().get(0);
306 assertEquals(2, (int) invocationLogEntry[0]);
307 assertEquals("Empty document", invocationLogEntry[2]);
308 }
309
310 /**
311 * Checks that unnamed layer number increases
312 */
313 @Test
314 public void testLayerNameIncreases() {
315 final OsmDataLayer layer1 = new OsmDataLayer(new DataSet(), OsmDataLayer.createLayerName(147), null);
316 final OsmDataLayer layer2 = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
317 assertEquals("Data Layer 147", layer1.getName());
318 assertEquals("Data Layer 148", layer2.getName());
319 }
320
321 /**
322 * Checks that named layer got no number
323 */
324 @Test
325 public void testLayerUnnumberedName() {
326 final OsmDataLayer layer = new OsmDataLayer(new DataSet(), "Data Layer ", null);
327 assertEquals("Data Layer ", layer.getName());
328 }
329
330 /**
331 * Non-regression test for ticket #13985
332 */
333 @Test
334 public void testLayerNameDoesFinish() {
335 final OsmDataLayer layer = new OsmDataLayer(new DataSet(), "Data Layer from GeoJSON: foo.geojson", null);
336 assertEquals("Data Layer from GeoJSON: foo.geojson", layer.getName());
337 }
338
339 /**
340 * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/17065">#17065</a>.
341 */
342 @Test
343 public void testTicket17065() {
344 ClipboardUtils.clear();
345 Logging.clearLastErrorAndWarnings();
346 new OsmDataLayer(new DataSet(), null, null).destroy();
347 assertTrue(Logging.getLastErrorAndWarnings().stream().noneMatch(s -> s.contains("UnsupportedFlavorException")));
348 }
349}
Note: See TracBrowser for help on using the repository browser.