summaryrefslogtreecommitdiff
path: root/jsr166-tests/src/test/java/jsr166/ConcurrentHashMap8Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'jsr166-tests/src/test/java/jsr166/ConcurrentHashMap8Test.java')
-rw-r--r--jsr166-tests/src/test/java/jsr166/ConcurrentHashMap8Test.java1096
1 files changed, 1096 insertions, 0 deletions
diff --git a/jsr166-tests/src/test/java/jsr166/ConcurrentHashMap8Test.java b/jsr166-tests/src/test/java/jsr166/ConcurrentHashMap8Test.java
new file mode 100644
index 0000000000..60de8b9de2
--- /dev/null
+++ b/jsr166-tests/src/test/java/jsr166/ConcurrentHashMap8Test.java
@@ -0,0 +1,1096 @@
+/*
+ * Written by Doug Lea with assistance from members of JCP JSR-166
+ * Expert Group and released to the public domain, as explained at
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+package jsr166;
+
+import static java.util.Spliterator.CONCURRENT;
+import static java.util.Spliterator.DISTINCT;
+import static java.util.Spliterator.NONNULL;
+
+import java.util.AbstractMap;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.LongAdder;
+import java.util.function.BiFunction;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class ConcurrentHashMap8Test extends JSR166TestCase {
+ // android-note: Removed because the CTS runner does a bad job of
+ // retrying tests that have suite() declarations.
+ //
+ // public static void main(String[] args) {
+ // main(suite(), args);
+ // }
+ // public static Test suite() {
+ // return new TestSuite(ConcurrentHashMap8Test.class);
+ // }
+
+ /**
+ * Returns a new map from Integers 1-5 to Strings "A"-"E".
+ */
+ private static ConcurrentHashMap map5() {
+ ConcurrentHashMap map = new ConcurrentHashMap(5);
+ assertTrue(map.isEmpty());
+ map.put(one, "A");
+ map.put(two, "B");
+ map.put(three, "C");
+ map.put(four, "D");
+ map.put(five, "E");
+ assertFalse(map.isEmpty());
+ assertEquals(5, map.size());
+ return map;
+ }
+
+ /**
+ * getOrDefault returns value if present, else default
+ */
+ public void testGetOrDefault() {
+ ConcurrentHashMap map = map5();
+ assertEquals(map.getOrDefault(one, "Z"), "A");
+ assertEquals(map.getOrDefault(six, "Z"), "Z");
+ }
+
+ /**
+ * computeIfAbsent adds when the given key is not present
+ */
+ public void testComputeIfAbsent() {
+ ConcurrentHashMap map = map5();
+ map.computeIfAbsent(six, (x) -> "Z");
+ assertTrue(map.containsKey(six));
+ }
+
+ /**
+ * computeIfAbsent does not replace if the key is already present
+ */
+ public void testComputeIfAbsent2() {
+ ConcurrentHashMap map = map5();
+ assertEquals("A", map.computeIfAbsent(one, (x) -> "Z"));
+ }
+
+ /**
+ * computeIfAbsent does not add if function returns null
+ */
+ public void testComputeIfAbsent3() {
+ ConcurrentHashMap map = map5();
+ map.computeIfAbsent(six, (x) -> null);
+ assertFalse(map.containsKey(six));
+ }
+
+ /**
+ * computeIfPresent does not replace if the key is already present
+ */
+ public void testComputeIfPresent() {
+ ConcurrentHashMap map = map5();
+ map.computeIfPresent(six, (x, y) -> "Z");
+ assertFalse(map.containsKey(six));
+ }
+
+ /**
+ * computeIfPresent adds when the given key is not present
+ */
+ public void testComputeIfPresent2() {
+ ConcurrentHashMap map = map5();
+ assertEquals("Z", map.computeIfPresent(one, (x, y) -> "Z"));
+ }
+
+ /**
+ * compute does not replace if the function returns null
+ */
+ public void testCompute() {
+ ConcurrentHashMap map = map5();
+ map.compute(six, (x, y) -> null);
+ assertFalse(map.containsKey(six));
+ }
+
+ /**
+ * compute adds when the given key is not present
+ */
+ public void testCompute2() {
+ ConcurrentHashMap map = map5();
+ assertEquals("Z", map.compute(six, (x, y) -> "Z"));
+ }
+
+ /**
+ * compute replaces when the given key is present
+ */
+ public void testCompute3() {
+ ConcurrentHashMap map = map5();
+ assertEquals("Z", map.compute(one, (x, y) -> "Z"));
+ }
+
+ /**
+ * compute removes when the given key is present and function returns null
+ */
+ public void testCompute4() {
+ ConcurrentHashMap map = map5();
+ map.compute(one, (x, y) -> null);
+ assertFalse(map.containsKey(one));
+ }
+
+ /**
+ * merge adds when the given key is not present
+ */
+ public void testMerge1() {
+ ConcurrentHashMap map = map5();
+ assertEquals("Y", map.merge(six, "Y", (x, y) -> "Z"));
+ }
+
+ /**
+ * merge replaces when the given key is present
+ */
+ public void testMerge2() {
+ ConcurrentHashMap map = map5();
+ assertEquals("Z", map.merge(one, "Y", (x, y) -> "Z"));
+ }
+
+ /**
+ * merge removes when the given key is present and function returns null
+ */
+ public void testMerge3() {
+ ConcurrentHashMap map = map5();
+ map.merge(one, "Y", (x, y) -> null);
+ assertFalse(map.containsKey(one));
+ }
+
+ static Set<Integer> populatedSet(int n) {
+ Set<Integer> a = ConcurrentHashMap.<Integer>newKeySet();
+ assertTrue(a.isEmpty());
+ for (int i = 0; i < n; i++)
+ assertTrue(a.add(i));
+ assertEquals(n == 0, a.isEmpty());
+ assertEquals(n, a.size());
+ return a;
+ }
+
+ static Set populatedSet(Integer[] elements) {
+ Set<Integer> a = ConcurrentHashMap.<Integer>newKeySet();
+ assertTrue(a.isEmpty());
+ for (int i = 0; i < elements.length; i++)
+ assertTrue(a.add(elements[i]));
+ assertFalse(a.isEmpty());
+ assertEquals(elements.length, a.size());
+ return a;
+ }
+
+ /**
+ * replaceAll replaces all matching values.
+ */
+ public void testReplaceAll() {
+ ConcurrentHashMap<Integer, String> map = map5();
+ map.replaceAll((x, y) -> { return x > 3 ? "Z" : y; });
+ assertEquals("A", map.get(one));
+ assertEquals("B", map.get(two));
+ assertEquals("C", map.get(three));
+ assertEquals("Z", map.get(four));
+ assertEquals("Z", map.get(five));
+ }
+
+ /**
+ * Default-constructed set is empty
+ */
+ public void testNewKeySet() {
+ Set a = ConcurrentHashMap.newKeySet();
+ assertTrue(a.isEmpty());
+ }
+
+ /**
+ * keySet.add adds the key with the established value to the map;
+ * remove removes it.
+ */
+ public void testKeySetAddRemove() {
+ ConcurrentHashMap map = map5();
+ Set set1 = map.keySet();
+ Set set2 = map.keySet(true);
+ set2.add(six);
+ assertTrue(((ConcurrentHashMap.KeySetView)set2).getMap() == map);
+ assertTrue(((ConcurrentHashMap.KeySetView)set1).getMap() == map);
+ assertEquals(set2.size(), map.size());
+ assertEquals(set1.size(), map.size());
+ assertTrue((Boolean)map.get(six));
+ assertTrue(set1.contains(six));
+ assertTrue(set2.contains(six));
+ set2.remove(six);
+ assertNull(map.get(six));
+ assertFalse(set1.contains(six));
+ assertFalse(set2.contains(six));
+ }
+
+ /**
+ * keySet.addAll adds each element from the given collection
+ */
+ public void testAddAll() {
+ Set full = populatedSet(3);
+ assertTrue(full.addAll(Arrays.asList(three, four, five)));
+ assertEquals(6, full.size());
+ assertFalse(full.addAll(Arrays.asList(three, four, five)));
+ assertEquals(6, full.size());
+ }
+
+ /**
+ * keySet.addAll adds each element from the given collection that did not
+ * already exist in the set
+ */
+ public void testAddAll2() {
+ Set full = populatedSet(3);
+ // "one" is duplicate and will not be added
+ assertTrue(full.addAll(Arrays.asList(three, four, one)));
+ assertEquals(5, full.size());
+ assertFalse(full.addAll(Arrays.asList(three, four, one)));
+ assertEquals(5, full.size());
+ }
+
+ /**
+ * keySet.add will not add the element if it already exists in the set
+ */
+ public void testAdd2() {
+ Set full = populatedSet(3);
+ assertFalse(full.add(one));
+ assertEquals(3, full.size());
+ }
+
+ /**
+ * keySet.add adds the element when it does not exist in the set
+ */
+ public void testAdd3() {
+ Set full = populatedSet(3);
+ assertTrue(full.add(three));
+ assertTrue(full.contains(three));
+ assertFalse(full.add(three));
+ assertTrue(full.contains(three));
+ }
+
+ /**
+ * keySet.add throws UnsupportedOperationException if no default
+ * mapped value
+ */
+ public void testAdd4() {
+ Set full = map5().keySet();
+ try {
+ full.add(three);
+ shouldThrow();
+ } catch (UnsupportedOperationException success) {}
+ }
+
+ /**
+ * keySet.add throws NullPointerException if the specified key is
+ * null
+ */
+ public void testAdd5() {
+ Set full = populatedSet(3);
+ try {
+ full.add(null);
+ shouldThrow();
+ } catch (NullPointerException success) {}
+ }
+
+ /**
+ * KeySetView.getMappedValue returns the map's mapped value
+ */
+ public void testGetMappedValue() {
+ ConcurrentHashMap map = map5();
+ assertNull(map.keySet().getMappedValue());
+ try {
+ map.keySet(null);
+ shouldThrow();
+ } catch (NullPointerException success) {}
+ ConcurrentHashMap.KeySetView set = map.keySet(one);
+ assertFalse(set.add(one));
+ assertTrue(set.add(six));
+ assertTrue(set.add(seven));
+ assertTrue(set.getMappedValue() == one);
+ assertTrue(map.get(one) != one);
+ assertTrue(map.get(six) == one);
+ assertTrue(map.get(seven) == one);
+ }
+
+ void checkSpliteratorCharacteristics(Spliterator<?> sp,
+ int requiredCharacteristics) {
+ assertEquals(requiredCharacteristics,
+ requiredCharacteristics & sp.characteristics());
+ }
+
+ /**
+ * KeySetView.spliterator returns spliterator over the elements in this set
+ */
+ public void testKeySetSpliterator() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap map = map5();
+ Set set = map.keySet();
+ Spliterator<Integer> sp = set.spliterator();
+ checkSpliteratorCharacteristics(sp, CONCURRENT | DISTINCT | NONNULL);
+ assertEquals(sp.estimateSize(), map.size());
+ Spliterator<Integer> sp2 = sp.trySplit();
+ sp.forEachRemaining((Integer x) -> adder.add(x.longValue()));
+ long v = adder.sumThenReset();
+ sp2.forEachRemaining((Integer x) -> adder.add(x.longValue()));
+ long v2 = adder.sum();
+ assertEquals(v + v2, 15);
+ }
+
+ /**
+ * keyset.clear removes all elements from the set
+ */
+ public void testClear() {
+ Set full = populatedSet(3);
+ full.clear();
+ assertEquals(0, full.size());
+ }
+
+ /**
+ * keyset.contains returns true for added elements
+ */
+ public void testContains() {
+ Set full = populatedSet(3);
+ assertTrue(full.contains(one));
+ assertFalse(full.contains(five));
+ }
+
+ /**
+ * KeySets with equal elements are equal
+ */
+ public void testEquals() {
+ Set a = populatedSet(3);
+ Set b = populatedSet(3);
+ assertTrue(a.equals(b));
+ assertTrue(b.equals(a));
+ assertEquals(a.hashCode(), b.hashCode());
+ a.add(m1);
+ assertFalse(a.equals(b));
+ assertFalse(b.equals(a));
+ b.add(m1);
+ assertTrue(a.equals(b));
+ assertTrue(b.equals(a));
+ assertEquals(a.hashCode(), b.hashCode());
+ }
+
+ /**
+ * KeySet.containsAll returns true for collections with subset of elements
+ */
+ public void testContainsAll() {
+ Collection full = populatedSet(3);
+ assertTrue(full.containsAll(Arrays.asList()));
+ assertTrue(full.containsAll(Arrays.asList(one)));
+ assertTrue(full.containsAll(Arrays.asList(one, two)));
+ assertFalse(full.containsAll(Arrays.asList(one, two, six)));
+ assertFalse(full.containsAll(Arrays.asList(six)));
+ }
+
+ /**
+ * KeySet.isEmpty is true when empty, else false
+ */
+ public void testIsEmpty() {
+ assertTrue(populatedSet(0).isEmpty());
+ assertFalse(populatedSet(3).isEmpty());
+ }
+
+ /**
+ * KeySet.iterator() returns an iterator containing the elements of the
+ * set
+ */
+ public void testIterator() {
+ Collection empty = ConcurrentHashMap.newKeySet();
+ int size = 20;
+ assertFalse(empty.iterator().hasNext());
+ try {
+ empty.iterator().next();
+ shouldThrow();
+ } catch (NoSuchElementException success) {}
+
+ Integer[] elements = new Integer[size];
+ for (int i = 0; i < size; i++)
+ elements[i] = i;
+ Collections.shuffle(Arrays.asList(elements));
+ Collection<Integer> full = populatedSet(elements);
+
+ Iterator it = full.iterator();
+ for (int j = 0; j < size; j++) {
+ assertTrue(it.hasNext());
+ it.next();
+ }
+ assertIteratorExhausted(it);
+ }
+
+ /**
+ * iterator of empty collections has no elements
+ */
+ public void testEmptyIterator() {
+ assertIteratorExhausted(ConcurrentHashMap.newKeySet().iterator());
+ assertIteratorExhausted(new ConcurrentHashMap().entrySet().iterator());
+ assertIteratorExhausted(new ConcurrentHashMap().values().iterator());
+ assertIteratorExhausted(new ConcurrentHashMap().keySet().iterator());
+ }
+
+ /**
+ * KeySet.iterator.remove removes current element
+ */
+ public void testIteratorRemove() {
+ Set q = populatedSet(3);
+ Iterator it = q.iterator();
+ Object removed = it.next();
+ it.remove();
+
+ it = q.iterator();
+ assertFalse(it.next().equals(removed));
+ assertFalse(it.next().equals(removed));
+ assertFalse(it.hasNext());
+ }
+
+ /**
+ * KeySet.toString holds toString of elements
+ */
+ public void testToString() {
+ assertEquals("[]", ConcurrentHashMap.newKeySet().toString());
+ Set full = populatedSet(3);
+ String s = full.toString();
+ for (int i = 0; i < 3; ++i)
+ assertTrue(s.contains(String.valueOf(i)));
+ }
+
+ /**
+ * KeySet.removeAll removes all elements from the given collection
+ */
+ public void testRemoveAll() {
+ Set full = populatedSet(3);
+ assertTrue(full.removeAll(Arrays.asList(one, two)));
+ assertEquals(1, full.size());
+ assertFalse(full.removeAll(Arrays.asList(one, two)));
+ assertEquals(1, full.size());
+ }
+
+ /**
+ * KeySet.remove removes an element
+ */
+ public void testRemove() {
+ Set full = populatedSet(3);
+ full.remove(one);
+ assertFalse(full.contains(one));
+ assertEquals(2, full.size());
+ }
+
+ /**
+ * keySet.size returns the number of elements
+ */
+ public void testSize() {
+ Set empty = ConcurrentHashMap.newKeySet();
+ Set full = populatedSet(3);
+ assertEquals(3, full.size());
+ assertEquals(0, empty.size());
+ }
+
+ /**
+ * KeySet.toArray() returns an Object array containing all elements from
+ * the set
+ */
+ public void testToArray() {
+ Object[] a = ConcurrentHashMap.newKeySet().toArray();
+ assertTrue(Arrays.equals(new Object[0], a));
+ assertSame(Object[].class, a.getClass());
+ int size = 20;
+ Integer[] elements = new Integer[size];
+ for (int i = 0; i < size; i++)
+ elements[i] = i;
+ Collections.shuffle(Arrays.asList(elements));
+ Collection<Integer> full = populatedSet(elements);
+
+ assertTrue(Arrays.asList(elements).containsAll(Arrays.asList(full.toArray())));
+ assertTrue(full.containsAll(Arrays.asList(full.toArray())));
+ assertSame(Object[].class, full.toArray().getClass());
+ }
+
+ /**
+ * toArray(Integer array) returns an Integer array containing all
+ * elements from the set
+ */
+ public void testToArray2() {
+ Collection empty = ConcurrentHashMap.newKeySet();
+ Integer[] a;
+ int size = 20;
+
+ a = new Integer[0];
+ assertSame(a, empty.toArray(a));
+
+ a = new Integer[size / 2];
+ Arrays.fill(a, 42);
+ assertSame(a, empty.toArray(a));
+ assertNull(a[0]);
+ for (int i = 1; i < a.length; i++)
+ assertEquals(42, (int) a[i]);
+
+ Integer[] elements = new Integer[size];
+ for (int i = 0; i < size; i++)
+ elements[i] = i;
+ Collections.shuffle(Arrays.asList(elements));
+ Collection<Integer> full = populatedSet(elements);
+
+ Arrays.fill(a, 42);
+ assertTrue(Arrays.asList(elements).containsAll(Arrays.asList(full.toArray(a))));
+ for (int i = 0; i < a.length; i++)
+ assertEquals(42, (int) a[i]);
+ assertSame(Integer[].class, full.toArray(a).getClass());
+
+ a = new Integer[size];
+ Arrays.fill(a, 42);
+ assertSame(a, full.toArray(a));
+ assertTrue(Arrays.asList(elements).containsAll(Arrays.asList(full.toArray(a))));
+ }
+
+ /**
+ * A deserialized serialized set is equal
+ */
+ public void testSerialization() throws Exception {
+ int size = 20;
+ Set x = populatedSet(size);
+ Set y = serialClone(x);
+
+ assertNotSame(x, y);
+ assertEquals(x.size(), y.size());
+ assertEquals(x, y);
+ assertEquals(y, x);
+ }
+
+ static final int SIZE = 10000;
+ static ConcurrentHashMap<Long, Long> longMap;
+
+ static ConcurrentHashMap<Long, Long> longMap() {
+ if (longMap == null) {
+ longMap = new ConcurrentHashMap<Long, Long>(SIZE);
+ for (int i = 0; i < SIZE; ++i)
+ longMap.put(Long.valueOf(i), Long.valueOf(2 *i));
+ }
+ return longMap;
+ }
+
+ // explicit function class to avoid type inference problems
+ static class AddKeys implements BiFunction<Map.Entry<Long,Long>, Map.Entry<Long,Long>, Map.Entry<Long,Long>> {
+ public Map.Entry<Long,Long> apply(Map.Entry<Long,Long> x, Map.Entry<Long,Long> y) {
+ return new AbstractMap.SimpleEntry<Long,Long>
+ (Long.valueOf(x.getKey().longValue() + y.getKey().longValue()),
+ Long.valueOf(1L));
+ }
+ }
+
+ /**
+ * forEachKeySequentially traverses all keys
+ */
+ public void testForEachKeySequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachKey(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * forEachValueSequentially traverses all values
+ */
+ public void testForEachValueSequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachValue(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), SIZE * (SIZE - 1));
+ }
+
+ /**
+ * forEachSequentially traverses all mappings
+ */
+ public void testForEachSequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEach(Long.MAX_VALUE, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * forEachEntrySequentially traverses all entries
+ */
+ public void testForEachEntrySequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachEntry(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * forEachKeyInParallel traverses all keys
+ */
+ public void testForEachKeyInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachKey(1L, (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * forEachValueInParallel traverses all values
+ */
+ public void testForEachValueInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachValue(1L, (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), SIZE * (SIZE - 1));
+ }
+
+ /**
+ * forEachInParallel traverses all mappings
+ */
+ public void testForEachInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEach(1L, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * forEachEntryInParallel traverses all entries
+ */
+ public void testForEachEntryInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachEntry(1L, (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped forEachKeySequentially traverses the given
+ * transformations of all keys
+ */
+ public void testMappedForEachKeySequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachKey(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped forEachValueSequentially traverses the given
+ * transformations of all values
+ */
+ public void testMappedForEachValueSequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachValue(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
+ }
+
+ /**
+ * Mapped forEachSequentially traverses the given
+ * transformations of all mappings
+ */
+ public void testMappedForEachSequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEach(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped forEachEntrySequentially traverses the given
+ * transformations of all entries
+ */
+ public void testMappedForEachEntrySequentially() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachEntry(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped forEachKeyInParallel traverses the given
+ * transformations of all keys
+ */
+ public void testMappedForEachKeyInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachKey(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped forEachValueInParallel traverses the given
+ * transformations of all values
+ */
+ public void testMappedForEachValueInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachValue(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
+ }
+
+ /**
+ * Mapped forEachInParallel traverses the given
+ * transformations of all mappings
+ */
+ public void testMappedForEachInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEach(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped forEachEntryInParallel traverses the given
+ * transformations of all entries
+ */
+ public void testMappedForEachEntryInParallel() {
+ LongAdder adder = new LongAdder();
+ ConcurrentHashMap<Long, Long> m = longMap();
+ m.forEachEntry(1L, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
+ (Long x) -> adder.add(x.longValue()));
+ assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysSequentially accumulates across all keys,
+ */
+ public void testReduceKeysSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceValuesSequentially accumulates across all values
+ */
+ public void testReduceValuesSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceEntriesSequentially accumulates across all entries
+ */
+ public void testReduceEntriesSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Map.Entry<Long,Long> r;
+ r = m.reduceEntries(Long.MAX_VALUE, new AddKeys());
+ assertEquals(r.getKey().longValue(), (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysInParallel accumulates across all keys
+ */
+ public void testReduceKeysInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.reduceKeys(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceValuesInParallel accumulates across all values
+ */
+ public void testReduceValuesInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.reduceValues(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceEntriesInParallel accumulate across all entries
+ */
+ public void testReduceEntriesInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Map.Entry<Long,Long> r;
+ r = m.reduceEntries(1L, new AddKeys());
+ assertEquals(r.getKey().longValue(), (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped reduceKeysSequentially accumulates mapped keys
+ */
+ public void testMapReduceKeysSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r = m.reduceKeys(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped reduceValuesSequentially accumulates mapped values
+ */
+ public void testMapReduceValuesSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r = m.reduceValues(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceSequentially accumulates across all transformed mappings
+ */
+ public void testMappedReduceSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r = m.reduce(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
+ (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+
+ assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped reduceKeysInParallel, accumulates mapped keys
+ */
+ public void testMapReduceKeysInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r = m.reduceKeys(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * Mapped reduceValuesInParallel accumulates mapped values
+ */
+ public void testMapReduceValuesInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r = m.reduceValues(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
+ (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceInParallel accumulate across all transformed mappings
+ */
+ public void testMappedReduceInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.reduce(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
+ (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysToLongSequentially accumulates mapped keys
+ */
+ public void testReduceKeysToLongSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ long lr = m.reduceKeysToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
+ assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysToIntSequentially accumulates mapped keys
+ */
+ public void testReduceKeysToIntSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ int ir = m.reduceKeysToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
+ assertEquals(ir, SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysToDoubleSequentially accumulates mapped keys
+ */
+ public void testReduceKeysToDoubleSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ double dr = m.reduceKeysToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
+ assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceValuesToLongSequentially accumulates mapped values
+ */
+ public void testReduceValuesToLongSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ long lr = m.reduceValuesToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
+ assertEquals(lr, (long)SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceValuesToIntSequentially accumulates mapped values
+ */
+ public void testReduceValuesToIntSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ int ir = m.reduceValuesToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
+ assertEquals(ir, SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceValuesToDoubleSequentially accumulates mapped values
+ */
+ public void testReduceValuesToDoubleSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ double dr = m.reduceValuesToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
+ assertEquals(dr, (double)SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceKeysToLongInParallel accumulates mapped keys
+ */
+ public void testReduceKeysToLongInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ long lr = m.reduceKeysToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
+ assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysToIntInParallel accumulates mapped keys
+ */
+ public void testReduceKeysToIntInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ int ir = m.reduceKeysToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
+ assertEquals(ir, SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceKeysToDoubleInParallel accumulates mapped values
+ */
+ public void testReduceKeysToDoubleInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ double dr = m.reduceKeysToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
+ assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
+ }
+
+ /**
+ * reduceValuesToLongInParallel accumulates mapped values
+ */
+ public void testReduceValuesToLongInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ long lr = m.reduceValuesToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
+ assertEquals(lr, (long)SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceValuesToIntInParallel accumulates mapped values
+ */
+ public void testReduceValuesToIntInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ int ir = m.reduceValuesToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
+ assertEquals(ir, SIZE * (SIZE - 1));
+ }
+
+ /**
+ * reduceValuesToDoubleInParallel accumulates mapped values
+ */
+ public void testReduceValuesToDoubleInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ double dr = m.reduceValuesToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
+ assertEquals(dr, (double)SIZE * (SIZE - 1));
+ }
+
+ /**
+ * searchKeysSequentially returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchKeysSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() < 0L ? x : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchValuesSequentially returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchValuesSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.searchValues(Long.MAX_VALUE,
+ (Long x) -> (x.longValue() == (long)(SIZE/2)) ? x : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.searchValues(Long.MAX_VALUE,
+ (Long x) -> (x.longValue() < 0L) ? x : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchSequentially returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() == (long)(SIZE/2) ? x : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() < 0L ? x : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchEntriesSequentially returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchEntriesSequentially() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.searchEntries(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2) ? e.getKey() : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.searchEntries(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchKeysInParallel returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchKeysInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.searchKeys(1L, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.searchKeys(1L, (Long x) -> x.longValue() < 0L ? x : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchValuesInParallel returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchValuesInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.searchValues(1L, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.searchValues(1L, (Long x) -> x.longValue() < 0L ? x : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchInParallel returns a non-null result of search function,
+ * or null if none
+ */
+ public void testSearchInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.search(1L, (Long x, Long y) -> x.longValue() == (long)(SIZE/2) ? x : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.search(1L, (Long x, Long y) -> x.longValue() < 0L ? x : null);
+ assertNull(r);
+ }
+
+ /**
+ * searchEntriesInParallel returns a non-null result of search
+ * function, or null if none
+ */
+ public void testSearchEntriesInParallel() {
+ ConcurrentHashMap<Long, Long> m = longMap();
+ Long r;
+ r = m.searchEntries(1L, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2) ? e.getKey() : null);
+ assertEquals((long)r, (long)(SIZE/2));
+ r = m.searchEntries(1L, (Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
+ assertNull(r);
+ }
+
+}