// Copyright (c) 2002 Dustin Sallings <dustin@spy.net>
package net.spy.cache;
import java.lang.ref.SoftReference;
import java.util.Collections;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Test the LRU cache implementation
*/
public class LRUTest extends TestCase {
/**
* Get an instance of LRUTest.
*/
public LRUTest(String name) {
super(name);
}
/**
* Get this test suite.
*/
public static Test suite() {
return new TestSuite(LRUTest.class);
}
/**
* Run this test.
*/
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
/**
* Perform basic LRU testing.
*/
public void testBasicLRU() {
Integer zero=new Integer(0);
LRUCache<Integer, Integer> cache=new LRUCache<Integer, Integer>(10);
assertNull("Zero shouldn't be there.", cache.get(zero));
// Keep this value up-to-date
cache.put(zero, zero);
assertNotNull("Zero should be there.", cache.get(zero));
for(int i=1; i<100; i++) {
assertTrue("Cache size exceeded valid size", cache.size() <= 10);
Integer ii=new Integer(i);
assertNull(cache.get(ii));
cache.put(ii, ii);
assertNotNull(cache.get(zero));
assertNotNull(cache.get(ii));
if(i>10) {
assertNull(cache.get(new Integer(i-10)));
}
}
}
/**
* Perform reference LRU testing.
*/
public void testReferenceLRU() {
Integer zero=new Integer(0);
LRUCache<Integer, SoftReference<Integer>> cache
=new LRUCache<Integer, SoftReference<Integer>>(10);
assertNull("Zero shouldn't be there.", cache.get(zero));
// Keep this value up-to-date
cache.put(zero, new SoftReference<Integer>(zero));
assertNotNull("Zero should be there.", cache.get(zero));
for(int i=1; i<100; i++) {
assertTrue("Cache size exceeded valid size", cache.size() <= 10);
Integer ii=new Integer(i);
assertNull(cache.get(ii));
cache.put(ii, new SoftReference<Integer>(ii));
assertNotNull(cache.get(zero));
assertNotNull(cache.get(ii));
if(i>10) {
assertNull(cache.get(new Integer(i-10)));
}
}
}
/**
* Test cache listener.
*/
@SuppressWarnings("unchecked")
public void testCacheListener() {
LRUCache<Comparable, Object> cache
=new LRUCache<Comparable, Object>(10);
TestListener tl=new TestListener();
cache.put("listener", tl);
for(int i=1; i<100; i++) {
Integer ii=new Integer(i);
assertNull(cache.get(ii));
cache.put(ii, ii);
assertNotNull(cache.get(ii));
}
assertNull(cache.get("listener"));
assertEquals(1, tl.cached);
assertEquals(1, tl.uncached);
}
public void testCacheListenerPutAll() {
LRUCache<String, TestListener> cache
=new LRUCache<String, TestListener>(10);
cache.putAll(Collections.singletonMap("listener", new TestListener()));
TestListener tl=cache.get("listener");
assertEquals(1, tl.cached);
}
private static final class TestListener extends Object
implements CacheListener {
public int cached=0;
public int uncached=0;
public TestListener() {
super();
}
public void cachedEvent(Object key) {
cached++;
}
public void uncachedEvent(Object key) {
uncached++;
}
}
}