diff --git a/platform/util/src/com/intellij/util/containers/hash/LinkedHashMap.java b/platform/util/src/com/intellij/util/containers/hash/LinkedHashMap.java index 9cc29915ba28..c0ead3695f38 100644 --- a/platform/util/src/com/intellij/util/containers/hash/LinkedHashMap.java +++ b/platform/util/src/com/intellij/util/containers/hash/LinkedHashMap.java @@ -211,6 +211,14 @@ public class LinkedHashMap extends AbstractMap implements Map size = 0; } + public K getLastAddedKey() { + return top != null ? top.key : null; + } + + public V getLastAddedValue() { + return top != null ? top.value : null; + } + private void moveToTop(final Entry e) { if (!accessOrder) { return; diff --git a/platform/util/testSrc/com/intellij/util/containers/hash/LinkedHashMapTest.java b/platform/util/testSrc/com/intellij/util/containers/hash/LinkedHashMapTest.java index 6d5db54769d0..573bc322f439 100644 --- a/platform/util/testSrc/com/intellij/util/containers/hash/LinkedHashMapTest.java +++ b/platform/util/testSrc/com/intellij/util/containers/hash/LinkedHashMapTest.java @@ -21,6 +21,10 @@ import org.junit.Test; import java.util.Iterator; import java.util.Map; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; + public class LinkedHashMapTest { @Test @@ -29,16 +33,16 @@ public class LinkedHashMapTest { for (int i = 0; i < 1000; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(1000, tested.size()); + assertEquals(1000, tested.size()); for (int i = 0; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i), tested.get(i)); + assertEquals(Integer.toString(i), tested.get(i)); } for (int i = 0; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i), tested.put(i, Integer.toString(i + 1))); + assertEquals(Integer.toString(i), tested.put(i, Integer.toString(i + 1))); } - Assert.assertEquals(1000, tested.size()); + assertEquals(1000, tested.size()); for (int i = 0; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i + 1), tested.get(i)); + assertEquals(Integer.toString(i + 1), tested.get(i)); } } @@ -48,16 +52,16 @@ public class LinkedHashMapTest { for (int i = 0; i < 1000; ++i) { tested.put(i - 500, Integer.toString(i)); } - Assert.assertEquals(1000, tested.size()); + assertEquals(1000, tested.size()); for (int i = 0; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i), tested.get(i - 500)); + assertEquals(Integer.toString(i), tested.get(i - 500)); } for (int i = 0; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i), tested.put(i - 500, Integer.toString(i + 1))); + assertEquals(Integer.toString(i), tested.put(i - 500, Integer.toString(i + 1))); } - Assert.assertEquals(1000, tested.size()); + assertEquals(1000, tested.size()); for (int i = 0; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i + 1), tested.get(i - 500)); + assertEquals(Integer.toString(i + 1), tested.get(i - 500)); } } @@ -67,13 +71,13 @@ public class LinkedHashMapTest { for (int i = 0; i < 1000; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(1000, tested.size()); + assertEquals(1000, tested.size()); for (int i = 0; i < 1000; i += 2) { - Assert.assertEquals(Integer.toString(i), tested.remove(i)); + assertEquals(Integer.toString(i), tested.remove(i)); } - Assert.assertEquals(500, tested.size()); + assertEquals(500, tested.size()); for (int i = 0; i < 1000; ++i) { - Assert.assertEquals((i % 2 == 0) ? null : Integer.toString(i), tested.get(i)); + assertEquals((i % 2 == 0) ? null : Integer.toString(i), tested.get(i)); } } @@ -85,7 +89,7 @@ public class LinkedHashMapTest { } int i = 10000; for (Integer key : tested.keySet()) { - Assert.assertEquals(--i, key.intValue()); + assertEquals(--i, key.intValue()); } } @@ -103,11 +107,11 @@ public class LinkedHashMapTest { } } - Assert.assertEquals(5000, tested.size()); + assertEquals(5000, tested.size()); it = tested.keySet().iterator(); for (int i = 9999; i > 0; i -= 2) { Assert.assertTrue(it.hasNext()); - Assert.assertEquals(i, it.next().intValue()); + assertEquals(i, it.next().intValue()); } } @@ -122,15 +126,15 @@ public class LinkedHashMapTest { for (int i = 0; i < 1000; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(500, tested.size()); + assertEquals(500, tested.size()); for (int i = 0; i < 500; ++i) { Assert.assertNull(tested.remove(i)); } - Assert.assertEquals(500, tested.size()); + assertEquals(500, tested.size()); for (int i = 500; i < 1000; ++i) { - Assert.assertEquals(Integer.toString(i), tested.remove(i)); + assertEquals(Integer.toString(i), tested.remove(i)); } - Assert.assertEquals(0, tested.size()); + assertEquals(0, tested.size()); } @Test @@ -144,11 +148,11 @@ public class LinkedHashMapTest { for (int i = 0; i < 1000; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(Integer.toString(0), tested.get(0)); + assertEquals(Integer.toString(0), tested.get(0)); for (int i = 1000; i < 1999; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(Integer.toString(0), tested.get(0)); + assertEquals(Integer.toString(0), tested.get(0)); tested.put(2000, Integer.toString(2000)); Assert.assertNull(tested.get(1000)); } @@ -164,15 +168,50 @@ public class LinkedHashMapTest { for (int i = 0; i < 1000; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(Integer.toString(999), tested.remove(999)); - Assert.assertEquals(999, tested.size()); - Assert.assertEquals(Integer.toString(0), tested.get(0)); + assertEquals(Integer.toString(999), tested.remove(999)); + assertEquals(999, tested.size()); + assertEquals(Integer.toString(0), tested.get(0)); for (int i = 1000; i < 1999; ++i) { tested.put(i, Integer.toString(i)); } - Assert.assertEquals(Integer.toString(0), tested.get(0)); + assertEquals(Integer.toString(0), tested.get(0)); tested.put(2000, Integer.toString(2000)); - Assert.assertNull(tested.get(1000)); + assertNull(tested.get(1000)); + } + + @Test + public void iteration() { + ///todo[nik] it iterates in reversed order, may be it is a bug? + Map map = new LinkedHashMap(); + map.put(1, "a"); + map.put(2, "b"); + map.put(3, "c"); + Iterator iterator = map.values().iterator(); + assertEquals("c", iterator.next()); + assertEquals("b", iterator.next()); + assertEquals("a", iterator.next()); + assertFalse(iterator.hasNext()); + } + + @Test + public void lastAddedKey() { + LinkedHashMap map = new LinkedHashMap(); + map.put(1, "a"); + map.put(2, "b"); + map.put(3, "c"); + map.get(1); + map.get(2); + assertEquals(3, map.getLastAddedKey().intValue()); + assertEquals("c", map.getLastAddedValue()); + map.remove(2); + assertEquals(3, map.getLastAddedKey().intValue()); + assertEquals("c", map.getLastAddedValue()); + map.remove(3); + assertEquals(1, map.getLastAddedKey().intValue()); + assertEquals("a", map.getLastAddedValue()); + map.remove(1); + assertNull(map.getLastAddedKey()); + assertNull(map.getLastAddedValue()); } //@Test