/*******************************************************************************
* Copyright 2014 Analog Devices, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
********************************************************************************/
package com.analog.lyric.collect.tests;
import static org.junit.Assert.*;
import java.util.Arrays;
import org.junit.Test;
import com.analog.lyric.collect.WeakIntHashMap;
import com.analog.lyric.collect.WeakLongHashMap;
/**
*
* @since 0.08
* @author Christopher Barber
*/
public class TestWeakPrimitiveHashMap
{
@Test
public void testInt()
{
WeakIntHashMap<Object> map = new WeakIntHashMap<>();
assertTrue(map.isEmpty());
assertInvariants(map);
Object s = new int[400];
assertTrue(map.put(42, s));
assertEquals(s, map.get(42));
assertTrue(map.containsKey(42));
assertEquals(1, map.size());
assertInvariants(map);
assertFalse(map.removeKey(23));
assertEquals(1, map.size());
assertTrue(map.removeKey(42));
assertTrue(map.isEmpty());
map.put(23, s);
map.put(42, s);
assertEquals(2, map.size());
assertInvariants(map);
// GC and sleep to try to get jvm to put entries on the reference queue, but there is
// no guarantee when that will happen.
s = null;
System.gc();
try
{
Thread.sleep(10);
}
catch (InterruptedException ex)
{
// TODO Auto-generated catch block
ex.printStackTrace();
}
System.gc();
assertInvariants(map);
assertNull(map.get(23));
}
@Test
public void testLong()
{
WeakLongHashMap<Object> map = new WeakLongHashMap<>();
assertTrue(map.isEmpty());
assertInvariants(map);
Object s = new long[400];
assertTrue(map.put(42, s));
assertEquals(s, map.get(42));
assertTrue(map.containsKey(42));
assertEquals(1, map.size());
assertInvariants(map);
assertFalse(map.removeKey(23));
assertEquals(1, map.size());
assertTrue(map.removeKey(42));
assertTrue(map.isEmpty());
map.put(23, s);
map.put(42, s);
assertEquals(2, map.size());
assertInvariants(map);
// GC and sleep to try to get jvm to put entries on the reference queue, but there is
// no guarantee when that will happen.
s = null;
System.gc();
try
{
Thread.sleep(10);
}
catch (InterruptedException ex)
{
// TODO Auto-generated catch block
ex.printStackTrace();
}
System.gc();
assertInvariants(map);
assertNull(map.get(23));
}
private <T> void assertInvariants(WeakIntHashMap<T> map)
{
assertTrue(map.size() >= 0);
assertEquals(map.isEmpty(), map.size() == 0);
int[] keys = map.keys();
assertEquals(map.size(), keys.length);
for (int key : keys)
{
assertEquals(map.containsKey(key), map.get(key) != null);
}
if (keys.length > 0)
{
Arrays.sort(keys);
assertFalse(map.containsKey(keys[keys.length - 1] + 1));
assertNull(map.get(keys[0] - 1));
}
else
{
assertFalse(map.containsKey(0));
assertNull(map.get(0));
}
}
private <T> void assertInvariants(WeakLongHashMap<T> map)
{
assertTrue(map.size() >= 0);
assertEquals(map.isEmpty(), map.size() == 0);
long[] keys = map.keys();
assertEquals(map.size(), keys.length);
for (long key : keys)
{
assertEquals(map.containsKey(key), map.get(key) != null);
}
if (keys.length > 0)
{
Arrays.sort(keys);
assertFalse(map.containsKey(keys[keys.length - 1] + 1));
assertNull(map.get(keys[0] - 1));
}
else
{
assertFalse(map.containsKey(0));
assertNull(map.get(0));
}
}
}