package org.exist.util.hashtable;
import org.junit.Test;
import java.util.Iterator;
import static org.junit.Assert.*;
public abstract class AbstractHashtableTest<T, K, V> extends
AbstractHashSetTest<T, K> {
protected abstract void simplePut(K k, V v);
protected abstract V simpleGet(K k);
protected abstract V valEquiv(int v);
protected abstract int valEquiv(V v);
protected abstract Iterator<? extends V> simpleValueIterator();
protected void simpleAdd(K k) {
simplePut(k, valEquiv(keyEquiv(k) ^ 0xDEADBEEF));
}
protected boolean simpleContainsKey(K k) {
return simpleGet(k) != null;
}
protected void simpleCheckKey(K k) {
assertTrue("contains " + k, simpleContainsKey(k));
assertEquals("check " + k, keyEquiv(k) ^ 0xDEADBEEF,
valEquiv(simpleGet(k)));
}
@Test
public void zeroValues() throws Exception {
assertFalse("empty collection should have no values",
simpleValueIterator().hasNext());
}
@Test
public void getNothing() throws Exception {
assertNull("empty collection should have no values",
simpleGet(keyEquiv(12345)));
}
@Test
public void valuePut() throws Exception {
simplePut(keyEquiv(12345), valEquiv(54321));
assertEquals(simpleGet(keyEquiv(12345)), valEquiv(54321));
}
@Test
public void valueMultiplePut() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
simplePut(keyEquiv(i + j), valEquiv(j));
}
}
int[] ct = new int[10];
for (Iterator<? extends V> vi = simpleValueIterator(); vi.hasNext();) {
V v = vi.next();
int vv = valEquiv(v);
ct[vv]++;
}
assertEquals(ct[0], 10);
for (int i = 1; i < 10; i++)
assertEquals(ct[i], 1);
}
}