ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/Atomic8Test.java
Revision: 1.11
Committed: Tue Jan 26 13:33:05 2021 UTC (3 years, 3 months ago) by dl
Branch: MAIN
CVS Tags: HEAD
Changes since 1.10: +159 -154 lines
Log Message:
Replace Integer with Item class

File Contents

# User Rev Content
1 dl 1.1 /*
2     * Written by Doug Lea and Martin Buchholz with assistance from
3     * members of JCP JSR-166 Expert Group and released to the public
4     * domain, as explained at
5     * http://creativecommons.org/publicdomain/zero/1.0/
6     */
7    
8 jsr166 1.3 import java.util.concurrent.atomic.AtomicInteger;
9     import java.util.concurrent.atomic.AtomicIntegerArray;
10     import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
11     import java.util.concurrent.atomic.AtomicLong;
12     import java.util.concurrent.atomic.AtomicLongArray;
13     import java.util.concurrent.atomic.AtomicLongFieldUpdater;
14     import java.util.concurrent.atomic.AtomicReference;
15     import java.util.concurrent.atomic.AtomicReferenceArray;
16     import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
17    
18     import junit.framework.Test;
19     import junit.framework.TestSuite;
20 dl 1.1
21 jsr166 1.7 /**
22     * Tests of atomic class methods accepting lambdas introduced in JDK8.
23     */
24 dl 1.1 public class Atomic8Test extends JSR166TestCase {
25    
26     public static void main(String[] args) {
27 jsr166 1.5 main(suite(), args);
28 dl 1.1 }
29     public static Test suite() {
30     return new TestSuite(Atomic8Test.class);
31     }
32    
33     static long addLong17(long x) { return x + 17; }
34     static int addInt17(int x) { return x + 17; }
35 dl 1.11 static Item addItem17(Item x) {
36     return new Item(x.intValue() + 17);
37 dl 1.1 }
38 dl 1.11 static Item sumItem(Item x, Item y) {
39     return new Item(x.intValue() + y.intValue());
40 dl 1.1 }
41    
42     volatile long aLongField;
43     volatile int anIntField;
44 dl 1.11 volatile Item anItemField;
45 dl 1.1
46 jsr166 1.8 AtomicLongFieldUpdater<Atomic8Test> aLongFieldUpdater() {
47 jsr166 1.2 return AtomicLongFieldUpdater.newUpdater
48     (Atomic8Test.class, "aLongField");
49     }
50    
51 jsr166 1.8 AtomicIntegerFieldUpdater<Atomic8Test> anIntFieldUpdater() {
52 jsr166 1.2 return AtomicIntegerFieldUpdater.newUpdater
53     (Atomic8Test.class, "anIntField");
54     }
55    
56 dl 1.11 AtomicReferenceFieldUpdater<Atomic8Test,Item> anItemFieldUpdater() {
57 jsr166 1.2 return AtomicReferenceFieldUpdater.newUpdater
58 dl 1.11 (Atomic8Test.class, Item.class, "anItemField");
59 jsr166 1.2 }
60    
61 dl 1.1 /**
62     * AtomicLong getAndUpdate returns previous value and updates
63     * result of supplied function
64     */
65     public void testLongGetAndUpdate() {
66     AtomicLong a = new AtomicLong(1L);
67 dl 1.11 mustEqual(1L, a.getAndUpdate(Atomic8Test::addLong17));
68     mustEqual(18L, a.getAndUpdate(Atomic8Test::addLong17));
69     mustEqual(35L, a.get());
70 dl 1.1 }
71    
72     /**
73     * AtomicLong updateAndGet updates with supplied function and
74     * returns result.
75     */
76     public void testLongUpdateAndGet() {
77     AtomicLong a = new AtomicLong(1L);
78 dl 1.11 mustEqual(18L, a.updateAndGet(Atomic8Test::addLong17));
79     mustEqual(35L, a.updateAndGet(Atomic8Test::addLong17));
80 dl 1.1 }
81    
82     /**
83     * AtomicLong getAndAccumulate returns previous value and updates
84     * with supplied function.
85     */
86     public void testLongGetAndAccumulate() {
87     AtomicLong a = new AtomicLong(1L);
88 dl 1.11 mustEqual(1L, a.getAndAccumulate(2L, Long::sum));
89     mustEqual(3L, a.getAndAccumulate(3L, Long::sum));
90     mustEqual(6L, a.get());
91 dl 1.1 }
92    
93     /**
94     * AtomicLong accumulateAndGet updates with supplied function and
95     * returns result.
96     */
97     public void testLongAccumulateAndGet() {
98     AtomicLong a = new AtomicLong(1L);
99 dl 1.11 mustEqual(7L, a.accumulateAndGet(6L, Long::sum));
100     mustEqual(10L, a.accumulateAndGet(3L, Long::sum));
101     mustEqual(10L, a.get());
102 dl 1.1 }
103    
104     /**
105     * AtomicInteger getAndUpdate returns previous value and updates
106     * result of supplied function
107     */
108     public void testIntGetAndUpdate() {
109     AtomicInteger a = new AtomicInteger(1);
110 dl 1.11 mustEqual(1, a.getAndUpdate(Atomic8Test::addInt17));
111     mustEqual(18, a.getAndUpdate(Atomic8Test::addInt17));
112     mustEqual(35, a.get());
113 dl 1.1 }
114    
115     /**
116     * AtomicInteger updateAndGet updates with supplied function and
117     * returns result.
118     */
119     public void testIntUpdateAndGet() {
120     AtomicInteger a = new AtomicInteger(1);
121 dl 1.11 mustEqual(18, a.updateAndGet(Atomic8Test::addInt17));
122     mustEqual(35, a.updateAndGet(Atomic8Test::addInt17));
123     mustEqual(35, a.get());
124 dl 1.1 }
125    
126     /**
127     * AtomicInteger getAndAccumulate returns previous value and updates
128     * with supplied function.
129     */
130     public void testIntGetAndAccumulate() {
131     AtomicInteger a = new AtomicInteger(1);
132 dl 1.11 mustEqual(1, a.getAndAccumulate(2, Integer::sum));
133     mustEqual(3, a.getAndAccumulate(3, Integer::sum));
134     mustEqual(6, a.get());
135 dl 1.1 }
136    
137     /**
138     * AtomicInteger accumulateAndGet updates with supplied function and
139     * returns result.
140     */
141     public void testIntAccumulateAndGet() {
142     AtomicInteger a = new AtomicInteger(1);
143 dl 1.11 mustEqual(7, a.accumulateAndGet(6, Integer::sum));
144     mustEqual(10, a.accumulateAndGet(3, Integer::sum));
145     mustEqual(10, a.get());
146 dl 1.1 }
147    
148     /**
149     * AtomicReference getAndUpdate returns previous value and updates
150     * result of supplied function
151     */
152     public void testReferenceGetAndUpdate() {
153 dl 1.11 AtomicReference<Item> a = new AtomicReference<>(one);
154     mustEqual(1, a.getAndUpdate(Atomic8Test::addItem17));
155     mustEqual(18, a.getAndUpdate(Atomic8Test::addItem17));
156     mustEqual(35, a.get());
157 dl 1.1 }
158    
159     /**
160     * AtomicReference updateAndGet updates with supplied function and
161     * returns result.
162     */
163     public void testReferenceUpdateAndGet() {
164 dl 1.11 AtomicReference<Item> a = new AtomicReference<>(one);
165     mustEqual(18, a.updateAndGet(Atomic8Test::addItem17));
166     mustEqual(35, a.updateAndGet(Atomic8Test::addItem17));
167     mustEqual(35, a.get());
168 dl 1.1 }
169    
170     /**
171     * AtomicReference getAndAccumulate returns previous value and updates
172     * with supplied function.
173     */
174     public void testReferenceGetAndAccumulate() {
175 dl 1.11 AtomicReference<Item> a = new AtomicReference<>(one);
176     mustEqual( 1, a.getAndAccumulate(two, Atomic8Test::sumItem));
177     mustEqual( 3, a.getAndAccumulate(three, Atomic8Test::sumItem));
178     mustEqual( 6, a.get());
179 dl 1.1 }
180    
181     /**
182     * AtomicReference accumulateAndGet updates with supplied function and
183     * returns result.
184     */
185     public void testReferenceAccumulateAndGet() {
186 dl 1.11 AtomicReference<Item> a = new AtomicReference<>(one);
187     mustEqual( 7, a.accumulateAndGet(six, Atomic8Test::sumItem));
188     mustEqual( 10, a.accumulateAndGet(three, Atomic8Test::sumItem));
189     mustEqual( 10, a.get());
190 dl 1.1 }
191    
192     /**
193     * AtomicLongArray getAndUpdate returns previous value and updates
194     * result of supplied function
195     */
196     public void testLongArrayGetAndUpdate() {
197     AtomicLongArray a = new AtomicLongArray(1);
198     a.set(0, 1);
199 dl 1.11 mustEqual(1L, a.getAndUpdate(0, Atomic8Test::addLong17));
200     mustEqual(18L, a.getAndUpdate(0, Atomic8Test::addLong17));
201     mustEqual(35L, a.get(0));
202 dl 1.1 }
203    
204     /**
205     * AtomicLongArray updateAndGet updates with supplied function and
206     * returns result.
207     */
208     public void testLongArrayUpdateAndGet() {
209     AtomicLongArray a = new AtomicLongArray(1);
210     a.set(0, 1);
211 dl 1.11 mustEqual(18L, a.updateAndGet(0, Atomic8Test::addLong17));
212     mustEqual(35L, a.updateAndGet(0, Atomic8Test::addLong17));
213     mustEqual(35L, a.get(0));
214 dl 1.1 }
215    
216     /**
217     * AtomicLongArray getAndAccumulate returns previous value and updates
218     * with supplied function.
219     */
220     public void testLongArrayGetAndAccumulate() {
221     AtomicLongArray a = new AtomicLongArray(1);
222     a.set(0, 1);
223 dl 1.11 mustEqual(1L, a.getAndAccumulate(0, 2L, Long::sum));
224     mustEqual(3L, a.getAndAccumulate(0, 3L, Long::sum));
225     mustEqual(6L, a.get(0));
226 dl 1.1 }
227    
228     /**
229     * AtomicLongArray accumulateAndGet updates with supplied function and
230     * returns result.
231     */
232     public void testLongArrayAccumulateAndGet() {
233     AtomicLongArray a = new AtomicLongArray(1);
234     a.set(0, 1);
235 dl 1.11 mustEqual(7L, a.accumulateAndGet(0, 6L, Long::sum));
236     mustEqual(10L, a.accumulateAndGet(0, 3L, Long::sum));
237     mustEqual(10L, a.get(0));
238 dl 1.1 }
239    
240     /**
241     * AtomicIntegerArray getAndUpdate returns previous value and updates
242     * result of supplied function
243     */
244     public void testIntArrayGetAndUpdate() {
245     AtomicIntegerArray a = new AtomicIntegerArray(1);
246     a.set(0, 1);
247 dl 1.11 mustEqual(1, a.getAndUpdate(0, Atomic8Test::addInt17));
248     mustEqual(18, a.getAndUpdate(0, Atomic8Test::addInt17));
249     mustEqual(35, a.get(0));
250 dl 1.1 }
251    
252     /**
253     * AtomicIntegerArray updateAndGet updates with supplied function and
254     * returns result.
255     */
256     public void testIntArrayUpdateAndGet() {
257     AtomicIntegerArray a = new AtomicIntegerArray(1);
258     a.set(0, 1);
259 dl 1.11 mustEqual(18, a.updateAndGet(0, Atomic8Test::addInt17));
260     mustEqual(35, a.updateAndGet(0, Atomic8Test::addInt17));
261     mustEqual(35, a.get(0));
262 dl 1.1 }
263    
264     /**
265     * AtomicIntegerArray getAndAccumulate returns previous value and updates
266     * with supplied function.
267     */
268     public void testIntArrayGetAndAccumulate() {
269     AtomicIntegerArray a = new AtomicIntegerArray(1);
270     a.set(0, 1);
271 dl 1.11 mustEqual(1, a.getAndAccumulate(0, 2, Integer::sum));
272     mustEqual(3, a.getAndAccumulate(0, 3, Integer::sum));
273     mustEqual(6, a.get(0));
274 dl 1.1 }
275    
276     /**
277     * AtomicIntegerArray accumulateAndGet updates with supplied function and
278     * returns result.
279     */
280     public void testIntArrayAccumulateAndGet() {
281     AtomicIntegerArray a = new AtomicIntegerArray(1);
282     a.set(0, 1);
283 dl 1.11 mustEqual(7, a.accumulateAndGet(0, 6, Integer::sum));
284     mustEqual(10, a.accumulateAndGet(0, 3, Integer::sum));
285 dl 1.1 }
286    
287     /**
288     * AtomicReferenceArray getAndUpdate returns previous value and updates
289     * result of supplied function
290     */
291     public void testReferenceArrayGetAndUpdate() {
292 dl 1.11 AtomicReferenceArray<Item> a = new AtomicReferenceArray<>(1);
293 dl 1.1 a.set(0, one);
294 dl 1.11 mustEqual( 1, a.getAndUpdate(0, Atomic8Test::addItem17));
295     mustEqual( 18, a.getAndUpdate(0, Atomic8Test::addItem17));
296     mustEqual( 35, a.get(0));
297 dl 1.1 }
298    
299     /**
300     * AtomicReferenceArray updateAndGet updates with supplied function and
301     * returns result.
302     */
303     public void testReferenceArrayUpdateAndGet() {
304 dl 1.11 AtomicReferenceArray<Item> a = new AtomicReferenceArray<>(1);
305 dl 1.1 a.set(0, one);
306 dl 1.11 mustEqual( 18, a.updateAndGet(0, Atomic8Test::addItem17));
307     mustEqual( 35, a.updateAndGet(0, Atomic8Test::addItem17));
308 dl 1.1 }
309    
310     /**
311     * AtomicReferenceArray getAndAccumulate returns previous value and updates
312     * with supplied function.
313     */
314     public void testReferenceArrayGetAndAccumulate() {
315 dl 1.11 AtomicReferenceArray<Item> a = new AtomicReferenceArray<>(1);
316 dl 1.1 a.set(0, one);
317 dl 1.11 mustEqual( 1, a.getAndAccumulate(0, two, Atomic8Test::sumItem));
318     mustEqual( 3, a.getAndAccumulate(0, three, Atomic8Test::sumItem));
319     mustEqual( 6, a.get(0));
320 dl 1.1 }
321    
322     /**
323     * AtomicReferenceArray accumulateAndGet updates with supplied function and
324     * returns result.
325     */
326     public void testReferenceArrayAccumulateAndGet() {
327 dl 1.11 AtomicReferenceArray<Item> a = new AtomicReferenceArray<>(1);
328 dl 1.1 a.set(0, one);
329 dl 1.11 mustEqual( 7, a.accumulateAndGet(0, six, Atomic8Test::sumItem));
330     mustEqual( 10, a.accumulateAndGet(0, three, Atomic8Test::sumItem));
331 dl 1.1 }
332    
333     /**
334     * AtomicLongFieldUpdater getAndUpdate returns previous value and updates
335     * result of supplied function
336     */
337     public void testLongFieldUpdaterGetAndUpdate() {
338 dl 1.11 AtomicLongFieldUpdater<Atomic8Test> a = aLongFieldUpdater();
339     a.set(this, 1L);
340     mustEqual(1L, a.getAndUpdate(this, Atomic8Test::addLong17));
341     mustEqual(18L, a.getAndUpdate(this, Atomic8Test::addLong17));
342     mustEqual(35L, a.get(this));
343     mustEqual(35L, aLongField);
344 dl 1.1 }
345    
346     /**
347     * AtomicLongFieldUpdater updateAndGet updates with supplied function and
348     * returns result.
349     */
350     public void testLongFieldUpdaterUpdateAndGet() {
351 dl 1.11 AtomicLongFieldUpdater<Atomic8Test> a = aLongFieldUpdater();
352     a.set(this, 1L);
353     mustEqual(18L, a.updateAndGet(this, Atomic8Test::addLong17));
354     mustEqual(35L, a.updateAndGet(this, Atomic8Test::addLong17));
355     mustEqual(35L, a.get(this));
356     mustEqual(35L, aLongField);
357 dl 1.1 }
358    
359     /**
360     * AtomicLongFieldUpdater getAndAccumulate returns previous value
361     * and updates with supplied function.
362     */
363     public void testLongFieldUpdaterGetAndAccumulate() {
364 dl 1.11 AtomicLongFieldUpdater<Atomic8Test> a = aLongFieldUpdater();
365     a.set(this, 1L);
366     mustEqual(1L, a.getAndAccumulate(this, 2L, Long::sum));
367     mustEqual(3L, a.getAndAccumulate(this, 3L, Long::sum));
368     mustEqual(6L, a.get(this));
369     mustEqual(6L, aLongField);
370 dl 1.1 }
371    
372     /**
373     * AtomicLongFieldUpdater accumulateAndGet updates with supplied
374     * function and returns result.
375     */
376     public void testLongFieldUpdaterAccumulateAndGet() {
377 dl 1.11 AtomicLongFieldUpdater<Atomic8Test> a = aLongFieldUpdater();
378     a.set(this, 1L);
379     mustEqual(7L, a.accumulateAndGet(this, 6L, Long::sum));
380     mustEqual(10L, a.accumulateAndGet(this, 3L, Long::sum));
381     mustEqual(10L, a.get(this));
382     mustEqual(10L, aLongField);
383 dl 1.1 }
384    
385     /**
386     * AtomicIntegerFieldUpdater getAndUpdate returns previous value and updates
387     * result of supplied function
388     */
389     public void testIntegerFieldUpdaterGetAndUpdate() {
390 dl 1.11 AtomicIntegerFieldUpdater<Atomic8Test> a = anIntFieldUpdater();
391 dl 1.1 a.set(this, 1);
392 dl 1.11 mustEqual(1, a.getAndUpdate(this, Atomic8Test::addInt17));
393     mustEqual(18, a.getAndUpdate(this, Atomic8Test::addInt17));
394     mustEqual(35, a.get(this));
395     mustEqual(35, anIntField);
396 dl 1.1 }
397    
398     /**
399     * AtomicIntegerFieldUpdater updateAndGet updates with supplied function and
400     * returns result.
401     */
402     public void testIntegerFieldUpdaterUpdateAndGet() {
403 dl 1.11 AtomicIntegerFieldUpdater<Atomic8Test> a = anIntFieldUpdater();
404 dl 1.1 a.set(this, 1);
405 dl 1.11 mustEqual(18, a.updateAndGet(this, Atomic8Test::addInt17));
406     mustEqual(35, a.updateAndGet(this, Atomic8Test::addInt17));
407     mustEqual(35, a.get(this));
408     mustEqual(35, anIntField);
409 dl 1.1 }
410    
411     /**
412     * AtomicIntegerFieldUpdater getAndAccumulate returns previous value
413     * and updates with supplied function.
414     */
415     public void testIntegerFieldUpdaterGetAndAccumulate() {
416 dl 1.11 AtomicIntegerFieldUpdater<Atomic8Test> a = anIntFieldUpdater();
417 dl 1.1 a.set(this, 1);
418 dl 1.11 mustEqual(1, a.getAndAccumulate(this, 2, Integer::sum));
419     mustEqual(3, a.getAndAccumulate(this, 3, Integer::sum));
420     mustEqual(6, a.get(this));
421     mustEqual(6, anIntField);
422 dl 1.1 }
423    
424     /**
425     * AtomicIntegerFieldUpdater accumulateAndGet updates with supplied
426     * function and returns result.
427     */
428     public void testIntegerFieldUpdaterAccumulateAndGet() {
429 dl 1.11 AtomicIntegerFieldUpdater<Atomic8Test> a = anIntFieldUpdater();
430 dl 1.1 a.set(this, 1);
431 dl 1.11 mustEqual(7, a.accumulateAndGet(this, 6, Integer::sum));
432     mustEqual(10, a.accumulateAndGet(this, 3, Integer::sum));
433     mustEqual(10, a.get(this));
434     mustEqual(10, anIntField);
435 dl 1.1 }
436    
437     /**
438     * AtomicReferenceFieldUpdater getAndUpdate returns previous value
439     * and updates result of supplied function
440     */
441     public void testReferenceFieldUpdaterGetAndUpdate() {
442 dl 1.11 AtomicReferenceFieldUpdater<Atomic8Test,Item> a = anItemFieldUpdater();
443 dl 1.1 a.set(this, one);
444 dl 1.11 mustEqual( 1, a.getAndUpdate(this, Atomic8Test::addItem17));
445     mustEqual( 18, a.getAndUpdate(this, Atomic8Test::addItem17));
446     mustEqual( 35, a.get(this));
447     mustEqual( 35, anItemField);
448 dl 1.1 }
449    
450     /**
451     * AtomicReferenceFieldUpdater updateAndGet updates with supplied
452     * function and returns result.
453     */
454     public void testReferenceFieldUpdaterUpdateAndGet() {
455 dl 1.11 AtomicReferenceFieldUpdater<Atomic8Test,Item> a = anItemFieldUpdater();
456 dl 1.1 a.set(this, one);
457 dl 1.11 mustEqual( 18, a.updateAndGet(this, Atomic8Test::addItem17));
458     mustEqual( 35, a.updateAndGet(this, Atomic8Test::addItem17));
459     mustEqual( 35, a.get(this));
460     mustEqual( 35, anItemField);
461 dl 1.1 }
462    
463     /**
464     * AtomicReferenceFieldUpdater returns previous value and updates
465     * with supplied function.
466     */
467     public void testReferenceFieldUpdaterGetAndAccumulate() {
468 dl 1.11 AtomicReferenceFieldUpdater<Atomic8Test,Item> a = anItemFieldUpdater();
469 dl 1.1 a.set(this, one);
470 dl 1.11 mustEqual( 1, a.getAndAccumulate(this, two, Atomic8Test::sumItem));
471     mustEqual( 3, a.getAndAccumulate(this, three, Atomic8Test::sumItem));
472     mustEqual( 6, a.get(this));
473     mustEqual( 6, anItemField);
474 dl 1.1 }
475    
476     /**
477     * AtomicReferenceFieldUpdater accumulateAndGet updates with
478     * supplied function and returns result.
479     */
480     public void testReferenceFieldUpdaterAccumulateAndGet() {
481 dl 1.11 AtomicReferenceFieldUpdater<Atomic8Test,Item> a = anItemFieldUpdater();
482 dl 1.1 a.set(this, one);
483 dl 1.11 mustEqual( 7, a.accumulateAndGet(this, six, Atomic8Test::sumItem));
484     mustEqual( 10, a.accumulateAndGet(this, three, Atomic8Test::sumItem));
485     mustEqual( 10, a.get(this));
486     mustEqual( 10, anItemField);
487 dl 1.1 }
488    
489     /**
490 jsr166 1.2 * All Atomic getAndUpdate methods throw NullPointerException on
491     * null function argument
492 dl 1.1 */
493 dl 1.11 @SuppressWarnings("unchecked")
494 dl 1.1 public void testGetAndUpdateNPE() {
495 jsr166 1.10 assertThrows(
496     NullPointerException.class,
497 jsr166 1.2 () -> new AtomicLong().getAndUpdate(null),
498     () -> new AtomicInteger().getAndUpdate(null),
499     () -> new AtomicReference().getAndUpdate(null),
500     () -> new AtomicLongArray(1).getAndUpdate(0, null),
501     () -> new AtomicIntegerArray(1).getAndUpdate(0, null),
502     () -> new AtomicReferenceArray(1).getAndUpdate(0, null),
503     () -> aLongFieldUpdater().getAndUpdate(this, null),
504     () -> anIntFieldUpdater().getAndUpdate(this, null),
505 dl 1.11 () -> anItemFieldUpdater().getAndUpdate(this, null));
506 dl 1.1 }
507    
508     /**
509 jsr166 1.2 * All Atomic updateAndGet methods throw NullPointerException on null function argument
510     */
511 dl 1.11 @SuppressWarnings("unchecked")
512 jsr166 1.2 public void testUpdateAndGetNPE() {
513 jsr166 1.10 assertThrows(
514     NullPointerException.class,
515 jsr166 1.2 () -> new AtomicLong().updateAndGet(null),
516     () -> new AtomicInteger().updateAndGet(null),
517     () -> new AtomicReference().updateAndGet(null),
518     () -> new AtomicLongArray(1).updateAndGet(0, null),
519     () -> new AtomicIntegerArray(1).updateAndGet(0, null),
520     () -> new AtomicReferenceArray(1).updateAndGet(0, null),
521     () -> aLongFieldUpdater().updateAndGet(this, null),
522     () -> anIntFieldUpdater().updateAndGet(this, null),
523 dl 1.11 () -> anItemFieldUpdater().updateAndGet(this, null));
524 jsr166 1.2 }
525    
526     /**
527     * All Atomic getAndAccumulate methods throw NullPointerException
528     * on null function argument
529 dl 1.1 */
530 dl 1.11 @SuppressWarnings("unchecked")
531 dl 1.1 public void testGetAndAccumulateNPE() {
532 jsr166 1.10 assertThrows(
533     NullPointerException.class,
534 jsr166 1.2 () -> new AtomicLong().getAndAccumulate(1L, null),
535     () -> new AtomicInteger().getAndAccumulate(1, null),
536     () -> new AtomicReference().getAndAccumulate(one, null),
537     () -> new AtomicLongArray(1).getAndAccumulate(0, 1L, null),
538     () -> new AtomicIntegerArray(1).getAndAccumulate(0, 1, null),
539     () -> new AtomicReferenceArray(1).getAndAccumulate(0, one, null),
540     () -> aLongFieldUpdater().getAndAccumulate(this, 1L, null),
541     () -> anIntFieldUpdater().getAndAccumulate(this, 1, null),
542 dl 1.11 () -> anItemFieldUpdater().getAndAccumulate(this, one, null));
543 dl 1.1 }
544    
545     /**
546 jsr166 1.2 * All Atomic accumulateAndGet methods throw NullPointerException
547     * on null function argument
548 dl 1.1 */
549 dl 1.11 @SuppressWarnings("unchecked")
550 dl 1.1 public void testAccumulateAndGetNPE() {
551 jsr166 1.10 assertThrows(
552     NullPointerException.class,
553 jsr166 1.2 () -> new AtomicLong().accumulateAndGet(1L, null),
554     () -> new AtomicInteger().accumulateAndGet(1, null),
555     () -> new AtomicReference().accumulateAndGet(one, null),
556     () -> new AtomicLongArray(1).accumulateAndGet(0, 1L, null),
557     () -> new AtomicIntegerArray(1).accumulateAndGet(0, 1, null),
558     () -> new AtomicReferenceArray(1).accumulateAndGet(0, one, null),
559     () -> aLongFieldUpdater().accumulateAndGet(this, 1L, null),
560     () -> anIntFieldUpdater().accumulateAndGet(this, 1, null),
561 dl 1.11 () -> anItemFieldUpdater().accumulateAndGet(this, one, null));
562 dl 1.1 }
563    
564 jsr166 1.8 /**
565     * Object arguments for parameters of type T that are not
566     * instances of the class passed to the newUpdater call will
567     * result in a ClassCastException being thrown.
568     */
569 dl 1.11 @SuppressWarnings("unchecked")
570 jsr166 1.8 public void testFieldUpdaters_ClassCastException() {
571     // Use raw types to allow passing wrong object type, provoking CCE
572     final AtomicLongFieldUpdater longUpdater = aLongFieldUpdater();
573     final AtomicIntegerFieldUpdater intUpdater = anIntFieldUpdater();
574 dl 1.11 final AtomicReferenceFieldUpdater refUpdater = anItemFieldUpdater();
575 jsr166 1.8 for (Object x : new Object[]{ new Object(), null }) {
576 jsr166 1.10 assertThrows(
577     ClassCastException.class,
578 jsr166 1.8 () -> longUpdater.get(x),
579     () -> intUpdater.get(x),
580     () -> refUpdater.get(x),
581    
582     () -> longUpdater.set(x, 17L),
583     () -> intUpdater.set(x, 17),
584 dl 1.11 () -> refUpdater.set(x, new Item(17)),
585 jsr166 1.8
586     () -> longUpdater.addAndGet(x, 17L),
587     () -> intUpdater.addAndGet(x, 17),
588    
589     () -> longUpdater.getAndUpdate(x, y -> y),
590     () -> intUpdater.getAndUpdate(x, y -> y),
591     () -> refUpdater.getAndUpdate(x, y -> y),
592    
593     () -> longUpdater.compareAndSet(x, 17L, 42L),
594     () -> intUpdater.compareAndSet(x, 17, 42),
595 dl 1.11 () -> refUpdater.compareAndSet(x, 17, fortytwo));
596 jsr166 1.8 }
597     }
598    
599 dl 1.1 }