diff --git a/dhfs-parent/kleppmanntree/pom.xml b/dhfs-parent/kleppmanntree/pom.xml
index 077abfd1..72f83688 100644
--- a/dhfs-parent/kleppmanntree/pom.xml
+++ b/dhfs-parent/kleppmanntree/pom.xml
@@ -18,6 +18,11 @@
junit-jupiter-engine
test
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
org.apache.commons
commons-collections4
diff --git a/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java b/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java
index d4694d1a..06e74d5b 100644
--- a/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java
+++ b/dhfs-parent/kleppmanntree/src/main/java/com/usatiuk/kleppmanntree/KleppmannTree.java
@@ -64,7 +64,7 @@ public class KleppmannTree, PeerIdT ex
// Needs to be read after changing curParent, as it might be the same node
var oldParent = _storage.getById(effect.oldInfo().oldParent());
{
- var newOldParentChildren = oldParent.children().plus(node.meta().getName(), node.key());
+ var newOldParentChildren = oldParent.children().plus(effect.oldInfo().oldMeta().getName(), node.key());
oldParent = oldParent.withChildren(newOldParentChildren);
_storage.putNode(oldParent);
}
diff --git a/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java b/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java
index dfe99ebd..eb651b08 100644
--- a/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java
+++ b/dhfs-parent/kleppmanntree/src/test/java/com/usatiuk/kleppmanntree/KleppmanTreeSimpleTest.java
@@ -2,13 +2,15 @@ package com.usatiuk.kleppmanntree;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import java.util.List;
public class KleppmanTreeSimpleTest {
private final TestNode testNode1 = new TestNode(1);
private final TestNode testNode2 = new TestNode(2);
-
+ private final TestNode testNode3 = new TestNode(3);
@Test
void circularTest() {
@@ -89,4 +91,50 @@ public class KleppmanTreeSimpleTest {
Assertions.assertTrue(testNode2._storageInterface.getLog().size() <= 1);
}
+ @ParameterizedTest
+ @ValueSource(booleans = {true, false})
+ void undoWithRenameTest(boolean opOrder) {
+ var d1id = testNode1._storageInterface.getNewNodeId();
+ var d2id = testNode2._storageInterface.getNewNodeId();
+ var d3id = testNode2._storageInterface.getNewNodeId();
+ testNode1._tree.move(testNode1._storageInterface.getRootId(), new TestNodeMetaDir("Test1"), d1id);
+ testNode2._tree.move(testNode1._storageInterface.getRootId(), new TestNodeMetaDir("Test1"), d2id);
+ testNode3._tree.move(testNode1._storageInterface.getRootId(), new TestNodeMetaDir("Test1"), d3id);
+ var r1 = testNode1.getRecorded();
+ var r2 = testNode2.getRecorded();
+ var r3 = testNode3.getRecorded();
+ Assertions.assertEquals(1, r1.size());
+ Assertions.assertEquals(1, r2.size());
+ Assertions.assertEquals(1, r3.size());
+
+ if (opOrder) {
+ testNode2._tree.applyExternalOp(3L, r3.getFirst());
+ testNode2._tree.applyExternalOp(1L, r1.getFirst());
+ } else {
+ testNode2._tree.applyExternalOp(1L, r1.getFirst());
+ testNode2._tree.applyExternalOp(3L, r3.getFirst());
+ }
+
+ Assertions.assertIterableEquals(List.of("Test1", "Test1.conflict." + d1id, "Test1.conflict." + d2id), testNode2._storageInterface.getById(testNode2._storageInterface.getRootId()).children().keySet());
+
+ if (opOrder) {
+ testNode1._tree.applyExternalOp(3L, r3.getFirst());
+ testNode1._tree.applyExternalOp(2L, r2.getFirst());
+ } else {
+ testNode1._tree.applyExternalOp(2L, r2.getFirst());
+ testNode1._tree.applyExternalOp(3L, r3.getFirst());
+ }
+
+ Assertions.assertIterableEquals(List.of("Test1", "Test1.conflict." + d1id, "Test1.conflict." + d2id), testNode1._storageInterface.getById(testNode1._storageInterface.getRootId()).children().keySet());
+
+ if (opOrder) {
+ testNode3._tree.applyExternalOp(2L, r2.getFirst());
+ testNode3._tree.applyExternalOp(1L, r1.getFirst());
+ } else {
+ testNode3._tree.applyExternalOp(1L, r1.getFirst());
+ testNode3._tree.applyExternalOp(2L, r2.getFirst());
+ }
+
+ Assertions.assertIterableEquals(List.of("Test1", "Test1.conflict." + d1id, "Test1.conflict." + d2id), testNode3._storageInterface.getById(testNode3._storageInterface.getRootId()).children().keySet());
+ }
}