From bd94ccdfa58f51cbb40ae0653c6654f4b4943db4 Mon Sep 17 00:00:00 2001 From: Stephen Colebourne Date: Sun, 13 Nov 2005 15:16:47 +0000 Subject: [PATCH] Extra tests for the internals of LRUMap bug 32573 git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@333020 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/collections/map/TestLRUMap.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/src/test/org/apache/commons/collections/map/TestLRUMap.java b/src/test/org/apache/commons/collections/map/TestLRUMap.java index 5fab0c0d7..fd4effe9e 100644 --- a/src/test/org/apache/commons/collections/map/TestLRUMap.java +++ b/src/test/org/apache/commons/collections/map/TestLRUMap.java @@ -322,6 +322,137 @@ public class TestLRUMap extends AbstractTestOrderedMap { } } + //----------------------------------------------------------------------- + static class SingleHashCode { + private final String code; + SingleHashCode(String code) { + this.code = code; + } + public int hashCode() { + // always return the same hashcode + // that way, it will end up in the same bucket + return 12; + } + public String toString() { + return "SingleHashCode:" + code; + } + } + + public void testInternalState_Buckets() { + if (isPutAddSupported() == false || isPutChangeSupported() == false) return; + SingleHashCode one = new SingleHashCode("1"); + SingleHashCode two = new SingleHashCode("2"); + SingleHashCode three = new SingleHashCode("3"); + SingleHashCode four = new SingleHashCode("4"); + SingleHashCode five = new SingleHashCode("5"); + SingleHashCode six = new SingleHashCode("6"); + + LRUMap map = new LRUMap(3, 1.0f); + int hashIndex = map.hashIndex(map.hash(one), 4); + map.put(one, "A"); + map.put(two, "B"); + map.put(three, "C"); + + assertEquals(4, map.data.length); + assertEquals(3, map.size); + assertEquals(null, map.header.next); + assertEquals(one, map.header.after.key); // LRU + assertEquals(two, map.header.after.after.key); + assertEquals(three, map.header.after.after.after.key); // MRU + assertEquals(three, map.data[hashIndex].key); + assertEquals(two, map.data[hashIndex].next.key); + assertEquals(one, map.data[hashIndex].next.next.key); + + map.put(four, "D"); // reuses last in next list + + assertEquals(4, map.data.length); + assertEquals(3, map.size); + assertEquals(null, map.header.next); + assertEquals(two, map.header.after.key); // LRU + assertEquals(three, map.header.after.after.key); + assertEquals(four, map.header.after.after.after.key); // MRU + assertEquals(four, map.data[hashIndex].key); + assertEquals(three, map.data[hashIndex].next.key); + assertEquals(two, map.data[hashIndex].next.next.key); + + map.get(three); + + assertEquals(4, map.data.length); + assertEquals(3, map.size); + assertEquals(null, map.header.next); + assertEquals(two, map.header.after.key); // LRU + assertEquals(four, map.header.after.after.key); + assertEquals(three, map.header.after.after.after.key); // MRU + assertEquals(four, map.data[hashIndex].key); + assertEquals(three, map.data[hashIndex].next.key); + assertEquals(two, map.data[hashIndex].next.next.key); + + map.put(five, "E"); // reuses last in next list + + assertEquals(4, map.data.length); + assertEquals(3, map.size); + assertEquals(null, map.header.next); + assertEquals(four, map.header.after.key); // LRU + assertEquals(three, map.header.after.after.key); + assertEquals(five, map.header.after.after.after.key); // MRU + assertEquals(five, map.data[hashIndex].key); + assertEquals(four, map.data[hashIndex].next.key); + assertEquals(three, map.data[hashIndex].next.next.key); + + map.get(three); + map.get(five); + + assertEquals(4, map.data.length); + assertEquals(3, map.size); + assertEquals(null, map.header.next); + assertEquals(four, map.header.after.key); // LRU + assertEquals(three, map.header.after.after.key); + assertEquals(five, map.header.after.after.after.key); // MRU + assertEquals(five, map.data[hashIndex].key); + assertEquals(four, map.data[hashIndex].next.key); + assertEquals(three, map.data[hashIndex].next.next.key); + + map.put(six, "F"); // reuses middle in next list + + assertEquals(4, map.data.length); + assertEquals(3, map.size); + assertEquals(null, map.header.next); + assertEquals(three, map.header.after.key); // LRU + assertEquals(five, map.header.after.after.key); + assertEquals(six, map.header.after.after.after.key); // MRU + assertEquals(six, map.data[hashIndex].key); + assertEquals(five, map.data[hashIndex].next.key); + assertEquals(three, map.data[hashIndex].next.next.key); + } + + public void testInternalState_getEntry_int() { + if (isPutAddSupported() == false || isPutChangeSupported() == false) return; + SingleHashCode one = new SingleHashCode("1"); + SingleHashCode two = new SingleHashCode("2"); + SingleHashCode three = new SingleHashCode("3"); + SingleHashCode four = new SingleHashCode("4"); + SingleHashCode five = new SingleHashCode("5"); + SingleHashCode six = new SingleHashCode("6"); + + LRUMap map = new LRUMap(3, 1.0f); + int hashIndex = map.hashIndex(map.hash(one), 4); + map.put(one, "A"); + map.put(two, "B"); + map.put(three, "C"); + + assertEquals(one, map.getEntry(0).key); + assertEquals(two, map.getEntry(1).key); + assertEquals(three, map.getEntry(2).key); + try { + map.getEntry(-1); + fail(); + } catch (IndexOutOfBoundsException ex) {} + try { + map.getEntry(3); + fail(); + } catch (IndexOutOfBoundsException ex) {} + } + // public void testCreate() throws Exception { // resetEmpty(); // writeExternalFormToDisk((java.io.Serializable) map, "D:/dev/collections/data/test/LRUMap.emptyCollection.version3.obj");