1 | // License: GPL. For details, see LICENSE file.
|
---|
2 | package org.openstreetmap.josm.data.osm;
|
---|
3 |
|
---|
4 | import static org.junit.jupiter.api.Assertions.assertEquals;
|
---|
5 | import static org.junit.jupiter.api.Assertions.assertFalse;
|
---|
6 | import static org.junit.jupiter.api.Assertions.assertInstanceOf;
|
---|
7 | import static org.junit.jupiter.api.Assertions.assertTrue;
|
---|
8 |
|
---|
9 | import java.util.ArrayList;
|
---|
10 | import java.util.Arrays;
|
---|
11 | import java.util.Collections;
|
---|
12 | import java.util.HashSet;
|
---|
13 | import java.util.List;
|
---|
14 |
|
---|
15 | import org.junit.jupiter.api.Test;
|
---|
16 | import org.junit.jupiter.api.extension.RegisterExtension;
|
---|
17 | import org.openstreetmap.josm.TestUtils;
|
---|
18 | import org.openstreetmap.josm.data.Bounds;
|
---|
19 | import org.openstreetmap.josm.data.DataSource;
|
---|
20 | import org.openstreetmap.josm.data.coor.LatLon;
|
---|
21 | import org.openstreetmap.josm.data.osm.event.DataSourceAddedEvent;
|
---|
22 | import org.openstreetmap.josm.data.osm.event.DataSourceRemovedEvent;
|
---|
23 | import org.openstreetmap.josm.testutils.JOSMTestRules;
|
---|
24 |
|
---|
25 | import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
---|
26 |
|
---|
27 | /**
|
---|
28 | * Unit tests for class {@link DataSet}.
|
---|
29 | */
|
---|
30 | class DataSetTest {
|
---|
31 |
|
---|
32 | /**
|
---|
33 | * Setup test.
|
---|
34 | */
|
---|
35 | @RegisterExtension
|
---|
36 | @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
|
---|
37 | public JOSMTestRules test = new JOSMTestRules();
|
---|
38 |
|
---|
39 | /**
|
---|
40 | * Unit test of method {@link DataSet#searchRelations}.
|
---|
41 | */
|
---|
42 | @Test
|
---|
43 | void testSearchRelations() {
|
---|
44 | final DataSet ds = new DataSet();
|
---|
45 | // null bbox => empty list
|
---|
46 | assertTrue(ds.searchRelations(null).isEmpty(), "Empty data set should produce an empty list.");
|
---|
47 |
|
---|
48 | // empty data set, any bbox => empty list
|
---|
49 | BBox bbox = new BBox(new LatLon(-180, -90), new LatLon(180, 90));
|
---|
50 | assertTrue(ds.searchRelations(bbox).isEmpty(), "Empty data set should produce an empty list.");
|
---|
51 |
|
---|
52 | // data set with elements in the given bbox => these elements
|
---|
53 | Node node = new Node(LatLon.ZERO);
|
---|
54 | Relation r = new Relation(1);
|
---|
55 | RelationMember rm = new RelationMember("role", node);
|
---|
56 | r.addMember(rm);
|
---|
57 | ds.addPrimitive(node);
|
---|
58 | ds.addPrimitive(r);
|
---|
59 | bbox = new BBox(new LatLon(-1.0, -1.0), new LatLon(1.0, 1.0));
|
---|
60 | List<Relation> result = ds.searchRelations(bbox);
|
---|
61 | assertEquals(1, result.size(), "We should have found only one item.");
|
---|
62 | assertTrue(result.contains(r), "The item found is relation r.");
|
---|
63 | }
|
---|
64 |
|
---|
65 | /**
|
---|
66 | * Unit test for {@link DataSet#searchPrimitives}
|
---|
67 | */
|
---|
68 | @Test
|
---|
69 | void testSearchPrimitives() {
|
---|
70 | final DataSet ds = new DataSet();
|
---|
71 | // null bbox => empty list
|
---|
72 | assertTrue(ds.searchPrimitives(null).isEmpty(), "Empty data set should produce an empty list.");
|
---|
73 |
|
---|
74 | // empty data set, any bbox => empty list
|
---|
75 | BBox bbox = new BBox(new LatLon(-180, -90), new LatLon(180, 90));
|
---|
76 | assertTrue(ds.searchPrimitives(bbox).isEmpty(), "Empty data set should produce an empty list.");
|
---|
77 | // data set with elements in the given bbox => these elements
|
---|
78 | Node node = new Node(LatLon.ZERO);
|
---|
79 | Node node2 = new Node(new LatLon(-0.01, -0.01));
|
---|
80 | Way way = TestUtils.newWay("", node, node2);
|
---|
81 | Relation r = new Relation(1);
|
---|
82 | RelationMember rm = new RelationMember("role", node);
|
---|
83 | r.addMember(rm);
|
---|
84 | way.getNodes().forEach(ds::addPrimitive);
|
---|
85 | ds.addPrimitive(way);
|
---|
86 | ds.addPrimitive(r);
|
---|
87 | bbox = new BBox(new LatLon(-1.0, -1.0), new LatLon(1.0, 1.0));
|
---|
88 | List<OsmPrimitive> result = ds.searchPrimitives(bbox);
|
---|
89 | assertEquals(4, result.size(), "We should have found four items.");
|
---|
90 | }
|
---|
91 |
|
---|
92 | /**
|
---|
93 | * Unit test of methods {@link DataSet#addChangeSetTag} / {@link DataSet#getChangeSetTags}.
|
---|
94 | */
|
---|
95 | @Test
|
---|
96 | void testChangesetTags() {
|
---|
97 | final DataSet ds = new DataSet();
|
---|
98 | assertTrue(ds.getChangeSetTags().isEmpty());
|
---|
99 | ds.addChangeSetTag("foo", "bar");
|
---|
100 | assertEquals("bar", ds.getChangeSetTags().get("foo"));
|
---|
101 | }
|
---|
102 |
|
---|
103 | /**
|
---|
104 | * Unit test of methods {@link DataSet#allNonDeletedPrimitives}
|
---|
105 | * / {@link DataSet#allNonDeletedCompletePrimitives}
|
---|
106 | * / {@link DataSet#allNonDeletedPhysicalPrimitives}.
|
---|
107 | */
|
---|
108 | @Test
|
---|
109 | void testAllNonDeleted() {
|
---|
110 | final DataSet ds = new DataSet();
|
---|
111 | assertTrue(ds.allNonDeletedPrimitives().isEmpty());
|
---|
112 | assertTrue(ds.allNonDeletedCompletePrimitives().isEmpty());
|
---|
113 | assertTrue(ds.allNonDeletedPhysicalPrimitives().isEmpty());
|
---|
114 |
|
---|
115 | Node n1 = new Node(1); n1.setCoor(LatLon.NORTH_POLE); n1.setDeleted(true); n1.setIncomplete(false); ds.addPrimitive(n1);
|
---|
116 | Node n2 = new Node(2); n2.setCoor(LatLon.NORTH_POLE); n2.setDeleted(false); n2.setIncomplete(false); ds.addPrimitive(n2);
|
---|
117 | Node n3 = new Node(3); n3.setCoor(LatLon.NORTH_POLE); n3.setDeleted(false); n3.setIncomplete(true); ds.addPrimitive(n3);
|
---|
118 |
|
---|
119 | Way w1 = new Way(1); w1.setDeleted(true); w1.setIncomplete(false); ds.addPrimitive(w1);
|
---|
120 | Way w2 = new Way(2); w2.setDeleted(false); w2.setIncomplete(false); ds.addPrimitive(w2);
|
---|
121 | Way w3 = new Way(3); w3.setDeleted(false); w3.setIncomplete(true); ds.addPrimitive(w3);
|
---|
122 |
|
---|
123 | Relation r1 = new Relation(1); r1.setDeleted(true); r1.setIncomplete(false); ds.addPrimitive(r1);
|
---|
124 | Relation r2 = new Relation(2); r2.setDeleted(false); r2.setIncomplete(false); ds.addPrimitive(r2);
|
---|
125 | Relation r3 = new Relation(3); r3.setDeleted(false); r3.setIncomplete(true); ds.addPrimitive(r3);
|
---|
126 |
|
---|
127 | assertEquals(new HashSet<>(Arrays.asList(n2, n3, w2, w3, r2, r3)),
|
---|
128 | new HashSet<>(ds.allNonDeletedPrimitives()));
|
---|
129 | assertEquals(new HashSet<>(Arrays.asList(n2, w2, r2)),
|
---|
130 | new HashSet<>(ds.allNonDeletedCompletePrimitives()));
|
---|
131 | assertEquals(new HashSet<>(Arrays.asList(n2, w2)),
|
---|
132 | new HashSet<>(ds.allNonDeletedPhysicalPrimitives()));
|
---|
133 | }
|
---|
134 |
|
---|
135 | /**
|
---|
136 | * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14186">Bug #14186</a>.
|
---|
137 | */
|
---|
138 | @Test
|
---|
139 | void testTicket14186() {
|
---|
140 | final DataSet ds = new DataSet();
|
---|
141 | Node n1 = new Node(1);
|
---|
142 | Node n2 = new Node(2);
|
---|
143 | Node n3 = new Node(3);
|
---|
144 | Way w1 = new Way(1);
|
---|
145 | w1.setNodes(Arrays.asList(n1, n2, n3));
|
---|
146 | Way w2 = new Way(2);
|
---|
147 | w2.setNodes(Arrays.asList(n1, n2, n3));
|
---|
148 | ds.addPrimitive(n1);
|
---|
149 | ds.addPrimitive(n2);
|
---|
150 | ds.addPrimitive(n3);
|
---|
151 | ds.addPrimitive(w1);
|
---|
152 | ds.addPrimitive(w2);
|
---|
153 | ds.unlinkNodeFromWays(n2);
|
---|
154 | }
|
---|
155 |
|
---|
156 | /**
|
---|
157 | * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14186">Bug #14186</a>.
|
---|
158 | */
|
---|
159 | @Test
|
---|
160 | void testTicket19438() {
|
---|
161 | final DataSet ds = new DataSet();
|
---|
162 | Node n1 = new Node(1);
|
---|
163 | Node n2 = new Node(2);
|
---|
164 | Node n3 = new Node(3);
|
---|
165 | Node n4 = new Node(4);
|
---|
166 | Way w1 = new Way(1);
|
---|
167 | w1.setNodes(Arrays.asList(n1, n2, n3, n4, n1));
|
---|
168 | w1.setIncomplete(false);
|
---|
169 | assertEquals(5, w1.getNodesCount());
|
---|
170 | assertTrue(w1.isClosed());
|
---|
171 | ds.addPrimitive(n1);
|
---|
172 | ds.addPrimitive(n2);
|
---|
173 | ds.addPrimitive(n3);
|
---|
174 | ds.addPrimitive(n4);
|
---|
175 | ds.addPrimitive(w1);
|
---|
176 | ds.unlinkNodeFromWays(n1);
|
---|
177 | assertTrue(w1.isClosed());
|
---|
178 | assertEquals(4, w1.getNodesCount());
|
---|
179 | }
|
---|
180 |
|
---|
181 | /**
|
---|
182 | * Test the selection order.
|
---|
183 | * See <a href="https://josm.openstreetmap.de/ticket/14737">#14737</a>
|
---|
184 | * @since 12069
|
---|
185 | */
|
---|
186 | @Test
|
---|
187 | void testSelectionOrderPreserved() {
|
---|
188 | final DataSet ds = new DataSet();
|
---|
189 | Node n1 = new Node(1);
|
---|
190 | Node n2 = new Node(2);
|
---|
191 | Node n3 = new Node(3);
|
---|
192 | ds.addPrimitive(n1);
|
---|
193 | ds.addPrimitive(n2);
|
---|
194 | ds.addPrimitive(n3);
|
---|
195 |
|
---|
196 | assertEquals(Collections.emptyList(), new ArrayList<>(ds.getSelected()));
|
---|
197 |
|
---|
198 | ds.setSelected(n1.getPrimitiveId(), n2.getPrimitiveId());
|
---|
199 | assertEquals(Arrays.asList(n1, n2), new ArrayList<>(ds.getSelected()));
|
---|
200 |
|
---|
201 | ds.clearSelection();
|
---|
202 | assertEquals(Collections.emptyList(), new ArrayList<>(ds.getSelected()));
|
---|
203 |
|
---|
204 | ds.addSelected(n3.getPrimitiveId());
|
---|
205 | ds.addSelected(n1.getPrimitiveId(), n2.getPrimitiveId());
|
---|
206 | assertEquals(Arrays.asList(n3, n1, n2), new ArrayList<>(ds.getSelected()));
|
---|
207 |
|
---|
208 | ds.addSelected(n3.getPrimitiveId());
|
---|
209 | assertEquals(Arrays.asList(n3, n1, n2), new ArrayList<>(ds.getSelected()));
|
---|
210 |
|
---|
211 | ds.clearSelection(n1.getPrimitiveId());
|
---|
212 | assertEquals(Arrays.asList(n3, n2), new ArrayList<>(ds.getSelected()));
|
---|
213 |
|
---|
214 | ds.toggleSelected(n1.getPrimitiveId());
|
---|
215 | assertEquals(Arrays.asList(n3, n2, n1), new ArrayList<>(ds.getSelected()));
|
---|
216 |
|
---|
217 | ds.toggleSelected(n2.getPrimitiveId());
|
---|
218 | assertEquals(Arrays.asList(n3, n1), new ArrayList<>(ds.getSelected()));
|
---|
219 | }
|
---|
220 |
|
---|
221 | /**
|
---|
222 | * Unit test for {@link DataSet#DataSet(DataSet)}.
|
---|
223 | */
|
---|
224 | @Test
|
---|
225 | void testCopyConstructor() {
|
---|
226 | DataSet ds = new DataSet();
|
---|
227 | assertEqualsDataSet(ds, new DataSet(ds));
|
---|
228 |
|
---|
229 | ds.setVersion("fake_version");
|
---|
230 | ds.setUploadPolicy(UploadPolicy.BLOCKED);
|
---|
231 | Node n1 = new Node(LatLon.SOUTH_POLE);
|
---|
232 | Node n2 = new Node(LatLon.NORTH_POLE);
|
---|
233 | Way w = new Way(1);
|
---|
234 | w.setNodes(Arrays.asList(n1, n2));
|
---|
235 | ds.addPrimitive(n1);
|
---|
236 | ds.addPrimitive(n2);
|
---|
237 | ds.addPrimitive(w);
|
---|
238 | Relation r1 = new Relation(1);
|
---|
239 | Relation r2 = new Relation(2);
|
---|
240 | r2.addMember(new RelationMember("role1", n1));
|
---|
241 | r2.addMember(new RelationMember("role2", w));
|
---|
242 | r2.addMember(new RelationMember("role3", r1));
|
---|
243 | ds.addPrimitive(r1);
|
---|
244 | ds.addPrimitive(r2);
|
---|
245 | assertEqualsDataSet(ds, new DataSet(ds));
|
---|
246 | }
|
---|
247 |
|
---|
248 | /**
|
---|
249 | * Unit test for {@link DataSet#mergeFrom} - Policies.
|
---|
250 | */
|
---|
251 | @Test
|
---|
252 | void testMergePolicies() {
|
---|
253 | DataSet ds1 = new DataSet();
|
---|
254 | DataSet ds2 = new DataSet();
|
---|
255 |
|
---|
256 | ds1.setUploadPolicy(UploadPolicy.BLOCKED);
|
---|
257 | ds2.setUploadPolicy(UploadPolicy.NORMAL);
|
---|
258 | ds1.mergeFrom(ds2);
|
---|
259 | assertEquals(UploadPolicy.BLOCKED, ds1.getUploadPolicy());
|
---|
260 |
|
---|
261 | ds1.setUploadPolicy(UploadPolicy.NORMAL);
|
---|
262 | ds2.setUploadPolicy(UploadPolicy.BLOCKED);
|
---|
263 | ds1.mergeFrom(ds2);
|
---|
264 | assertEquals(UploadPolicy.BLOCKED, ds1.getUploadPolicy());
|
---|
265 |
|
---|
266 | ds1.setDownloadPolicy(DownloadPolicy.BLOCKED);
|
---|
267 | ds2.setDownloadPolicy(DownloadPolicy.NORMAL);
|
---|
268 | ds1.mergeFrom(ds2);
|
---|
269 | assertEquals(DownloadPolicy.BLOCKED, ds1.getDownloadPolicy());
|
---|
270 |
|
---|
271 | ds1.setDownloadPolicy(DownloadPolicy.NORMAL);
|
---|
272 | ds2.setDownloadPolicy(DownloadPolicy.BLOCKED);
|
---|
273 | ds1.mergeFrom(ds2);
|
---|
274 | assertEquals(DownloadPolicy.BLOCKED, ds1.getDownloadPolicy());
|
---|
275 |
|
---|
276 | ds2.lock();
|
---|
277 | assertFalse(ds1.isLocked());
|
---|
278 | assertTrue(ds2.isLocked());
|
---|
279 | ds1.mergeFrom(ds2);
|
---|
280 | assertTrue(ds1.isLocked());
|
---|
281 | }
|
---|
282 |
|
---|
283 | private static void assertEqualsDataSet(DataSet ds1, DataSet ds2) {
|
---|
284 | assertEquals(new ArrayList<>(ds1.getNodes()), new ArrayList<>(ds2.getNodes()));
|
---|
285 | assertEquals(new ArrayList<>(ds1.getWays()), new ArrayList<>(ds2.getWays()));
|
---|
286 | assertEquals(new ArrayList<>(ds1.getRelations()), new ArrayList<>(ds2.getRelations()));
|
---|
287 | assertEquals(new ArrayList<>(ds1.getDataSources()), new ArrayList<>(ds2.getDataSources()));
|
---|
288 | assertEquals(ds1.getUploadPolicy(), ds2.getUploadPolicy());
|
---|
289 | assertEquals(ds1.getVersion(), ds2.getVersion());
|
---|
290 | }
|
---|
291 |
|
---|
292 | /**
|
---|
293 | * Checks that enum values are defined in the correct order.
|
---|
294 | */
|
---|
295 | @Test
|
---|
296 | void testEnumOrder() {
|
---|
297 | assertTrue(DownloadPolicy.BLOCKED.compareTo(DownloadPolicy.NORMAL) > 0);
|
---|
298 | assertTrue(UploadPolicy.BLOCKED.compareTo(UploadPolicy.NORMAL) > 0);
|
---|
299 | assertTrue(UploadPolicy.BLOCKED.compareTo(UploadPolicy.DISCOURAGED) > 0);
|
---|
300 | assertTrue(UploadPolicy.DISCOURAGED.compareTo(UploadPolicy.NORMAL) > 0);
|
---|
301 | }
|
---|
302 |
|
---|
303 | /**
|
---|
304 | * Checks that data source listeners get called when a data source is added
|
---|
305 | */
|
---|
306 | @Test
|
---|
307 | void testAddDataSourceListener() {
|
---|
308 | DataSourceListener addListener = event -> assertInstanceOf(DataSourceAddedEvent.class, event);
|
---|
309 |
|
---|
310 | DataSet ds = new DataSet();
|
---|
311 | ds.addDataSourceListener(addListener);
|
---|
312 | ds.addDataSource(new DataSource(new Bounds(0, 0, 0.1, 0.1), "fake source"));
|
---|
313 |
|
---|
314 | }
|
---|
315 |
|
---|
316 | /**
|
---|
317 | * Checks that data source listeners get called when a data source is removed
|
---|
318 | */
|
---|
319 | @Test
|
---|
320 | void testRemoveDataSourceListener() {
|
---|
321 | DataSourceListener removeListener = event -> assertInstanceOf(DataSourceRemovedEvent.class, event);
|
---|
322 |
|
---|
323 | DataSet ds = new DataSet();
|
---|
324 | ds.addDataSource(new DataSource(new Bounds(0, 0, 0.1, 0.1), "fake source"));
|
---|
325 | ds.addDataSourceListener(removeListener);
|
---|
326 | new DataSet().mergeFrom(ds);
|
---|
327 | }
|
---|
328 |
|
---|
329 | /**
|
---|
330 | * Checks that a read-only dataset can be cloned.
|
---|
331 | */
|
---|
332 | @Test
|
---|
333 | void testCloneReadOnly() {
|
---|
334 | DataSet ds = new DataSet();
|
---|
335 | Node n1 = new Node(LatLon.SOUTH_POLE);
|
---|
336 | Node n2 = new Node(LatLon.NORTH_POLE);
|
---|
337 | ds.addPrimitive(n1);
|
---|
338 | ds.addPrimitive(n2);
|
---|
339 | Way w = new Way();
|
---|
340 | w.setNodes(Arrays.asList(n1, n2));
|
---|
341 | ds.addPrimitive(w);
|
---|
342 | Relation r = new Relation();
|
---|
343 | r.setMembers(Collections.singletonList(new RelationMember(null, w)));
|
---|
344 | ds.addPrimitive(r);
|
---|
345 | ds.lock();
|
---|
346 |
|
---|
347 | DataSet copy = new DataSet(ds);
|
---|
348 |
|
---|
349 | assertEquals(4, copy.allPrimitives().size());
|
---|
350 | assertTrue(copy.isLocked());
|
---|
351 | }
|
---|
352 | }
|
---|