diff --git a/hutool-core/src/test/java/cn/hutool/core/map/LinkedForestMapTest.java b/hutool-core/src/test/java/cn/hutool/core/map/LinkedForestMapTest.java
index 27af0b13c..af13d4c5e 100644
--- a/hutool-core/src/test/java/cn/hutool/core/map/LinkedForestMapTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/map/LinkedForestMapTest.java
@@ -6,24 +6,8 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import java.util.Collection;
+import java.util.*;
-/**
- * {@link LinkedForestMap}的测试用例。
- *
- */
public class LinkedForestMapTest {
private final ForestMap treeNodeMap = new LinkedForestMap<>(false);
@@ -31,110 +15,351 @@ public class LinkedForestMapTest {
@Before
public void beforeTest() {
// a -> b -> c -> d
- treeNodeMap.linkNodes("a", "b");
- treeNodeMap.linkNodes("b", "c");
- treeNodeMap.linkNodes("c", "d");
+ treeNodeMap.putLinkedNodes("a", "b", "bbb");
+ treeNodeMap.putLinkedNodes("b", "c", "ccc");
+ treeNodeMap.putLinkedNodes("c", "d", "ddd");
+ treeNodeMap.get("a").setValue("aaa");
}
@Test
- public void testRegisterBeforeRemove() {
- // containsChildNode
- Assert.assertTrue(treeNodeMap.containsChildNode("a", "b"));
- Assert.assertTrue(treeNodeMap.containsChildNode("a", "c"));
- Assert.assertTrue(treeNodeMap.containsChildNode("a", "d"));
- Assert.assertFalse(treeNodeMap.containsChildNode("a", "e"));
+ public void testTreeEntry() {
+ TreeEntry parent = treeNodeMap.get("b");
+ TreeEntry treeEntry = treeNodeMap.get("c");
+ TreeEntry child = treeNodeMap.get("d");
- // getChildNodes
- Assert.assertEquals(CollUtil.newLinkedHashSet("b", "c", "d"), transKey(treeNodeMap.getChildNodes("a")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("c", "d"), transKey(treeNodeMap.getChildNodes("b")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("d"), transKey(treeNodeMap.getChildNodes("c")));
- Assert.assertEquals(CollUtil.newLinkedHashSet(), transKey(treeNodeMap.getChildNodes("d")));
+ // Entry相关
+ Assert.assertEquals("c", treeEntry.getKey());
+ Assert.assertEquals("ccc", treeEntry.getValue());
- // getRootNode
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("a")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("b")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("c")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("d")));
+ // 父节点相关方法
+ Assert.assertEquals(2, treeEntry.getWeight());
+ Assert.assertEquals(treeNodeMap.get("a"), treeEntry.getRoot());
+ Assert.assertTrue(treeEntry.hasParent());
+ Assert.assertEquals(parent, treeEntry.getDeclaredParent());
+ Assert.assertEquals(treeNodeMap.get("a"), treeEntry.getParent("a"));
+ Assert.assertTrue(treeEntry.containsParent("a"));
- // getTreeNodes
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d"), transKey(treeNodeMap.getTreeNodes("a")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d"), transKey(treeNodeMap.getTreeNodes("b")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d"), transKey(treeNodeMap.getTreeNodes("c")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d"), transKey(treeNodeMap.getTreeNodes("d")));
+ // 子节点相关方法
+ List> nodes = new ArrayList<>();
+ treeEntry.forEachChild(true, nodes::add);
+ Assert.assertEquals(CollUtil.newArrayList(treeEntry, child), nodes);
+ nodes.clear();
+ treeEntry.forEachChild(false, nodes::add);
+ Assert.assertEquals(CollUtil.newArrayList(child), nodes);
- // 循环依赖
- Assert.assertThrows(IllegalArgumentException.class, () -> treeNodeMap.linkNodes("d", "a"));
+ Assert.assertEquals(CollUtil.newLinkedHashSet(child), new LinkedHashSet<>(treeEntry.getDeclaredChildren().values()));
+ Assert.assertEquals(CollUtil.newLinkedHashSet(child), new LinkedHashSet<>(treeEntry.getChildren().values()));
+ Assert.assertTrue(treeEntry.hasChildren());
+ Assert.assertEquals(treeNodeMap.get("d"), treeEntry.getChild("d"));
+ Assert.assertTrue(treeEntry.containsChild("d"));
}
@Test
- public void testAfterRemove() {
- // a -> b, c -> d
- treeNodeMap.unlinkNode("b", "c");
+ public void putTest() {
+ ForestMap map = new LinkedForestMap<>(false);
- // getDeclaredChildren
- Assert.assertEquals(CollUtil.newLinkedHashSet("b"), transKey(treeNodeMap.getChildNodes("a")));
- Assert.assertEquals(CollUtil.newLinkedHashSet(), transKey(treeNodeMap.getChildNodes("b")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("d"), transKey(treeNodeMap.getChildNodes("c")));
- Assert.assertEquals(CollUtil.newLinkedHashSet(), transKey(treeNodeMap.getChildNodes("d")));
+ TreeEntry treeEntry = new LinkedForestMap.TreeEntryNode<>(null, "a", "aaa");
+ Assert.assertNull(map.put("a", treeEntry));
+ Assert.assertNotEquals(map.get("a"), treeEntry);
+ Assert.assertEquals(map.get("a").getKey(), treeEntry.getKey());
+ Assert.assertEquals(map.get("a").getValue(), treeEntry.getValue());
- // getRootNode
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("a")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("b")));
- Assert.assertEquals("c", transKey(treeNodeMap.getRootNode("c")));
- Assert.assertEquals("c", transKey(treeNodeMap.getRootNode("d")));
-
- // getTreeNodes
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b"), transKey(treeNodeMap.getTreeNodes("a")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b"), transKey(treeNodeMap.getTreeNodes("b")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("c", "d"), transKey(treeNodeMap.getTreeNodes("c")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("c", "d"), transKey(treeNodeMap.getTreeNodes("d")));
+ treeEntry = new LinkedForestMap.TreeEntryNode<>(null, "a", "aaaa");
+ Assert.assertNotNull(map.put("a", treeEntry));
+ Assert.assertNotEquals(map.get("a"), treeEntry);
+ Assert.assertEquals(map.get("a").getKey(), treeEntry.getKey());
+ Assert.assertEquals(map.get("a").getValue(), treeEntry.getValue());
}
@Test
- public void testReRegisterAfterRemove() {
- // a -> b -> c -> d
- treeNodeMap.linkNodes("b", "c");
- testRegisterBeforeRemove();
+ public void removeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+
+ TreeEntry a = map.get("a");
+ TreeEntry b = map.get("b");
+ TreeEntry c = map.get("c");
+
+ map.remove("b");
+ Assert.assertNull(map.get("b"));
+ Assert.assertFalse(b.hasChildren());
+ Assert.assertFalse(b.hasParent());
+ Assert.assertEquals(a, c.getDeclaredParent());
+ Assert.assertEquals(CollUtil.newArrayList(c), new ArrayList<>(a.getDeclaredChildren().values()));
}
@Test
- public void testParallelRegister() {
- // a -> b -> c --> d
- // | -> c2 -> d2
- treeNodeMap.linkNodes("b", "c2");
- treeNodeMap.linkNodes("c2", "d2");
+ public void putAllTest() {
+ ForestMap source = new LinkedForestMap<>(false);
+ source.linkNodes("a", "b");
+ source.linkNodes("b", "c");
- // getDeclaredChildren
- Assert.assertEquals(CollUtil.newLinkedHashSet("b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getChildNodes("a")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("c", "d", "c2", "d2"), transKey(treeNodeMap.getChildNodes("b")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("d"), transKey(treeNodeMap.getChildNodes("c")));
- Assert.assertEquals(CollUtil.newLinkedHashSet(), transKey(treeNodeMap.getChildNodes("d")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("d2"), transKey(treeNodeMap.getChildNodes("c2")));
- Assert.assertEquals(CollUtil.newLinkedHashSet(), transKey(treeNodeMap.getChildNodes("d2")));
+ ForestMap target = new LinkedForestMap<>(false);
+ target.putAll(source);
- // getRootNode
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("a")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("b")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("c")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("d")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("c2")));
- Assert.assertEquals("a", transKey(treeNodeMap.getRootNode("d2")));
+ TreeEntry a = target.get("a");
+ TreeEntry b = target.get("b");
+ TreeEntry c = target.get("c");
+
+ Assert.assertNotNull(a);
+ Assert.assertEquals("a", a.getKey());
+ Assert.assertEquals(CollUtil.newArrayList(b, c), new ArrayList<>(a.getChildren().values()));
+
+ Assert.assertNotNull(b);
+ Assert.assertEquals("b", b.getKey());
+ Assert.assertEquals(CollUtil.newArrayList(c), new ArrayList<>(b.getChildren().values()));
+
+ Assert.assertNotNull(c);
+ Assert.assertEquals("c", c.getKey());
+ Assert.assertEquals(CollUtil.newArrayList(), new ArrayList<>(c.getChildren().values()));
- // getTreeNodes
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getTreeNodes("a")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getTreeNodes("b")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getTreeNodes("c")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getTreeNodes("d")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getTreeNodes("c2")));
- Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d", "c2", "d2"), transKey(treeNodeMap.getTreeNodes("d2")));
}
- private static Collection transKey(Collection> entryNodes) {
- return CollStreamUtil.toSet(entryNodes, TreeEntry::getKey);
+ @Test
+ public void clearTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+
+ TreeEntry a = map.get("a");
+ TreeEntry b = map.get("b");
+ TreeEntry c = map.get("c");
+ Assert.assertFalse(a.hasParent());
+ Assert.assertTrue(a.hasChildren());
+ Assert.assertTrue(b.hasParent());
+ Assert.assertTrue(b.hasChildren());
+ Assert.assertTrue(c.hasParent());
+ Assert.assertFalse(c.hasChildren());
+
+ map.clear();
+ Assert.assertTrue(map.isEmpty());
+ Assert.assertFalse(a.hasParent());
+ Assert.assertFalse(a.hasChildren());
+ Assert.assertFalse(b.hasParent());
+ Assert.assertFalse(b.hasChildren());
+ Assert.assertFalse(c.hasParent());
+ Assert.assertFalse(c.hasChildren());
}
- private static K transKey(TreeEntry entryNodes) {
- return entryNodes.getKey();
+ @Test
+ public void putAllNodeTest() {
+ ForestMap> map = new LinkedForestMap<>(false);
+
+ Map aMap = MapBuilder. create()
+ .put("pid", null)
+ .put("id", "a")
+ .build();
+ Map bMap = MapBuilder. create()
+ .put("pid", "a")
+ .put("id", "b")
+ .build();
+ Map cMap = MapBuilder. create()
+ .put("pid", "b")
+ .put("id", "c")
+ .build();
+ map.putAllNode(Arrays.asList(aMap, bMap, cMap), m -> m.get("id"), m -> m.get("pid"), true);
+
+ TreeEntry> a = map.get("a");
+ Assert.assertNotNull(a);
+ TreeEntry> b = map.get("b");
+ Assert.assertNotNull(b);
+ TreeEntry> c = map.get("c");
+ Assert.assertNotNull(c);
+
+ Assert.assertNull(a.getDeclaredParent());
+ Assert.assertEquals(a, b.getDeclaredParent());
+ Assert.assertEquals(b, c.getDeclaredParent());
+
+ Assert.assertEquals(aMap, a.getValue());
+ Assert.assertEquals(bMap, b.getValue());
+ Assert.assertEquals(cMap, c.getValue());
+ }
+
+ @Test
+ public void putNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+
+ Assert.assertNull(map.get("a"));
+
+ map.putNode("a", "aaa");
+ Assert.assertNotNull(map.get("a"));
+ Assert.assertEquals("aaa", map.get("a").getValue());
+
+ map.putNode("a", "aaaa");
+ Assert.assertNotNull(map.get("a"));
+ Assert.assertEquals("aaaa", map.get("a").getValue());
+ }
+
+ @Test
+ public void putLinkedNodesTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+
+ Assert.assertNull(map.get("a"));
+ Assert.assertNull(map.get("b"));
+
+ map.putLinkedNodes("a", "b", "bbb");
+ Assert.assertNotNull(map.get("a"));
+ Assert.assertNull(map.get("a").getValue());
+ Assert.assertNotNull(map.get("b"));
+ Assert.assertEquals("bbb", map.get("b").getValue());
+
+ map.putLinkedNodes("a", "b", "bbbb");
+ Assert.assertNotNull(map.get("a"));
+ Assert.assertNull(map.get("a").getValue());
+ Assert.assertNotNull(map.get("b"));
+ Assert.assertEquals("bbbb", map.get("b").getValue());
+ }
+
+ @Test
+ public void putLinkedNodesTest2() {
+ ForestMap map = new LinkedForestMap<>(false);
+
+ Assert.assertNull(map.get("a"));
+ Assert.assertNull(map.get("b"));
+
+ map.putLinkedNodes("a", "aaa", "b", "bbb");
+ Assert.assertNotNull(map.get("a"));
+ Assert.assertEquals("aaa", map.get("a").getValue());
+ Assert.assertNotNull(map.get("b"));
+ Assert.assertEquals("bbb", map.get("b").getValue());
+
+ map.putLinkedNodes("a", "aaaa", "b", "bbbb");
+ Assert.assertNotNull(map.get("a"));
+ Assert.assertEquals("aaaa", map.get("a").getValue());
+ Assert.assertNotNull(map.get("b"));
+ Assert.assertEquals("bbbb", map.get("b").getValue());
+ }
+
+ @Test
+ public void linkNodesTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+
+ TreeEntry parent = map.get("a");
+ TreeEntry child = map.get("b");
+
+ Assert.assertNotNull(parent);
+ Assert.assertEquals("a", parent.getKey());
+ Assert.assertEquals(child, parent.getChild("b"));
+
+ Assert.assertNotNull(child);
+ Assert.assertEquals("b", child.getKey());
+ Assert.assertEquals(parent, child.getDeclaredParent());
+ }
+
+ @Test
+ public void unlinkNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ TreeEntry parent = map.get("a");
+ TreeEntry child = map.get("b");
+ map.unlinkNode("a", "b");
+ Assert.assertFalse(child.hasParent());
+ Assert.assertFalse(parent.hasChildren());
+ }
+
+ @Test
+ public void getTreeNodesTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+
+ List expected = CollUtil.newArrayList("a", "b", "c");
+ List actual = CollStreamUtil.toList(map.getTreeNodes("a"), TreeEntry::getKey);
+ Assert.assertEquals(expected, actual);
+ actual = CollStreamUtil.toList(map.getTreeNodes("b"), TreeEntry::getKey);
+ Assert.assertEquals(expected, actual);
+ actual = CollStreamUtil.toList(map.getTreeNodes("c"), TreeEntry::getKey);
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void getRootNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+
+ TreeEntry root = map.get("a");
+ Assert.assertEquals(root, map.getRootNode("a"));
+ Assert.assertEquals(root, map.getRootNode("b"));
+ Assert.assertEquals(root, map.getRootNode("c"));
+ }
+
+ @Test
+ public void getDeclaredParentNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+ TreeEntry a = map.get("a");
+ TreeEntry b = map.get("b");
+ Assert.assertEquals(a, map.getDeclaredParentNode("b"));
+ Assert.assertEquals(b, map.getDeclaredParentNode("c"));
+ }
+
+ @Test
+ public void getParentNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+ TreeEntry a = map.get("a");
+ TreeEntry b = map.get("b");
+
+ Assert.assertEquals(a, map.getParentNode("c", "a"));
+ Assert.assertEquals(b, map.getParentNode("c", "b"));
+ Assert.assertEquals(a, map.getParentNode("b", "a"));
+ Assert.assertNull(map.getParentNode("a", "a"));
+ }
+
+ @Test
+ public void containsParentNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+ Assert.assertTrue(map.containsParentNode("c", "b"));
+ Assert.assertTrue(map.containsParentNode("c", "a"));
+ Assert.assertTrue(map.containsParentNode("b", "a"));
+ Assert.assertFalse(map.containsParentNode("a", "a"));
+ }
+
+ @Test
+ public void containsChildNodeTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+ TreeEntry b = map.get("b");
+ TreeEntry c = map.get("c");
+
+ Assert.assertTrue(map.containsChildNode("a", "b"));
+ Assert.assertTrue(map.containsChildNode("a", "c"));
+ Assert.assertTrue(map.containsChildNode("b", "c"));
+ Assert.assertFalse(map.containsChildNode("c", "c"));
+ }
+
+ @Test
+ public void getDeclaredChildNodesTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+ TreeEntry b = map.get("b");
+ TreeEntry c = map.get("c");
+
+ Assert.assertEquals(CollUtil.newArrayList(b), new ArrayList<>(map.getDeclaredChildNodes("a")));
+ Assert.assertEquals(CollUtil.newArrayList(c), new ArrayList<>(map.getDeclaredChildNodes("b")));
+ Assert.assertEquals(CollUtil.newArrayList(), new ArrayList<>(map.getDeclaredChildNodes("c")));
+ }
+
+ @Test
+ public void getChildNodesTest() {
+ ForestMap map = new LinkedForestMap<>(false);
+ map.linkNodes("a", "b");
+ map.linkNodes("b", "c");
+ TreeEntry b = map.get("b");
+ TreeEntry c = map.get("c");
+
+ Assert.assertEquals(CollUtil.newArrayList(b, c), new ArrayList<>(map.getChildNodes("a")));
+ Assert.assertEquals(CollUtil.newArrayList(c), new ArrayList<>(map.getChildNodes("b")));
+ Assert.assertEquals(CollUtil.newArrayList(), new ArrayList<>(map.getChildNodes("c")));
}
}