/* 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: * Gabriel Roldan (Boundless) - initial implementation */ package org.locationtech.geogig.api.plumbing.diff; import static org.locationtech.geogig.api.NodeRef.ROOT; import static org.locationtech.geogig.api.ObjectId.NULL; import java.util.Iterator; import javax.annotation.Nullable; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.locationtech.geogig.api.Node; import org.locationtech.geogig.api.NodeRef; import org.locationtech.geogig.api.ObjectId; import org.locationtech.geogig.api.RevObject.TYPE; import org.locationtech.geogig.api.RevTree; import org.locationtech.geogig.api.plumbing.diff.DepthTreeIterator.Strategy; import org.locationtech.geogig.storage.ObjectDatabase; import org.locationtech.geogig.storage.memory.HeapObjectDatabse; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; public class MutableTreeTest extends Assert { MutableTree root; @Before public void setUp() { ObjectId md1 = id("d1"); ObjectId md2 = id("d2"); ObjectId md3 = id("d3"); ObjectId md4 = id("d4"); ObjectId t1 = id("a1"); ObjectId t2 = id("a2"); ObjectId t3 = id("a3"); ObjectId t4 = id("a4"); ObjectId t5 = id("a5"); ObjectId t6 = id("a6"); NodeRef r1 = tree("roads", t1, ObjectId.NULL); NodeRef r11 = tree("roads/highways", t2, md1); NodeRef r12 = tree("roads/streets", t3, md2); NodeRef r2 = tree("buildings", t4, ObjectId.NULL); NodeRef r21 = tree("buildings/stores", t5, md3); NodeRef r22 = tree("buildings/unknown", t6, md4); ImmutableList<NodeRef> refs = ImmutableList.of(r1, r11, r12, r2, r21, r22); root = MutableTree.createFromRefs(id("abc"), refs.iterator()); assertNotNull(root); } @Test public void testRoot() { assertNode(root, id("abc"), null, ROOT); } @Test @Ignore public void testBuild() { ObjectDatabase origin = new HeapObjectDatabse(); origin.open(); ObjectDatabase target = new HeapObjectDatabse(); target.open(); RevTree tree = root.build(origin, target); Iterator<NodeRef> treeRefs = new DepthTreeIterator("", ObjectId.NULL, tree, target, Strategy.RECURSIVE_TREES_ONLY); MutableTree createFromRefs = MutableTree.createFromRefs(root.getNode().getObjectId(), treeRefs); // TODO finish } @Test public void testGetChild() { assertNode(root.getChild("roads"), id("a1"), null, "roads"); assertNode(root.getChild("roads/highways"), id("a2"), id("d1"), "highways"); assertNode(root.getChild("roads/streets"), id("a3"), id("d2"), "streets"); assertNode(root.getChild("roads").getChild("highways"), id("a2"), id("d1"), "highways"); assertNode(root.getChild("buildings"), id("a4"), null, "buildings"); assertNode(root.getChild("buildings/stores"), id("a5"), id("d3"), "stores"); assertNode(root.getChild("buildings/unknown"), id("a6"), id("d4"), "unknown"); assertNode(root.getChild("buildings").getChild("unknown"), id("a6"), id("d4"), "unknown"); } @Test public void testSet() { Node node = treeNode("roads", id("a11"), id("d1")); root.setChild("", node); assertEquals(node, root.getChild("roads").getNode()); node = treeNode("stores", id("a51"), id("d3")); root.setChild("buildings", node); assertEquals(node, root.getChild("buildings/stores").getNode()); } @Test public void testGetChildPreconditions() { try { assertNode(root.getChild(""), NULL, null, ROOT); fail("expected IAE on empty path"); } catch (IllegalArgumentException e) { assertTrue(true); } try { assertNull(root.getChild("notAChild")); fail("expected IAE on invalid child name"); } catch (IllegalArgumentException e) { assertTrue(true); } try { assertNull(root.getChild("not/a/child")); fail("expected IAE on invalid child name"); } catch (IllegalArgumentException e) { assertTrue(true); } } private void assertNode(MutableTree mutableTree, ObjectId treeId, @Nullable ObjectId metadtaId, String nodeName) { assertNotNull(mutableTree); Node node = mutableTree.getNode(); assertNotNull(node); assertEquals(treeId, node.getObjectId()); if (metadtaId == null) { assertFalse(node.getMetadataId().isPresent()); } else { assertEquals(metadtaId, node.getMetadataId().get()); } assertEquals(nodeName, node.getName()); assertEquals(TYPE.TREE, node.getType()); } private NodeRef tree(String path, ObjectId treeId, ObjectId metadataId) { String parentPath = NodeRef.parentPath(path); String name = NodeRef.nodeFromPath(path); Node node = treeNode(name, treeId, metadataId); return new NodeRef(node, parentPath, ObjectId.NULL); } private Node treeNode(String name, ObjectId treeId, ObjectId metadataId) { Node node = Node.create(name, treeId, metadataId, TYPE.TREE, null); return node; } private static ObjectId id(String hash) { hash = Strings.padEnd(hash, 2 * ObjectId.NUM_BYTES, '0'); return ObjectId.valueOf(hash); } }