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

Last change on this file since 6801 was 6801, checked in by simon04, 10 years ago

fix #9656 - Repair upload order of objects to be deleted (regression from r6776)

File size: 8.0 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.fail;
6
7import java.util.List;
8
9import org.junit.BeforeClass;
10import org.junit.Test;
11import org.openstreetmap.josm.Main;
12import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
13import org.openstreetmap.josm.data.APIDataSet;
14import org.openstreetmap.josm.data.Preferences;
15
16
17public class APIDataSetTest {
18
19 @BeforeClass
20 public static void init() {
21 Main.initApplicationPreferences();
22 }
23
24 @Test
25 public void oneNewRelationOnly() {
26 Relation r = new Relation();
27 r.put("name", "r1");
28 DataSet ds = new DataSet();
29 ds.addPrimitive(r);
30
31 APIDataSet apiDataSet = new APIDataSet();
32 apiDataSet.init(ds);
33 try {
34 apiDataSet.adjustRelationUploadOrder();
35 } catch(CyclicUploadDependencyException e) {
36 fail("unexpected exception:" + e);
37 }
38 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
39
40 assertEquals(1, toAdd.size());
41 assertEquals(r, toAdd.get(0));
42 }
43
44 @Test
45 public void newParentChildPair() {
46 DataSet ds = new DataSet();
47 Relation r1 = new Relation();
48 ds.addPrimitive(r1);
49 r1.put("name", "r1");
50
51 Relation r2 = new Relation();
52 ds.addPrimitive(r2);
53 r2.put("name", "r2");
54
55 r1.addMember(new RelationMember("", r2));
56
57 APIDataSet apiDataSet = new APIDataSet();
58 apiDataSet.init(ds);
59 try {
60 apiDataSet.adjustRelationUploadOrder();
61 } catch(CyclicUploadDependencyException e) {
62 fail("unexpected exception:" + e);
63 }
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 oneExistingAndThreNewInAChain() {
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 try {
98 apiDataSet.adjustRelationUploadOrder();
99 } catch(CyclicUploadDependencyException e) {
100 fail("unexpected exception:" + e);
101 }
102 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
103
104 assertEquals(3, toAdd.size());
105 assertEquals(r3, toAdd.get(0));
106 assertEquals(r2, toAdd.get(1));
107 assertEquals(r1, toAdd.get(2));
108
109 List<OsmPrimitive> toUpdate = apiDataSet.getPrimitivesToUpdate();
110 assertEquals(1, toUpdate.size());
111 assertEquals(r4, toUpdate.get(0));
112 }
113
114 @Test
115 public void oneParentTwoNewChildren() {
116 DataSet ds = new DataSet();
117 Relation r1 = new Relation();
118 ds.addPrimitive(r1);
119 r1.put("name", "r1");
120
121 Relation r2 = new Relation();
122 ds.addPrimitive(r2);
123 r2.put("name", "r2");
124
125 Relation r3 = new Relation();
126 ds.addPrimitive(r3);
127 r3.put("name", "r3");
128
129 r1.addMember(new RelationMember("", r2));
130 r1.addMember(new RelationMember("", r3));
131
132
133 APIDataSet apiDataSet = new APIDataSet();
134 apiDataSet.init(ds);
135 try {
136 apiDataSet.adjustRelationUploadOrder();
137 } catch(CyclicUploadDependencyException e) {
138 fail("unexpected exception:" + e);
139 }
140 List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
141
142 assertEquals(3, toAdd.size());
143 assertEquals(true, toAdd.indexOf(r2) < toAdd.indexOf(r1));
144 assertEquals(true, toAdd.indexOf(r3) < toAdd.indexOf(r1));
145 }
146
147 @Test // for ticket #9624
148 public void deleteOneParentTwoNewChildren() {
149 DataSet ds = new DataSet();
150 Relation r1 = new Relation(1);
151 ds.addPrimitive(r1);
152 r1.put("name", "r1");
153
154 Relation r2 = new Relation(2);
155 ds.addPrimitive(r2);
156 r2.put("name", "r2");
157
158 Relation r3 = new Relation(3);
159 ds.addPrimitive(r3);
160 r3.put("name", "r3");
161
162 Relation r4 = new Relation(4);
163 ds.addPrimitive(r4);
164 r4.put("name", "unrelated");
165
166
167 r1.addMember(new RelationMember("", r2));
168 r1.addMember(new RelationMember("", r3));
169
170 r1.setDeleted(true);
171 r2.setDeleted(true);
172 r3.setDeleted(true);
173 r4.setDeleted(true);
174
175
176 APIDataSet apiDataSet = new APIDataSet();
177 // add r1 first to test functionality of APIDataSet#adjustRelationUploadOrder()
178 apiDataSet.getPrimitivesToDelete().add(r1);
179 apiDataSet.getPrimitivesToDelete().add(r2);
180 apiDataSet.getPrimitivesToDelete().add(r3);
181 apiDataSet.getPrimitivesToDelete().add(r4);
182 try {
183 apiDataSet.adjustRelationUploadOrder();
184 } catch(CyclicUploadDependencyException e) {
185 fail("unexpected exception:" + e);
186 }
187 List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
188
189 assertEquals(4, toDelete.size());
190 assertEquals(true, toDelete.indexOf(r2) < toDelete.indexOf(r1));
191 assertEquals(true, toDelete.indexOf(r3) < toDelete.indexOf(r1));
192 }
193
194 @Test // for ticket #9656
195 public void deleteWay() {
196 DataSet ds = new DataSet();
197 final Way way = new Way(1, 2);
198 way.put("highway", "unclassified");
199 ds.addPrimitive(way);
200
201 final Node n1 = new Node(2);
202 ds.addPrimitive(n1);
203 way.addNode(n1);
204
205 final Node n2 = new Node(3);
206 ds.addPrimitive(n2);
207 way.addNode(n2);
208
209 Relation r1 = new Relation(4, 2);
210 ds.addPrimitive(r1);
211 r1.put("name", "r1");
212 r1.addMember(new RelationMember("foo", way));
213
214
215 r1.setDeleted(true);
216 way.setDeleted(true);
217 n1.setDeleted(true);
218 n2.setDeleted(true);
219
220 APIDataSet apiDataSet = new APIDataSet();
221 apiDataSet.init(ds);
222 try {
223 apiDataSet.adjustRelationUploadOrder();
224 } catch (CyclicUploadDependencyException e) {
225 fail("unexpected exception:" + e);
226 }
227 List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
228
229 assertEquals(4, toDelete.size());
230 assertEquals(true, toDelete.indexOf(way) < toDelete.indexOf(n1));
231 assertEquals(true, toDelete.indexOf(way) < toDelete.indexOf(n2));
232 assertEquals(true, toDelete.indexOf(r1) < toDelete.indexOf(way));
233 }
234
235 @Test
236 public void oneCycle() {
237 DataSet ds = new DataSet();
238 Relation r1 = new Relation();
239 ds.addPrimitive(r1);
240 r1.put("name", "r1");
241
242 Relation r2 = new Relation();
243 ds.addPrimitive(r2);
244 r2.put("name", "r2");
245
246 Relation r3 = new Relation();
247 ds.addPrimitive(r3);
248 r3.put("name", "r3");
249
250 r1.addMember(new RelationMember("", r2));
251 r2.addMember(new RelationMember("", r3));
252 r3.addMember(new RelationMember("", r1));
253
254 APIDataSet apiDataSet = new APIDataSet();
255 apiDataSet.init(ds);
256 try {
257 apiDataSet.adjustRelationUploadOrder();
258 fail("expected cyclic upload dependency exception not thrown");
259 } catch(CyclicUploadDependencyException e) {
260 System.out.println(e);
261 }
262 }
263}
Note: See TracBrowser for help on using the repository browser.