package com.limegroup.gnutella.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import junit.framework.Test;
/**
* Unit tests for FixedsizeForgetfulHashMap
*/
public class FixedsizeForgetfulHashMapTest extends BaseTestCase {
public FixedsizeForgetfulHashMapTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(FixedsizeForgetfulHashMapTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testLegacy() throws Exception {
//The cryptic variable names are um..."legacy variables" =)
FixedsizeForgetfulHashMap rt=null;
String g1="key1";
String g2="key2";
String g3="key3";
String g4="key4";
String g5="key5";
String c1="value1";
String c2="value2";
String c3="value3";
String c4="value4";
String c5="value5";
//1. FIFO put/get tests
rt=new FixedsizeForgetfulHashMap(3);
rt.put(g1, c1);
rt.put(g2, c2);
rt.put(g3, c3);
assertSame(c1, rt.get(g1));
assertSame(c2, rt.get(g2));
assertSame(c3, rt.get(g3));
rt.put(g4, c4);
assertNull(rt.get(g1));
assertSame(c2, rt.get(g2));
assertSame(c3, rt.get(g3));
assertSame(c4, rt.get(g4));
rt.put(g1, c1);
assertSame(c1, rt.get(g1));
assertNull(rt.get(g2));
assertSame(c3, rt.get(g3));
assertSame(c4, rt.get(g4));
rt=new FixedsizeForgetfulHashMap(1);
rt.put(g1, c1);
assertSame(c1, rt.get(g1));
rt.put(g2, c2);
assertNull(rt.get(g1));
assertSame(c2, rt.get(g2));
rt.put(g3, c3);
assertNull(rt.get(g1));
assertNull(rt.get(g2));
assertSame(c3, rt.get(g3));
rt=new FixedsizeForgetfulHashMap(2);
rt.put(g1,c1);
rt.remove(g1);
assertNull(rt.get(g1));
//1a. Stronger put/get tests with renaming keys
rt=new FixedsizeForgetfulHashMap(3);
assertNull(rt.put(g1, c1));
assertSame(c1, rt.get(g1));
assertNull(rt.put(g2, c2));
assertSame(c1, rt.get(g1));
assertNull(rt.put(g3, c3));
assertSame(c1, rt.get(g1));
assertSame(c1, rt.put(g1, c4));
assertSame(c4, rt.get(g1)); //remapping takes no space...
assertSame(c2, rt.get(g2));
assertSame(c3, rt.get(g3));
assertNull(rt.put(g5, c5));
assertSame(c5, rt.get(g5)); //...and it renews the key
assertSame(c4, rt.get(g1));
assertSame(c3, rt.get(g3));
assertNull(rt.get(g2));
assertNull(rt.put(g4, c4));
assertSame(c4, rt.get(g4));
assertSame(c5, rt.get(g5));
assertSame(c4, rt.get(g1));
assertNull(rt.get(g3));
assertNull(rt.get(g2));
//2. Remove tests
rt=new FixedsizeForgetfulHashMap(2);
rt.put(g1,c1);
rt.remove(g1);
assertNull(rt.get(g1));
rt.put(g1,c2);
assertSame(c2, rt.get(g1));
//3. putAll tests.
rt=new FixedsizeForgetfulHashMap(3);
Map m=new HashMap();
m.put(g1,c1);
m.put(g2,c2);
rt.putAll(m);
assertSame(c1, rt.get(g1));
assertSame(c2, rt.get(g2));
//4. keySet().iterator() methods. (Other methods are incomplete.)
Iterator iter=null;
rt=new FixedsizeForgetfulHashMap(4);
rt.put(g1, c1);
rt.put(g2, c5);
rt.put(g2, c2); //remap c2
rt.put(g3, c3);
rt.put(g4, c4);
iter=rt.keySet().iterator();
assertTrue(iter.hasNext());
Object a1=iter.next();
assertTrue(a1==g1 || a1==g2 || a1==g3 || a1==g4);
assertTrue(iter.hasNext());
Object a2=iter.next();
assertTrue(rt.size()==4);
iter.remove(); //remove a2
assertTrue(rt.size()==3);
assertTrue(a2==g1 || a2==g2 || a2==g3 || a2==g4);
assertNotSame(a1, a2);
assertTrue(iter.hasNext());
Object a3=iter.next();
assertEquals(3, rt.size());
iter.remove(); //remove a3
assertEquals(2, rt.size());
assertTrue(a3==g1 || a3==g2 || a3==g3 || a3==g4);
assertNotSame(a3, a2);
assertNotSame(a3, a1);
Object a4=iter.next();
assertTrue(a4==g1 || a4==g2 || a4==g3 || a4==g4);
assertNotSame(a4, a3);
assertNotSame(a4, a2);
assertNotSame(a4, a1);
assertTrue(! iter.hasNext());
iter=rt.keySet().iterator();
assertTrue(rt.containsKey(a1));
assertTrue(! rt.containsKey(a2));
assertTrue(! rt.containsKey(a3));
assertTrue(rt.containsKey(a4));
Object b1=iter.next();
assertTrue(b1==a1 || b1==a4); //NOT a2, a3
Object b2=iter.next();
assertTrue(b1==a1 || b1==a4); //NOT a2, a3
assertNotSame(b1, b2);
assertTrue(! iter.hasNext());
rt = new FixedsizeForgetfulHashMap(4);
rt.put(g1, c1);
rt.put(g2, c2);
assertEquals("should be equals", rt, rt);
assertEquals("hashcodes should be equal", rt.hashCode(), rt.hashCode());
FixedsizeForgetfulHashMap rt2 = new FixedsizeForgetfulHashMap(3);
rt2.put(g1, c1);
assertNotEquals("should not be equal", rt, rt2);
assertNotEquals("hashes shouldn't be equal", rt.hashCode(), rt2.hashCode());
rt2.put(g2, c2);
assertEquals("should be equals", rt, rt2);
assertEquals("hashes should be equal", rt.hashCode(), rt2.hashCode());
rt2.remove(g1);
assertNotEquals("should not be equal", rt, rt2);
assertNotEquals("hashes shouldn't be equal", rt.hashCode(), rt2.hashCode());
}
}