// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.set.v0_6;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.openstreetmap.osmosis.core.Osmosis;
import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer;
import org.openstreetmap.osmosis.core.domain.v0_6.Entity;
import org.openstreetmap.osmosis.core.domain.v0_6.EntityType;
import org.openstreetmap.osmosis.core.misc.v0_6.EmptyReader;
import org.openstreetmap.osmosis.core.task.common.ChangeAction;
import org.openstreetmap.osmosis.core.task.v0_6.RunnableSource;
import org.openstreetmap.osmosis.testutil.AbstractDataTest;
import org.openstreetmap.osmosis.testutil.v0_6.RunTaskUtilities;
import org.openstreetmap.osmosis.testutil.v0_6.SinkChangeInspector;
import org.openstreetmap.osmosis.xml.common.CompressionMethod;
import org.openstreetmap.osmosis.xml.v0_6.XmlReader;
/**
* Tests for --derive-change task.
*
* @author Igor Podolskiy
*/
public class ChangeDeriverTest extends AbstractDataTest {
/**
* Empty inputs should yield empty change.
*
* @throws Exception if something goes wrong.
*/
@Test
public void emptyInputs() throws Exception {
deriveChange("v0_6/empty-entity.osm",
"v0_6/empty-entity.osm",
"v0_6/empty-change.osc");
}
/**
* Same inputs should yield empty change.
*
* @throws Exception if something goes wrong.
*/
@Test
public void sameInputs() throws Exception {
deriveChange("v0_6/derive_change/simple.osm",
"v0_6/derive_change/simple.osm",
"v0_6/empty-change.osc");
}
/**
* Deriving change with an empty left input should yield
* a change with deletes only.
*
* @throws Exception if something goes wrong.
*/
@Test
public void leftEmpty() throws Exception {
deriveChange("v0_6/empty-entity.osm",
"v0_6/derive_change/simple.osm",
"v0_6/derive_change/full-create.osc");
}
/**
* Deriving change with an empty right input should yield
* a change with creates only.
*
* @throws Exception if something goes wrong.
*/
@Test
public void rightEmpty() throws Exception {
// Cannot be tested with file comparison as the derived
// change contains deletes which have a current timestamp
// that cannot be reliably predicted.
// Therefore, check all relevant attributes manually.
ChangeDeriver deriver = new ChangeDeriver(1);
RunnableSource left = new XmlReader(dataUtils.createDataFile(
"v0_6/derive_change/simple.osm"), true, CompressionMethod.None);
RunnableSource right = new EmptyReader();
SinkChangeInspector result = RunTaskUtilities.run(deriver, left, right);
List<ChangeContainer> changes = result.getProcessedChanges();
Assert.assertEquals(3, changes.size());
for (ChangeContainer changeContainer : changes) {
Assert.assertEquals(ChangeAction.Delete, changeContainer.getAction());
}
Entity e;
e = changes.get(0).getEntityContainer().getEntity();
Assert.assertEquals(EntityType.Node, e.getType());
Assert.assertEquals(10, e.getId());
Assert.assertEquals(34, e.getVersion());
e = changes.get(1).getEntityContainer().getEntity();
Assert.assertEquals(EntityType.Way, e.getType());
Assert.assertEquals(100, e.getId());
Assert.assertEquals(56, e.getVersion());
e = changes.get(2).getEntityContainer().getEntity();
Assert.assertEquals(EntityType.Relation, e.getType());
Assert.assertEquals(1000, e.getId());
Assert.assertEquals(78, e.getVersion());
}
private void deriveChange(String leftFileName, String rightFileName,
String expectedOutputFileName) throws IOException {
File leftFile;
File rightFile;
File expectedOutputFile;
File actualOutputFile;
leftFile = dataUtils.createDataFile(leftFileName);
rightFile = dataUtils.createDataFile(rightFileName);
expectedOutputFile = dataUtils.createDataFile(expectedOutputFileName);
actualOutputFile = dataUtils.newFile();
Osmosis.run(
new String [] {
"-q",
"--read-xml-0.6", rightFile.getPath(),
"--read-xml-0.6", leftFile.getPath(),
"--derive-change-0.6",
"--write-xml-change-0.6", actualOutputFile.getPath()
}
);
dataUtils.compareFiles(expectedOutputFile, actualOutputFile);
}
}