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