source: josm/trunk/test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java@ 13079

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

see #15560 - EqualsVerifier does not work with newer Java versions -> disable tests automatically in this case
Workaround to https://github.com/jqno/equalsverifier/issues/177 / https://github.com/raphw/byte-buddy/issues/370
Inspired by https://issues.apache.org/jira/browse/SOLR-11606

  • Property svn:eol-style set to native
File size: 15.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.gpx;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertNotNull;
7import static org.junit.Assert.assertNull;
8import static org.junit.Assert.assertTrue;
9
10import java.util.ArrayList;
11import java.util.Arrays;
12import java.util.Collections;
13import java.util.Date;
14import java.util.List;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17
18import org.junit.Before;
19import org.junit.Rule;
20import org.junit.Test;
21import org.openstreetmap.josm.Main;
22import org.openstreetmap.josm.TestUtils;
23import org.openstreetmap.josm.data.Bounds;
24import org.openstreetmap.josm.data.DataSource;
25import org.openstreetmap.josm.data.coor.EastNorth;
26import org.openstreetmap.josm.data.coor.LatLon;
27import org.openstreetmap.josm.data.gpx.GpxData.GpxDataChangeEvent;
28import org.openstreetmap.josm.data.gpx.GpxData.GpxDataChangeListener;
29import org.openstreetmap.josm.testutils.JOSMTestRules;
30import org.openstreetmap.josm.tools.ListenerList;
31
32import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
33import nl.jqno.equalsverifier.EqualsVerifier;
34
35/**
36 * Unit tests for class {@link GpxData}.
37 */
38public class GpxDataTest {
39
40 /**
41 * Setup test.
42 */
43 @Rule
44 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
45 public JOSMTestRules test = new JOSMTestRules().projection();
46
47 private GpxData data;
48
49 /**
50 * Set up empty test data
51 */
52 @Before
53 public void setUp() {
54 data = new GpxData();
55 }
56
57
58 /**
59 * Test method for {@link GpxData#mergeFrom(GpxData)}.
60 */
61 @Test
62 public void testMergeFrom() {
63 ImmutableGpxTrack track = singleWaypointGpxTrack();
64 GpxRoute route = singleWaypointRoute();
65 WayPoint newWP = new WayPoint(LatLon.NORTH_POLE);
66 WayPoint existingWP = new WayPoint(LatLon.SOUTH_POLE);
67
68 GpxData dataToMerge = new GpxData();
69 dataToMerge.addTrack(track);
70 dataToMerge.addRoute(route);
71 dataToMerge.addWaypoint(newWP);
72
73 data.addWaypoint(existingWP);
74 data.mergeFrom(dataToMerge);
75
76 assertEquals(1, data.getTracks().size());
77 assertEquals(1, data.getRoutes().size());
78 assertEquals(2, data.getWaypoints().size());
79
80 assertTrue(data.getTracks().contains(track));
81 assertTrue(data.getRoutes().contains(route));
82 assertTrue(data.getWaypoints().contains(newWP));
83 assertTrue(data.getWaypoints().contains(existingWP));
84 }
85
86 /**
87 * Test method for {@link GpxData#getTracks()}, {@link GpxData#addTrack(GpxTrack)}, {@link GpxData#removeTrack(GpxTrack)}.
88 */
89 @Test
90 public void testTracks() {
91 assertEquals(0, data.getTracks().size());
92
93 ImmutableGpxTrack track1 = emptyGpxTrack();
94 ImmutableGpxTrack track2 = singleWaypointGpxTrack();
95 data.addTrack(track1);
96 assertEquals(1, data.getTracks().size());
97 data.addTrack(track2);
98 assertEquals(2, data.getTracks().size());
99 assertTrue(data.getTracks().contains(track1));
100 assertTrue(data.getTracks().contains(track2));
101
102 data.removeTrack(track1);
103 assertEquals(1, data.getTracks().size());
104 assertFalse(data.getTracks().contains(track1));
105 assertTrue(data.getTracks().contains(track2));
106 }
107
108 /**
109 * Test method for {@link GpxData#addTrack(GpxTrack)}.
110 */
111 @Test(expected = IllegalArgumentException.class)
112 public void testAddTrackFails() {
113 ImmutableGpxTrack track1 = emptyGpxTrack();
114 data.addTrack(track1);
115 data.addTrack(track1);
116 }
117
118 /**
119 * Test method for {@link GpxData#removeTrack(GpxTrack)}.
120 */
121 @Test(expected = IllegalArgumentException.class)
122 public void testRemoveTrackFails() {
123 ImmutableGpxTrack track1 = emptyGpxTrack();
124 data.addTrack(track1);
125 data.removeTrack(track1);
126 data.removeTrack(track1);
127 }
128
129 /**
130 * Test method for {@link GpxData#getRoutes()}, {@link GpxData#addRoute(GpxRoute)}, {@link GpxData#removeRoute(GpxRoute)}.
131 */
132 @Test
133 public void testRoutes() {
134 assertEquals(0, data.getTracks().size());
135
136 GpxRoute route1 = new GpxRoute();
137 GpxRoute route2 = new GpxRoute();
138 route2.routePoints.add(new WayPoint(LatLon.NORTH_POLE));
139 data.addRoute(route1);
140 assertEquals(1, data.getRoutes().size());
141 data.addRoute(route2);
142 assertEquals(2, data.getRoutes().size());
143 assertTrue(data.getRoutes().contains(route1));
144 assertTrue(data.getRoutes().contains(route2));
145
146 data.removeRoute(route1);
147 assertEquals(1, data.getRoutes().size());
148 assertFalse(data.getRoutes().contains(route1));
149 assertTrue(data.getRoutes().contains(route2));
150 }
151
152 /**
153 * Test method for {@link GpxData#addRoute(GpxRoute)}.
154 */
155 @Test(expected = IllegalArgumentException.class)
156 public void testAddRouteFails() {
157 GpxRoute route1 = new GpxRoute();
158 data.addRoute(route1);
159 data.addRoute(route1);
160 }
161
162 /**
163 * Test method for {@link GpxData#removeRoute(GpxRoute)}.
164 */
165 @Test(expected = IllegalArgumentException.class)
166 public void testRemoveRouteFails() {
167 GpxRoute route1 = new GpxRoute();
168 data.addRoute(route1);
169 data.removeRoute(route1);
170 data.removeRoute(route1);
171 }
172
173 /**
174 * Test method for {@link GpxData#getWaypoints()}, {@link GpxData#addWaypoint(WayPoint)}, {@link GpxData#removeWaypoint(WayPoint)}.
175 */
176 @Test
177 public void testWaypoints() {
178 assertEquals(0, data.getTracks().size());
179
180 WayPoint waypoint1 = new WayPoint(LatLon.ZERO);
181 WayPoint waypoint2 = new WayPoint(LatLon.NORTH_POLE);
182 data.addWaypoint(waypoint1);
183 assertEquals(1, data.getWaypoints().size());
184 data.addWaypoint(waypoint2);
185 assertEquals(2, data.getWaypoints().size());
186 assertTrue(data.getWaypoints().contains(waypoint1));
187 assertTrue(data.getWaypoints().contains(waypoint2));
188
189 data.removeWaypoint(waypoint1);
190 assertEquals(1, data.getWaypoints().size());
191 assertFalse(data.getWaypoints().contains(waypoint1));
192 assertTrue(data.getWaypoints().contains(waypoint2));
193 }
194
195 /**
196 * Test method for {@link GpxData#addWaypoint(WayPoint)}.
197 */
198 @Test(expected = IllegalArgumentException.class)
199 public void testAddWaypointFails() {
200 WayPoint waypoint1 = new WayPoint(LatLon.ZERO);
201 data.addWaypoint(waypoint1);
202 data.addWaypoint(waypoint1);
203 }
204
205 /**
206 * Test method for {@link GpxData#removeWaypoint(WayPoint)}.
207 */
208 @Test(expected = IllegalArgumentException.class)
209 public void testRemoveWaypointFails() {
210 WayPoint waypoint1 = new WayPoint(LatLon.ZERO);
211 data.addWaypoint(waypoint1);
212 data.removeWaypoint(waypoint1);
213 data.removeWaypoint(waypoint1);
214 }
215
216 /**
217 * Test method for {@link GpxData#hasTrackPoints()}.
218 */
219 @Test
220 public void testHasTrackPoints() {
221 assertFalse(data.hasTrackPoints());
222 ImmutableGpxTrack track1 = emptyGpxTrack();
223 data.addTrack(track1);
224 assertFalse(data.hasTrackPoints());
225 ImmutableGpxTrack track2 = singleWaypointGpxTrack();
226 data.addTrack(track2);
227 assertTrue(data.hasTrackPoints());
228 }
229
230 /**
231 * Test method for {@link GpxData#getTrackPoints()}.
232 */
233 @Test
234 public void testGetTrackPoints() {
235 assertEquals(0, data.getTrackPoints().count());
236 ImmutableGpxTrack track1 = singleWaypointGpxTrack();
237 data.addTrack(track1);
238 assertEquals(1, data.getTrackPoints().count());
239 ImmutableGpxTrack track2 = singleWaypointGpxTrack();
240 data.addTrack(track2);
241 assertEquals(2, data.getTrackPoints().count());
242 }
243
244 /**
245 * Test method for {@link GpxData#hasRoutePoints()}.
246 */
247 @Test
248 public void testHasRoutePoints() {
249
250 }
251
252 /**
253 * Test method for {@link GpxData#isEmpty()}.
254 */
255 @Test
256 public void testIsEmpty() {
257 ImmutableGpxTrack track1 = singleWaypointGpxTrack();
258 WayPoint waypoint = new WayPoint(LatLon.ZERO);
259 GpxRoute route = singleWaypointRoute();
260
261 assertTrue(data.isEmpty());
262
263 data.addTrack(track1);
264 assertFalse(data.isEmpty());
265 data.removeTrack(track1);
266 assertTrue(data.isEmpty());
267
268 data.addWaypoint(waypoint);
269 assertFalse(data.isEmpty());
270 data.removeWaypoint(waypoint);
271 assertTrue(data.isEmpty());
272
273 data.addRoute(route);
274 assertFalse(data.isEmpty());
275 data.removeRoute(route);
276 assertTrue(data.isEmpty());
277 }
278
279 /**
280 * Test method for {@link GpxData#length()}.
281 */
282 @Test
283 public void testLength() {
284 ImmutableGpxTrack track1 = waypointGpxTrack(
285 new WayPoint(new LatLon(0, 0)),
286 new WayPoint(new LatLon(1, 1)),
287 new WayPoint(new LatLon(0, 2)));
288 ImmutableGpxTrack track2 = waypointGpxTrack(
289 new WayPoint(new LatLon(0, 0)),
290 new WayPoint(new LatLon(-1, 1)));
291 data.addTrack(track1);
292 data.addTrack(track2);
293 assertEquals(3 * new LatLon(0, 0).greatCircleDistance(new LatLon(1, 1)), data.length(), 1);
294
295 }
296
297 /**
298 * Test method for {@link GpxData#getMinMaxTimeForAllTracks()}.
299 */
300 @Test
301 public void testGetMinMaxTimeForAllTracks() {
302 assertEquals(0, data.getMinMaxTimeForAllTracks().length);
303
304 WayPoint p1 = new WayPoint(LatLon.NORTH_POLE);
305 WayPoint p2 = new WayPoint(LatLon.NORTH_POLE);
306 WayPoint p3 = new WayPoint(LatLon.NORTH_POLE);
307 WayPoint p4 = new WayPoint(LatLon.NORTH_POLE);
308 WayPoint p5 = new WayPoint(LatLon.NORTH_POLE);
309 p1.setTime(new Date(200020));
310 p2.setTime(new Date(100020));
311 p4.setTime(new Date(500020));
312 data.addTrack(new ImmutableGpxTrack(Arrays.asList(Arrays.asList(p1, p2)), Collections.emptyMap()));
313 data.addTrack(new ImmutableGpxTrack(Arrays.asList(Arrays.asList(p3, p4, p5)), Collections.emptyMap()));
314
315 Date[] times = data.getMinMaxTimeForAllTracks();
316 assertEquals(times.length, 2);
317 assertEquals(new Date(100020), times[0]);
318 assertEquals(new Date(500020), times[1]);
319 }
320
321 /**
322 * Test method for {@link GpxData#nearestPointOnTrack(org.openstreetmap.josm.data.coor.EastNorth, double)}.
323 */
324 @Test
325 public void testNearestPointOnTrack() {
326 List<WayPoint> points = Stream
327 .of(new EastNorth(10, 10), new EastNorth(10, 0), new EastNorth(-1, 0))
328 .map(Main.getProjection()::eastNorth2latlon)
329 .map(WayPoint::new)
330 .collect(Collectors.toList());
331 data.addTrack(new ImmutableGpxTrack(Arrays.asList(points), Collections.emptyMap()));
332
333 WayPoint closeToMiddle = data.nearestPointOnTrack(new EastNorth(10, 0), 10);
334 assertEquals(points.get(1), closeToMiddle);
335
336 WayPoint close = data.nearestPointOnTrack(new EastNorth(5, 5), 10);
337 assertEquals(10, close.getEastNorth(Main.getProjection()).east(), .01);
338 assertEquals(5, close.getEastNorth(Main.getProjection()).north(), .01);
339
340 close = data.nearestPointOnTrack(new EastNorth(15, 5), 10);
341 assertEquals(10, close.getEastNorth(Main.getProjection()).east(), .01);
342 assertEquals(5, close.getEastNorth(Main.getProjection()).north(), .01);
343
344 assertNull(data.nearestPointOnTrack(new EastNorth(5, 5), 1));
345 }
346
347 /**
348 * Test method for {@link GpxData#getDataSources()}.
349 */
350 @Test
351 public void testGetDataSources() {
352 DataSource ds = new DataSource(new Bounds(0, 0, 1, 1), "test");
353 data.dataSources.add(ds);
354 assertEquals(new ArrayList<>(Arrays.asList(ds)), new ArrayList<>(data.getDataSources()));
355 }
356
357 /**
358 * Test method for {@link GpxData#getDataSourceArea()}.
359 */
360 @Test
361 public void testGetDataSourceArea() {
362 DataSource ds = new DataSource(new Bounds(0, 0, 1, 1), "test");
363 data.dataSources.add(ds);
364 assertNotNull(data.getDataSourceArea());
365 assertTrue(data.getDataSourceArea().contains(0.5, 0.5));
366 assertFalse(data.getDataSourceArea().contains(0.5, 1.5));
367 }
368
369 /**
370 * Test method for {@link GpxData#getDataSourceBounds()}.
371 */
372 @Test
373 public void testGetDataSourceBounds() {
374 Bounds bounds = new Bounds(0, 0, 1, 1);
375 DataSource ds = new DataSource(bounds, "test");
376 data.dataSources.add(ds);
377 assertEquals(Arrays.asList(bounds), data.getDataSourceBounds());
378 }
379
380 /**
381 * Test method for {@link GpxData#addChangeListener(GpxData.GpxDataChangeListener)},
382 * {@link GpxData#addWeakChangeListener(GpxData.GpxDataChangeListener)},
383 * {@link GpxData#removeChangeListener(GpxData.GpxDataChangeListener)}.
384 */
385 @Test
386 public void testChangeListener() {
387 TestChangeListener cl1 = new TestChangeListener();
388 TestChangeListener cl2 = new TestChangeListener();
389
390 data.addChangeListener(cl1);
391 data.addWeakChangeListener(cl2);
392 assertNull(cl1.lastEvent);
393 assertNull(cl2.lastEvent);
394
395 data.addTrack(singleWaypointGpxTrack());
396 assertEquals(data, cl1.lastEvent.getSource());
397 assertEquals(data, cl2.lastEvent.getSource());
398 cl1.lastEvent = null;
399 cl2.lastEvent = null;
400
401 data.addRoute(singleWaypointRoute());
402 assertEquals(data, cl1.lastEvent.getSource());
403 assertEquals(data, cl2.lastEvent.getSource());
404 cl1.lastEvent = null;
405 cl2.lastEvent = null;
406
407 data.removeChangeListener(cl1);
408 data.removeChangeListener(cl2);
409 data.addTrack(singleWaypointGpxTrack());
410 assertNull(cl1.lastEvent);
411 assertNull(cl2.lastEvent);
412 }
413
414 private static class TestChangeListener implements GpxDataChangeListener {
415
416 private GpxDataChangeEvent lastEvent;
417
418 @Override
419 public void gpxDataChanged(GpxDataChangeEvent e) {
420 lastEvent = e;
421 }
422
423 }
424
425 private static ImmutableGpxTrack emptyGpxTrack() {
426 return new ImmutableGpxTrack(Collections.emptyList(), Collections.emptyMap());
427 }
428
429 private static ImmutableGpxTrack singleWaypointGpxTrack() {
430 return new ImmutableGpxTrack(Collections.singleton(Collections.singleton(new WayPoint(LatLon.ZERO))), Collections.emptyMap());
431 }
432
433 private static ImmutableGpxTrack waypointGpxTrack(WayPoint... wps) {
434 return new ImmutableGpxTrack(Collections.singleton(Arrays.asList(wps)), Collections.emptyMap());
435 }
436
437 private static GpxRoute singleWaypointRoute() {
438 GpxRoute route = new GpxRoute();
439 route.routePoints.add(new WayPoint(LatLon.ZERO));
440 return route;
441 }
442
443 /**
444 * Unit test of methods {@link GpxData#equals} and {@link GpxData#hashCode}.
445 */
446 @Test
447 public void testEqualsContract() {
448 TestUtils.assumeWorkingEqualsVerifier();
449 EqualsVerifier.forClass(GpxData.class).usingGetClass()
450 .withIgnoredFields("attr", "creator", "fromServer", "storageFile", "listeners", "tracks", "routes", "waypoints", "proxy")
451 .withPrefabValues(WayPoint.class, new WayPoint(LatLon.NORTH_POLE), new WayPoint(LatLon.SOUTH_POLE))
452 .withPrefabValues(ListenerList.class, ListenerList.create(), ListenerList.create())
453 .verify();
454 }
455}
Note: See TracBrowser for help on using the repository browser.