/*
* Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except
* in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.amazonaws.services.dynamodbv2.datamodeling.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.junit.Test;
public class LRUCacheTest {
@Test
public void test() {
final LRUCache<String> cache = new LRUCache<String>(3);
assertEquals(0, cache.size());
assertEquals(3, cache.getMaxSize());
cache.add("k1", "v1");
assertTrue(cache.size() == 1);
cache.add("k1", "v11");
assertTrue(cache.size() == 1);
cache.add("k2", "v2");
assertTrue(cache.size() == 2);
cache.add("k3", "v3");
assertTrue(cache.size() == 3);
assertEquals("v11", cache.get("k1"));
assertEquals("v2", cache.get("k2"));
assertEquals("v3", cache.get("k3"));
cache.add("k4", "v4");
assertTrue(cache.size() == 3);
assertNull(cache.get("k1"));
assertEquals("v4", cache.get("k4"));
assertEquals("v2", cache.get("k2"));
assertEquals("v3", cache.get("k3"));
assertTrue(cache.size() == 3);
cache.add("k5", "v5");
assertNull(cache.get("k4"));
assertEquals("v5", cache.get("k5"));
assertEquals("v2", cache.get("k2"));
assertEquals("v3", cache.get("k3"));
cache.clear();
assertEquals(0, cache.size());
}
@Test
public void testListener() {
final Map<String, String> removed = new HashMap<String, String>();
final LRUCache<String> cache = new LRUCache<String>(3,
new LRUCache.RemovalListener<String>() {
@Override
public void onRemoval(final Entry<String, String> entry) {
removed.put(entry.getKey(), entry.getValue());
}
});
assertTrue(cache.size() == 0);
cache.add("k1", "v1");
assertTrue(cache.size() == 1);
cache.add("k1", "v11");
assertTrue(cache.size() == 1);
cache.add("k2", "v2");
assertTrue(cache.size() == 2);
cache.add("k3", "v3");
assertTrue(cache.size() == 3);
assertEquals("v11", cache.get("k1"));
assertEquals("v2", cache.get("k2"));
assertEquals("v3", cache.get("k3"));
assertTrue(removed.isEmpty());
cache.add("k4", "v4");
assertTrue(cache.size() == 3);
assertNull(cache.get("k1"));
assertEquals(1, removed.size());
assertEquals("v11", removed.get("k1"));
removed.clear();
assertEquals("v4", cache.get("k4"));
assertEquals("v2", cache.get("k2"));
assertEquals("v3", cache.get("k3"));
assertTrue(cache.size() == 3);
cache.add("k5", "v5");
assertEquals(1, removed.size());
assertEquals("v4", removed.get("k4"));
removed.clear();
assertNull(cache.get("k4"));
assertEquals("v5", cache.get("k5"));
assertEquals("v2", cache.get("k2"));
assertEquals("v3", cache.get("k3"));
cache.clear();
assertEquals(0, cache.size());
assertEquals(3, removed.size());
assertEquals("v5", removed.get("k5"));
assertEquals("v2", removed.get("k2"));
assertEquals("v3", removed.get("k3"));
}
@Test(expected = IllegalArgumentException.class)
public void testZeroSize() {
new LRUCache<Object>(0);
}
@Test(expected = IllegalArgumentException.class)
public void testIllegalArgument() {
new LRUCache<Object>(-1);
}
@Test
public void testSingleEntry() {
final LRUCache<String> cache = new LRUCache<String>(1);
assertTrue(cache.size() == 0);
cache.add("k1", "v1");
assertTrue(cache.size() == 1);
cache.add("k1", "v11");
assertTrue(cache.size() == 1);
assertEquals("v11", cache.get("k1"));
cache.add("k2", "v2");
assertTrue(cache.size() == 1);
assertEquals("v2", cache.get("k2"));
assertNull(cache.get("k1"));
cache.add("k3", "v3");
assertTrue(cache.size() == 1);
assertEquals("v3", cache.get("k3"));
assertNull(cache.get("k2"));
}
}