ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentHashMap8Test.java
(Generate patch)

Comparing jsr166/src/test/tck/ConcurrentHashMap8Test.java (file contents):
Revision 1.2 by dl, Fri Mar 22 00:24:35 2013 UTC vs.
Revision 1.13 by jsr166, Mon Jul 22 15:55:43 2013 UTC

# Line 6 | Line 6
6  
7   import junit.framework.*;
8   import java.util.*;
9 + import java.util.function.*;
10   import java.util.concurrent.atomic.LongAdder;
11   import java.util.concurrent.ConcurrentHashMap;
12 + import java.util.concurrent.ConcurrentHashMap.KeySetView;
13  
14   public class ConcurrentHashMap8Test extends JSR166TestCase {
15      public static void main(String[] args) {
# Line 34 | Line 36 | public class ConcurrentHashMap8Test exte
36      }
37  
38      /**
39 +     * getOrDefault returns value if present, else default
40 +     */
41 +    public void testGetOrDefault() {
42 +        ConcurrentHashMap map = map5();
43 +        assertEquals(map.getOrDefault(one, "Z"), "A");
44 +        assertEquals(map.getOrDefault(six, "Z"), "Z");
45 +    }
46 +
47 +    /**
48       * computeIfAbsent adds when the given key is not present
49       */
50      public void testComputeIfAbsent() {
# Line 58 | Line 69 | public class ConcurrentHashMap8Test exte
69          map.computeIfAbsent(six, (x) -> null);
70          assertFalse(map.containsKey(six));
71      }
72 <    
72 >
73      /**
74       * computeIfPresent does not replace  if the key is already present
75       */
# Line 135 | Line 146 | public class ConcurrentHashMap8Test exte
146          assertFalse(map.containsKey(one));
147      }
148  
149 +    static Set<Integer> populatedSet(int n) {
150 +        Set<Integer> a = ConcurrentHashMap.<Integer>newKeySet();
151 +        assertTrue(a.isEmpty());
152 +        for (int i = 0; i < n; i++)
153 +            a.add(i);
154 +        assertFalse(a.isEmpty());
155 +        assertEquals(n, a.size());
156 +        return a;
157 +    }
158 +
159 +    static Set populatedSet(Integer[] elements) {
160 +        Set<Integer> a = ConcurrentHashMap.<Integer>newKeySet();
161 +        assertTrue(a.isEmpty());
162 +        for (int i = 0; i < elements.length; i++)
163 +            a.add(elements[i]);
164 +        assertFalse(a.isEmpty());
165 +        assertEquals(elements.length, a.size());
166 +        return a;
167 +    }
168 +
169 +    /*
170 +     * replaceAll replaces all matching values.
171 +     */
172 +    public void testReplaceAll() {
173 +        ConcurrentHashMap<Integer, String> map = map5();
174 +        map.replaceAll((x, y) -> {return x > 3 ? "Z" : y;});
175 +        assertEquals("A", map.get(one));
176 +        assertEquals("B", map.get(two));
177 +        assertEquals("C", map.get(three));
178 +        assertEquals("Z", map.get(four));
179 +        assertEquals("Z", map.get(five));
180 +    }
181 +
182 +    /**
183 +     * Default-constructed set is empty
184 +     */
185 +    public void testNewKeySet() {
186 +        Set a = ConcurrentHashMap.newKeySet();
187 +        assertTrue(a.isEmpty());
188 +    }
189 +
190 +    /**
191 +     * keySet.add adds the key with the established value to the map;
192 +     * remove removes it.
193 +     */
194 +    public void testKeySetAddRemove() {
195 +        ConcurrentHashMap map = map5();
196 +        Set set1 = map.keySet();
197 +        Set set2 = map.keySet(true);
198 +        set2.add(six);
199 +        assertTrue(((KeySetView)set2).getMap() == map);
200 +        assertTrue(((KeySetView)set1).getMap() == map);
201 +        assertEquals(set2.size(), map.size());
202 +        assertEquals(set1.size(), map.size());
203 +        assertTrue((Boolean)map.get(six));
204 +        assertTrue(set1.contains(six));
205 +        assertTrue(set2.contains(six));
206 +        set2.remove(six);
207 +        assertNull(map.get(six));
208 +        assertFalse(set1.contains(six));
209 +        assertFalse(set2.contains(six));
210 +    }
211 +
212 +
213 +    /**
214 +     * keySet.addAll adds each element from the given collection
215 +     */
216 +    public void testAddAll() {
217 +        Set full = populatedSet(3);
218 +        Vector v = new Vector();
219 +        v.add(three);
220 +        v.add(four);
221 +        v.add(five);
222 +        full.addAll(v);
223 +        assertEquals(6, full.size());
224 +    }
225 +
226 +    /**
227 +     * keySet.addAll adds each element from the given collection that did not
228 +     * already exist in the set
229 +     */
230 +    public void testAddAll2() {
231 +        Set full = populatedSet(3);
232 +        Vector v = new Vector();
233 +        v.add(three);
234 +        v.add(four);
235 +        v.add(one); // will not add this element
236 +        full.addAll(v);
237 +        assertEquals(5, full.size());
238 +    }
239 +
240 +    /**
241 +     * keySet.add will not add the element if it already exists in the set
242 +     */
243 +    public void testAdd2() {
244 +        Set full = populatedSet(3);
245 +        full.add(one);
246 +        assertEquals(3, full.size());
247 +    }
248 +
249 +    /**
250 +     * keySet.add adds the element when it does not exist in the set
251 +     */
252 +    public void testAdd3() {
253 +        Set full = populatedSet(3);
254 +        full.add(three);
255 +        assertTrue(full.contains(three));
256 +    }
257 +
258 +    /**
259 +     * keySet.add throws UnsupportedOperationException if no default
260 +     * mapped value
261 +     */
262 +    public void testAdd4() {
263 +        Set full = map5().keySet();
264 +        try {
265 +            full.add(three);
266 +            shouldThrow();
267 +        } catch (UnsupportedOperationException e){}
268 +    }
269 +
270 +    /**
271 +     * keySet.add throws NullPointerException if the specified key is
272 +     * null
273 +     */
274 +    public void testAdd5() {
275 +        Set full = populatedSet(3);
276 +        try {
277 +            full.add(null);
278 +            shouldThrow();
279 +        } catch (NullPointerException e){}
280 +    }
281 +
282 +    /**
283 +     * KeySetView.getMappedValue returns the map's mapped value
284 +     */
285 +    public void testGetMappedValue() {
286 +        ConcurrentHashMap map = map5();
287 +        assertNull(map.keySet().getMappedValue());
288 +        try {
289 +            map.keySet(null);
290 +            shouldThrow();
291 +        } catch (NullPointerException e) {}
292 +        KeySetView set = map.keySet(one);
293 +        set.add(one);
294 +        set.add(six);
295 +        set.add(seven);
296 +        assertTrue(set.getMappedValue() == one);
297 +        assertTrue(map.get(one) != one);
298 +        assertTrue(map.get(six) == one);
299 +        assertTrue(map.get(seven) == one);
300 +    }
301 +
302 +    /**
303 +     * KeySetView.spliterator returns spliterator over the elements in this set
304 +     */
305 +    public void testKeySetSpliterator() {
306 +        LongAdder adder = new LongAdder();
307 +        ConcurrentHashMap map = map5();
308 +        Set set = map.keySet();
309 +        Spliterator<Integer> sp = set.spliterator();
310 +        assertEquals(sp.estimateSize(), map.size());
311 +        Spliterator<Integer> sp2 = sp.trySplit();
312 +        sp.forEachRemaining((Integer x) -> adder.add(x.longValue()));
313 +        long v = adder.sumThenReset();
314 +        sp2.forEachRemaining((Integer x) -> adder.add(x.longValue()));
315 +        long v2 = adder.sum();
316 +        assertEquals(v + v2, 15);
317 +    }
318 +
319 +    /**
320 +     * keyset.clear removes all elements from the set
321 +     */
322 +    public void testClear() {
323 +        Set full = populatedSet(3);
324 +        full.clear();
325 +        assertEquals(0, full.size());
326 +    }
327 +
328 +    /**
329 +     * keyset.contains returns true for added elements
330 +     */
331 +    public void testContains() {
332 +        Set full = populatedSet(3);
333 +        assertTrue(full.contains(one));
334 +        assertFalse(full.contains(five));
335 +    }
336 +
337 +    /**
338 +     * KeySets with equal elements are equal
339 +     */
340 +    public void testEquals() {
341 +        Set a = populatedSet(3);
342 +        Set b = populatedSet(3);
343 +        assertTrue(a.equals(b));
344 +        assertTrue(b.equals(a));
345 +        assertEquals(a.hashCode(), b.hashCode());
346 +        a.add(m1);
347 +        assertFalse(a.equals(b));
348 +        assertFalse(b.equals(a));
349 +        b.add(m1);
350 +        assertTrue(a.equals(b));
351 +        assertTrue(b.equals(a));
352 +        assertEquals(a.hashCode(), b.hashCode());
353 +    }
354 +
355 +    /**
356 +     * KeySet.containsAll returns true for collections with subset of elements
357 +     */
358 +    public void testContainsAll() {
359 +        Set full = populatedSet(3);
360 +        Vector v = new Vector();
361 +        v.add(one);
362 +        v.add(two);
363 +        assertTrue(full.containsAll(v));
364 +        v.add(six);
365 +        assertFalse(full.containsAll(v));
366 +    }
367 +
368 +    /**
369 +     * KeySet.isEmpty is true when empty, else false
370 +     */
371 +    public void testIsEmpty() {
372 +        Set empty = ConcurrentHashMap.newKeySet();
373 +        Set full = populatedSet(3);
374 +        assertTrue(empty.isEmpty());
375 +        assertFalse(full.isEmpty());
376 +    }
377 +
378 +    /**
379 +     * KeySet.iterator() returns an iterator containing the elements of the
380 +     * set
381 +     */
382 +    public void testIterator() {
383 +        Collection empty = ConcurrentHashMap.newKeySet();
384 +        int size = 20;
385 +        assertFalse(empty.iterator().hasNext());
386 +        try {
387 +            empty.iterator().next();
388 +            shouldThrow();
389 +        } catch (NoSuchElementException success) {}
390 +
391 +        Integer[] elements = new Integer[size];
392 +        for (int i = 0; i < size; i++)
393 +            elements[i] = i;
394 +        Collections.shuffle(Arrays.asList(elements));
395 +        Collection<Integer> full = populatedSet(elements);
396 +
397 +        Iterator it = full.iterator();
398 +        for (int j = 0; j < size; j++) {
399 +            assertTrue(it.hasNext());
400 +            it.next();
401 +        }
402 +        assertFalse(it.hasNext());
403 +        try {
404 +            it.next();
405 +            shouldThrow();
406 +        } catch (NoSuchElementException success) {}
407 +    }
408 +
409 +    /**
410 +     * KeySet.iterator.remove removes current element
411 +     */
412 +    public void testIteratorRemove() {
413 +        Set q = populatedSet(3);
414 +        Iterator it = q.iterator();
415 +        Object removed = it.next();
416 +        it.remove();
417 +
418 +        it = q.iterator();
419 +        assertFalse(it.next().equals(removed));
420 +        assertFalse(it.next().equals(removed));
421 +        assertFalse(it.hasNext());
422 +    }
423 +
424 +    /**
425 +     * KeySet.toString holds toString of elements
426 +     */
427 +    public void testToString() {
428 +        assertEquals("[]", ConcurrentHashMap.newKeySet().toString());
429 +        Set full = populatedSet(3);
430 +        String s = full.toString();
431 +        for (int i = 0; i < 3; ++i)
432 +            assertTrue(s.contains(String.valueOf(i)));
433 +    }
434 +
435 +    /**
436 +     * KeySet.removeAll removes all elements from the given collection
437 +     */
438 +    public void testRemoveAll() {
439 +        Set full = populatedSet(3);
440 +        Vector v = new Vector();
441 +        v.add(one);
442 +        v.add(two);
443 +        full.removeAll(v);
444 +        assertEquals(1, full.size());
445 +    }
446 +
447 +    /**
448 +     * KeySet.remove removes an element
449 +     */
450 +    public void testRemove() {
451 +        Set full = populatedSet(3);
452 +        full.remove(one);
453 +        assertFalse(full.contains(one));
454 +        assertEquals(2, full.size());
455 +    }
456 +
457 +    /**
458 +     * keySet.size returns the number of elements
459 +     */
460 +    public void testSize() {
461 +        Set empty = ConcurrentHashMap.newKeySet();
462 +        Set full = populatedSet(3);
463 +        assertEquals(3, full.size());
464 +        assertEquals(0, empty.size());
465 +    }
466 +
467 +    /**
468 +     * KeySet.toArray() returns an Object array containing all elements from
469 +     * the set
470 +     */
471 +    public void testToArray() {
472 +        Object[] a = ConcurrentHashMap.newKeySet().toArray();
473 +        assertTrue(Arrays.equals(new Object[0], a));
474 +        assertSame(Object[].class, a.getClass());
475 +        int size = 20;
476 +        Integer[] elements = new Integer[size];
477 +        for (int i = 0; i < size; i++)
478 +            elements[i] = i;
479 +        Collections.shuffle(Arrays.asList(elements));
480 +        Collection<Integer> full = populatedSet(elements);
481 +
482 +        assertTrue(Arrays.asList(elements).containsAll(Arrays.asList(full.toArray())));
483 +        assertTrue(full.containsAll(Arrays.asList(full.toArray())));
484 +        assertSame(Object[].class, full.toArray().getClass());
485 +    }
486 +
487 +    /**
488 +     * toArray(Integer array) returns an Integer array containing all
489 +     * elements from the set
490 +     */
491 +    public void testToArray2() {
492 +        Collection empty = ConcurrentHashMap.newKeySet();
493 +        Integer[] a;
494 +        int size = 20;
495 +
496 +        a = new Integer[0];
497 +        assertSame(a, empty.toArray(a));
498 +
499 +        a = new Integer[size/2];
500 +        Arrays.fill(a, 42);
501 +        assertSame(a, empty.toArray(a));
502 +        assertNull(a[0]);
503 +        for (int i = 1; i < a.length; i++)
504 +            assertEquals(42, (int) a[i]);
505 +
506 +        Integer[] elements = new Integer[size];
507 +        for (int i = 0; i < size; i++)
508 +            elements[i] = i;
509 +        Collections.shuffle(Arrays.asList(elements));
510 +        Collection<Integer> full = populatedSet(elements);
511 +
512 +        Arrays.fill(a, 42);
513 +        assertTrue(Arrays.asList(elements).containsAll(Arrays.asList(full.toArray(a))));
514 +        for (int i = 0; i < a.length; i++)
515 +            assertEquals(42, (int) a[i]);
516 +        assertSame(Integer[].class, full.toArray(a).getClass());
517 +
518 +        a = new Integer[size];
519 +        Arrays.fill(a, 42);
520 +        assertSame(a, full.toArray(a));
521 +        assertTrue(Arrays.asList(elements).containsAll(Arrays.asList(full.toArray(a))));
522 +    }
523 +
524 +    /**
525 +     * A deserialized serialized set is equal
526 +     */
527 +    public void testSerialization() throws Exception {
528 +        int size = 20;
529 +        Set x = populatedSet(size);
530 +        Set y = serialClone(x);
531 +
532 +        assertNotSame(x, y);
533 +        assertEquals(x.size(), y.size());
534 +        assertEquals(x.toString(), y.toString());
535 +        assertTrue(Arrays.equals(x.toArray(), y.toArray()));
536 +        assertEquals(x, y);
537 +        assertEquals(y, x);
538 +    }
539 +
540      static final int SIZE = 10000;
541      static ConcurrentHashMap<Long, Long> longMap;
542 <    
542 >
543      static ConcurrentHashMap<Long, Long> longMap() {
544          if (longMap == null) {
545              longMap = new ConcurrentHashMap<Long, Long>(SIZE);
# Line 147 | Line 549 | public class ConcurrentHashMap8Test exte
549          return longMap;
550      }
551  
552 +    // explicit function class to avoid type inference problems
553 +    static class AddKeys implements BiFunction<Map.Entry<Long,Long>, Map.Entry<Long,Long>, Map.Entry<Long,Long>> {
554 +        public Map.Entry<Long,Long> apply(Map.Entry<Long,Long> x, Map.Entry<Long,Long> y) {
555 +            return new AbstractMap.SimpleEntry<Long,Long>
556 +             (Long.valueOf(x.getKey().longValue() + y.getKey().longValue()),
557 +              Long.valueOf(1L));
558 +        }
559 +    }
560 +
561      /**
562 <     * forEachKeySequentially, forEachValueSequentially,
152 <     * forEachEntrySequentially, forEachSequentially,
153 <     * forEachKeyInParallel, forEachValueInParallel,
154 <     * forEachEntryInParallel, forEachInParallel traverse all keys,
155 <     * values, entries, or mappings accordingly
562 >     * forEachKeySequentially traverses all keys
563       */
564 <    public void testForEach() {
564 >    public void testForEachKeySequentially() {
565          LongAdder adder = new LongAdder();
566          ConcurrentHashMap<Long, Long> m = longMap();
567 <        m.forEachKeySequentially((Long x) -> adder.add(x.longValue()));
567 >        m.forEachKey(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
568          assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
569 <        adder.reset();
570 <        m.forEachValueSequentially((Long x) -> adder.add(x.longValue()));
569 >    }
570 >
571 >    /**
572 >     * forEachValueSequentially traverses all values
573 >     */
574 >    public void testForEachValueSequentially() {
575 >        LongAdder adder = new LongAdder();
576 >        ConcurrentHashMap<Long, Long> m = longMap();
577 >        m.forEachValue(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
578          assertEquals(adder.sum(), SIZE * (SIZE - 1));
579 <        adder.reset();
580 <        m.forEachSequentially((Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
579 >    }
580 >
581 >    /**
582 >     * forEachSequentially traverses all mappings
583 >     */
584 >    public void testForEachSequentially() {
585 >        LongAdder adder = new LongAdder();
586 >        ConcurrentHashMap<Long, Long> m = longMap();
587 >        m.forEach(Long.MAX_VALUE, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
588          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
589 <        adder.reset();
590 <        m.forEachEntrySequentially((Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
589 >    }
590 >
591 >    /**
592 >     * forEachEntrySequentially traverses all entries
593 >     */
594 >    public void testForEachEntrySequentially() {
595 >        LongAdder adder = new LongAdder();
596 >        ConcurrentHashMap<Long, Long> m = longMap();
597 >        m.forEachEntry(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
598          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
599 <        adder.reset();
600 <        m.forEachKeyInParallel((Long x) -> adder.add(x.longValue()));
599 >    }
600 >
601 >    /**
602 >     * forEachKeyInParallel traverses all keys
603 >     */
604 >    public void testForEachKeyInParallel() {
605 >        LongAdder adder = new LongAdder();
606 >        ConcurrentHashMap<Long, Long> m = longMap();
607 >        m.forEachKey(1L, (Long x) -> adder.add(x.longValue()));
608          assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
609 <        adder.reset();
610 <        m.forEachValueInParallel((Long x) -> adder.add(x.longValue()));
609 >    }
610 >
611 >    /**
612 >     * forEachValueInParallel traverses all values
613 >     */
614 >    public void testForEachValueInParallel() {
615 >        LongAdder adder = new LongAdder();
616 >        ConcurrentHashMap<Long, Long> m = longMap();
617 >        m.forEachValue(1L, (Long x) -> adder.add(x.longValue()));
618          assertEquals(adder.sum(), SIZE * (SIZE - 1));
619 <        adder.reset();
620 <        m.forEachInParallel((Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
619 >    }
620 >
621 >    /**
622 >     * forEachInParallel traverses all mappings
623 >     */
624 >    public void testForEachInParallel() {
625 >        LongAdder adder = new LongAdder();
626 >        ConcurrentHashMap<Long, Long> m = longMap();
627 >        m.forEach(1L, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
628          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
629 <        adder.reset();
630 <        m.forEachEntryInParallel((Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
629 >    }
630 >
631 >    /**
632 >     * forEachEntryInParallel traverses all entries
633 >     */
634 >    public void testForEachEntryInParallel() {
635 >        LongAdder adder = new LongAdder();
636 >        ConcurrentHashMap<Long, Long> m = longMap();
637 >        m.forEachEntry(1L, (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
638          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
639      }
640  
641      /**
642 <     * Mapped forEachKeySequentially, forEachValueSequentially,
643 <     * forEachEntrySequentially, forEachSequentially,
188 <     * forEachKeyInParallel, forEachValueInParallel,
189 <     * forEachEntryInParallel, forEachInParallel traverse the given
190 <     * transformations of all keys, values, entries, or mappings
191 <     * accordingly
642 >     * Mapped forEachKeySequentially traverses the given
643 >     * transformations of all keys
644       */
645 <    public void testMappedForEach() {
645 >    public void testMappedForEachKeySequentially() {
646          LongAdder adder = new LongAdder();
647          ConcurrentHashMap<Long, Long> m = longMap();
648 <        m.forEachKeySequentially((Long x) -> Long.valueOf(4 * x.longValue()),
648 >        m.forEachKey(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
649                                   (Long x) -> adder.add(x.longValue()));
650          assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
651 <        adder.reset();
652 <        m.forEachValueSequentially((Long x) -> Long.valueOf(4 * x.longValue()),
651 >    }
652 >
653 >    /**
654 >     * Mapped forEachValueSequentially traverses the given
655 >     * transformations of all values
656 >     */
657 >    public void testMappedForEachValueSequentially() {
658 >        LongAdder adder = new LongAdder();
659 >        ConcurrentHashMap<Long, Long> m = longMap();
660 >        m.forEachValue(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
661                                     (Long x) -> adder.add(x.longValue()));
662          assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
663 <        adder.reset();
664 <        m.forEachSequentially((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
663 >    }
664 >
665 >    /**
666 >     * Mapped forEachSequentially traverses the given
667 >     * transformations of all mappings
668 >     */
669 >    public void testMappedForEachSequentially() {
670 >        LongAdder adder = new LongAdder();
671 >        ConcurrentHashMap<Long, Long> m = longMap();
672 >        m.forEach(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
673                                (Long x) -> adder.add(x.longValue()));
674          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
675 <        adder.reset();
676 <        m.forEachEntrySequentially((Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
675 >    }
676 >
677 >    /**
678 >     * Mapped forEachEntrySequentially traverses the given
679 >     * transformations of all entries
680 >     */
681 >    public void testMappedForEachEntrySequentially() {
682 >        LongAdder adder = new LongAdder();
683 >        ConcurrentHashMap<Long, Long> m = longMap();
684 >        m.forEachEntry(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
685                                     (Long x) -> adder.add(x.longValue()));
686          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
687 <        adder.reset();
688 <        m.forEachKeyInParallel((Long x) -> Long.valueOf(4 * x.longValue()),
687 >    }
688 >
689 >    /**
690 >     * Mapped forEachKeyInParallel traverses the given
691 >     * transformations of all keys
692 >     */
693 >    public void testMappedForEachKeyInParallel() {
694 >        LongAdder adder = new LongAdder();
695 >        ConcurrentHashMap<Long, Long> m = longMap();
696 >        m.forEachKey(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
697                                 (Long x) -> adder.add(x.longValue()));
698          assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
699 <        adder.reset();
700 <        m.forEachValueInParallel((Long x) -> Long.valueOf(4 * x.longValue()),
699 >    }
700 >
701 >    /**
702 >     * Mapped forEachValueInParallel traverses the given
703 >     * transformations of all values
704 >     */
705 >    public void testMappedForEachValueInParallel() {
706 >        LongAdder adder = new LongAdder();
707 >        ConcurrentHashMap<Long, Long> m = longMap();
708 >        m.forEachValue(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
709                                   (Long x) -> adder.add(x.longValue()));
710          assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
711 <        adder.reset();
712 <        m.forEachInParallel((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
711 >    }
712 >
713 >    /**
714 >     * Mapped forEachInParallel traverses the given
715 >     * transformations of all mappings
716 >     */
717 >    public void testMappedForEachInParallel() {
718 >        LongAdder adder = new LongAdder();
719 >        ConcurrentHashMap<Long, Long> m = longMap();
720 >        m.forEach(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
721                              (Long x) -> adder.add(x.longValue()));
722          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
723 <        adder.reset();
724 <        m.forEachEntryInParallel((Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
723 >    }
724 >
725 >    /**
726 >     * Mapped forEachEntryInParallel traverses the given
727 >     * transformations of all entries
728 >     */
729 >    public void testMappedForEachEntryInParallel() {
730 >        LongAdder adder = new LongAdder();
731 >        ConcurrentHashMap<Long, Long> m = longMap();
732 >        m.forEachEntry(1L, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
733                                   (Long x) -> adder.add(x.longValue()));
734          assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
735      }
736  
737      /**
738 <     * reduceKeysSequentially, reduceValuesSequentially,
231 <     * reduceSequentially, reduceEntriesSequentially,
232 <     * reduceKeysInParallel, reduceValuesInParallel, reduceInParallel,
233 <     * and reduceEntriesInParallel, accumulate across all keys,
234 <     * values, entries, or mappings accordingly
738 >     * reduceKeysSequentially accumulates across all keys,
739       */
740 <    public void testReduce() {
740 >    public void testReduceKeysSequentially() {
741          ConcurrentHashMap<Long, Long> m = longMap();
742          Long r;
743 <        r = m.reduceKeysSequentially((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
743 >        r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
744          assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
745 <        r = m.reduceValuesSequentially((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
745 >    }
746 >
747 >    /**
748 >     * reduceValuesSequentially accumulates across all values
749 >     */
750 >    public void testReduceValuesSequentially() {
751 >        ConcurrentHashMap<Long, Long> m = longMap();
752 >        Long r;
753 >        r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
754 >        assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
755 >    }
756 >
757 >    /**
758 >     * reduceEntriesSequentially accumulates across all entries
759 >     */
760 >    public void testReduceEntriesSequentially() {
761 >        ConcurrentHashMap<Long, Long> m = longMap();
762 >        Map.Entry<Long,Long> r;
763 >        r = m.reduceEntries(Long.MAX_VALUE, new AddKeys());
764 >        assertEquals(r.getKey().longValue(), (long)SIZE * (SIZE - 1) / 2);
765 >    }
766 >
767 >    /**
768 >     * reduceKeysInParallel accumulates across all keys
769 >     */
770 >    public void testReduceKeysInParallel() {
771 >        ConcurrentHashMap<Long, Long> m = longMap();
772 >        Long r;
773 >        r = m.reduceKeys(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
774 >        assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
775 >    }
776 >
777 >    /**
778 >     * reduceValuesInParallel accumulates across all values
779 >     */
780 >    public void testReduceValuesInParallel() {
781 >        ConcurrentHashMap<Long, Long> m = longMap();
782 >        Long r;
783 >        r = m.reduceValues(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
784          assertEquals((long)r, (long)SIZE * (SIZE - 1));
785 <        r = m.reduceSequentially((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
785 >    }
786 >
787 >    /**
788 >     * reduceEntriesInParallel accumulate across all entries
789 >     */
790 >    public void testReduceEntriesInParallel() {
791 >        ConcurrentHashMap<Long, Long> m = longMap();
792 >        Map.Entry<Long,Long> r;
793 >        r = m.reduceEntries(1L, new AddKeys());
794 >        assertEquals(r.getKey().longValue(), (long)SIZE * (SIZE - 1) / 2);
795 >    }
796 >
797 >    /**
798 >     * Mapped reduceKeysSequentially accumulates mapped keys
799 >     */
800 >    public void testMapReduceKeysSequentially() {
801 >        ConcurrentHashMap<Long, Long> m = longMap();
802 >        Long r = m.reduceKeys(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
803 >                                     (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
804 >        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
805 >    }
806 >
807 >    /**
808 >     * Mapped reduceValuesSequentially accumulates mapped values
809 >     */
810 >    public void testMapReduceValuesSequentially() {
811 >        ConcurrentHashMap<Long, Long> m = longMap();
812 >        Long r = m.reduceValues(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
813 >                                       (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
814 >        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
815 >    }
816 >
817 >    /**
818 >     * reduceSequentially accumulates across all transformed mappings
819 >     */
820 >    public void testMappedReduceSequentially() {
821 >        ConcurrentHashMap<Long, Long> m = longMap();
822 >        Long r = m.reduce(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
823                                   (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
824 <        
246 <        assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
247 <        r = m.reduceEntriesSequentially((Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
248 <                                        (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
824 >
825          assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
826 +    }
827  
828 <        r = m.reduceKeysInParallel((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
829 <        assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
830 <        r = m.reduceValuesInParallel((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
831 <        assertEquals((long)r, (long)SIZE * (SIZE - 1));
832 <        r = m.reduceInParallel((Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
828 >    /**
829 >     * Mapped reduceKeysInParallel, accumulates mapped keys
830 >     */
831 >    public void testMapReduceKeysInParallel() {
832 >        ConcurrentHashMap<Long, Long> m = longMap();
833 >        Long r = m.reduceKeys(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
834 >                                   (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
835 >        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
836 >    }
837 >
838 >    /**
839 >     * Mapped reduceValuesInParallel accumulates mapped values
840 >     */
841 >    public void testMapReduceValuesInParallel() {
842 >        ConcurrentHashMap<Long, Long> m = longMap();
843 >        Long r = m.reduceValues(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
844 >                                     (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
845 >        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
846 >    }
847 >
848 >    /**
849 >     * reduceInParallel accumulate across all transformed mappings
850 >     */
851 >    public void testMappedReduceInParallel() {
852 >        ConcurrentHashMap<Long, Long> m = longMap();
853 >        Long r;
854 >        r = m.reduce(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
855                                 (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
856          assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
258        r = m.reduceEntriesInParallel((Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
259                                        (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
260        assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
857      }
858  
859 <    /*
860 <     * Mapped reduceKeysSequentially, reduceKeysToIntSequentially,
265 <     * reduceKeysToLongSequentially, reduceKeysToDoubleSequentially,
266 <     * reduceValuesSequentially, reduceValuesToLongSequentially,
267 <     * reduceValuesToDoubleSequentially, reduceKeysInParallel,
268 <     * reduceKeysToLongInParallel, reduceKeysToIntInParallel,
269 <     * reduceKeysToDoubleInParallel, reduceValuesInParallel,
270 <     * reduceValuesToLongInParallel, reduceValuesToIntInParallel,
271 <     * reduceValuesToDoubleInParallel accumulate mapped keys, values,
272 <     * entries, or mappings accordingly
859 >    /**
860 >     * reduceKeysToLongSequentially accumulates mapped keys
861       */
862 <    public void testMapReduce() {
862 >    public void testReduceKeysToLongSequentially() {
863          ConcurrentHashMap<Long, Long> m = longMap();
864 <        Long r; long lr; int ir; double dr;
277 <        r = m.reduceKeysSequentially((Long x) -> Long.valueOf(4 * x.longValue()),
278 <                                     (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
279 <        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
280 <        lr = m.reduceKeysToLongSequentially((Long x) -> x.longValue(), 0L, Long::sum);
864 >        long lr = m.reduceKeysToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
865          assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
866 +    }
867  
868 <        ir = m.reduceKeysToIntSequentially((Long x) -> x.intValue(), 0, Integer::sum);
869 <        assertEquals(ir, (int)SIZE * (SIZE - 1) / 2);
870 <        dr = m.reduceKeysToDoubleSequentially((Long x) -> x.doubleValue(), 0.0, Double::sum);
868 >    /**
869 >     * reduceKeysToIntSequentially accumulates mapped keys
870 >     */
871 >    public void testReduceKeysToIntSequentially() {
872 >        ConcurrentHashMap<Long, Long> m = longMap();
873 >        int ir = m.reduceKeysToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
874 >        assertEquals(ir, SIZE * (SIZE - 1) / 2);
875 >    }
876 >
877 >    /**
878 >     * reduceKeysToDoubleSequentially accumulates mapped keys
879 >     */
880 >    public void testReduceKeysToDoubleSequentially() {
881 >        ConcurrentHashMap<Long, Long> m = longMap();
882 >        double dr = m.reduceKeysToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
883          assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
884 +    }
885  
886 <        r = m.reduceValuesSequentially((Long x) -> Long.valueOf(4 * x.longValue()),
887 <                                       (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
888 <        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
889 <        lr = m.reduceValuesToLongSequentially((Long x) -> x.longValue(), 0L, Long::sum);
886 >    /**
887 >     * reduceValuesToLongSequentially accumulates mapped values
888 >     */
889 >    public void testReduceValuesToLongSequentially() {
890 >        ConcurrentHashMap<Long, Long> m = longMap();
891 >        long lr = m.reduceValuesToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
892          assertEquals(lr, (long)SIZE * (SIZE - 1));
893 <        ir = m.reduceValuesToIntSequentially((Long x) -> x.intValue(), 0, Integer::sum);
294 <        assertEquals(ir, (int)SIZE * (SIZE - 1));
893 >    }
894  
895 <        dr = m.reduceValuesToDoubleSequentially((Long x) -> x.doubleValue(), 0.0, Double::sum);
895 >    /**
896 >     * reduceValuesToIntSequentially accumulates mapped values
897 >     */
898 >    public void testReduceValuesToIntSequentially() {
899 >        ConcurrentHashMap<Long, Long> m = longMap();
900 >        int ir = m.reduceValuesToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
901 >        assertEquals(ir, SIZE * (SIZE - 1));
902 >    }
903 >
904 >    /**
905 >     * reduceValuesToDoubleSequentially accumulates mapped values
906 >     */
907 >    public void testReduceValuesToDoubleSequentially() {
908 >        ConcurrentHashMap<Long, Long> m = longMap();
909 >        double dr = m.reduceValuesToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
910          assertEquals(dr, (double)SIZE * (SIZE - 1));
911 +    }
912  
913 <        r = m.reduceKeysInParallel((Long x) -> Long.valueOf(4 * x.longValue()),
914 <                                   (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
915 <        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
916 <        lr = m.reduceKeysToLongInParallel((Long x) -> x.longValue(), 0L, Long::sum);
913 >    /**
914 >     * reduceKeysToLongInParallel accumulates mapped keys
915 >     */
916 >    public void testReduceKeysToLongInParallel() {
917 >        ConcurrentHashMap<Long, Long> m = longMap();
918 >        long lr = m.reduceKeysToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
919          assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
920 <        ir = m.reduceKeysToIntInParallel((Long x) -> x.intValue(), 0, Integer::sum);
921 <        assertEquals(ir, (int)SIZE * (SIZE - 1) / 2);
922 <        dr = m.reduceKeysToDoubleInParallel((Long x) -> x.doubleValue(), 0.0, Double::sum);
920 >    }
921 >
922 >    /**
923 >     * reduceKeysToIntInParallel accumulates mapped keys
924 >     */
925 >    public void testReduceKeysToIntInParallel() {
926 >        ConcurrentHashMap<Long, Long> m = longMap();
927 >        int ir = m.reduceKeysToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
928 >        assertEquals(ir, SIZE * (SIZE - 1) / 2);
929 >    }
930 >
931 >    /**
932 >     * reduceKeysToDoubleInParallel accumulates mapped values
933 >     */
934 >    public void testReduceKeysToDoubleInParallel() {
935 >        ConcurrentHashMap<Long, Long> m = longMap();
936 >        double dr = m.reduceKeysToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
937          assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
938 +    }
939  
940 <        r = m.reduceValuesInParallel((Long x) -> Long.valueOf(4 * x.longValue()),
941 <                                     (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
942 <        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
943 <        lr = m.reduceValuesToLongInParallel((Long x) -> x.longValue(), 0L, Long::sum);
940 >    /**
941 >     * reduceValuesToLongInParallel accumulates mapped values
942 >     */
943 >    public void testReduceValuesToLongInParallel() {
944 >        ConcurrentHashMap<Long, Long> m = longMap();
945 >        long lr = m.reduceValuesToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
946          assertEquals(lr, (long)SIZE * (SIZE - 1));
947 <        ir = m.reduceValuesToIntInParallel((Long x) -> x.intValue(), 0, Integer::sum);
948 <        assertEquals(ir, (int)SIZE * (SIZE - 1));
949 <        dr = m.reduceValuesToDoubleInParallel((Long x) -> x.doubleValue(), 0.0, Double::sum);
947 >    }
948 >
949 >    /**
950 >     * reduceValuesToIntInParallel accumulates mapped values
951 >     */
952 >    public void testReduceValuesToIntInParallel() {
953 >        ConcurrentHashMap<Long, Long> m = longMap();
954 >        int ir = m.reduceValuesToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
955 >        assertEquals(ir, SIZE * (SIZE - 1));
956 >    }
957 >
958 >    /**
959 >     * reduceValuesToDoubleInParallel accumulates mapped values
960 >     */
961 >    public void testReduceValuesToDoubleInParallel() {
962 >        ConcurrentHashMap<Long, Long> m = longMap();
963 >        double dr = m.reduceValuesToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
964          assertEquals(dr, (double)SIZE * (SIZE - 1));
965      }
966  
967      /**
968 <     * searchKeysSequentially, searchValuesSequentially,
969 <     * searchSequentially, searchEntriesSequentially,
323 <     * searchKeysInParallel, searchValuesInParallel, searchInParallel,
324 <     * searchEntriesInParallel all return a non-null result of search
325 <     * function, or null if none, across keys, values, entries, or
326 <     * mappings accordingly
968 >     * searchKeysSequentially returns a non-null result of search
969 >     * function, or null if none
970       */
971 <    public void testSearch() {
971 >    public void testSearchKeysSequentially() {
972          ConcurrentHashMap<Long, Long> m = longMap();
973          Long r;
974 <        r = m.searchKeysSequentially((Long x) -> x.longValue() == (long)(SIZE/2)? x : null);
974 >        r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
975          assertEquals((long)r, (long)(SIZE/2));
976 <        r = m.searchValuesSequentially((Long x) -> x.longValue() == (long)(SIZE/2)? x : null);
334 <        assertEquals((long)r, (long)(SIZE/2));
335 <        r = m.searchSequentially((Long x, Long y) -> x.longValue() == (long)(SIZE/2)? x : null);
336 <        assertEquals((long)r, (long)(SIZE/2));
337 <        r = m.searchEntriesSequentially((Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2)? e.getKey() : null);
338 <        assertEquals((long)r, (long)(SIZE/2));
339 <
340 <        r = m.searchKeysSequentially((Long x) -> x.longValue() < 0L? x : null);
341 <        assertNull(r);
342 <        r = m.searchValuesSequentially((Long x) -> x.longValue() < 0L? x : null);
343 <        assertNull(r);
344 <        r = m.searchSequentially((Long x, Long y) -> x.longValue() < 0L? x : null);
345 <        assertNull(r);
346 <        r = m.searchEntriesSequentially((Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L? e.getKey() : null);
976 >        r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() < 0L ? x : null);
977          assertNull(r);
978 +    }
979  
980 <        r = m.searchKeysInParallel((Long x) -> x.longValue() == (long)(SIZE/2)? x : null);
981 <        assertEquals((long)r, (long)(SIZE/2));
982 <        r = m.searchValuesInParallel((Long x) -> x.longValue() == (long)(SIZE/2)? x : null);
983 <        assertEquals((long)r, (long)(SIZE/2));
984 <        r = m.searchInParallel((Long x, Long y) -> x.longValue() == (long)(SIZE/2)? x : null);
985 <        assertEquals((long)r, (long)(SIZE/2));
986 <        r = m.searchEntriesInParallel((Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2)? e.getKey() : null);
980 >    /**
981 >     * searchValuesSequentially returns a non-null result of search
982 >     * function, or null if none
983 >     */
984 >    public void testSearchValuesSequentially() {
985 >        ConcurrentHashMap<Long, Long> m = longMap();
986 >        Long r;
987 >        r = m.searchValues(Long.MAX_VALUE, (Long x) -> x.longValue() == (long)(SIZE/2)? x : null);
988          assertEquals((long)r, (long)(SIZE/2));
989 <
358 <        r = m.searchKeysInParallel((Long x) -> x.longValue() < 0L? x : null);
989 >        r = m.searchValues(Long.MAX_VALUE, (Long x) -> x.longValue() < 0L ? x : null);
990          assertNull(r);
991 <        r = m.searchValuesInParallel((Long x) -> x.longValue() < 0L? x : null);
992 <        assertNull(r);
993 <        r = m.searchInParallel((Long x, Long y) -> x.longValue() < 0L? x : null);
994 <        assertNull(r);
995 <        r = m.searchEntriesInParallel((Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L? e.getKey() : null);
991 >    }
992 >
993 >    /**
994 >     * searchSequentially returns a non-null result of search
995 >     * function, or null if none
996 >     */
997 >    public void testSearchSequentially() {
998 >        ConcurrentHashMap<Long, Long> m = longMap();
999 >        Long r;
1000 >        r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() == (long)(SIZE/2) ? x : null);
1001 >        assertEquals((long)r, (long)(SIZE/2));
1002 >        r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() < 0L ? x : null);
1003          assertNull(r);
1004      }
1005  
1006      /**
1007 <     * Invoking task versions of bulk methods has same effect as
1008 <     * parallel methods
1007 >     * searchEntriesSequentially returns a non-null result of search
1008 >     * function, or null if none
1009       */
1010 <    public void testForkJoinTasks() {
373 <        LongAdder adder = new LongAdder();
1010 >    public void testSearchEntriesSequentially() {
1011          ConcurrentHashMap<Long, Long> m = longMap();
1012 <        ConcurrentHashMap.ForkJoinTasks.forEachKey
1013 <            (m, (Long x) -> adder.add(x.longValue())).invoke();
1014 <        assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
1015 <        adder.reset();
1016 <        ConcurrentHashMap.ForkJoinTasks.forEachValue
1017 <            (m, (Long x) -> adder.add(x.longValue())).invoke();
381 <        assertEquals(adder.sum(), SIZE * (SIZE - 1));
382 <        adder.reset();
383 <        ConcurrentHashMap.ForkJoinTasks.forEach
384 <            (m, (Long x, Long y) -> adder.add(x.longValue() + y.longValue())).invoke();
385 <        assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
386 <        adder.reset();
387 <        ConcurrentHashMap.ForkJoinTasks.forEachEntry
388 <            (m,
389 <             (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue())).invoke();
390 <        assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
391 <        adder.reset();
392 <        ConcurrentHashMap.ForkJoinTasks.forEachKey
393 <            (m, (Long x) -> Long.valueOf(4 * x.longValue()),
394 <             (Long x) -> adder.add(x.longValue())).invoke();
395 <        assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
396 <        adder.reset();
397 <        ConcurrentHashMap.ForkJoinTasks.forEachValue
398 <            (m, (Long x) -> Long.valueOf(4 * x.longValue()),
399 <             (Long x) -> adder.add(x.longValue())).invoke();
400 <        assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
401 <        adder.reset();
402 <        ConcurrentHashMap.ForkJoinTasks.forEach
403 <            (m, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
404 <             (Long x) -> adder.add(x.longValue())).invoke();
405 <        assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
406 <        adder.reset();
407 <        ConcurrentHashMap.ForkJoinTasks.forEachEntry
408 <            (m, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
409 <             (Long x) -> adder.add(x.longValue())).invoke();
410 <        assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
411 <        adder.reset();
1012 >        Long r;
1013 >        r = m.searchEntries(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2) ? e.getKey() : null);
1014 >        assertEquals((long)r, (long)(SIZE/2));
1015 >        r = m.searchEntries(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
1016 >        assertNull(r);
1017 >    }
1018  
1019 <        Long r; long lr; int ir; double dr;
1020 <        r = ConcurrentHashMap.ForkJoinTasks.reduceKeys
1021 <            (m, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue())).invoke();
1022 <        assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
1023 <        r = ConcurrentHashMap.ForkJoinTasks.reduceValues
1024 <            (m, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue())).invoke();
1025 <        assertEquals((long)r, (long)SIZE * (SIZE - 1));
1026 <        r = ConcurrentHashMap.ForkJoinTasks.reduce
421 <            (m, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
422 <             (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue())).invoke();
423 <        assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
424 <        r = ConcurrentHashMap.ForkJoinTasks.reduceEntries
425 <            (m, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
426 <             (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue())).invoke();
427 <        assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
428 <        r = ConcurrentHashMap.ForkJoinTasks.reduceKeys
429 <            (m, (Long x) -> Long.valueOf(4 * x.longValue()),
430 <             (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue())).invoke();
431 <        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
432 <        lr = ConcurrentHashMap.ForkJoinTasks.reduceKeysToLong
433 <            (m, (Long x) -> x.longValue(), 0L, Long::sum).invoke();
434 <        assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
435 <        ir = ConcurrentHashMap.ForkJoinTasks.reduceKeysToInt
436 <            (m, (Long x) -> x.intValue(), 0, Integer::sum).invoke();
437 <        assertEquals(ir, (int)SIZE * (SIZE - 1) / 2);
438 <        dr = ConcurrentHashMap.ForkJoinTasks.reduceKeysToDouble
439 <            (m, (Long x) -> x.doubleValue(), 0.0, Double::sum).invoke();
440 <        assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
441 <        r = ConcurrentHashMap.ForkJoinTasks.reduceValues
442 <            (m, (Long x) -> Long.valueOf(4 * x.longValue()),
443 <             (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue())).invoke();
444 <        assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
445 <        lr = ConcurrentHashMap.ForkJoinTasks.reduceValuesToLong
446 <            (m, (Long x) -> x.longValue(), 0L, Long::sum).invoke();
447 <        assertEquals(lr, (long)SIZE * (SIZE - 1));
448 <        ir = ConcurrentHashMap.ForkJoinTasks.reduceValuesToInt
449 <            (m, (Long x) -> x.intValue(), 0, Integer::sum).invoke();
450 <        assertEquals(ir, (int)SIZE * (SIZE - 1));
451 <        dr = ConcurrentHashMap.ForkJoinTasks.reduceValuesToDouble
452 <            (m, (Long x) -> x.doubleValue(), 0.0, Double::sum).invoke();
453 <        assertEquals(dr, (double)SIZE * (SIZE - 1));
454 <        r = ConcurrentHashMap.ForkJoinTasks.searchKeys
455 <            (m, (Long x) -> x.longValue() == (long)(SIZE/2)? x : null).invoke();
1019 >    /**
1020 >     * searchKeysInParallel returns a non-null result of search
1021 >     * function, or null if none
1022 >     */
1023 >    public void testSearchKeysInParallel() {
1024 >        ConcurrentHashMap<Long, Long> m = longMap();
1025 >        Long r;
1026 >        r = m.searchKeys(1L, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
1027          assertEquals((long)r, (long)(SIZE/2));
1028 <        r = ConcurrentHashMap.ForkJoinTasks.searchValues
1029 <            (m, (Long x) -> x.longValue() == (long)(SIZE/2)? x : null).invoke();
1028 >        r = m.searchKeys(1L, (Long x) -> x.longValue() < 0L ? x : null);
1029 >        assertNull(r);
1030 >    }
1031 >
1032 >    /**
1033 >     * searchValuesInParallel returns a non-null result of search
1034 >     * function, or null if none
1035 >     */
1036 >    public void testSearchValuesInParallel() {
1037 >        ConcurrentHashMap<Long, Long> m = longMap();
1038 >        Long r;
1039 >        r = m.searchValues(1L, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
1040          assertEquals((long)r, (long)(SIZE/2));
1041 <        r = ConcurrentHashMap.ForkJoinTasks.search
1042 <            (m, (Long x, Long y) -> x.longValue() == (long)(SIZE/2)? x : null).invoke();
1041 >        r = m.searchValues(1L, (Long x) -> x.longValue() < 0L ? x : null);
1042 >        assertNull(r);
1043 >    }
1044 >
1045 >    /**
1046 >     * searchInParallel returns a non-null result of search function,
1047 >     * or null if none
1048 >     */
1049 >    public void testSearchInParallel() {
1050 >        ConcurrentHashMap<Long, Long> m = longMap();
1051 >        Long r;
1052 >        r = m.search(1L, (Long x, Long y) -> x.longValue() == (long)(SIZE/2) ? x : null);
1053          assertEquals((long)r, (long)(SIZE/2));
1054 <        r = ConcurrentHashMap.ForkJoinTasks.searchEntries
1055 <            (m, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2)? e.getKey() : null).invoke();
1054 >        r = m.search(1L, (Long x, Long y) -> x.longValue() < 0L ? x : null);
1055 >        assertNull(r);
1056 >    }
1057 >
1058 >    /**
1059 >     * searchEntriesInParallel returns a non-null result of search
1060 >     * function, or null if none
1061 >     */
1062 >    public void testSearchEntriesInParallel() {
1063 >        ConcurrentHashMap<Long, Long> m = longMap();
1064 >        Long r;
1065 >        r = m.searchEntries(1L, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2) ? e.getKey() : null);
1066          assertEquals((long)r, (long)(SIZE/2));
1067 <    }            
1067 >        r = m.searchEntries(1L, (Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
1068 >        assertNull(r);
1069 >    }
1070 >
1071   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines