// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.concurrent;
import org.junit.Test;
import java.util.Iterator;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* @author Henning Baldersheim
* @since 5.2
*/
public class CopyOnWriteHashMapTest {
@Test
public void requireThatAccessorsWork() {
Map map = new CopyOnWriteHashMap<>();
assertEquals(0, map.size());
assertEquals(true, map.isEmpty());
assertEquals(false, map.containsKey("fooKey"));
assertEquals(false, map.containsValue("fooVal"));
assertNull(map.get("fooKey"));
assertNull(map.remove("fooKey"));
assertEquals(0, map.keySet().size());
assertEquals(0, map.entrySet().size());
assertEquals(0, map.values().size());
map.put("fooKey", "fooVal");
assertEquals(1, map.size());
assertEquals(false, map.isEmpty());
assertEquals(true, map.containsKey("fooKey"));
assertEquals(true, map.containsValue("fooVal"));
assertEquals("fooVal", map.get("fooKey"));
assertEquals(1, map.keySet().size());
assertEquals(1, map.entrySet().size());
assertEquals(1, map.values().size());
map.put("barKey", "barVal");
assertEquals(2, map.size());
assertEquals(false, map.isEmpty());
assertEquals(true, map.containsKey("fooKey"));
assertEquals(true, map.containsKey("barKey"));
assertEquals(true, map.containsValue("fooVal"));
assertEquals(true, map.containsValue("barVal"));
assertEquals("fooVal", map.get("fooKey"));
assertEquals("barVal", map.get("barKey"));
assertEquals(2, map.keySet().size());
assertEquals(2, map.entrySet().size());
assertEquals(2, map.values().size());
assertEquals("fooVal", map.remove("fooKey"));
assertEquals(1, map.size());
assertEquals(false, map.isEmpty());
assertEquals(false, map.containsKey("fooKey"));
assertEquals(true, map.containsKey("barKey"));
assertEquals(false, map.containsValue("fooVal"));
assertEquals(true, map.containsValue("barVal"));
assertNull(map.get("fooKey"));
assertEquals("barVal", map.get("barKey"));
assertEquals(1, map.keySet().size());
assertEquals(1, map.entrySet().size());
assertEquals(1, map.values().size());
}
@Test
public void requireThatEntrySetDoesNotReflectConcurrentModifications() {
Map map = new CopyOnWriteHashMap<>();
map.put("fooKey", "fooVal");
Iterator> it = map.entrySet().iterator();
assertEquals("fooVal", map.remove("fooKey"));
assertTrue(it.hasNext());
Map.Entry entry = it.next();
assertEquals("fooKey", entry.getKey());
assertEquals("fooVal", entry.getValue());
}
@Test
public void requireThatKeySetDoesNotReflectConcurrentModifications() {
Map map = new CopyOnWriteHashMap<>();
map.put("fooKey", "fooVal");
Iterator it = map.keySet().iterator();
assertEquals("fooVal", map.remove("fooKey"));
assertTrue(it.hasNext());
assertEquals("fooKey", it.next());
}
@Test
public void requireThatValuesDoNotReflectConcurrentModifications() {
Map map = new CopyOnWriteHashMap<>();
map.put("fooKey", "fooVal");
Iterator it = map.values().iterator();
assertEquals("fooVal", map.remove("fooKey"));
assertTrue(it.hasNext());
assertEquals("fooVal", it.next());
}
}