source: josm/trunk/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java@ 11241

Last change on this file since 11241 was 11175, checked in by simon04, 7 years ago

APIDataSet: simplify implementation using streams, add test

  • Property svn:eol-style set to native
File size: 7.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertFalse;
6import static org.junit.Assert.assertTrue;
7import static org.junit.Assert.fail;
8
9import java.util.List;
10
11import org.junit.Rule;
12import org.junit.Test;
13import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
14import org.openstreetmap.josm.data.APIDataSet;
15import org.openstreetmap.josm.data.conflict.ConflictCollection;
16import org.openstreetmap.josm.testutils.JOSMTestRules;
17
18import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
19
20/**
21 * Unit tests for class {@link APIDataSet}.
22 */
23public class APIDataSetTest {
24
25 /**
26 * Setup test.
27 */
28 @Rule
29 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
30 public JOSMTestRules test = new JOSMTestRules();
31
32 @Test
33 public void testOneNewRelationOnly() throws CyclicUploadDependencyException {
34 Relation r = new Relation();
35 r.put("name", "r1");
36 DataSet ds = new DataSet();
37 ds.addPrimitive(r);
38
39 APIDataSet apiDataSet = new APIDataSet();
40 apiDataSet.init(ds);
41 apiDataSet.adjustRelationUploadOrder();
42 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
43
44 assertEquals(1, toAdd.size());
45 assertEquals(r, toAdd.get(0));
46 }
47
48 @Test
49 public void testNewParentChildPair() throws CyclicUploadDependencyException {
50 DataSet ds = new DataSet();
51 Relation r1 = new Relation();
52 ds.addPrimitive(r1);
53 r1.put("name", "r1");
54
55 Relation r2 = new Relation();
56 ds.addPrimitive(r2);
57 r2.put("name", "r2");
58
59 r1.addMember(new RelationMember("", r2));
60
61 APIDataSet apiDataSet = new APIDataSet();
62 apiDataSet.init(ds);
63 apiDataSet.adjustRelationUploadOrder();
64 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
65
66 assertEquals(2, toAdd.size());
67 assertEquals(r2, toAdd.get(0)); // child first
68 assertEquals(r1, toAdd.get(1)); // ... then the parent
69 }
70
71 @Test
72 public void testOneExistingAndThreNewInAChain() throws CyclicUploadDependencyException {
73 DataSet ds = new DataSet();
74
75 Relation r1 = new Relation();
76 ds.addPrimitive(r1);
77 r1.put("name", "r1");
78
79 Relation r2 = new Relation();
80 ds.addPrimitive(r2);
81 r2.put("name", "r2");
82
83 Relation r3 = new Relation();
84 ds.addPrimitive(r3);
85 r3.put("name", "r3");
86
87 Relation r4 = new Relation(1, 1);
88 ds.addPrimitive(r4);
89 r4.put("name", "r4");
90 r4.setModified(true);
91
92 r1.addMember(new RelationMember("", r2));
93 r2.addMember(new RelationMember("", r3));
94
95 APIDataSet apiDataSet = new APIDataSet();
96 apiDataSet.init(ds);
97 apiDataSet.adjustRelationUploadOrder();
98 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
99
100 assertEquals(3, toAdd.size());
101 assertEquals(r3, toAdd.get(0));
102 assertEquals(r2, toAdd.get(1));
103 assertEquals(r1, toAdd.get(2));
104
105 List<OsmPrimitive> toUpdate = apiDataSet.getPrimitivesToUpdate();
106 assertEquals(1, toUpdate.size());
107 assertEquals(r4, toUpdate.get(0));
108
109 final ConflictCollection cc4 = new ConflictCollection();
110 cc4.add(r4, r4);
111 assertTrue(apiDataSet.participatesInConflict(cc4));
112 final ConflictCollection cc1 = new ConflictCollection();
113 cc1.add(r1, r1);
114 assertFalse(apiDataSet.participatesInConflict(cc1));
115 }
116
117 @Test
118 public void testOneParentTwoNewChildren() throws CyclicUploadDependencyException {
119 DataSet ds = new DataSet();
120 Relation r1 = new Relation();
121 ds.addPrimitive(r1);
122 r1.put("name", "r1");
123
124 Relation r2 = new Relation();
125 ds.addPrimitive(r2);
126 r2.put("name", "r2");
127
128 Relation r3 = new Relation();
129 ds.addPrimitive(r3);
130 r3.put("name", "r3");
131
132 r1.addMember(new RelationMember("", r2));
133 r1.addMember(new RelationMember("", r3));
134
135
136 APIDataSet apiDataSet = new APIDataSet();
137 apiDataSet.init(ds);
138 apiDataSet.adjustRelationUploadOrder();
139 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
140
141 assertEquals(3, toAdd.size());
142 assertTrue(toAdd.indexOf(r2) < toAdd.indexOf(r1));
143 assertTrue(toAdd.indexOf(r3) < toAdd.indexOf(r1));
144 }
145
146 @Test // for ticket #9624
147 public void testDeleteOneParentTwoNewChildren() throws CyclicUploadDependencyException {
148 DataSet ds = new DataSet();
149 Relation r1 = new Relation(1);
150 ds.addPrimitive(r1);
151 r1.put("name", "r1");
152
153 Relation r2 = new Relation(2);
154 ds.addPrimitive(r2);
155 r2.put("name", "r2");
156
157 Relation r3 = new Relation(3);
158 ds.addPrimitive(r3);
159 r3.put("name", "r3");
160
161 Relation r4 = new Relation(4);
162 ds.addPrimitive(r4);
163 r4.put("name", "unrelated");
164
165
166 r1.addMember(new RelationMember("", r2));
167 r1.addMember(new RelationMember("", r3));
168
169 r1.setDeleted(true);
170 r2.setDeleted(true);
171 r3.setDeleted(true);
172 r4.setDeleted(true);
173
174
175 APIDataSet apiDataSet = new APIDataSet();
176 // add r1 first to test functionality of APIDataSet#adjustRelationUploadOrder()
177 apiDataSet.getPrimitivesToDelete().add(r1);
178 apiDataSet.getPrimitivesToDelete().add(r2);
179 apiDataSet.getPrimitivesToDelete().add(r3);
180 apiDataSet.getPrimitivesToDelete().add(r4);
181 apiDataSet.adjustRelationUploadOrder();
182 List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
183
184 assertEquals(4, toDelete.size());
185 assertTrue(toDelete.indexOf(r2) < toDelete.indexOf(r1));
186 assertTrue(toDelete.indexOf(r3) < toDelete.indexOf(r1));
187 }
188
189 @Test // for ticket #9656
190 public void testDeleteWay() throws CyclicUploadDependencyException {
191 DataSet ds = new DataSet();
192 final Way way = new Way(1, 2);
193 way.put("highway", "unclassified");
194 ds.addPrimitive(way);
195
196 final Node n1 = new Node(2);
197 ds.addPrimitive(n1);
198 way.addNode(n1);
199
200 final Node n2 = new Node(3);
201 ds.addPrimitive(n2);
202 way.addNode(n2);
203
204 Relation r1 = new Relation(4, 2);
205 ds.addPrimitive(r1);
206 r1.put("name", "r1");
207 r1.addMember(new RelationMember("foo", way));
208
209
210 r1.setDeleted(true);
211 way.setDeleted(true);
212 n1.setDeleted(true);
213 n2.setDeleted(true);
214
215 APIDataSet apiDataSet = new APIDataSet();
216 apiDataSet.init(ds);
217 apiDataSet.adjustRelationUploadOrder();
218 List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
219
220 assertEquals(4, toDelete.size());
221 assertTrue(toDelete.indexOf(way) < toDelete.indexOf(n1));
222 assertTrue(toDelete.indexOf(way) < toDelete.indexOf(n2));
223 assertTrue(toDelete.indexOf(r1) < toDelete.indexOf(way));
224 }
225
226 @Test
227 public void testOneCycle() {
228 DataSet ds = new DataSet();
229 Relation r1 = new Relation();
230 ds.addPrimitive(r1);
231 r1.put("name", "r1");
232
233 Relation r2 = new Relation();
234 ds.addPrimitive(r2);
235 r2.put("name", "r2");
236
237 Relation r3 = new Relation();
238 ds.addPrimitive(r3);
239 r3.put("name", "r3");
240
241 r1.addMember(new RelationMember("", r2));
242 r2.addMember(new RelationMember("", r3));
243 r3.addMember(new RelationMember("", r1));
244
245 APIDataSet apiDataSet = new APIDataSet();
246 apiDataSet.init(ds);
247 try {
248 apiDataSet.adjustRelationUploadOrder();
249 fail("expected cyclic upload dependency exception not thrown");
250 } catch (CyclicUploadDependencyException e) {
251 System.out.println(e);
252 }
253 }
254}
Note: See TracBrowser for help on using the repository browser.