// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.osm;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException;
import org.openstreetmap.josm.data.APIDataSet;
import org.openstreetmap.josm.data.conflict.ConflictCollection;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
/**
* Unit tests for class {@link APIDataSet}.
*/
public class APIDataSetTest {
/**
* Setup test.
*/
@Rule
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public JOSMTestRules test = new JOSMTestRules();
@Test
public void testOneNewRelationOnly() throws CyclicUploadDependencyException {
Relation r = new Relation();
r.put("name", "r1");
DataSet ds = new DataSet();
ds.addPrimitive(r);
APIDataSet apiDataSet = new APIDataSet();
apiDataSet.init(ds);
apiDataSet.adjustRelationUploadOrder();
List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
assertEquals(1, toAdd.size());
assertEquals(r, toAdd.get(0));
}
@Test
public void testNewParentChildPair() throws CyclicUploadDependencyException {
DataSet ds = new DataSet();
Relation r1 = new Relation();
ds.addPrimitive(r1);
r1.put("name", "r1");
Relation r2 = new Relation();
ds.addPrimitive(r2);
r2.put("name", "r2");
r1.addMember(new RelationMember("", r2));
APIDataSet apiDataSet = new APIDataSet();
apiDataSet.init(ds);
apiDataSet.adjustRelationUploadOrder();
List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
assertEquals(2, toAdd.size());
assertEquals(r2, toAdd.get(0)); // child first
assertEquals(r1, toAdd.get(1)); // ... then the parent
}
@Test
public void testOneExistingAndThreNewInAChain() throws CyclicUploadDependencyException {
DataSet ds = new DataSet();
Relation r1 = new Relation();
ds.addPrimitive(r1);
r1.put("name", "r1");
Relation r2 = new Relation();
ds.addPrimitive(r2);
r2.put("name", "r2");
Relation r3 = new Relation();
ds.addPrimitive(r3);
r3.put("name", "r3");
Relation r4 = new Relation(1, 1);
ds.addPrimitive(r4);
r4.put("name", "r4");
r4.setModified(true);
r1.addMember(new RelationMember("", r2));
r2.addMember(new RelationMember("", r3));
APIDataSet apiDataSet = new APIDataSet();
apiDataSet.init(ds);
apiDataSet.adjustRelationUploadOrder();
List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
assertEquals(3, toAdd.size());
assertEquals(r3, toAdd.get(0));
assertEquals(r2, toAdd.get(1));
assertEquals(r1, toAdd.get(2));
List<OsmPrimitive> toUpdate = apiDataSet.getPrimitivesToUpdate();
assertEquals(1, toUpdate.size());
assertEquals(r4, toUpdate.get(0));
final ConflictCollection cc4 = new ConflictCollection();
cc4.add(r4, r4);
assertTrue(apiDataSet.participatesInConflict(cc4));
final ConflictCollection cc1 = new ConflictCollection();
cc1.add(r1, r1);
assertFalse(apiDataSet.participatesInConflict(cc1));
}
@Test
public void testOneParentTwoNewChildren() throws CyclicUploadDependencyException {
DataSet ds = new DataSet();
Relation r1 = new Relation();
ds.addPrimitive(r1);
r1.put("name", "r1");
Relation r2 = new Relation();
ds.addPrimitive(r2);
r2.put("name", "r2");
Relation r3 = new Relation();
ds.addPrimitive(r3);
r3.put("name", "r3");
r1.addMember(new RelationMember("", r2));
r1.addMember(new RelationMember("", r3));
APIDataSet apiDataSet = new APIDataSet();
apiDataSet.init(ds);
apiDataSet.adjustRelationUploadOrder();
List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd();
assertEquals(3, toAdd.size());
assertTrue(toAdd.indexOf(r2) < toAdd.indexOf(r1));
assertTrue(toAdd.indexOf(r3) < toAdd.indexOf(r1));
}
@Test // for ticket #9624
public void testDeleteOneParentTwoNewChildren() throws CyclicUploadDependencyException {
DataSet ds = new DataSet();
Relation r1 = new Relation(1);
ds.addPrimitive(r1);
r1.put("name", "r1");
Relation r2 = new Relation(2);
ds.addPrimitive(r2);
r2.put("name", "r2");
Relation r3 = new Relation(3);
ds.addPrimitive(r3);
r3.put("name", "r3");
Relation r4 = new Relation(4);
ds.addPrimitive(r4);
r4.put("name", "unrelated");
r1.addMember(new RelationMember("", r2));
r1.addMember(new RelationMember("", r3));
r1.setDeleted(true);
r2.setDeleted(true);
r3.setDeleted(true);
r4.setDeleted(true);
APIDataSet apiDataSet = new APIDataSet();
// add r1 first to test functionality of APIDataSet#adjustRelationUploadOrder()
apiDataSet.getPrimitivesToDelete().add(r1);
apiDataSet.getPrimitivesToDelete().add(r2);
apiDataSet.getPrimitivesToDelete().add(r3);
apiDataSet.getPrimitivesToDelete().add(r4);
apiDataSet.adjustRelationUploadOrder();
List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
assertEquals(4, toDelete.size());
assertTrue(toDelete.indexOf(r2) < toDelete.indexOf(r1));
assertTrue(toDelete.indexOf(r3) < toDelete.indexOf(r1));
}
@Test // for ticket #9656
public void testDeleteWay() throws CyclicUploadDependencyException {
DataSet ds = new DataSet();
final Way way = new Way(1, 2);
way.put("highway", "unclassified");
ds.addPrimitive(way);
final Node n1 = new Node(2);
ds.addPrimitive(n1);
way.addNode(n1);
final Node n2 = new Node(3);
ds.addPrimitive(n2);
way.addNode(n2);
Relation r1 = new Relation(4, 2);
ds.addPrimitive(r1);
r1.put("name", "r1");
r1.addMember(new RelationMember("foo", way));
r1.setDeleted(true);
way.setDeleted(true);
n1.setDeleted(true);
n2.setDeleted(true);
APIDataSet apiDataSet = new APIDataSet();
apiDataSet.init(ds);
apiDataSet.adjustRelationUploadOrder();
List<OsmPrimitive> toDelete = apiDataSet.getPrimitivesToDelete();
assertEquals(4, toDelete.size());
assertTrue(toDelete.indexOf(way) < toDelete.indexOf(n1));
assertTrue(toDelete.indexOf(way) < toDelete.indexOf(n2));
assertTrue(toDelete.indexOf(r1) < toDelete.indexOf(way));
}
@Test
public void testOneCycle() {
DataSet ds = new DataSet();
Relation r1 = new Relation();
ds.addPrimitive(r1);
r1.put("name", "r1");
Relation r2 = new Relation();
ds.addPrimitive(r2);
r2.put("name", "r2");
Relation r3 = new Relation();
ds.addPrimitive(r3);
r3.put("name", "r3");
r1.addMember(new RelationMember("", r2));
r2.addMember(new RelationMember("", r3));
r3.addMember(new RelationMember("", r1));
APIDataSet apiDataSet = new APIDataSet();
apiDataSet.init(ds);
try {
apiDataSet.adjustRelationUploadOrder();
fail("expected cyclic upload dependency exception not thrown");
} catch (CyclicUploadDependencyException e) {
System.out.println(e);
}
}
}