ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ConcurrentHashMap8Test.java
Revision: 1.21
Committed: Thu Jan 15 18:34:19 2015 UTC (9 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.20: +0 -1 lines
Log Message:
delete extraneous blank lines

File Contents

# User Rev Content
1 dl 1.1 /*
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     */
6    
7 jsr166 1.18 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 dl 1.2 import java.util.concurrent.atomic.LongAdder;
23 jsr166 1.18 import java.util.function.BiFunction;
24    
25     import junit.framework.Test;
26     import junit.framework.TestSuite;
27 dl 1.1
28     public class ConcurrentHashMap8Test extends JSR166TestCase {
29     public static void main(String[] args) {
30     junit.textui.TestRunner.run(suite());
31     }
32     public static Test suite() {
33     return new TestSuite(ConcurrentHashMap8Test.class);
34     }
35    
36     /**
37     * Returns a new map from Integers 1-5 to Strings "A"-"E".
38     */
39     private static ConcurrentHashMap map5() {
40     ConcurrentHashMap map = new ConcurrentHashMap(5);
41     assertTrue(map.isEmpty());
42     map.put(one, "A");
43     map.put(two, "B");
44     map.put(three, "C");
45     map.put(four, "D");
46     map.put(five, "E");
47     assertFalse(map.isEmpty());
48     assertEquals(5, map.size());
49     return map;
50     }
51    
52     /**
53 dl 1.3 * 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 dl 1.1 * computeIfAbsent adds when the given key is not present
63     */
64     public void testComputeIfAbsent() {
65     ConcurrentHashMap map = map5();
66     map.computeIfAbsent(six, (x) -> "Z");
67     assertTrue(map.containsKey(six));
68     }
69    
70     /**
71 jsr166 1.14 * computeIfAbsent does not replace if the key is already present
72 dl 1.1 */
73     public void testComputeIfAbsent2() {
74     ConcurrentHashMap map = map5();
75     assertEquals("A", map.computeIfAbsent(one, (x) -> "Z"));
76     }
77    
78     /**
79     * computeIfAbsent does not add if function returns null
80     */
81     public void testComputeIfAbsent3() {
82     ConcurrentHashMap map = map5();
83     map.computeIfAbsent(six, (x) -> null);
84     assertFalse(map.containsKey(six));
85     }
86 jsr166 1.4
87 dl 1.1 /**
88 jsr166 1.14 * computeIfPresent does not replace if the key is already present
89 dl 1.1 */
90     public void testComputeIfPresent() {
91     ConcurrentHashMap map = map5();
92     map.computeIfPresent(six, (x, y) -> "Z");
93     assertFalse(map.containsKey(six));
94     }
95    
96     /**
97     * computeIfPresent adds when the given key is not present
98     */
99     public void testComputeIfPresent2() {
100     ConcurrentHashMap map = map5();
101     assertEquals("Z", map.computeIfPresent(one, (x, y) -> "Z"));
102     }
103    
104     /**
105 jsr166 1.14 * compute does not replace if the function returns null
106 dl 1.1 */
107     public void testCompute() {
108     ConcurrentHashMap map = map5();
109     map.compute(six, (x, y) -> null);
110     assertFalse(map.containsKey(six));
111     }
112    
113     /**
114     * compute adds when the given key is not present
115     */
116     public void testCompute2() {
117     ConcurrentHashMap map = map5();
118     assertEquals("Z", map.compute(six, (x, y) -> "Z"));
119     }
120    
121     /**
122     * compute replaces when the given key is present
123     */
124     public void testCompute3() {
125     ConcurrentHashMap map = map5();
126     assertEquals("Z", map.compute(one, (x, y) -> "Z"));
127     }
128    
129     /**
130     * compute removes when the given key is present and function returns null
131     */
132     public void testCompute4() {
133     ConcurrentHashMap map = map5();
134     map.compute(one, (x, y) -> null);
135     assertFalse(map.containsKey(one));
136     }
137    
138     /**
139     * merge adds when the given key is not present
140     */
141     public void testMerge1() {
142     ConcurrentHashMap map = map5();
143     assertEquals("Y", map.merge(six, "Y", (x, y) -> "Z"));
144     }
145    
146     /**
147     * merge replaces when the given key is present
148     */
149     public void testMerge2() {
150     ConcurrentHashMap map = map5();
151     assertEquals("Z", map.merge(one, "Y", (x, y) -> "Z"));
152     }
153    
154     /**
155     * merge removes when the given key is present and function returns null
156     */
157     public void testMerge3() {
158     ConcurrentHashMap map = map5();
159     map.merge(one, "Y", (x, y) -> null);
160     assertFalse(map.containsKey(one));
161     }
162    
163 dl 1.3 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 jsr166 1.19 /**
184 dl 1.12 * replaceAll replaces all matching values.
185     */
186     public void testReplaceAll() {
187     ConcurrentHashMap<Integer, String> map = map5();
188 jsr166 1.19 map.replaceAll((x, y) -> { return x > 3 ? "Z" : y; });
189 dl 1.12 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 dl 1.3 /**
197     * Default-constructed set is empty
198     */
199     public void testNewKeySet() {
200     Set a = ConcurrentHashMap.newKeySet();
201     assertTrue(a.isEmpty());
202     }
203    
204     /**
205 dl 1.12 * 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 jsr166 1.18 assertTrue(((ConcurrentHashMap.KeySetView)set2).getMap() == map);
214     assertTrue(((ConcurrentHashMap.KeySetView)set1).getMap() == map);
215 dl 1.12 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 dl 1.3 * 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 jsr166 1.13 /**
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 jsr166 1.18 ConcurrentHashMap.KeySetView set = map.keySet(one);
306 jsr166 1.13 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 dl 1.12
315 jsr166 1.15 void checkSpliteratorCharacteristics(Spliterator<?> sp,
316     int requiredCharacteristics) {
317     assertEquals(requiredCharacteristics,
318     requiredCharacteristics & sp.characteristics());
319     }
320 jsr166 1.16
321 jsr166 1.13 /**
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 jsr166 1.15 checkSpliteratorCharacteristics(sp, CONCURRENT | DISTINCT | NONNULL);
330 jsr166 1.13 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 dl 1.12
339 dl 1.3 /**
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 jsr166 1.4
502 dl 1.3 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 jsr166 1.10 assertNotSame(x, y);
553 dl 1.3 assertEquals(x.size(), y.size());
554     assertEquals(x, y);
555     assertEquals(y, x);
556     }
557    
558 dl 1.2 static final int SIZE = 10000;
559     static ConcurrentHashMap<Long, Long> longMap;
560 jsr166 1.4
561 dl 1.2 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 dl 1.3 // 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 jsr166 1.4 (Long.valueOf(x.getKey().longValue() + y.getKey().longValue()),
575 dl 1.3 Long.valueOf(1L));
576     }
577     }
578    
579 dl 1.2 /**
580 dl 1.3 * forEachKeySequentially traverses all keys
581 dl 1.2 */
582 dl 1.3 public void testForEachKeySequentially() {
583 dl 1.2 LongAdder adder = new LongAdder();
584     ConcurrentHashMap<Long, Long> m = longMap();
585 dl 1.9 m.forEachKey(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
586 dl 1.2 assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
587 dl 1.3 }
588    
589     /**
590     * forEachValueSequentially traverses all values
591     */
592     public void testForEachValueSequentially() {
593     LongAdder adder = new LongAdder();
594     ConcurrentHashMap<Long, Long> m = longMap();
595 dl 1.9 m.forEachValue(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
596 dl 1.2 assertEquals(adder.sum(), SIZE * (SIZE - 1));
597 dl 1.3 }
598    
599     /**
600     * forEachSequentially traverses all mappings
601     */
602     public void testForEachSequentially() {
603     LongAdder adder = new LongAdder();
604     ConcurrentHashMap<Long, Long> m = longMap();
605 dl 1.9 m.forEach(Long.MAX_VALUE, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
606 dl 1.2 assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
607 dl 1.3 }
608    
609     /**
610     * forEachEntrySequentially traverses all entries
611     */
612     public void testForEachEntrySequentially() {
613     LongAdder adder = new LongAdder();
614     ConcurrentHashMap<Long, Long> m = longMap();
615 dl 1.9 m.forEachEntry(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
616 dl 1.2 assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
617 dl 1.3 }
618    
619     /**
620     * forEachKeyInParallel traverses all keys
621     */
622     public void testForEachKeyInParallel() {
623     LongAdder adder = new LongAdder();
624     ConcurrentHashMap<Long, Long> m = longMap();
625 dl 1.9 m.forEachKey(1L, (Long x) -> adder.add(x.longValue()));
626 dl 1.2 assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
627 dl 1.3 }
628    
629     /**
630     * forEachValueInParallel traverses all values
631     */
632     public void testForEachValueInParallel() {
633     LongAdder adder = new LongAdder();
634     ConcurrentHashMap<Long, Long> m = longMap();
635 dl 1.9 m.forEachValue(1L, (Long x) -> adder.add(x.longValue()));
636 dl 1.2 assertEquals(adder.sum(), SIZE * (SIZE - 1));
637 dl 1.3 }
638    
639     /**
640     * forEachInParallel traverses all mappings
641     */
642     public void testForEachInParallel() {
643     LongAdder adder = new LongAdder();
644     ConcurrentHashMap<Long, Long> m = longMap();
645 dl 1.9 m.forEach(1L, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
646 dl 1.2 assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
647 dl 1.3 }
648    
649     /**
650     * forEachEntryInParallel traverses all entries
651     */
652     public void testForEachEntryInParallel() {
653     LongAdder adder = new LongAdder();
654     ConcurrentHashMap<Long, Long> m = longMap();
655 dl 1.9 m.forEachEntry(1L, (Map.Entry<Long,Long> e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
656 dl 1.2 assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
657     }
658    
659     /**
660 dl 1.3 * Mapped forEachKeySequentially traverses the given
661     * transformations of all keys
662 dl 1.2 */
663 dl 1.3 public void testMappedForEachKeySequentially() {
664 dl 1.2 LongAdder adder = new LongAdder();
665     ConcurrentHashMap<Long, Long> m = longMap();
666 dl 1.9 m.forEachKey(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
667 dl 1.2 (Long x) -> adder.add(x.longValue()));
668     assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
669 dl 1.3 }
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 dl 1.9 m.forEachValue(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
679 dl 1.2 (Long x) -> adder.add(x.longValue()));
680     assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
681 dl 1.3 }
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 dl 1.9 m.forEach(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
691 dl 1.2 (Long x) -> adder.add(x.longValue()));
692     assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
693 dl 1.3 }
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 dl 1.9 m.forEachEntry(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
703 dl 1.2 (Long x) -> adder.add(x.longValue()));
704     assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
705 dl 1.3 }
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 dl 1.9 m.forEachKey(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
715 dl 1.2 (Long x) -> adder.add(x.longValue()));
716     assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
717 dl 1.3 }
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 dl 1.9 m.forEachValue(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
727 dl 1.2 (Long x) -> adder.add(x.longValue()));
728     assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
729 dl 1.3 }
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 dl 1.9 m.forEach(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
739 dl 1.2 (Long x) -> adder.add(x.longValue()));
740     assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
741 dl 1.3 }
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 dl 1.9 m.forEachEntry(1L, (Map.Entry<Long,Long> e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
751 dl 1.2 (Long x) -> adder.add(x.longValue()));
752     assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
753     }
754    
755 dl 1.3 /**
756     * reduceKeysSequentially accumulates across all keys,
757     */
758     public void testReduceKeysSequentially() {
759     ConcurrentHashMap<Long, Long> m = longMap();
760     Long r;
761 dl 1.9 r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
762 dl 1.3 assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
763     }
764    
765 dl 1.2 /**
766 dl 1.3 * reduceValuesSequentially accumulates across all values
767 dl 1.2 */
768 dl 1.3 public void testReduceValuesSequentially() {
769 dl 1.2 ConcurrentHashMap<Long, Long> m = longMap();
770     Long r;
771 dl 1.9 r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
772 dl 1.2 assertEquals((long)r, (long)SIZE * (SIZE - 1) / 2);
773 dl 1.3 }
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 dl 1.9 r = m.reduceEntries(Long.MAX_VALUE, new AddKeys());
782 dl 1.3 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 dl 1.9 r = m.reduceKeys(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
792 dl 1.3 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 dl 1.9 r = m.reduceValues(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
802 dl 1.2 assertEquals((long)r, (long)SIZE * (SIZE - 1));
803 dl 1.3 }
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 dl 1.9 r = m.reduceEntries(1L, new AddKeys());
812 dl 1.3 assertEquals(r.getKey().longValue(), (long)SIZE * (SIZE - 1) / 2);
813     }
814    
815 jsr166 1.7 /**
816 dl 1.3 * Mapped reduceKeysSequentially accumulates mapped keys
817     */
818     public void testMapReduceKeysSequentially() {
819     ConcurrentHashMap<Long, Long> m = longMap();
820 dl 1.9 Long r = m.reduceKeys(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
821 dl 1.3 (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
822     assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
823     }
824    
825 jsr166 1.7 /**
826 dl 1.3 * Mapped reduceValuesSequentially accumulates mapped values
827     */
828     public void testMapReduceValuesSequentially() {
829     ConcurrentHashMap<Long, Long> m = longMap();
830 dl 1.9 Long r = m.reduceValues(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
831 dl 1.3 (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 dl 1.9 Long r = m.reduce(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
841 dl 1.2 (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
842 jsr166 1.4
843 dl 1.2 assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
844 dl 1.3 }
845    
846 jsr166 1.7 /**
847 dl 1.3 * Mapped reduceKeysInParallel, accumulates mapped keys
848     */
849     public void testMapReduceKeysInParallel() {
850     ConcurrentHashMap<Long, Long> m = longMap();
851 dl 1.9 Long r = m.reduceKeys(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
852 dl 1.3 (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
853     assertEquals((long)r, (long)4 * SIZE * (SIZE - 1) / 2);
854     }
855    
856 jsr166 1.7 /**
857 dl 1.3 * Mapped reduceValuesInParallel accumulates mapped values
858     */
859     public void testMapReduceValuesInParallel() {
860     ConcurrentHashMap<Long, Long> m = longMap();
861 dl 1.9 Long r = m.reduceValues(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
862 dl 1.3 (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
863     assertEquals((long)r, (long)4 * SIZE * (SIZE - 1));
864     }
865 dl 1.2
866 dl 1.3 /**
867     * reduceInParallel accumulate across all transformed mappings
868     */
869     public void testMappedReduceInParallel() {
870     ConcurrentHashMap<Long, Long> m = longMap();
871     Long r;
872 dl 1.9 r = m.reduce(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
873 dl 1.2 (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
874     assertEquals((long)r, (long)3 * SIZE * (SIZE - 1) / 2);
875     }
876    
877 jsr166 1.7 /**
878 dl 1.3 * reduceKeysToLongSequentially accumulates mapped keys
879 dl 1.2 */
880 dl 1.3 public void testReduceKeysToLongSequentially() {
881 dl 1.2 ConcurrentHashMap<Long, Long> m = longMap();
882 dl 1.9 long lr = m.reduceKeysToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
883 dl 1.2 assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
884 dl 1.3 }
885 dl 1.2
886 jsr166 1.7 /**
887 dl 1.3 * reduceKeysToIntSequentially accumulates mapped keys
888     */
889     public void testReduceKeysToIntSequentially() {
890     ConcurrentHashMap<Long, Long> m = longMap();
891 dl 1.9 int ir = m.reduceKeysToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
892 jsr166 1.5 assertEquals(ir, SIZE * (SIZE - 1) / 2);
893 dl 1.3 }
894    
895 jsr166 1.7 /**
896 dl 1.3 * reduceKeysToDoubleSequentially accumulates mapped keys
897     */
898     public void testReduceKeysToDoubleSequentially() {
899     ConcurrentHashMap<Long, Long> m = longMap();
900 dl 1.9 double dr = m.reduceKeysToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
901 dl 1.2 assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
902 dl 1.3 }
903 dl 1.2
904 jsr166 1.7 /**
905 dl 1.3 * reduceValuesToLongSequentially accumulates mapped values
906     */
907     public void testReduceValuesToLongSequentially() {
908     ConcurrentHashMap<Long, Long> m = longMap();
909 dl 1.9 long lr = m.reduceValuesToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
910 dl 1.2 assertEquals(lr, (long)SIZE * (SIZE - 1));
911 dl 1.3 }
912    
913 jsr166 1.7 /**
914 dl 1.3 * reduceValuesToIntSequentially accumulates mapped values
915     */
916     public void testReduceValuesToIntSequentially() {
917     ConcurrentHashMap<Long, Long> m = longMap();
918 dl 1.9 int ir = m.reduceValuesToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
919 jsr166 1.5 assertEquals(ir, SIZE * (SIZE - 1));
920 dl 1.3 }
921 dl 1.2
922 jsr166 1.7 /**
923 dl 1.3 * reduceValuesToDoubleSequentially accumulates mapped values
924     */
925     public void testReduceValuesToDoubleSequentially() {
926     ConcurrentHashMap<Long, Long> m = longMap();
927 dl 1.9 double dr = m.reduceValuesToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
928 dl 1.2 assertEquals(dr, (double)SIZE * (SIZE - 1));
929 dl 1.3 }
930 dl 1.2
931 jsr166 1.7 /**
932 dl 1.3 * reduceKeysToLongInParallel accumulates mapped keys
933     */
934     public void testReduceKeysToLongInParallel() {
935     ConcurrentHashMap<Long, Long> m = longMap();
936 dl 1.9 long lr = m.reduceKeysToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
937 dl 1.2 assertEquals(lr, (long)SIZE * (SIZE - 1) / 2);
938 dl 1.3 }
939    
940 jsr166 1.7 /**
941 dl 1.3 * reduceKeysToIntInParallel accumulates mapped keys
942     */
943     public void testReduceKeysToIntInParallel() {
944     ConcurrentHashMap<Long, Long> m = longMap();
945 dl 1.9 int ir = m.reduceKeysToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
946 jsr166 1.5 assertEquals(ir, SIZE * (SIZE - 1) / 2);
947 dl 1.3 }
948    
949 jsr166 1.7 /**
950 dl 1.3 * reduceKeysToDoubleInParallel accumulates mapped values
951     */
952     public void testReduceKeysToDoubleInParallel() {
953     ConcurrentHashMap<Long, Long> m = longMap();
954 dl 1.9 double dr = m.reduceKeysToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
955 dl 1.2 assertEquals(dr, (double)SIZE * (SIZE - 1) / 2);
956 dl 1.3 }
957 dl 1.2
958 jsr166 1.7 /**
959 dl 1.3 * reduceValuesToLongInParallel accumulates mapped values
960     */
961     public void testReduceValuesToLongInParallel() {
962     ConcurrentHashMap<Long, Long> m = longMap();
963 dl 1.9 long lr = m.reduceValuesToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
964 dl 1.2 assertEquals(lr, (long)SIZE * (SIZE - 1));
965 dl 1.3 }
966    
967 jsr166 1.7 /**
968 dl 1.3 * reduceValuesToIntInParallel accumulates mapped values
969     */
970     public void testReduceValuesToIntInParallel() {
971     ConcurrentHashMap<Long, Long> m = longMap();
972 dl 1.9 int ir = m.reduceValuesToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
973 jsr166 1.5 assertEquals(ir, SIZE * (SIZE - 1));
974 dl 1.3 }
975    
976 jsr166 1.7 /**
977 dl 1.3 * reduceValuesToDoubleInParallel accumulates mapped values
978     */
979     public void testReduceValuesToDoubleInParallel() {
980     ConcurrentHashMap<Long, Long> m = longMap();
981 dl 1.9 double dr = m.reduceValuesToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
982 dl 1.2 assertEquals(dr, (double)SIZE * (SIZE - 1));
983     }
984    
985     /**
986 dl 1.3 * searchKeysSequentially returns a non-null result of search
987     * function, or null if none
988 dl 1.2 */
989 dl 1.3 public void testSearchKeysSequentially() {
990 dl 1.2 ConcurrentHashMap<Long, Long> m = longMap();
991     Long r;
992 dl 1.9 r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
993 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
994 dl 1.9 r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() < 0L ? x : null);
995 dl 1.3 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 jsr166 1.20 r = m.searchValues(Long.MAX_VALUE,
1006     (Long x) -> (x.longValue() == (long)(SIZE/2)) ? x : null);
1007 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1008 jsr166 1.20 r = m.searchValues(Long.MAX_VALUE,
1009     (Long x) -> (x.longValue() < 0L) ? x : null);
1010 dl 1.3 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 dl 1.9 r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() == (long)(SIZE/2) ? x : null);
1021 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1022 dl 1.9 r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() < 0L ? x : null);
1023 dl 1.3 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 dl 1.9 r = m.searchEntries(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2) ? e.getKey() : null);
1034 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1035 dl 1.9 r = m.searchEntries(Long.MAX_VALUE, (Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
1036 dl 1.2 assertNull(r);
1037 dl 1.3 }
1038 dl 1.2
1039 dl 1.3 /**
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 dl 1.9 r = m.searchKeys(1L, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
1047 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1048 dl 1.9 r = m.searchKeys(1L, (Long x) -> x.longValue() < 0L ? x : null);
1049 dl 1.3 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 dl 1.9 r = m.searchValues(1L, (Long x) -> x.longValue() == (long)(SIZE/2) ? x : null);
1060 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1061 dl 1.9 r = m.searchValues(1L, (Long x) -> x.longValue() < 0L ? x : null);
1062 dl 1.3 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 dl 1.9 r = m.search(1L, (Long x, Long y) -> x.longValue() == (long)(SIZE/2) ? x : null);
1073 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1074 dl 1.9 r = m.search(1L, (Long x, Long y) -> x.longValue() < 0L ? x : null);
1075 dl 1.3 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 dl 1.9 r = m.searchEntries(1L, (Map.Entry<Long,Long> e) -> e.getKey().longValue() == (long)(SIZE/2) ? e.getKey() : null);
1086 dl 1.2 assertEquals((long)r, (long)(SIZE/2));
1087 dl 1.9 r = m.searchEntries(1L, (Map.Entry<Long,Long> e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
1088 dl 1.2 assertNull(r);
1089     }
1090    
1091 dl 1.1 }