package org.exist.util.hashtable;
import org.junit.Test;
import java.util.Iterator;
import static org.junit.Assert.assertEquals;
public class Object2LongIdentityHashMapTest extends AbstractHashtableTest<Object2LongIdentityHashMap, Object, Long> {
private final java.util.HashMap<Integer, Integer> canonicalObject = new java.util.HashMap<>();
@Override
protected Object2LongIdentityHashMap newT() {
return new Object2LongIdentityHashMap();
}
@Override
protected Iterator<?> simpleKeyIterator() {
return map.iterator();
}
@SuppressWarnings("unchecked")
@Override
protected Iterator<? extends Long> simpleValueIterator() {
return map.valueIterator();
}
@SuppressWarnings("unchecked")
@Override
protected Long simpleGet(final Object k) {
final long foo = map.get(k);
return foo == -1 ? null : foo;
}
@SuppressWarnings("unchecked")
@Override
protected void simplePut(final Object k, final Long v) {
map.put(k, v);
}
@SuppressWarnings("unchecked")
@Override
protected void simpleRemove(final Object k) {
map.remove(k);
}
@SuppressWarnings("unchecked")
protected boolean simpleContainsKey(final int k) {
return map.containsKey(keyEquiv(k));
}
@Override
protected Long valEquiv(final int v) {
return (long) v;
}
@Override
protected int valEquiv(final Long v) {
return v.intValue();
}
@Override
protected Object keyEquiv(final int k) {
if(!canonicalObject.containsKey(k)) {
canonicalObject.put(k,k);
}
return canonicalObject.get(k);
}
@Override
protected int keyEquiv(final Object k) {
return (Integer) k;
}
@Override
protected Integer keyEquiv_newObject(final int k) {
return new Integer(k);
}
/**
* We override this, because the identity hash map specifically behaves differently
* with respect to equality.
*/
@Test
public void putDuplicates() {
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++) {
simpleAdd(keyEquiv_newObject(j));
}
final int[] test = new int[10];
for (final Iterator<?> ki = simpleKeyIterator(); ki.hasNext();) {
final Object k = ki.next();
final int kk = keyEquiv(k);
test[kk]++;
}
for (int i = 0; i < 10; i++) {
assertEquals("key " + i + " appeared 10 times", 10, test[i]);
}
}
}