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
This commit is contained in:
Stephen Colebourne 2005-11-13 15:16:47 +00:00
parent c9b89ca55d
commit bd94ccdfa5
1 changed files with 131 additions and 0 deletions

View File

@ -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");