source: josm/trunk/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java@ 18037

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

fix #21064 - Add JUnit 5 extension for preferences (patch by taylor.smock)

  • Property svn:eol-style set to native
File size: 14.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.openstreetmap.josm.TestUtils.assertEqualsNewline;
5
6import java.awt.Color;
7import java.io.ByteArrayOutputStream;
8import java.io.IOException;
9import java.time.Instant;
10import java.time.LocalDate;
11import java.time.Month;
12import java.time.ZoneOffset;
13import java.util.Arrays;
14import java.util.HashMap;
15import java.util.function.Consumer;
16
17import org.openstreetmap.josm.data.coor.LatLon;
18import org.openstreetmap.josm.data.gpx.GpxConstants;
19import org.openstreetmap.josm.data.gpx.GpxData;
20import org.openstreetmap.josm.data.gpx.GpxData.XMLNamespace;
21import org.openstreetmap.josm.data.gpx.GpxExtensionCollection;
22import org.openstreetmap.josm.data.gpx.GpxTrack;
23import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
24import org.openstreetmap.josm.data.gpx.WayPoint;
25import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
26
27import org.junit.jupiter.api.Test;
28
29/**
30 * Tests the {@link GpxWriter}.
31 */
32@BasicPreferences
33public class GpxWriterTest {
34 private static void testSingleWaypoint(Consumer<WayPoint> consumer, String atts) throws IOException {
35 GpxData gpx = new GpxData();
36 WayPoint waypoint = new WayPoint(LatLon.ZERO);
37 waypoint.setInstant(Instant.parse("2019-06-08T08:23:12.300Z"));
38 consumer.accept(waypoint);
39 gpx.addWaypoint(waypoint);
40 ByteArrayOutputStream baos = new ByteArrayOutputStream();
41 try (GpxWriter writer = new GpxWriter(baos)) {
42 writer.write(gpx);
43 }
44 assertEqualsNewline("<?xml version='1.0' encoding='UTF-8'?>\n" +
45 "<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" +
46 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
47 " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\n" +
48 " <metadata>\n" +
49 " <bounds minlat=\"0.0\" minlon=\"0.0\" maxlat=\"0.0\" maxlon=\"0.0\"/>\n" +
50 " </metadata>\n" +
51 " <wpt lat=\"0.0\" lon=\"0.0\">\n" +
52 atts +
53 " </wpt>\n" +
54 "</gpx>", baos.toString());
55 }
56
57 /**
58 * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/16550">#16550</a>
59 * @throws IOException never
60 */
61 @Test
62 void testTicket16550() throws IOException {
63 // Checks that time stored as date is correctly written into XML timestamp
64 testSingleWaypoint(
65 w -> w.put(GpxConstants.PT_TIME, LocalDate.of(2018, Month.AUGUST, 2).atStartOfDay(ZoneOffset.UTC).toInstant()),
66 " <time>2018-08-02T00:00:00Z</time>\n");
67 }
68
69 /**
70 * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/16725">#16725</a>
71 * @throws IOException never
72 */
73 @Test
74 void testTicket16725() throws IOException {
75 // Checks that sat, hdop, pdop, vdop are correctly exported
76 testSingleWaypoint(
77 w -> {
78 w.put(GpxConstants.PT_SAT, 16);
79 w.put(GpxConstants.PT_HDOP, 0.7);
80 w.put(GpxConstants.PT_VDOP, 0.9);
81 w.put(GpxConstants.PT_PDOP, 1.2);
82 },
83 " <time>2019-06-08T08:23:12.300Z</time>\n" +
84 " <sat>16</sat>\n" +
85 " <hdop>0.7</hdop>\n" +
86 " <vdop>0.9</vdop>\n" +
87 " <pdop>1.2</pdop>\n");
88 }
89
90 /**
91 * Tests if extensions are written correctly.
92 * @throws IOException in case of I/O error
93 */
94 @Test
95 void testExtensions() throws IOException {
96 GpxData data = new GpxData();
97 // only namespace, no location printed
98 data.getNamespaces().add(new XMLNamespace("test", "http://example.com/testURI"));
99 // printed
100 data.getNamespaces().add(new XMLNamespace("knownprefix", "http://example.com/URI", "http://example.com/location.xsd"));
101 // NOT printed
102 data.getNamespaces().add(new XMLNamespace("notpresent", "http://example.com/notpresent", "http://example.com/notpresent.xsd"));
103
104 GpxExtensionCollection exts = data.getExtensions();
105 data.fromServer = true; //printed
106 data.getLayerPrefs().put("foo", "bar"); //printed depending on writer config
107 exts.add("knownprefix", "foo", "bar"); //printed
108 exts.add("unknownprefix", "foo", "bar"); //NOT printed
109
110 WayPoint wpt = new WayPoint(LatLon.ZERO);
111 wpt.getExtensions().add("test", "foo", "extension of a waypoint"); //printed
112
113 GpxTrackSegment seg = new GpxTrackSegment(Arrays.asList(wpt));
114 seg.getExtensions().add("test", "foo", "extension of a segment"); //printed
115
116 GpxTrack trk = new GpxTrack(Arrays.asList(seg), new HashMap<>());
117
118 trk.setColor(Color.RED); //printed depending on writer configuration
119
120 data.addTrack(trk);
121
122 ByteArrayOutputStream baos = new ByteArrayOutputStream();
123 GpxWriter writer = new GpxWriter(baos);
124
125 // CHECKSTYLE.OFF: LineLength
126
127 writer.write(data);
128 assertEqualsNewline("<?xml version='1.0' encoding='UTF-8'?>\n" +
129 "<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" +
130 " xmlns:knownprefix=\"http://example.com/URI\"\n" +
131 " xmlns:josm=\"http://josm.openstreetmap.de/gpx-extensions-1.1\"\n" +
132 " xmlns:gpxd=\"http://josm.openstreetmap.de/gpx-drawing-extensions-1.0\"\n" +
133 " xmlns:test=\"http://example.com/testURI\"\n" +
134 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
135 " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://example.com/URI http://example.com/location.xsd http://josm.openstreetmap.de/gpx-extensions-1.1 http://josm.openstreetmap.de/gpx-extensions-1.1.xsd http://josm.openstreetmap.de/gpx-drawing-extensions-1.0 http://josm.openstreetmap.de/gpx-drawing-extensions-1.0.xsd\">\n" +
136 " <metadata>\n" +
137 " <bounds minlat=\"0.0\" minlon=\"0.0\" maxlat=\"0.0\" maxlon=\"0.0\"/>\n" +
138 " <extensions>\n" +
139 " <knownprefix:foo>bar</knownprefix:foo>\n" +
140 " <josm:from-server>true</josm:from-server>\n" +
141 " <josm:layerPreferences>\n" +
142 " <josm:entry key=\"foo\" value=\"bar\"/>\n" +
143 " </josm:layerPreferences>\n" +
144 " </extensions>\n" +
145 " </metadata>\n" +
146 " <trk>\n" +
147 " <extensions>\n" +
148 " <gpxd:color>#FF0000</gpxd:color>\n" +
149 " </extensions>\n" +
150 " <trkseg>\n" +
151 " <extensions>\n" +
152 " <test:foo>extension of a segment</test:foo>\n" +
153 " </extensions>\n" +
154 " <trkpt lat=\"0.0\" lon=\"0.0\">\n" +
155 " <extensions>\n" +
156 " <test:foo>extension of a waypoint</test:foo>\n" +
157 " </extensions>\n" +
158 " </trkpt>\n" +
159 " </trkseg>\n" +
160 " </trk>\n" +
161 "</gpx>", baos.toString());
162
163 baos.reset();
164 writer.write(data, GpxConstants.ColorFormat.GPXX, true);
165 assertEqualsNewline("<?xml version='1.0' encoding='UTF-8'?>\n" +
166 "<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" +
167 " xmlns:knownprefix=\"http://example.com/URI\"\n" +
168 " xmlns:josm=\"http://josm.openstreetmap.de/gpx-extensions-1.1\"\n" +
169 " xmlns:gpxx=\"http://www.garmin.com/xmlschemas/GpxExtensions/v3\"\n" +
170 " xmlns:test=\"http://example.com/testURI\"\n" +
171 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
172 " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://example.com/URI http://example.com/location.xsd http://josm.openstreetmap.de/gpx-extensions-1.1 http://josm.openstreetmap.de/gpx-extensions-1.1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd\">\n" +
173 " <metadata>\n" +
174 " <bounds minlat=\"0.0\" minlon=\"0.0\" maxlat=\"0.0\" maxlon=\"0.0\"/>\n" +
175 " <extensions>\n" +
176 " <knownprefix:foo>bar</knownprefix:foo>\n" +
177 " <josm:from-server>true</josm:from-server>\n" +
178 " <josm:layerPreferences>\n" +
179 " <josm:entry key=\"foo\" value=\"bar\"/>\n" +
180 " </josm:layerPreferences>\n" +
181 " </extensions>\n" +
182 " </metadata>\n" +
183 " <trk>\n" +
184 " <extensions>\n" +
185 " <gpxx:TrackExtension>\n" +
186 " <gpxx:DisplayColor>Red</gpxx:DisplayColor>\n" +
187 " </gpxx:TrackExtension>\n" +
188 " </extensions>\n" +
189 " <trkseg>\n" +
190 " <extensions>\n" +
191 " <test:foo>extension of a segment</test:foo>\n" +
192 " </extensions>\n" +
193 " <trkpt lat=\"0.0\" lon=\"0.0\">\n" +
194 " <extensions>\n" +
195 " <test:foo>extension of a waypoint</test:foo>\n" +
196 " </extensions>\n" +
197 " </trkpt>\n" +
198 " </trkseg>\n" +
199 " </trk>\n" +
200 "</gpx>", baos.toString());
201
202 baos.reset();
203 writer.write(data, null, false);
204 assertEqualsNewline("<?xml version='1.0' encoding='UTF-8'?>\n" +
205 "<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" +
206 " xmlns:knownprefix=\"http://example.com/URI\"\n" +
207 " xmlns:josm=\"http://josm.openstreetmap.de/gpx-extensions-1.1\"\n" +
208 " xmlns:test=\"http://example.com/testURI\"\n" +
209 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
210 " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://example.com/URI http://example.com/location.xsd http://josm.openstreetmap.de/gpx-extensions-1.1 http://josm.openstreetmap.de/gpx-extensions-1.1.xsd\">\n" +
211 " <metadata>\n" +
212 " <bounds minlat=\"0.0\" minlon=\"0.0\" maxlat=\"0.0\" maxlon=\"0.0\"/>\n" +
213 " <extensions>\n" +
214 " <knownprefix:foo>bar</knownprefix:foo>\n" +
215 " <josm:from-server>true</josm:from-server>\n" +
216 " </extensions>\n" +
217 " </metadata>\n" +
218 " <trk>\n" +
219 " <trkseg>\n" +
220 " <extensions>\n" +
221 " <test:foo>extension of a segment</test:foo>\n" +
222 " </extensions>\n" +
223 " <trkpt lat=\"0.0\" lon=\"0.0\">\n" +
224 " <extensions>\n" +
225 " <test:foo>extension of a waypoint</test:foo>\n" +
226 " </extensions>\n" +
227 " </trkpt>\n" +
228 " </trkseg>\n" +
229 " </trk>\n" +
230 "</gpx>", baos.toString());
231
232 baos.reset();
233 writer.write(data, GpxConstants.ColorFormat.GPXX, true);
234 // checked again to make sure that extensions are shown again after
235 // being hidden, even if they don't actually have to be converted
236 // (GPXD -> convertColor() -> GPXX -> hide() -> null -> show() -> GPXX)
237 assertEqualsNewline("<?xml version='1.0' encoding='UTF-8'?>\n" +
238 "<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" +
239 " xmlns:knownprefix=\"http://example.com/URI\"\n" +
240 " xmlns:josm=\"http://josm.openstreetmap.de/gpx-extensions-1.1\"\n" +
241 " xmlns:gpxx=\"http://www.garmin.com/xmlschemas/GpxExtensions/v3\"\n" +
242 " xmlns:test=\"http://example.com/testURI\"\n" +
243 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
244 " xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://example.com/URI http://example.com/location.xsd http://josm.openstreetmap.de/gpx-extensions-1.1 http://josm.openstreetmap.de/gpx-extensions-1.1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd\">\n" +
245 " <metadata>\n" +
246 " <bounds minlat=\"0.0\" minlon=\"0.0\" maxlat=\"0.0\" maxlon=\"0.0\"/>\n" +
247 " <extensions>\n" +
248 " <knownprefix:foo>bar</knownprefix:foo>\n" +
249 " <josm:from-server>true</josm:from-server>\n" +
250 " <josm:layerPreferences>\n" +
251 " <josm:entry key=\"foo\" value=\"bar\"/>\n" +
252 " </josm:layerPreferences>\n" +
253 " </extensions>\n" +
254 " </metadata>\n" +
255 " <trk>\n" +
256 " <extensions>\n" +
257 " <gpxx:TrackExtension>\n" +
258 " <gpxx:DisplayColor>Red</gpxx:DisplayColor>\n" +
259 " </gpxx:TrackExtension>\n" +
260 " </extensions>\n" +
261 " <trkseg>\n" +
262 " <extensions>\n" +
263 " <test:foo>extension of a segment</test:foo>\n" +
264 " </extensions>\n" +
265 " <trkpt lat=\"0.0\" lon=\"0.0\">\n" +
266 " <extensions>\n" +
267 " <test:foo>extension of a waypoint</test:foo>\n" +
268 " </extensions>\n" +
269 " </trkpt>\n" +
270 " </trkseg>\n" +
271 " </trk>\n" +
272 "</gpx>", baos.toString());
273
274 // CHECKSTYLE.ON: LineLength
275
276 writer.close();
277 }
278}
Note: See TracBrowser for help on using the repository browser.