/* Copyright (c) 2013-2014 Boundless and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Distribution License v1.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/edl-v10.html * * Contributors: * Victor Olaya (Boundless) - initial implementation */ package org.locationtech.geogig.test.integration; import java.util.Iterator; import org.junit.Test; import org.locationtech.geogig.api.NodeRef; import org.locationtech.geogig.api.ObjectId; import org.locationtech.geogig.api.RevFeatureTypeImpl; import org.locationtech.geogig.api.plumbing.diff.DiffEntry; import org.locationtech.geogig.api.plumbing.diff.Patch; import org.locationtech.geogig.api.porcelain.AddOp; import org.locationtech.geogig.api.porcelain.CommitOp; import org.locationtech.geogig.api.porcelain.CreatePatchOp; import org.locationtech.geogig.api.porcelain.DiffOp; import org.locationtech.geogig.repository.WorkingTree; import org.opengis.feature.Feature; import org.opengis.feature.simple.SimpleFeatureType; public class CreatePatchOpTest extends RepositoryTestCase { @Override protected void setUpInternal() throws Exception { } @Test public void testCreatePatch() throws Exception { insertAndAdd(points1, points2); geogig.command(CommitOp.class).setAll(true).call(); final String featureId = points1.getIdentifier().getID(); final Feature modifiedFeature = feature((SimpleFeatureType) points1.getType(), featureId, "changedProp", new Integer(1500), "POINT (2 2)"); insert(modifiedFeature); insert(points3); delete(points2); Iterator<DiffEntry> diffs = geogig.command(DiffOp.class).call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(3, patch.count()); assertEquals(1, patch.getAddedFeatures().size()); assertEquals(1, patch.getRemovedFeatures().size()); assertEquals(1, patch.getModifiedFeatures().size()); assertEquals(RevFeatureTypeImpl.build(pointsType), patch.getFeatureTypes().get(0)); assertEquals(NodeRef.appendChild(pointsName, idP2), patch.getRemovedFeatures().get(0) .getPath()); assertEquals(NodeRef.appendChild(pointsName, idP3), patch.getAddedFeatures().get(0) .getPath()); } @Test public void testCreatePatchUsingIndex() throws Exception { insertAndAdd(points1, points2); geogig.command(CommitOp.class).setAll(true).call(); final String featureId = points1.getIdentifier().getID(); final Feature modifiedFeature = feature((SimpleFeatureType) points1.getType(), featureId, "changedProp", new Integer(1500), null); insertAndAdd(modifiedFeature); insertAndAdd(points3); deleteAndAdd(points2); delete(points3); DiffOp op = geogig.command(DiffOp.class); op.setCompareIndex(true); Iterator<DiffEntry> diffs = op.call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(3, patch.count()); assertEquals(1, patch.getAddedFeatures().size()); assertEquals(1, patch.getRemovedFeatures().size()); assertEquals(1, patch.getModifiedFeatures().size()); assertEquals(RevFeatureTypeImpl.build(pointsType), patch.getFeatureTypes().get(0)); assertEquals(NodeRef.appendChild(pointsName, idP2), patch.getRemovedFeatures().get(0) .getPath()); assertEquals(NodeRef.appendChild(pointsName, idP3), patch.getAddedFeatures().get(0) .getPath()); } @Test public void testCreatePatchWithNoChanges() throws Exception { insertAndAdd(points1, points2); geogig.command(CommitOp.class).setAll(true).call(); Iterator<DiffEntry> diffs = geogig.command(DiffOp.class).call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(0, patch.count()); } @Test public void testCreatePatchAddNewFeatureToEmptyRepo() throws Exception { insert(points1); DiffOp op = geogig.command(DiffOp.class); Iterator<DiffEntry> diffs = op.call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(1, patch.getAddedFeatures().size()); } @Test public void testCreatePatchAddNewEmptyFeatureTypeToEmptyRepo() throws Exception { WorkingTree workingTree = geogig.getRepository().workingTree(); workingTree.createTypeTree(linesName, linesType); DiffOp op = geogig.command(DiffOp.class).setReportTrees(true); Iterator<DiffEntry> diffs = op.call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(1, patch.getAlteredTrees().size()); assertEquals(ObjectId.NULL, patch.getAlteredTrees().get(0).getOldFeatureType()); assertEquals(RevFeatureTypeImpl.build(linesType).getId(), patch.getAlteredTrees().get(0) .getNewFeatureType()); assertEquals(1, patch.getFeatureTypes().size()); } @Test public void testCreatePatchRemoveEmptyFeatureType() throws Exception { WorkingTree workingTree = geogig.getRepository().workingTree(); workingTree.createTypeTree(linesName, linesType); geogig.command(AddOp.class).setUpdateOnly(false).call(); workingTree.delete(linesName); DiffOp op = geogig.command(DiffOp.class).setReportTrees(true); Iterator<DiffEntry> diffs = op.call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(1, patch.getAlteredTrees().size()); assertEquals(RevFeatureTypeImpl.build(linesType).getId(), patch.getAlteredTrees().get(0) .getOldFeatureType()); assertEquals(ObjectId.NULL, patch.getAlteredTrees().get(0).getNewFeatureType()); assertEquals(1, patch.getFeatureTypes().size()); } @Test public void testCreatePatchModifyFeatureType() throws Exception { DiffOp op = geogig.command(DiffOp.class).setReportTrees(true); insertAndAdd(points1, points2); geogig.getRepository().workingTree().updateTypeTree(pointsName, modifiedPointsType); Iterator<DiffEntry> diffs = op.call(); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(1, patch.getAlteredTrees().size()); assertEquals(RevFeatureTypeImpl.build(pointsType).getId(), patch.getAlteredTrees().get(0) .getOldFeatureType()); assertEquals(RevFeatureTypeImpl.build(modifiedPointsType).getId(), patch.getAlteredTrees().get(0).getNewFeatureType()); assertEquals(2, patch.getFeatureTypes().size()); } @Test public void testCreatePatchAddNewEmptyPath() throws Exception { insert(points1); delete(points1); DiffOp op = geogig.command(DiffOp.class).setReportTrees(true); Iterator<DiffEntry> diffs = op.call(); // ArrayList<DiffEntry> list = Lists.newArrayList(diffs); Patch patch = geogig.command(CreatePatchOp.class).setDiffs(diffs).call(); assertEquals(1, patch.getAlteredTrees().size()); } }