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:
parent
c9b89ca55d
commit
bd94ccdfa5
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue