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.1 by dl, Thu Mar 21 19:06:54 2013 UTC vs.
Revision 1.21 by jsr166, Thu Jan 15 18:34:19 2015 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines