package org.exist.util.hashtable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Iterator;
import java.util.Random;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public abstract class AbstractHashSetTest<T, K> {
protected T map;
protected abstract T newT();
protected abstract K keyEquiv(int k);
protected abstract int keyEquiv(K k);
/*
* make an equivalent of k, but always use a new object. This helps us to
* check that keys are compared by value, not by identity.
*/
protected abstract K keyEquiv_newObject(int k);
protected abstract Iterator<? extends K> simpleKeyIterator();
protected void clearT() {
}
protected abstract void simpleAdd(K k);
protected abstract void simpleRemove(K k);
protected boolean simpleContainsKey(K k) {
for (Iterator<? extends K> ki = simpleKeyIterator(); ki.hasNext();) {
if (k.equals(ki.next())) {
return true;
}
}
return false;
}
@Before
public final void setUp() {
map = newT();
}
@After
public final void tearDown() {
clearT();
map = null;
}
@Test
public void zeroKeys() throws Exception {
assertFalse("empty collection should have no keys", simpleKeyIterator()
.hasNext());
}
@Test
public void setPut() throws Exception {
simpleAdd(keyEquiv(12345));
assertTrue(simpleContainsKey(keyEquiv(12345)));
}
@Test
public void putAndRemove() throws Exception {
for (int i = 0; i < 10; i++) {
simpleAdd(keyEquiv(i));
}
for (int i = 0; i < 10; i+=2) {
simpleRemove(keyEquiv(i));
}
for (int i = 5; i < 10; i++) {
simpleAdd(keyEquiv(i));
}
boolean[] test = new boolean[10];
for (Iterator<? extends K> ki = simpleKeyIterator(); ki.hasNext();) {
K k = ki.next();
int kk = keyEquiv(k);
test[kk] = true;
}
for (int i = 0; i < 10; i++) {
assertEquals(test[i], i >=5 || (i%2)==1);
}
}
@Test
public void putDuplicates() {
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++) {
simpleAdd(keyEquiv_newObject(j));
}
boolean[] test = new boolean[10];
for (Iterator<? extends K> ki = simpleKeyIterator(); ki.hasNext();) {
K k = ki.next();
int kk = keyEquiv(k);
assertFalse("Key " + kk + " appears only once", test[kk]);
test[kk] = true;
}
for (int i = 0; i < 10; i++) {
assertTrue("key " + i + " appeared once", test[i]);
}
}
}