// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.List; import org.junit.Test; import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException; import org.openstreetmap.josm.data.APIDataSet; public class APIDataSetTest { @Test public void oneNewRelationOnly() { Relation r = new Relation(); r.put("name", "r1"); DataSet ds = new DataSet(); ds.addPrimitive(r); APIDataSet apiDataSet = new APIDataSet(); apiDataSet.init(ds); try { apiDataSet.adjustRelationUploadOrder(); } catch(CyclicUploadDependencyException e) { fail("unexpected exception:" + e); } List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd(); assertEquals(1, toAdd.size()); assertEquals(r, toAdd.get(0)); } @Test public void newParentChildPair() { 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); try { apiDataSet.adjustRelationUploadOrder(); } catch(CyclicUploadDependencyException e) { fail("unexpected exception:" + e); } 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 oneExistingAndThreNewInAChain() { 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); try { apiDataSet.adjustRelationUploadOrder(); } catch(CyclicUploadDependencyException e) { fail("unexpected exception:" + e); } 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)); } @Test public void oneParentTwoNewChildren() { 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); try { apiDataSet.adjustRelationUploadOrder(); } catch(CyclicUploadDependencyException e) { fail("unexpected exception:" + e); } List<OsmPrimitive> toAdd = apiDataSet.getPrimitivesToAdd(); assertEquals(3, toAdd.size()); assertEquals(true, toAdd.indexOf(r2) < toAdd.indexOf(r1)); assertEquals(true, toAdd.indexOf(r3) < toAdd.indexOf(r1)); } @Test public void oneCycle() { 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); } } }