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