ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.32
Committed: Mon May 26 17:25:36 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +2 -0 lines
Log Message:
add NPE javadoc and test for obtrudeException(null)

File Contents

# User Rev Content
1 jsr166 1.1 /*
2 jsr166 1.4 * 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 jsr166 1.1 * http://creativecommons.org/publicdomain/zero/1.0/
6     */
7    
8     import junit.framework.*;
9     import java.util.concurrent.Callable;
10 dl 1.5 import java.util.concurrent.Executor;
11     import java.util.concurrent.ExecutorService;
12     import java.util.concurrent.Executors;
13 jsr166 1.1 import java.util.concurrent.CancellationException;
14     import java.util.concurrent.CountDownLatch;
15     import java.util.concurrent.ExecutionException;
16     import java.util.concurrent.Future;
17     import java.util.concurrent.CompletableFuture;
18 dl 1.5 import java.util.concurrent.CompletionException;
19 jsr166 1.1 import java.util.concurrent.TimeoutException;
20     import java.util.concurrent.atomic.AtomicInteger;
21     import static java.util.concurrent.TimeUnit.MILLISECONDS;
22     import static java.util.concurrent.TimeUnit.SECONDS;
23     import java.util.*;
24 dl 1.5 import java.util.function.Supplier;
25     import java.util.function.Consumer;
26     import java.util.function.BiConsumer;
27     import java.util.function.Function;
28     import java.util.function.BiFunction;
29 jsr166 1.1
30     public class CompletableFutureTest extends JSR166TestCase {
31    
32     public static void main(String[] args) {
33     junit.textui.TestRunner.run(suite());
34     }
35     public static Test suite() {
36     return new TestSuite(CompletableFutureTest.class);
37     }
38    
39 dl 1.5 static class CFException extends RuntimeException {}
40    
41 jsr166 1.4 void checkIncomplete(CompletableFuture<?> f) {
42     assertFalse(f.isDone());
43     assertFalse(f.isCancelled());
44     assertTrue(f.toString().contains("[Not completed]"));
45     try {
46     assertNull(f.getNow(null));
47     } catch (Throwable fail) { threadUnexpectedException(fail); }
48     try {
49     f.get(0L, SECONDS);
50     shouldThrow();
51     }
52     catch (TimeoutException success) {}
53     catch (Throwable fail) { threadUnexpectedException(fail); }
54     }
55    
56 jsr166 1.11 <T> void checkCompletedNormally(CompletableFuture<T> f, T value) {
57 jsr166 1.4 try {
58 jsr166 1.20 assertEquals(value, f.get(LONG_DELAY_MS, MILLISECONDS));
59     } catch (Throwable fail) { threadUnexpectedException(fail); }
60     try {
61 dl 1.5 assertEquals(value, f.join());
62 jsr166 1.4 } catch (Throwable fail) { threadUnexpectedException(fail); }
63     try {
64 dl 1.5 assertEquals(value, f.getNow(null));
65 jsr166 1.4 } catch (Throwable fail) { threadUnexpectedException(fail); }
66     try {
67 dl 1.5 assertEquals(value, f.get());
68 jsr166 1.4 } catch (Throwable fail) { threadUnexpectedException(fail); }
69 dl 1.5 assertTrue(f.isDone());
70     assertFalse(f.isCancelled());
71 dl 1.26 assertFalse(f.isCompletedExceptionally());
72 dl 1.5 assertTrue(f.toString().contains("[Completed normally]"));
73     }
74    
75     void checkCompletedWithWrappedCFException(CompletableFuture<?> f) {
76     try {
77 jsr166 1.20 f.get(LONG_DELAY_MS, MILLISECONDS);
78     shouldThrow();
79     } catch (ExecutionException success) {
80     assertTrue(success.getCause() instanceof CFException);
81     } catch (Throwable fail) { threadUnexpectedException(fail); }
82     try {
83 dl 1.5 f.join();
84     shouldThrow();
85 jsr166 1.8 } catch (CompletionException success) {
86     assertTrue(success.getCause() instanceof CFException);
87 dl 1.5 }
88     try {
89     f.getNow(null);
90     shouldThrow();
91 jsr166 1.8 } catch (CompletionException success) {
92     assertTrue(success.getCause() instanceof CFException);
93 dl 1.5 }
94     try {
95     f.get();
96     shouldThrow();
97 jsr166 1.8 } catch (ExecutionException success) {
98     assertTrue(success.getCause() instanceof CFException);
99     } catch (Throwable fail) { threadUnexpectedException(fail); }
100 dl 1.5 assertTrue(f.isDone());
101     assertFalse(f.isCancelled());
102 jsr166 1.14 assertTrue(f.toString().contains("[Completed exceptionally]"));
103 dl 1.5 }
104    
105     void checkCancelled(CompletableFuture<?> f) {
106     try {
107 jsr166 1.20 f.get(LONG_DELAY_MS, MILLISECONDS);
108     shouldThrow();
109     } catch (CancellationException success) {
110     } catch (Throwable fail) { threadUnexpectedException(fail); }
111     try {
112 dl 1.5 f.join();
113     shouldThrow();
114 jsr166 1.8 } catch (CancellationException success) {}
115 dl 1.5 try {
116     f.getNow(null);
117     shouldThrow();
118 jsr166 1.8 } catch (CancellationException success) {}
119 dl 1.5 try {
120     f.get();
121     shouldThrow();
122 jsr166 1.8 } catch (CancellationException success) {
123     } catch (Throwable fail) { threadUnexpectedException(fail); }
124 dl 1.5 assertTrue(f.isDone());
125 dl 1.26 assertTrue(f.isCompletedExceptionally());
126 dl 1.5 assertTrue(f.isCancelled());
127 jsr166 1.14 assertTrue(f.toString().contains("[Completed exceptionally]"));
128 dl 1.5 }
129    
130     void checkCompletedWithWrappedCancellationException(CompletableFuture<?> f) {
131     try {
132 jsr166 1.20 f.get(LONG_DELAY_MS, MILLISECONDS);
133     shouldThrow();
134     } catch (ExecutionException success) {
135     assertTrue(success.getCause() instanceof CancellationException);
136     } catch (Throwable fail) { threadUnexpectedException(fail); }
137     try {
138 dl 1.5 f.join();
139     shouldThrow();
140 jsr166 1.8 } catch (CompletionException success) {
141     assertTrue(success.getCause() instanceof CancellationException);
142 dl 1.5 }
143     try {
144     f.getNow(null);
145     shouldThrow();
146 jsr166 1.8 } catch (CompletionException success) {
147     assertTrue(success.getCause() instanceof CancellationException);
148 dl 1.5 }
149     try {
150     f.get();
151     shouldThrow();
152 jsr166 1.8 } catch (ExecutionException success) {
153     assertTrue(success.getCause() instanceof CancellationException);
154     } catch (Throwable fail) { threadUnexpectedException(fail); }
155 dl 1.5 assertTrue(f.isDone());
156     assertFalse(f.isCancelled());
157 dl 1.26 assertTrue(f.isCompletedExceptionally());
158 jsr166 1.14 assertTrue(f.toString().contains("[Completed exceptionally]"));
159 dl 1.5 }
160    
161     /**
162     * A newly constructed CompletableFuture is incomplete, as indicated
163     * by methods isDone, isCancelled, and getNow
164     */
165     public void testConstructor() {
166 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
167 dl 1.5 checkIncomplete(f);
168     }
169    
170     /**
171     * complete completes normally, as indicated by methods isDone,
172     * isCancelled, join, get, and getNow
173     */
174     public void testComplete() {
175 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
176 dl 1.5 checkIncomplete(f);
177     f.complete(one);
178     checkCompletedNormally(f, one);
179     }
180    
181     /**
182     * completeExceptionally completes exceptionally, as indicated by
183     * methods isDone, isCancelled, join, get, and getNow
184     */
185     public void testCompleteExceptionally() {
186 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
187 dl 1.5 checkIncomplete(f);
188     f.completeExceptionally(new CFException());
189     checkCompletedWithWrappedCFException(f);
190     }
191    
192     /**
193     * cancel completes exceptionally and reports cancelled, as indicated by
194     * methods isDone, isCancelled, join, get, and getNow
195     */
196     public void testCancel() {
197 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
198 dl 1.5 checkIncomplete(f);
199     assertTrue(f.cancel(true));
200     checkCancelled(f);
201     }
202    
203     /**
204     * obtrudeValue forces completion with given value
205     */
206     public void testObtrudeValue() {
207 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
208 dl 1.5 checkIncomplete(f);
209     f.complete(one);
210     checkCompletedNormally(f, one);
211     f.obtrudeValue(three);
212     checkCompletedNormally(f, three);
213     f.obtrudeValue(two);
214     checkCompletedNormally(f, two);
215 jsr166 1.22 f = new CompletableFuture<>();
216 dl 1.5 f.obtrudeValue(three);
217     checkCompletedNormally(f, three);
218 jsr166 1.22 f = new CompletableFuture<>();
219 dl 1.5 f.completeExceptionally(new CFException());
220     f.obtrudeValue(four);
221     checkCompletedNormally(f, four);
222 jsr166 1.4 }
223    
224 dl 1.5 /**
225     * obtrudeException forces completion with given exception
226     */
227     public void testObtrudeException() {
228 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
229 dl 1.5 checkIncomplete(f);
230     f.complete(one);
231     checkCompletedNormally(f, one);
232     f.obtrudeException(new CFException());
233     checkCompletedWithWrappedCFException(f);
234 jsr166 1.22 f = new CompletableFuture<>();
235 dl 1.5 f.obtrudeException(new CFException());
236     checkCompletedWithWrappedCFException(f);
237 jsr166 1.22 f = new CompletableFuture<>();
238 dl 1.5 f.completeExceptionally(new CFException());
239     f.obtrudeValue(four);
240     checkCompletedNormally(f, four);
241     f.obtrudeException(new CFException());
242     checkCompletedWithWrappedCFException(f);
243     }
244 jsr166 1.6
245 dl 1.5 /**
246     * getNumberOfDependents returns number of dependent tasks
247     */
248     public void testGetNumberOfDependents() {
249 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
250 dl 1.5 assertEquals(f.getNumberOfDependents(), 0);
251     CompletableFuture g = f.thenRun(new Noop());
252     assertEquals(f.getNumberOfDependents(), 1);
253     assertEquals(g.getNumberOfDependents(), 0);
254     CompletableFuture h = f.thenRun(new Noop());
255     assertEquals(f.getNumberOfDependents(), 2);
256     f.complete(1);
257     checkCompletedNormally(g, null);
258     assertEquals(f.getNumberOfDependents(), 0);
259     assertEquals(g.getNumberOfDependents(), 0);
260 jsr166 1.3 }
261    
262 dl 1.5 /**
263     * toString indicates current completion state
264     */
265 jsr166 1.1 public void testToString() {
266     CompletableFuture<String> f;
267 jsr166 1.2
268 jsr166 1.1 f = new CompletableFuture<String>();
269 jsr166 1.2 assertTrue(f.toString().contains("[Not completed]"));
270    
271 jsr166 1.1 f.complete("foo");
272     assertTrue(f.toString().contains("[Completed normally]"));
273 jsr166 1.2
274 jsr166 1.1 f = new CompletableFuture<String>();
275     f.completeExceptionally(new IndexOutOfBoundsException());
276     assertTrue(f.toString().contains("[Completed exceptionally]"));
277     }
278 jsr166 1.4
279 dl 1.9 /**
280 jsr166 1.10 * completedFuture returns a completed CompletableFuture with given value
281 dl 1.9 */
282     public void testCompletedFuture() {
283     CompletableFuture<String> f = CompletableFuture.completedFuture("test");
284     checkCompletedNormally(f, "test");
285     }
286    
287 jsr166 1.18 // Choose non-commutative actions for better coverage
288    
289 jsr166 1.6 static final Supplier<Integer> supplyOne =
290 dl 1.5 () -> Integer.valueOf(1);
291 jsr166 1.6 static final Function<Integer, Integer> inc =
292 dl 1.5 (Integer x) -> Integer.valueOf(x.intValue() + 1);
293 jsr166 1.18 static final BiFunction<Integer, Integer, Integer> subtract =
294     (Integer x, Integer y) -> Integer.valueOf(x.intValue() - y.intValue());
295 dl 1.5 static final class IncAction implements Consumer<Integer> {
296     int value;
297     public void accept(Integer x) { value = x.intValue() + 1; }
298     }
299 jsr166 1.22 static final class SubtractAction implements BiConsumer<Integer, Integer> {
300 dl 1.5 int value;
301 jsr166 1.6 public void accept(Integer x, Integer y) {
302 jsr166 1.22 value = x.intValue() - y.intValue();
303 dl 1.5 }
304     }
305     static final class Noop implements Runnable {
306     boolean ran;
307     public void run() { ran = true; }
308     }
309    
310     static final class FailingSupplier implements Supplier<Integer> {
311     boolean ran;
312     public Integer get() { ran = true; throw new CFException(); }
313     }
314     static final class FailingConsumer implements Consumer<Integer> {
315     boolean ran;
316     public void accept(Integer x) { ran = true; throw new CFException(); }
317     }
318     static final class FailingBiConsumer implements BiConsumer<Integer, Integer> {
319     boolean ran;
320     public void accept(Integer x, Integer y) { ran = true; throw new CFException(); }
321     }
322     static final class FailingFunction implements Function<Integer, Integer> {
323     boolean ran;
324     public Integer apply(Integer x) { ran = true; throw new CFException(); }
325     }
326     static final class FailingBiFunction implements BiFunction<Integer, Integer, Integer> {
327     boolean ran;
328     public Integer apply(Integer x, Integer y) { ran = true; throw new CFException(); }
329     }
330     static final class FailingNoop implements Runnable {
331     boolean ran;
332     public void run() { ran = true; throw new CFException(); }
333     }
334    
335 jsr166 1.18 static final class CompletableFutureInc
336     implements Function<Integer, CompletableFuture<Integer>> {
337 jsr166 1.20 boolean ran;
338 dl 1.5 public CompletableFuture<Integer> apply(Integer x) {
339 jsr166 1.20 ran = true;
340 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
341 dl 1.5 f.complete(Integer.valueOf(x.intValue() + 1));
342     return f;
343     }
344     }
345    
346 jsr166 1.18 static final class FailingCompletableFutureFunction
347     implements Function<Integer, CompletableFuture<Integer>> {
348 dl 1.5 boolean ran;
349     public CompletableFuture<Integer> apply(Integer x) {
350     ran = true; throw new CFException();
351     }
352     }
353 jsr166 1.6
354 dl 1.5 // Used for explicit executor tests
355     static final class ThreadExecutor implements Executor {
356 jsr166 1.17 AtomicInteger count = new AtomicInteger(0);
357    
358 dl 1.5 public void execute(Runnable r) {
359 jsr166 1.17 count.getAndIncrement();
360 dl 1.5 new Thread(r).start();
361     }
362     }
363    
364     static final class ExceptionToInteger implements Function<Throwable, Integer> {
365     public Integer apply(Throwable x) { return Integer.valueOf(3); }
366     }
367    
368     static final class IntegerHandler implements BiFunction<Integer, Throwable, Integer> {
369 jsr166 1.15 boolean ran;
370 jsr166 1.6 public Integer apply(Integer x, Throwable t) {
371 jsr166 1.15 ran = true;
372 dl 1.5 return (t == null) ? two : three;
373     }
374     }
375    
376     /**
377     * exceptionally action completes with function value on source
378 jsr166 1.30 * exception; otherwise with source value
379 dl 1.5 */
380     public void testExceptionally() {
381 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
382 dl 1.5 ExceptionToInteger r = new ExceptionToInteger();
383     CompletableFuture<Integer> g = f.exceptionally(r);
384     f.completeExceptionally(new CFException());
385     checkCompletedNormally(g, three);
386    
387 jsr166 1.22 f = new CompletableFuture<>();
388 dl 1.5 r = new ExceptionToInteger();
389     g = f.exceptionally(r);
390     f.complete(one);
391     checkCompletedNormally(g, one);
392     }
393    
394     /**
395     * handle action completes normally with function value on either
396     * normal or exceptional completion of source
397     */
398     public void testHandle() {
399 jsr166 1.15 CompletableFuture<Integer> f, g;
400     IntegerHandler r;
401    
402 jsr166 1.22 f = new CompletableFuture<>();
403 dl 1.5 f.completeExceptionally(new CFException());
404 jsr166 1.15 g = f.handle(r = new IntegerHandler());
405     assertTrue(r.ran);
406 dl 1.5 checkCompletedNormally(g, three);
407    
408 jsr166 1.22 f = new CompletableFuture<>();
409 jsr166 1.15 g = f.handle(r = new IntegerHandler());
410     assertFalse(r.ran);
411     f.completeExceptionally(new CFException());
412     checkCompletedNormally(g, three);
413     assertTrue(r.ran);
414    
415 jsr166 1.22 f = new CompletableFuture<>();
416 dl 1.5 f.complete(one);
417 jsr166 1.15 g = f.handle(r = new IntegerHandler());
418     assertTrue(r.ran);
419     checkCompletedNormally(g, two);
420    
421 jsr166 1.22 f = new CompletableFuture<>();
422 jsr166 1.15 g = f.handle(r = new IntegerHandler());
423     assertFalse(r.ran);
424     f.complete(one);
425     assertTrue(r.ran);
426 dl 1.5 checkCompletedNormally(g, two);
427     }
428    
429     /**
430     * runAsync completes after running Runnable
431     */
432     public void testRunAsync() {
433     Noop r = new Noop();
434     CompletableFuture<Void> f = CompletableFuture.runAsync(r);
435     assertNull(f.join());
436     assertTrue(r.ran);
437 jsr166 1.14 checkCompletedNormally(f, null);
438 dl 1.5 }
439    
440     /**
441     * runAsync with executor completes after running Runnable
442     */
443     public void testRunAsync2() {
444     Noop r = new Noop();
445 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
446     CompletableFuture<Void> f = CompletableFuture.runAsync(r, exec);
447 dl 1.5 assertNull(f.join());
448     assertTrue(r.ran);
449 jsr166 1.14 checkCompletedNormally(f, null);
450 jsr166 1.17 assertEquals(1, exec.count.get());
451 dl 1.5 }
452    
453     /**
454     * failing runAsync completes exceptionally after running Runnable
455     */
456     public void testRunAsync3() {
457     FailingNoop r = new FailingNoop();
458     CompletableFuture<Void> f = CompletableFuture.runAsync(r);
459     checkCompletedWithWrappedCFException(f);
460     assertTrue(r.ran);
461     }
462    
463     /**
464     * supplyAsync completes with result of supplier
465     */
466     public void testSupplyAsync() {
467 jsr166 1.17 CompletableFuture<Integer> f;
468     f = CompletableFuture.supplyAsync(supplyOne);
469 dl 1.5 assertEquals(f.join(), one);
470 jsr166 1.17 checkCompletedNormally(f, one);
471 dl 1.5 }
472    
473     /**
474     * supplyAsync with executor completes with result of supplier
475     */
476     public void testSupplyAsync2() {
477 jsr166 1.17 CompletableFuture<Integer> f;
478     f = CompletableFuture.supplyAsync(supplyOne, new ThreadExecutor());
479 dl 1.5 assertEquals(f.join(), one);
480 jsr166 1.17 checkCompletedNormally(f, one);
481 dl 1.5 }
482    
483     /**
484     * Failing supplyAsync completes exceptionally
485     */
486     public void testSupplyAsync3() {
487     FailingSupplier r = new FailingSupplier();
488     CompletableFuture<Integer> f = CompletableFuture.supplyAsync(r);
489     checkCompletedWithWrappedCFException(f);
490     assertTrue(r.ran);
491     }
492    
493 jsr166 1.7 // seq completion methods
494 jsr166 1.6
495 dl 1.5 /**
496     * thenRun result completes normally after normal completion of source
497     */
498     public void testThenRun() {
499 jsr166 1.23 CompletableFuture<Integer> f;
500     CompletableFuture<Void> g;
501     Noop r;
502    
503     f = new CompletableFuture<>();
504     g = f.thenRun(r = new Noop());
505 dl 1.5 f.complete(null);
506     checkCompletedNormally(g, null);
507 jsr166 1.23 assertTrue(r.ran);
508    
509 jsr166 1.22 f = new CompletableFuture<>();
510 dl 1.5 f.complete(null);
511 jsr166 1.23 g = f.thenRun(r = new Noop());
512 dl 1.5 checkCompletedNormally(g, null);
513 jsr166 1.23 assertTrue(r.ran);
514 dl 1.5 }
515    
516     /**
517     * thenRun result completes exceptionally after exceptional
518     * completion of source
519     */
520     public void testThenRun2() {
521 jsr166 1.23 CompletableFuture<Integer> f;
522     CompletableFuture<Void> g;
523     Noop r;
524    
525     f = new CompletableFuture<>();
526     g = f.thenRun(r = new Noop());
527     f.completeExceptionally(new CFException());
528     checkCompletedWithWrappedCFException(g);
529     assertFalse(r.ran);
530    
531     f = new CompletableFuture<>();
532 dl 1.5 f.completeExceptionally(new CFException());
533 jsr166 1.23 g = f.thenRun(r = new Noop());
534 dl 1.5 checkCompletedWithWrappedCFException(g);
535 jsr166 1.23 assertFalse(r.ran);
536 dl 1.5 }
537    
538     /**
539     * thenRun result completes exceptionally if action does
540     */
541     public void testThenRun3() {
542 jsr166 1.23 CompletableFuture<Integer> f;
543     CompletableFuture<Void> g;
544     FailingNoop r;
545    
546     f = new CompletableFuture<>();
547     g = f.thenRun(r = new FailingNoop());
548     f.complete(null);
549     checkCompletedWithWrappedCFException(g);
550    
551     f = new CompletableFuture<>();
552 dl 1.5 f.complete(null);
553 jsr166 1.23 g = f.thenRun(r = new FailingNoop());
554 dl 1.5 checkCompletedWithWrappedCFException(g);
555     }
556    
557     /**
558     * thenRun result completes exceptionally if source cancelled
559     */
560     public void testThenRun4() {
561 jsr166 1.23 CompletableFuture<Integer> f;
562     CompletableFuture<Void> g;
563     Noop r;
564    
565     f = new CompletableFuture<>();
566     g = f.thenRun(r = new Noop());
567     assertTrue(f.cancel(true));
568     checkCompletedWithWrappedCancellationException(g);
569    
570     f = new CompletableFuture<>();
571 dl 1.5 assertTrue(f.cancel(true));
572 jsr166 1.23 g = f.thenRun(r = new Noop());
573 dl 1.5 checkCompletedWithWrappedCancellationException(g);
574     }
575    
576     /**
577     * thenApply result completes normally after normal completion of source
578     */
579     public void testThenApply() {
580 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
581 dl 1.5 CompletableFuture<Integer> g = f.thenApply(inc);
582     f.complete(one);
583     checkCompletedNormally(g, two);
584     }
585    
586     /**
587     * thenApply result completes exceptionally after exceptional
588     * completion of source
589     */
590     public void testThenApply2() {
591 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
592 dl 1.5 CompletableFuture<Integer> g = f.thenApply(inc);
593     f.completeExceptionally(new CFException());
594     checkCompletedWithWrappedCFException(g);
595     }
596    
597     /**
598     * thenApply result completes exceptionally if action does
599     */
600     public void testThenApply3() {
601 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
602 dl 1.5 CompletableFuture<Integer> g = f.thenApply(new FailingFunction());
603     f.complete(one);
604     checkCompletedWithWrappedCFException(g);
605     }
606    
607     /**
608     * thenApply result completes exceptionally if source cancelled
609     */
610     public void testThenApply4() {
611 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
612 dl 1.5 CompletableFuture<Integer> g = f.thenApply(inc);
613     assertTrue(f.cancel(true));
614     checkCompletedWithWrappedCancellationException(g);
615     }
616    
617     /**
618     * thenAccept result completes normally after normal completion of source
619     */
620     public void testThenAccept() {
621 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
622 dl 1.5 IncAction r = new IncAction();
623     CompletableFuture<Void> g = f.thenAccept(r);
624     f.complete(one);
625     checkCompletedNormally(g, null);
626     assertEquals(r.value, 2);
627     }
628    
629     /**
630     * thenAccept result completes exceptionally after exceptional
631     * completion of source
632     */
633     public void testThenAccept2() {
634 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
635 dl 1.5 IncAction r = new IncAction();
636     CompletableFuture<Void> g = f.thenAccept(r);
637     f.completeExceptionally(new CFException());
638     checkCompletedWithWrappedCFException(g);
639     }
640    
641     /**
642     * thenAccept result completes exceptionally if action does
643     */
644     public void testThenAccept3() {
645 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
646 dl 1.5 FailingConsumer r = new FailingConsumer();
647     CompletableFuture<Void> g = f.thenAccept(r);
648     f.complete(one);
649     checkCompletedWithWrappedCFException(g);
650     assertTrue(r.ran);
651     }
652    
653     /**
654     * thenAccept result completes exceptionally if source cancelled
655     */
656     public void testThenAccept4() {
657 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
658 dl 1.5 IncAction r = new IncAction();
659     CompletableFuture<Void> g = f.thenAccept(r);
660     assertTrue(f.cancel(true));
661     checkCompletedWithWrappedCancellationException(g);
662     }
663    
664     /**
665 jsr166 1.18 * thenCombine result completes normally after normal completion
666     * of sources
667 dl 1.5 */
668     public void testThenCombine() {
669 jsr166 1.18 CompletableFuture<Integer> f, g, h;
670 dl 1.5
671 jsr166 1.22 f = new CompletableFuture<>();
672     g = new CompletableFuture<>();
673 jsr166 1.18 h = f.thenCombine(g, subtract);
674     f.complete(3);
675     checkIncomplete(h);
676     g.complete(1);
677     checkCompletedNormally(h, 2);
678    
679 jsr166 1.22 f = new CompletableFuture<>();
680     g = new CompletableFuture<>();
681 jsr166 1.18 h = f.thenCombine(g, subtract);
682     g.complete(1);
683     checkIncomplete(h);
684     f.complete(3);
685     checkCompletedNormally(h, 2);
686    
687 jsr166 1.22 f = new CompletableFuture<>();
688     g = new CompletableFuture<>();
689 jsr166 1.18 g.complete(1);
690     f.complete(3);
691     h = f.thenCombine(g, subtract);
692     checkCompletedNormally(h, 2);
693 dl 1.5 }
694    
695     /**
696     * thenCombine result completes exceptionally after exceptional
697     * completion of either source
698     */
699     public void testThenCombine2() {
700 jsr166 1.18 CompletableFuture<Integer> f, g, h;
701    
702 jsr166 1.22 f = new CompletableFuture<>();
703     g = new CompletableFuture<>();
704 jsr166 1.18 h = f.thenCombine(g, subtract);
705 dl 1.5 f.completeExceptionally(new CFException());
706 jsr166 1.18 checkIncomplete(h);
707     g.complete(1);
708     checkCompletedWithWrappedCFException(h);
709    
710 jsr166 1.22 f = new CompletableFuture<>();
711     g = new CompletableFuture<>();
712 jsr166 1.18 h = f.thenCombine(g, subtract);
713     g.completeExceptionally(new CFException());
714     checkIncomplete(h);
715     f.complete(3);
716     checkCompletedWithWrappedCFException(h);
717    
718 jsr166 1.22 f = new CompletableFuture<>();
719     g = new CompletableFuture<>();
720 jsr166 1.18 f.complete(3);
721     g.completeExceptionally(new CFException());
722     h = f.thenCombine(g, subtract);
723     checkCompletedWithWrappedCFException(h);
724 dl 1.5
725 jsr166 1.22 f = new CompletableFuture<>();
726     g = new CompletableFuture<>();
727 jsr166 1.18 f.completeExceptionally(new CFException());
728     g.complete(3);
729     h = f.thenCombine(g, subtract);
730     checkCompletedWithWrappedCFException(h);
731 dl 1.5 }
732    
733     /**
734     * thenCombine result completes exceptionally if action does
735     */
736     public void testThenCombine3() {
737 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
738     CompletableFuture<Integer> f2 = new CompletableFuture<>();
739 dl 1.5 FailingBiFunction r = new FailingBiFunction();
740     CompletableFuture<Integer> g = f.thenCombine(f2, r);
741     f.complete(one);
742     checkIncomplete(g);
743 jsr166 1.18 assertFalse(r.ran);
744 dl 1.5 f2.complete(two);
745     checkCompletedWithWrappedCFException(g);
746 jsr166 1.18 assertTrue(r.ran);
747 dl 1.5 }
748    
749     /**
750     * thenCombine result completes exceptionally if either source cancelled
751     */
752     public void testThenCombine4() {
753 jsr166 1.18 CompletableFuture<Integer> f, g, h;
754    
755 jsr166 1.22 f = new CompletableFuture<>();
756     g = new CompletableFuture<>();
757 jsr166 1.18 h = f.thenCombine(g, subtract);
758 dl 1.5 assertTrue(f.cancel(true));
759 jsr166 1.18 checkIncomplete(h);
760     g.complete(1);
761     checkCompletedWithWrappedCancellationException(h);
762    
763 jsr166 1.22 f = new CompletableFuture<>();
764     g = new CompletableFuture<>();
765 jsr166 1.18 h = f.thenCombine(g, subtract);
766     assertTrue(g.cancel(true));
767     checkIncomplete(h);
768     f.complete(3);
769     checkCompletedWithWrappedCancellationException(h);
770    
771 jsr166 1.22 f = new CompletableFuture<>();
772     g = new CompletableFuture<>();
773 jsr166 1.18 assertTrue(f.cancel(true));
774     assertTrue(g.cancel(true));
775     h = f.thenCombine(g, subtract);
776     checkCompletedWithWrappedCancellationException(h);
777 dl 1.5 }
778    
779     /**
780     * thenAcceptBoth result completes normally after normal
781     * completion of sources
782     */
783     public void testThenAcceptBoth() {
784 jsr166 1.22 CompletableFuture<Integer> f, g;
785     CompletableFuture<Void> h;
786     SubtractAction r;
787    
788     f = new CompletableFuture<>();
789     g = new CompletableFuture<>();
790     h = f.thenAcceptBoth(g, r = new SubtractAction());
791     f.complete(3);
792     checkIncomplete(h);
793     g.complete(1);
794     checkCompletedNormally(h, null);
795     assertEquals(r.value, 2);
796    
797     f = new CompletableFuture<>();
798     g = new CompletableFuture<>();
799     h = f.thenAcceptBoth(g, r = new SubtractAction());
800     g.complete(1);
801     checkIncomplete(h);
802     f.complete(3);
803     checkCompletedNormally(h, null);
804     assertEquals(r.value, 2);
805 dl 1.5
806 jsr166 1.22 f = new CompletableFuture<>();
807     g = new CompletableFuture<>();
808     g.complete(1);
809     f.complete(3);
810     h = f.thenAcceptBoth(g, r = new SubtractAction());
811     checkCompletedNormally(h, null);
812     assertEquals(r.value, 2);
813 dl 1.5 }
814    
815     /**
816     * thenAcceptBoth result completes exceptionally after exceptional
817     * completion of either source
818     */
819     public void testThenAcceptBoth2() {
820 jsr166 1.22 CompletableFuture<Integer> f, g;
821     CompletableFuture<Void> h;
822     SubtractAction r;
823    
824     f = new CompletableFuture<>();
825     g = new CompletableFuture<>();
826     h = f.thenAcceptBoth(g, r = new SubtractAction());
827 dl 1.5 f.completeExceptionally(new CFException());
828 jsr166 1.22 checkIncomplete(h);
829     g.complete(1);
830     checkCompletedWithWrappedCFException(h);
831    
832     f = new CompletableFuture<>();
833     g = new CompletableFuture<>();
834     h = f.thenAcceptBoth(g, r = new SubtractAction());
835     g.completeExceptionally(new CFException());
836     checkIncomplete(h);
837     f.complete(3);
838     checkCompletedWithWrappedCFException(h);
839    
840     f = new CompletableFuture<>();
841     g = new CompletableFuture<>();
842     f.complete(3);
843     g.completeExceptionally(new CFException());
844     h = f.thenAcceptBoth(g, r = new SubtractAction());
845     checkCompletedWithWrappedCFException(h);
846 dl 1.5
847 jsr166 1.22 f = new CompletableFuture<>();
848     g = new CompletableFuture<>();
849     f.completeExceptionally(new CFException());
850     g.complete(3);
851     h = f.thenAcceptBoth(g, r = new SubtractAction());
852     checkCompletedWithWrappedCFException(h);
853 dl 1.5 }
854    
855     /**
856     * thenAcceptBoth result completes exceptionally if action does
857     */
858     public void testThenAcceptBoth3() {
859 jsr166 1.22 CompletableFuture<Integer> f, g;
860     CompletableFuture<Void> h;
861     FailingBiConsumer r;
862    
863     f = new CompletableFuture<>();
864     g = new CompletableFuture<>();
865     h = f.thenAcceptBoth(g, r = new FailingBiConsumer());
866     f.complete(3);
867     checkIncomplete(h);
868     g.complete(1);
869     checkCompletedWithWrappedCFException(h);
870    
871     f = new CompletableFuture<>();
872     g = new CompletableFuture<>();
873     f.complete(3);
874     g.complete(1);
875     h = f.thenAcceptBoth(g, r = new FailingBiConsumer());
876     checkCompletedWithWrappedCFException(h);
877 dl 1.5 }
878    
879     /**
880     * thenAcceptBoth result completes exceptionally if either source cancelled
881     */
882     public void testThenAcceptBoth4() {
883 jsr166 1.22 CompletableFuture<Integer> f, g;
884     CompletableFuture<Void> h;
885     SubtractAction r;
886    
887     f = new CompletableFuture<>();
888     g = new CompletableFuture<>();
889     h = f.thenAcceptBoth(g, r = new SubtractAction());
890     assertTrue(f.cancel(true));
891     checkIncomplete(h);
892     g.complete(1);
893     checkCompletedWithWrappedCancellationException(h);
894    
895     f = new CompletableFuture<>();
896     g = new CompletableFuture<>();
897     h = f.thenAcceptBoth(g, r = new SubtractAction());
898     assertTrue(g.cancel(true));
899     checkIncomplete(h);
900     f.complete(3);
901     checkCompletedWithWrappedCancellationException(h);
902    
903     f = new CompletableFuture<>();
904     g = new CompletableFuture<>();
905     f.complete(3);
906     assertTrue(g.cancel(true));
907     h = f.thenAcceptBoth(g, r = new SubtractAction());
908     checkCompletedWithWrappedCancellationException(h);
909    
910     f = new CompletableFuture<>();
911     g = new CompletableFuture<>();
912 dl 1.5 assertTrue(f.cancel(true));
913 jsr166 1.22 g.complete(3);
914     h = f.thenAcceptBoth(g, r = new SubtractAction());
915     checkCompletedWithWrappedCancellationException(h);
916 dl 1.5 }
917    
918     /**
919     * runAfterBoth result completes normally after normal
920     * completion of sources
921     */
922     public void testRunAfterBoth() {
923 jsr166 1.22 CompletableFuture<Integer> f, g;
924     CompletableFuture<Void> h;
925     Noop r;
926    
927     f = new CompletableFuture<>();
928     g = new CompletableFuture<>();
929     h = f.runAfterBoth(g, r = new Noop());
930     f.complete(3);
931     checkIncomplete(h);
932     g.complete(1);
933     checkCompletedNormally(h, null);
934     assertTrue(r.ran);
935    
936     f = new CompletableFuture<>();
937     g = new CompletableFuture<>();
938     h = f.runAfterBoth(g, r = new Noop());
939     g.complete(1);
940     checkIncomplete(h);
941     f.complete(3);
942     checkCompletedNormally(h, null);
943 dl 1.5 assertTrue(r.ran);
944    
945 jsr166 1.22 f = new CompletableFuture<>();
946     g = new CompletableFuture<>();
947     g.complete(1);
948     f.complete(3);
949     h = f.runAfterBoth(g, r = new Noop());
950     checkCompletedNormally(h, null);
951 dl 1.5 assertTrue(r.ran);
952     }
953    
954     /**
955     * runAfterBoth result completes exceptionally after exceptional
956     * completion of either source
957     */
958     public void testRunAfterBoth2() {
959 jsr166 1.22 CompletableFuture<Integer> f, g;
960     CompletableFuture<Void> h;
961     Noop r;
962    
963     f = new CompletableFuture<>();
964     g = new CompletableFuture<>();
965     h = f.runAfterBoth(g, r = new Noop());
966 dl 1.5 f.completeExceptionally(new CFException());
967 jsr166 1.22 checkIncomplete(h);
968     g.complete(1);
969     checkCompletedWithWrappedCFException(h);
970     assertFalse(r.ran);
971    
972     f = new CompletableFuture<>();
973     g = new CompletableFuture<>();
974     h = f.runAfterBoth(g, r = new Noop());
975     g.completeExceptionally(new CFException());
976     checkIncomplete(h);
977     f.complete(3);
978     checkCompletedWithWrappedCFException(h);
979     assertFalse(r.ran);
980    
981     f = new CompletableFuture<>();
982     g = new CompletableFuture<>();
983     g.completeExceptionally(new CFException());
984     f.complete(3);
985     h = f.runAfterBoth(g, r = new Noop());
986     checkCompletedWithWrappedCFException(h);
987     assertFalse(r.ran);
988 dl 1.5
989 jsr166 1.22 f = new CompletableFuture<>();
990     g = new CompletableFuture<>();
991     f.completeExceptionally(new CFException());
992     g.complete(1);
993     h = f.runAfterBoth(g, r = new Noop());
994     checkCompletedWithWrappedCFException(h);
995     assertFalse(r.ran);
996 dl 1.5 }
997    
998 jsr166 1.4 /**
999 dl 1.5 * runAfterBoth result completes exceptionally if action does
1000 jsr166 1.4 */
1001 dl 1.5 public void testRunAfterBoth3() {
1002 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1003     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1004 dl 1.5 FailingNoop r = new FailingNoop();
1005     CompletableFuture<Void> g = f.runAfterBoth(f2, r);
1006     f.complete(one);
1007     checkIncomplete(g);
1008     f2.complete(two);
1009     checkCompletedWithWrappedCFException(g);
1010 jsr166 1.4 }
1011    
1012     /**
1013 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
1014 jsr166 1.4 */
1015 dl 1.5 public void testRunAfterBoth4() {
1016 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1017     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1018 dl 1.5 Noop r = new Noop();
1019     CompletableFuture<Void> g = f.runAfterBoth(f2, r);
1020     assertTrue(f.cancel(true));
1021     f2.complete(two);
1022     checkCompletedWithWrappedCancellationException(g);
1023 jsr166 1.22 f = new CompletableFuture<>();
1024     f2 = new CompletableFuture<>();
1025 dl 1.5 r = new Noop();
1026     g = f.runAfterBoth(f2, r);
1027     f.complete(one);
1028     assertTrue(f2.cancel(true));
1029     checkCompletedWithWrappedCancellationException(g);
1030 jsr166 1.4 }
1031 dl 1.5
1032     /**
1033     * applyToEither result completes normally after normal completion
1034     * of either source
1035     */
1036     public void testApplyToEither() {
1037 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1038     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1039 dl 1.5 CompletableFuture<Integer> g = f.applyToEither(f2, inc);
1040     f.complete(one);
1041     checkCompletedNormally(g, two);
1042     f2.complete(one);
1043     checkCompletedNormally(g, two);
1044    
1045 jsr166 1.22 f = new CompletableFuture<>();
1046 dl 1.5 f.complete(one);
1047 jsr166 1.22 f2 = new CompletableFuture<>();
1048 dl 1.5 g = f.applyToEither(f2, inc);
1049     checkCompletedNormally(g, two);
1050     }
1051    
1052     /**
1053     * applyToEither result completes exceptionally after exceptional
1054     * completion of either source
1055     */
1056     public void testApplyToEither2() {
1057 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1058     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1059 dl 1.5 CompletableFuture<Integer> g = f.applyToEither(f2, inc);
1060     f.completeExceptionally(new CFException());
1061     f2.complete(one);
1062     checkCompletedWithWrappedCFException(g);
1063    
1064 jsr166 1.22 f = new CompletableFuture<>();
1065     f2 = new CompletableFuture<>();
1066 dl 1.5 f2.completeExceptionally(new CFException());
1067     g = f.applyToEither(f2, inc);
1068     checkCompletedWithWrappedCFException(g);
1069     }
1070    
1071     /**
1072     * applyToEither result completes exceptionally if action does
1073     */
1074     public void testApplyToEither3() {
1075 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1076     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1077 dl 1.5 FailingFunction r = new FailingFunction();
1078     CompletableFuture<Integer> g = f.applyToEither(f2, r);
1079     f2.complete(two);
1080     checkCompletedWithWrappedCFException(g);
1081     }
1082    
1083     /**
1084     * applyToEither result completes exceptionally if either source cancelled
1085     */
1086     public void testApplyToEither4() {
1087 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1088     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1089 dl 1.5 CompletableFuture<Integer> g = f.applyToEither(f2, inc);
1090     assertTrue(f.cancel(true));
1091     checkCompletedWithWrappedCancellationException(g);
1092 jsr166 1.22 f = new CompletableFuture<>();
1093     f2 = new CompletableFuture<>();
1094 dl 1.5 assertTrue(f2.cancel(true));
1095     checkCompletedWithWrappedCancellationException(g);
1096     }
1097    
1098     /**
1099     * acceptEither result completes normally after normal completion
1100     * of either source
1101     */
1102     public void testAcceptEither() {
1103 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1104     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1105 dl 1.5 IncAction r = new IncAction();
1106     CompletableFuture<Void> g = f.acceptEither(f2, r);
1107     f.complete(one);
1108     checkCompletedNormally(g, null);
1109     f2.complete(one);
1110     checkCompletedNormally(g, null);
1111     assertEquals(r.value, 2);
1112    
1113     r = new IncAction();
1114 jsr166 1.22 f = new CompletableFuture<>();
1115 dl 1.5 f.complete(one);
1116 jsr166 1.22 f2 = new CompletableFuture<>();
1117 dl 1.5 g = f.acceptEither(f2, r);
1118     checkCompletedNormally(g, null);
1119     assertEquals(r.value, 2);
1120     }
1121    
1122     /**
1123     * acceptEither result completes exceptionally after exceptional
1124     * completion of either source
1125     */
1126     public void testAcceptEither2() {
1127 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1128     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1129 dl 1.5 IncAction r = new IncAction();
1130     CompletableFuture<Void> g = f.acceptEither(f2, r);
1131     f.completeExceptionally(new CFException());
1132     f2.complete(one);
1133     checkCompletedWithWrappedCFException(g);
1134    
1135     r = new IncAction();
1136 jsr166 1.22 f = new CompletableFuture<>();
1137     f2 = new CompletableFuture<>();
1138 dl 1.5 f2.completeExceptionally(new CFException());
1139     g = f.acceptEither(f2, r);
1140     checkCompletedWithWrappedCFException(g);
1141     }
1142    
1143     /**
1144     * acceptEither result completes exceptionally if action does
1145     */
1146     public void testAcceptEither3() {
1147 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1148     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1149 dl 1.5 FailingConsumer r = new FailingConsumer();
1150     CompletableFuture<Void> g = f.acceptEither(f2, r);
1151     f2.complete(two);
1152     checkCompletedWithWrappedCFException(g);
1153     }
1154    
1155     /**
1156     * acceptEither result completes exceptionally if either source cancelled
1157     */
1158     public void testAcceptEither4() {
1159 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1160     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1161 dl 1.5 IncAction r = new IncAction();
1162     CompletableFuture<Void> g = f.acceptEither(f2, r);
1163     assertTrue(f.cancel(true));
1164     checkCompletedWithWrappedCancellationException(g);
1165 jsr166 1.22 f = new CompletableFuture<>();
1166     f2 = new CompletableFuture<>();
1167 dl 1.5 assertTrue(f2.cancel(true));
1168     checkCompletedWithWrappedCancellationException(g);
1169     }
1170    
1171     /**
1172     * runAfterEither result completes normally after normal completion
1173     * of either source
1174     */
1175     public void testRunAfterEither() {
1176 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1177     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1178 dl 1.5 Noop r = new Noop();
1179     CompletableFuture<Void> g = f.runAfterEither(f2, r);
1180     f.complete(one);
1181     checkCompletedNormally(g, null);
1182     f2.complete(one);
1183     checkCompletedNormally(g, null);
1184     assertTrue(r.ran);
1185    
1186     r = new Noop();
1187 jsr166 1.22 f = new CompletableFuture<>();
1188 dl 1.5 f.complete(one);
1189 jsr166 1.22 f2 = new CompletableFuture<>();
1190 dl 1.5 g = f.runAfterEither(f2, r);
1191     checkCompletedNormally(g, null);
1192     assertTrue(r.ran);
1193     }
1194    
1195     /**
1196     * runAfterEither result completes exceptionally after exceptional
1197     * completion of either source
1198     */
1199     public void testRunAfterEither2() {
1200 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1201     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1202 dl 1.5 Noop r = new Noop();
1203     CompletableFuture<Void> g = f.runAfterEither(f2, r);
1204     f.completeExceptionally(new CFException());
1205     f2.complete(one);
1206     checkCompletedWithWrappedCFException(g);
1207    
1208     r = new Noop();
1209 jsr166 1.22 f = new CompletableFuture<>();
1210     f2 = new CompletableFuture<>();
1211 dl 1.5 f2.completeExceptionally(new CFException());
1212     g = f.runAfterEither(f2, r);
1213     checkCompletedWithWrappedCFException(g);
1214     }
1215    
1216     /**
1217     * runAfterEither result completes exceptionally if action does
1218     */
1219     public void testRunAfterEither3() {
1220 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1221     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1222 dl 1.5 FailingNoop r = new FailingNoop();
1223     CompletableFuture<Void> g = f.runAfterEither(f2, r);
1224     f2.complete(two);
1225     checkCompletedWithWrappedCFException(g);
1226     }
1227    
1228     /**
1229     * runAfterEither result completes exceptionally if either source cancelled
1230     */
1231     public void testRunAfterEither4() {
1232 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1233     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1234 dl 1.5 Noop r = new Noop();
1235     CompletableFuture<Void> g = f.runAfterEither(f2, r);
1236     assertTrue(f.cancel(true));
1237     checkCompletedWithWrappedCancellationException(g);
1238 jsr166 1.22 f = new CompletableFuture<>();
1239     f2 = new CompletableFuture<>();
1240 dl 1.5 assertTrue(f2.cancel(true));
1241     checkCompletedWithWrappedCancellationException(g);
1242     }
1243    
1244     /**
1245     * thenCompose result completes normally after normal completion of source
1246     */
1247     public void testThenCompose() {
1248 jsr166 1.21 CompletableFuture<Integer> f, g;
1249     CompletableFutureInc r;
1250    
1251 jsr166 1.22 f = new CompletableFuture<>();
1252 jsr166 1.21 g = f.thenCompose(r = new CompletableFutureInc());
1253     f.complete(one);
1254     checkCompletedNormally(g, two);
1255     assertTrue(r.ran);
1256    
1257 jsr166 1.22 f = new CompletableFuture<>();
1258 dl 1.5 f.complete(one);
1259 jsr166 1.21 g = f.thenCompose(r = new CompletableFutureInc());
1260 dl 1.5 checkCompletedNormally(g, two);
1261 jsr166 1.21 assertTrue(r.ran);
1262 dl 1.5 }
1263    
1264     /**
1265     * thenCompose result completes exceptionally after exceptional
1266     * completion of source
1267     */
1268     public void testThenCompose2() {
1269 jsr166 1.21 CompletableFuture<Integer> f, g;
1270     CompletableFutureInc r;
1271    
1272 jsr166 1.22 f = new CompletableFuture<>();
1273 jsr166 1.21 g = f.thenCompose(r = new CompletableFutureInc());
1274     f.completeExceptionally(new CFException());
1275     checkCompletedWithWrappedCFException(g);
1276    
1277 jsr166 1.22 f = new CompletableFuture<>();
1278 dl 1.5 f.completeExceptionally(new CFException());
1279 jsr166 1.21 g = f.thenCompose(r = new CompletableFutureInc());
1280 dl 1.5 checkCompletedWithWrappedCFException(g);
1281     }
1282    
1283     /**
1284     * thenCompose result completes exceptionally if action does
1285     */
1286     public void testThenCompose3() {
1287 jsr166 1.21 CompletableFuture<Integer> f, g;
1288     FailingCompletableFutureFunction r;
1289    
1290 jsr166 1.22 f = new CompletableFuture<>();
1291 jsr166 1.21 g = f.thenCompose(r = new FailingCompletableFutureFunction());
1292     f.complete(one);
1293     checkCompletedWithWrappedCFException(g);
1294    
1295 jsr166 1.22 f = new CompletableFuture<>();
1296 dl 1.5 f.complete(one);
1297 jsr166 1.21 g = f.thenCompose(r = new FailingCompletableFutureFunction());
1298 dl 1.5 checkCompletedWithWrappedCFException(g);
1299     }
1300    
1301     /**
1302     * thenCompose result completes exceptionally if source cancelled
1303     */
1304     public void testThenCompose4() {
1305 jsr166 1.21 CompletableFuture<Integer> f, g;
1306     CompletableFutureInc r;
1307    
1308 jsr166 1.22 f = new CompletableFuture<>();
1309 jsr166 1.21 g = f.thenCompose(r = new CompletableFutureInc());
1310     assertTrue(f.cancel(true));
1311     checkCompletedWithWrappedCancellationException(g);
1312    
1313 jsr166 1.22 f = new CompletableFuture<>();
1314 dl 1.5 assertTrue(f.cancel(true));
1315 jsr166 1.21 g = f.thenCompose(r = new CompletableFutureInc());
1316 dl 1.5 checkCompletedWithWrappedCancellationException(g);
1317     }
1318    
1319     // asyncs
1320    
1321     /**
1322     * thenRunAsync result completes normally after normal completion of source
1323     */
1324     public void testThenRunAsync() {
1325 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1326 dl 1.5 Noop r = new Noop();
1327     CompletableFuture<Void> g = f.thenRunAsync(r);
1328     f.complete(null);
1329     checkCompletedNormally(g, null);
1330    
1331     // reordered version
1332 jsr166 1.22 f = new CompletableFuture<>();
1333 dl 1.5 f.complete(null);
1334     r = new Noop();
1335     g = f.thenRunAsync(r);
1336     checkCompletedNormally(g, null);
1337     }
1338    
1339     /**
1340     * thenRunAsync result completes exceptionally after exceptional
1341     * completion of source
1342     */
1343     public void testThenRunAsync2() {
1344 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1345 dl 1.5 Noop r = new Noop();
1346     CompletableFuture<Void> g = f.thenRunAsync(r);
1347     f.completeExceptionally(new CFException());
1348     try {
1349     g.join();
1350     shouldThrow();
1351 jsr166 1.29 } catch (CompletionException success) {}
1352 dl 1.5 checkCompletedWithWrappedCFException(g);
1353     }
1354    
1355     /**
1356     * thenRunAsync result completes exceptionally if action does
1357     */
1358     public void testThenRunAsync3() {
1359 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1360 dl 1.5 FailingNoop r = new FailingNoop();
1361     CompletableFuture<Void> g = f.thenRunAsync(r);
1362     f.complete(null);
1363     checkCompletedWithWrappedCFException(g);
1364     }
1365 jsr166 1.6
1366 dl 1.5 /**
1367     * thenRunAsync result completes exceptionally if source cancelled
1368     */
1369     public void testThenRunAsync4() {
1370 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1371 dl 1.5 Noop r = new Noop();
1372     CompletableFuture<Void> g = f.thenRunAsync(r);
1373     assertTrue(f.cancel(true));
1374     checkCompletedWithWrappedCancellationException(g);
1375     }
1376    
1377     /**
1378     * thenApplyAsync result completes normally after normal completion of source
1379     */
1380     public void testThenApplyAsync() {
1381 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1382 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1383     f.complete(one);
1384     checkCompletedNormally(g, two);
1385     }
1386    
1387     /**
1388     * thenApplyAsync result completes exceptionally after exceptional
1389     * completion of source
1390     */
1391     public void testThenApplyAsync2() {
1392 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1393 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1394     f.completeExceptionally(new CFException());
1395     checkCompletedWithWrappedCFException(g);
1396     }
1397    
1398     /**
1399     * thenApplyAsync result completes exceptionally if action does
1400     */
1401     public void testThenApplyAsync3() {
1402 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1403 dl 1.5 FailingFunction r = new FailingFunction();
1404     CompletableFuture<Integer> g = f.thenApplyAsync(r);
1405     f.complete(null);
1406     checkCompletedWithWrappedCFException(g);
1407     }
1408 jsr166 1.6
1409 dl 1.5 /**
1410     * thenApplyAsync result completes exceptionally if source cancelled
1411     */
1412     public void testThenApplyAsync4() {
1413 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1414 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1415     assertTrue(f.cancel(true));
1416     checkCompletedWithWrappedCancellationException(g);
1417     }
1418    
1419     /**
1420     * thenAcceptAsync result completes normally after normal
1421     * completion of source
1422     */
1423     public void testThenAcceptAsync() {
1424 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1425 dl 1.5 IncAction r = new IncAction();
1426     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1427     f.complete(one);
1428     checkCompletedNormally(g, null);
1429     assertEquals(r.value, 2);
1430     }
1431    
1432     /**
1433     * thenAcceptAsync result completes exceptionally after exceptional
1434     * completion of source
1435     */
1436     public void testThenAcceptAsync2() {
1437 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1438 dl 1.5 IncAction r = new IncAction();
1439     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1440     f.completeExceptionally(new CFException());
1441     checkCompletedWithWrappedCFException(g);
1442     }
1443    
1444     /**
1445     * thenAcceptAsync result completes exceptionally if action does
1446     */
1447     public void testThenAcceptAsync3() {
1448 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1449 dl 1.5 FailingConsumer r = new FailingConsumer();
1450     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1451     f.complete(null);
1452     checkCompletedWithWrappedCFException(g);
1453     }
1454 jsr166 1.6
1455 dl 1.5 /**
1456     * thenAcceptAsync result completes exceptionally if source cancelled
1457     */
1458     public void testThenAcceptAsync4() {
1459 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1460 dl 1.5 IncAction r = new IncAction();
1461     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1462     assertTrue(f.cancel(true));
1463     checkCompletedWithWrappedCancellationException(g);
1464     }
1465 jsr166 1.19
1466 dl 1.5 /**
1467     * thenCombineAsync result completes normally after normal
1468     * completion of sources
1469     */
1470     public void testThenCombineAsync() {
1471 jsr166 1.18 CompletableFuture<Integer> f, g, h;
1472    
1473 jsr166 1.22 f = new CompletableFuture<>();
1474     g = new CompletableFuture<>();
1475 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1476     f.complete(3);
1477     checkIncomplete(h);
1478     g.complete(1);
1479     checkCompletedNormally(h, 2);
1480    
1481 jsr166 1.22 f = new CompletableFuture<>();
1482     g = new CompletableFuture<>();
1483 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1484     g.complete(1);
1485     checkIncomplete(h);
1486     f.complete(3);
1487     checkCompletedNormally(h, 2);
1488    
1489 jsr166 1.22 f = new CompletableFuture<>();
1490     g = new CompletableFuture<>();
1491 jsr166 1.18 g.complete(1);
1492     f.complete(3);
1493     h = f.thenCombineAsync(g, subtract);
1494     checkCompletedNormally(h, 2);
1495 dl 1.5 }
1496    
1497     /**
1498     * thenCombineAsync result completes exceptionally after exceptional
1499 jsr166 1.18 * completion of either source
1500 dl 1.5 */
1501     public void testThenCombineAsync2() {
1502 jsr166 1.18 CompletableFuture<Integer> f, g, h;
1503    
1504 jsr166 1.22 f = new CompletableFuture<>();
1505     g = new CompletableFuture<>();
1506 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1507 dl 1.5 f.completeExceptionally(new CFException());
1508 jsr166 1.18 checkIncomplete(h);
1509     g.complete(1);
1510     checkCompletedWithWrappedCFException(h);
1511    
1512 jsr166 1.22 f = new CompletableFuture<>();
1513     g = new CompletableFuture<>();
1514 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1515     g.completeExceptionally(new CFException());
1516     checkIncomplete(h);
1517     f.complete(3);
1518     checkCompletedWithWrappedCFException(h);
1519 dl 1.5
1520 jsr166 1.22 f = new CompletableFuture<>();
1521     g = new CompletableFuture<>();
1522 jsr166 1.18 g.completeExceptionally(new CFException());
1523     f.complete(3);
1524     h = f.thenCombineAsync(g, subtract);
1525     checkCompletedWithWrappedCFException(h);
1526 dl 1.5 }
1527    
1528     /**
1529     * thenCombineAsync result completes exceptionally if action does
1530     */
1531     public void testThenCombineAsync3() {
1532 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1533     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1534 dl 1.5 FailingBiFunction r = new FailingBiFunction();
1535     CompletableFuture<Integer> g = f.thenCombineAsync(f2, r);
1536     f.complete(one);
1537     checkIncomplete(g);
1538 jsr166 1.18 assertFalse(r.ran);
1539 dl 1.5 f2.complete(two);
1540     checkCompletedWithWrappedCFException(g);
1541 jsr166 1.18 assertTrue(r.ran);
1542 dl 1.5 }
1543 jsr166 1.6
1544 dl 1.5 /**
1545     * thenCombineAsync result completes exceptionally if either source cancelled
1546     */
1547     public void testThenCombineAsync4() {
1548 jsr166 1.18 CompletableFuture<Integer> f, g, h;
1549    
1550 jsr166 1.22 f = new CompletableFuture<>();
1551     g = new CompletableFuture<>();
1552 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1553     assertTrue(f.cancel(true));
1554     checkIncomplete(h);
1555     g.complete(1);
1556     checkCompletedWithWrappedCancellationException(h);
1557    
1558 jsr166 1.22 f = new CompletableFuture<>();
1559     g = new CompletableFuture<>();
1560 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1561     assertTrue(g.cancel(true));
1562     checkIncomplete(h);
1563     f.complete(3);
1564     checkCompletedWithWrappedCancellationException(h);
1565    
1566 jsr166 1.22 f = new CompletableFuture<>();
1567     g = new CompletableFuture<>();
1568 jsr166 1.18 g.complete(3);
1569 dl 1.5 assertTrue(f.cancel(true));
1570 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1571     checkCompletedWithWrappedCancellationException(h);
1572 jsr166 1.6
1573 jsr166 1.22 f = new CompletableFuture<>();
1574     g = new CompletableFuture<>();
1575 jsr166 1.18 f.complete(3);
1576     assertTrue(g.cancel(true));
1577     h = f.thenCombineAsync(g, subtract);
1578     checkCompletedWithWrappedCancellationException(h);
1579 dl 1.5 }
1580    
1581     /**
1582     * thenAcceptBothAsync result completes normally after normal
1583     * completion of sources
1584     */
1585     public void testThenAcceptBothAsync() {
1586 jsr166 1.22 CompletableFuture<Integer> f, g;
1587     CompletableFuture<Void> h;
1588     SubtractAction r;
1589    
1590     f = new CompletableFuture<>();
1591     g = new CompletableFuture<>();
1592     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1593     f.complete(3);
1594     checkIncomplete(h);
1595     g.complete(1);
1596     checkCompletedNormally(h, null);
1597     assertEquals(r.value, 2);
1598    
1599     f = new CompletableFuture<>();
1600     g = new CompletableFuture<>();
1601     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1602     g.complete(1);
1603     checkIncomplete(h);
1604     f.complete(3);
1605     checkCompletedNormally(h, null);
1606     assertEquals(r.value, 2);
1607    
1608     f = new CompletableFuture<>();
1609     g = new CompletableFuture<>();
1610     g.complete(1);
1611     f.complete(3);
1612     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1613     checkCompletedNormally(h, null);
1614     assertEquals(r.value, 2);
1615 dl 1.5 }
1616    
1617     /**
1618     * thenAcceptBothAsync result completes exceptionally after exceptional
1619     * completion of source
1620     */
1621     public void testThenAcceptBothAsync2() {
1622 jsr166 1.22 CompletableFuture<Integer> f, g;
1623     CompletableFuture<Void> h;
1624     SubtractAction r;
1625    
1626     f = new CompletableFuture<>();
1627     g = new CompletableFuture<>();
1628     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1629 dl 1.5 f.completeExceptionally(new CFException());
1630 jsr166 1.22 checkIncomplete(h);
1631     g.complete(1);
1632     checkCompletedWithWrappedCFException(h);
1633    
1634     f = new CompletableFuture<>();
1635     g = new CompletableFuture<>();
1636     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1637     g.completeExceptionally(new CFException());
1638     checkIncomplete(h);
1639     f.complete(3);
1640     checkCompletedWithWrappedCFException(h);
1641    
1642     f = new CompletableFuture<>();
1643     g = new CompletableFuture<>();
1644     f.complete(3);
1645     g.completeExceptionally(new CFException());
1646     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1647     checkCompletedWithWrappedCFException(h);
1648 dl 1.5
1649 jsr166 1.22 f = new CompletableFuture<>();
1650     g = new CompletableFuture<>();
1651     f.completeExceptionally(new CFException());
1652     g.complete(3);
1653     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1654     checkCompletedWithWrappedCFException(h);
1655 dl 1.5 }
1656    
1657     /**
1658     * thenAcceptBothAsync result completes exceptionally if action does
1659     */
1660     public void testThenAcceptBothAsync3() {
1661 jsr166 1.22 CompletableFuture<Integer> f, g;
1662     CompletableFuture<Void> h;
1663     FailingBiConsumer r;
1664    
1665     f = new CompletableFuture<>();
1666     g = new CompletableFuture<>();
1667     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer());
1668     f.complete(3);
1669     checkIncomplete(h);
1670     g.complete(1);
1671     checkCompletedWithWrappedCFException(h);
1672    
1673     f = new CompletableFuture<>();
1674     g = new CompletableFuture<>();
1675     f.complete(3);
1676     g.complete(1);
1677     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer());
1678     checkCompletedWithWrappedCFException(h);
1679 dl 1.5 }
1680 jsr166 1.6
1681 dl 1.5 /**
1682     * thenAcceptBothAsync result completes exceptionally if either source cancelled
1683     */
1684     public void testThenAcceptBothAsync4() {
1685 jsr166 1.22 CompletableFuture<Integer> f, g;
1686     CompletableFuture<Void> h;
1687     SubtractAction r;
1688    
1689     f = new CompletableFuture<>();
1690     g = new CompletableFuture<>();
1691     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1692 dl 1.5 assertTrue(f.cancel(true));
1693 jsr166 1.22 checkIncomplete(h);
1694     g.complete(1);
1695     checkCompletedWithWrappedCancellationException(h);
1696    
1697     f = new CompletableFuture<>();
1698     g = new CompletableFuture<>();
1699     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1700     assertTrue(g.cancel(true));
1701     checkIncomplete(h);
1702     f.complete(3);
1703     checkCompletedWithWrappedCancellationException(h);
1704    
1705     f = new CompletableFuture<>();
1706     g = new CompletableFuture<>();
1707     f.complete(3);
1708     assertTrue(g.cancel(true));
1709     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1710     checkCompletedWithWrappedCancellationException(h);
1711 jsr166 1.6
1712 jsr166 1.22 f = new CompletableFuture<>();
1713     g = new CompletableFuture<>();
1714     assertTrue(f.cancel(true));
1715     g.complete(3);
1716     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1717     checkCompletedWithWrappedCancellationException(h);
1718 dl 1.5 }
1719    
1720     /**
1721     * runAfterBothAsync result completes normally after normal
1722     * completion of sources
1723     */
1724     public void testRunAfterBothAsync() {
1725 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1726     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1727 dl 1.5 Noop r = new Noop();
1728     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1729     f.complete(one);
1730     checkIncomplete(g);
1731     f2.complete(two);
1732     checkCompletedNormally(g, null);
1733     assertTrue(r.ran);
1734     }
1735    
1736     /**
1737     * runAfterBothAsync result completes exceptionally after exceptional
1738     * completion of source
1739     */
1740     public void testRunAfterBothAsync2() {
1741 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1742     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1743 dl 1.5 Noop r = new Noop();
1744     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1745     f.completeExceptionally(new CFException());
1746     f2.complete(two);
1747     checkCompletedWithWrappedCFException(g);
1748    
1749     r = new Noop();
1750 jsr166 1.22 f = new CompletableFuture<>();
1751     f2 = new CompletableFuture<>();
1752 dl 1.5 g = f.runAfterBothAsync(f2, r);
1753     f.complete(one);
1754     f2.completeExceptionally(new CFException());
1755     checkCompletedWithWrappedCFException(g);
1756     }
1757    
1758     /**
1759     * runAfterBothAsync result completes exceptionally if action does
1760     */
1761     public void testRunAfterBothAsync3() {
1762 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1763     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1764 dl 1.5 FailingNoop r = new FailingNoop();
1765 jsr166 1.6 CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1766 dl 1.5 f.complete(one);
1767     checkIncomplete(g);
1768     f2.complete(two);
1769     checkCompletedWithWrappedCFException(g);
1770     }
1771 jsr166 1.6
1772 dl 1.5 /**
1773     * runAfterBothAsync result completes exceptionally if either source cancelled
1774     */
1775     public void testRunAfterBothAsync4() {
1776 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1777     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1778 dl 1.5 Noop r = new Noop();
1779     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1780     assertTrue(f.cancel(true));
1781     f2.complete(two);
1782     checkCompletedWithWrappedCancellationException(g);
1783 jsr166 1.6
1784 dl 1.5 r = new Noop();
1785 jsr166 1.22 f = new CompletableFuture<>();
1786     f2 = new CompletableFuture<>();
1787 dl 1.5 g = f.runAfterBothAsync(f2, r);
1788     f.complete(one);
1789     assertTrue(f2.cancel(true));
1790     checkCompletedWithWrappedCancellationException(g);
1791     }
1792    
1793     /**
1794     * applyToEitherAsync result completes normally after normal
1795     * completion of sources
1796     */
1797     public void testApplyToEitherAsync() {
1798 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1799     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1800 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1801     f.complete(one);
1802     checkCompletedNormally(g, two);
1803    
1804 jsr166 1.22 f = new CompletableFuture<>();
1805 dl 1.5 f.complete(one);
1806 jsr166 1.22 f2 = new CompletableFuture<>();
1807 dl 1.5 g = f.applyToEitherAsync(f2, inc);
1808     checkCompletedNormally(g, two);
1809     }
1810    
1811     /**
1812     * applyToEitherAsync result completes exceptionally after exceptional
1813     * completion of source
1814     */
1815     public void testApplyToEitherAsync2() {
1816 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1817     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1818 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1819     f.completeExceptionally(new CFException());
1820     checkCompletedWithWrappedCFException(g);
1821    
1822 jsr166 1.22 f = new CompletableFuture<>();
1823     f2 = new CompletableFuture<>();
1824 dl 1.5 f2.completeExceptionally(new CFException());
1825     g = f.applyToEitherAsync(f2, inc);
1826     f.complete(one);
1827     checkCompletedWithWrappedCFException(g);
1828     }
1829    
1830     /**
1831     * applyToEitherAsync result completes exceptionally if action does
1832     */
1833     public void testApplyToEitherAsync3() {
1834 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1835     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1836 dl 1.5 FailingFunction r = new FailingFunction();
1837 jsr166 1.6 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, r);
1838 dl 1.5 f.complete(one);
1839     checkCompletedWithWrappedCFException(g);
1840     }
1841 jsr166 1.6
1842 dl 1.5 /**
1843     * applyToEitherAsync result completes exceptionally if either source cancelled
1844     */
1845     public void testApplyToEitherAsync4() {
1846 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1847     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1848 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1849     assertTrue(f.cancel(true));
1850     checkCompletedWithWrappedCancellationException(g);
1851 jsr166 1.6
1852 jsr166 1.22 f = new CompletableFuture<>();
1853     f2 = new CompletableFuture<>();
1854 dl 1.5 assertTrue(f2.cancel(true));
1855     g = f.applyToEitherAsync(f2, inc);
1856     checkCompletedWithWrappedCancellationException(g);
1857     }
1858    
1859     /**
1860     * acceptEitherAsync result completes normally after normal
1861     * completion of sources
1862     */
1863     public void testAcceptEitherAsync() {
1864 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1865     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1866 dl 1.5 IncAction r = new IncAction();
1867     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1868     f.complete(one);
1869     checkCompletedNormally(g, null);
1870     assertEquals(r.value, 2);
1871    
1872     r = new IncAction();
1873 jsr166 1.22 f = new CompletableFuture<>();
1874 dl 1.5 f.complete(one);
1875 jsr166 1.22 f2 = new CompletableFuture<>();
1876 dl 1.5 g = f.acceptEitherAsync(f2, r);
1877     checkCompletedNormally(g, null);
1878     assertEquals(r.value, 2);
1879     }
1880    
1881     /**
1882     * acceptEitherAsync result completes exceptionally after exceptional
1883     * completion of source
1884     */
1885     public void testAcceptEitherAsync2() {
1886 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1887     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1888 dl 1.5 IncAction r = new IncAction();
1889     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1890     f.completeExceptionally(new CFException());
1891     checkCompletedWithWrappedCFException(g);
1892    
1893     r = new IncAction();
1894 jsr166 1.22 f = new CompletableFuture<>();
1895     f2 = new CompletableFuture<>();
1896 dl 1.5 f2.completeExceptionally(new CFException());
1897     g = f.acceptEitherAsync(f2, r);
1898     f.complete(one);
1899     checkCompletedWithWrappedCFException(g);
1900     }
1901    
1902     /**
1903     * acceptEitherAsync result completes exceptionally if action does
1904     */
1905     public void testAcceptEitherAsync3() {
1906 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1907     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1908 dl 1.5 FailingConsumer r = new FailingConsumer();
1909 jsr166 1.6 CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1910 dl 1.5 f.complete(one);
1911     checkCompletedWithWrappedCFException(g);
1912     }
1913 jsr166 1.6
1914 dl 1.5 /**
1915     * acceptEitherAsync result completes exceptionally if either
1916     * source cancelled
1917     */
1918     public void testAcceptEitherAsync4() {
1919 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1920     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1921 dl 1.5 IncAction r = new IncAction();
1922     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1923     assertTrue(f.cancel(true));
1924     checkCompletedWithWrappedCancellationException(g);
1925 jsr166 1.6
1926 dl 1.5 r = new IncAction();
1927 jsr166 1.22 f = new CompletableFuture<>();
1928     f2 = new CompletableFuture<>();
1929 dl 1.5 assertTrue(f2.cancel(true));
1930     g = f.acceptEitherAsync(f2, r);
1931     checkCompletedWithWrappedCancellationException(g);
1932     }
1933    
1934     /**
1935     * runAfterEitherAsync result completes normally after normal
1936     * completion of sources
1937     */
1938     public void testRunAfterEitherAsync() {
1939 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1940     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1941 dl 1.5 Noop r = new Noop();
1942     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1943     f.complete(one);
1944     checkCompletedNormally(g, null);
1945     assertTrue(r.ran);
1946    
1947     r = new Noop();
1948 jsr166 1.22 f = new CompletableFuture<>();
1949 dl 1.5 f.complete(one);
1950 jsr166 1.22 f2 = new CompletableFuture<>();
1951 dl 1.5 g = f.runAfterEitherAsync(f2, r);
1952     checkCompletedNormally(g, null);
1953     assertTrue(r.ran);
1954     }
1955    
1956     /**
1957     * runAfterEitherAsync result completes exceptionally after exceptional
1958     * completion of source
1959     */
1960     public void testRunAfterEitherAsync2() {
1961 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1962     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1963 dl 1.5 Noop r = new Noop();
1964     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1965     f.completeExceptionally(new CFException());
1966     checkCompletedWithWrappedCFException(g);
1967    
1968     r = new Noop();
1969 jsr166 1.22 f = new CompletableFuture<>();
1970     f2 = new CompletableFuture<>();
1971 dl 1.5 f2.completeExceptionally(new CFException());
1972     g = f.runAfterEitherAsync(f2, r);
1973     f.complete(one);
1974     checkCompletedWithWrappedCFException(g);
1975     }
1976    
1977     /**
1978     * runAfterEitherAsync result completes exceptionally if action does
1979     */
1980     public void testRunAfterEitherAsync3() {
1981 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1982     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1983 dl 1.5 FailingNoop r = new FailingNoop();
1984 jsr166 1.6 CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1985 dl 1.5 f.complete(one);
1986     checkCompletedWithWrappedCFException(g);
1987     }
1988 jsr166 1.6
1989 dl 1.5 /**
1990     * runAfterEitherAsync result completes exceptionally if either
1991     * source cancelled
1992     */
1993     public void testRunAfterEitherAsync4() {
1994 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1995     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1996 dl 1.5 Noop r = new Noop();
1997     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1998     assertTrue(f.cancel(true));
1999     checkCompletedWithWrappedCancellationException(g);
2000 jsr166 1.6
2001 dl 1.5 r = new Noop();
2002 jsr166 1.22 f = new CompletableFuture<>();
2003     f2 = new CompletableFuture<>();
2004 dl 1.5 assertTrue(f2.cancel(true));
2005     g = f.runAfterEitherAsync(f2, r);
2006     checkCompletedWithWrappedCancellationException(g);
2007     }
2008    
2009     /**
2010 jsr166 1.7 * thenComposeAsync result completes normally after normal
2011     * completion of source
2012 dl 1.5 */
2013     public void testThenComposeAsync() {
2014 jsr166 1.20 CompletableFuture<Integer> f, g;
2015     CompletableFutureInc r;
2016    
2017 jsr166 1.22 f = new CompletableFuture<>();
2018 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2019     f.complete(one);
2020     checkCompletedNormally(g, two);
2021    
2022 jsr166 1.22 f = new CompletableFuture<>();
2023 dl 1.5 f.complete(one);
2024 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2025 dl 1.5 checkCompletedNormally(g, two);
2026     }
2027    
2028     /**
2029 jsr166 1.7 * thenComposeAsync result completes exceptionally after
2030     * exceptional completion of source
2031 dl 1.5 */
2032     public void testThenComposeAsync2() {
2033 jsr166 1.20 CompletableFuture<Integer> f, g;
2034     CompletableFutureInc r;
2035    
2036 jsr166 1.22 f = new CompletableFuture<>();
2037 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2038     f.completeExceptionally(new CFException());
2039     checkCompletedWithWrappedCFException(g);
2040     assertFalse(r.ran);
2041    
2042 jsr166 1.22 f = new CompletableFuture<>();
2043 dl 1.5 f.completeExceptionally(new CFException());
2044 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2045 dl 1.5 checkCompletedWithWrappedCFException(g);
2046 jsr166 1.20 assertFalse(r.ran);
2047 dl 1.5 }
2048    
2049     /**
2050     * thenComposeAsync result completes exceptionally if action does
2051     */
2052     public void testThenComposeAsync3() {
2053 jsr166 1.20 CompletableFuture<Integer> f, g;
2054     FailingCompletableFutureFunction r;
2055 jsr166 1.21
2056 jsr166 1.22 f = new CompletableFuture<>();
2057 jsr166 1.20 g = f.thenComposeAsync(r = new FailingCompletableFutureFunction());
2058     f.complete(one);
2059     checkCompletedWithWrappedCFException(g);
2060 jsr166 1.21
2061 jsr166 1.22 f = new CompletableFuture<>();
2062 dl 1.5 f.complete(one);
2063 jsr166 1.20 g = f.thenComposeAsync(r = new FailingCompletableFutureFunction());
2064 dl 1.5 checkCompletedWithWrappedCFException(g);
2065     }
2066    
2067     /**
2068     * thenComposeAsync result completes exceptionally if source cancelled
2069     */
2070     public void testThenComposeAsync4() {
2071 jsr166 1.20 CompletableFuture<Integer> f, g;
2072     CompletableFutureInc r;
2073    
2074 jsr166 1.22 f = new CompletableFuture<>();
2075 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2076     assertTrue(f.cancel(true));
2077     checkCompletedWithWrappedCancellationException(g);
2078    
2079 jsr166 1.22 f = new CompletableFuture<>();
2080 dl 1.5 assertTrue(f.cancel(true));
2081 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2082 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2083     }
2084    
2085 jsr166 1.7 // async with explicit executors
2086 dl 1.5
2087     /**
2088     * thenRunAsync result completes normally after normal completion of source
2089     */
2090     public void testThenRunAsyncE() {
2091 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2092 dl 1.5 Noop r = new Noop();
2093     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2094     f.complete(null);
2095     checkCompletedNormally(g, null);
2096    
2097     // reordered version
2098 jsr166 1.22 f = new CompletableFuture<>();
2099 dl 1.5 f.complete(null);
2100     r = new Noop();
2101     g = f.thenRunAsync(r, new ThreadExecutor());
2102     checkCompletedNormally(g, null);
2103     }
2104    
2105     /**
2106     * thenRunAsync result completes exceptionally after exceptional
2107     * completion of source
2108     */
2109     public void testThenRunAsync2E() {
2110 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2111 dl 1.5 Noop r = new Noop();
2112     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2113     f.completeExceptionally(new CFException());
2114     try {
2115     g.join();
2116     shouldThrow();
2117 jsr166 1.29 } catch (CompletionException success) {}
2118 dl 1.5 checkCompletedWithWrappedCFException(g);
2119     }
2120    
2121     /**
2122     * thenRunAsync result completes exceptionally if action does
2123     */
2124     public void testThenRunAsync3E() {
2125 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2126 dl 1.5 FailingNoop r = new FailingNoop();
2127     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2128     f.complete(null);
2129     checkCompletedWithWrappedCFException(g);
2130     }
2131 jsr166 1.6
2132 dl 1.5 /**
2133     * thenRunAsync result completes exceptionally if source cancelled
2134     */
2135     public void testThenRunAsync4E() {
2136 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2137 dl 1.5 Noop r = new Noop();
2138     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2139     assertTrue(f.cancel(true));
2140     checkCompletedWithWrappedCancellationException(g);
2141     }
2142    
2143     /**
2144     * thenApplyAsync result completes normally after normal completion of source
2145     */
2146     public void testThenApplyAsyncE() {
2147 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2148 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
2149     f.complete(one);
2150     checkCompletedNormally(g, two);
2151     }
2152    
2153     /**
2154     * thenApplyAsync result completes exceptionally after exceptional
2155     * completion of source
2156     */
2157     public void testThenApplyAsync2E() {
2158 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2159 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
2160     f.completeExceptionally(new CFException());
2161     checkCompletedWithWrappedCFException(g);
2162     }
2163    
2164     /**
2165     * thenApplyAsync result completes exceptionally if action does
2166     */
2167     public void testThenApplyAsync3E() {
2168 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2169 dl 1.5 FailingFunction r = new FailingFunction();
2170     CompletableFuture<Integer> g = f.thenApplyAsync(r, new ThreadExecutor());
2171     f.complete(null);
2172     checkCompletedWithWrappedCFException(g);
2173     }
2174 jsr166 1.6
2175 dl 1.5 /**
2176     * thenApplyAsync result completes exceptionally if source cancelled
2177     */
2178     public void testThenApplyAsync4E() {
2179 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2180 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
2181     assertTrue(f.cancel(true));
2182     checkCompletedWithWrappedCancellationException(g);
2183     }
2184    
2185     /**
2186     * thenAcceptAsync result completes normally after normal
2187     * completion of source
2188     */
2189     public void testThenAcceptAsyncE() {
2190 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2191 dl 1.5 IncAction r = new IncAction();
2192     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2193     f.complete(one);
2194     checkCompletedNormally(g, null);
2195     assertEquals(r.value, 2);
2196     }
2197    
2198     /**
2199     * thenAcceptAsync result completes exceptionally after exceptional
2200     * completion of source
2201     */
2202     public void testThenAcceptAsync2E() {
2203 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2204 dl 1.5 IncAction r = new IncAction();
2205     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2206     f.completeExceptionally(new CFException());
2207     checkCompletedWithWrappedCFException(g);
2208     }
2209    
2210     /**
2211     * thenAcceptAsync result completes exceptionally if action does
2212     */
2213     public void testThenAcceptAsync3E() {
2214 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2215 dl 1.5 FailingConsumer r = new FailingConsumer();
2216     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2217     f.complete(null);
2218     checkCompletedWithWrappedCFException(g);
2219     }
2220 jsr166 1.6
2221 dl 1.5 /**
2222     * thenAcceptAsync result completes exceptionally if source cancelled
2223     */
2224     public void testThenAcceptAsync4E() {
2225 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2226 dl 1.5 IncAction r = new IncAction();
2227     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2228     assertTrue(f.cancel(true));
2229     checkCompletedWithWrappedCancellationException(g);
2230     }
2231 jsr166 1.18
2232 dl 1.5 /**
2233     * thenCombineAsync result completes normally after normal
2234     * completion of sources
2235     */
2236     public void testThenCombineAsyncE() {
2237 jsr166 1.18 CompletableFuture<Integer> f, g, h;
2238     ThreadExecutor e = new ThreadExecutor();
2239     int count = 0;
2240    
2241 jsr166 1.22 f = new CompletableFuture<>();
2242     g = new CompletableFuture<>();
2243 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2244     f.complete(3);
2245     checkIncomplete(h);
2246     g.complete(1);
2247     checkCompletedNormally(h, 2);
2248     assertEquals(++count, e.count.get());
2249    
2250 jsr166 1.22 f = new CompletableFuture<>();
2251     g = new CompletableFuture<>();
2252 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2253     g.complete(1);
2254     checkIncomplete(h);
2255     f.complete(3);
2256     checkCompletedNormally(h, 2);
2257     assertEquals(++count, e.count.get());
2258    
2259 jsr166 1.22 f = new CompletableFuture<>();
2260     g = new CompletableFuture<>();
2261 jsr166 1.18 g.complete(1);
2262     f.complete(3);
2263     h = f.thenCombineAsync(g, subtract, e);
2264     checkCompletedNormally(h, 2);
2265     assertEquals(++count, e.count.get());
2266 dl 1.5 }
2267    
2268     /**
2269     * thenCombineAsync result completes exceptionally after exceptional
2270 jsr166 1.18 * completion of either source
2271 dl 1.5 */
2272     public void testThenCombineAsync2E() {
2273 jsr166 1.18 CompletableFuture<Integer> f, g, h;
2274     ThreadExecutor e = new ThreadExecutor();
2275     int count = 0;
2276    
2277 jsr166 1.22 f = new CompletableFuture<>();
2278     g = new CompletableFuture<>();
2279 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2280 dl 1.5 f.completeExceptionally(new CFException());
2281 jsr166 1.18 checkIncomplete(h);
2282     g.complete(1);
2283     checkCompletedWithWrappedCFException(h);
2284    
2285 jsr166 1.22 f = new CompletableFuture<>();
2286     g = new CompletableFuture<>();
2287 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2288     g.completeExceptionally(new CFException());
2289     checkIncomplete(h);
2290     f.complete(3);
2291     checkCompletedWithWrappedCFException(h);
2292 dl 1.5
2293 jsr166 1.22 f = new CompletableFuture<>();
2294     g = new CompletableFuture<>();
2295 jsr166 1.18 g.completeExceptionally(new CFException());
2296     h = f.thenCombineAsync(g, subtract, e);
2297     checkIncomplete(h);
2298     f.complete(3);
2299     checkCompletedWithWrappedCFException(h);
2300    
2301     assertEquals(0, e.count.get());
2302 dl 1.5 }
2303    
2304     /**
2305     * thenCombineAsync result completes exceptionally if action does
2306     */
2307     public void testThenCombineAsync3E() {
2308 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2309     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2310 dl 1.5 FailingBiFunction r = new FailingBiFunction();
2311     CompletableFuture<Integer> g = f.thenCombineAsync(f2, r, new ThreadExecutor());
2312     f.complete(one);
2313     checkIncomplete(g);
2314 jsr166 1.18 assertFalse(r.ran);
2315 dl 1.5 f2.complete(two);
2316     checkCompletedWithWrappedCFException(g);
2317 jsr166 1.18 assertTrue(r.ran);
2318 dl 1.5 }
2319 jsr166 1.6
2320 dl 1.5 /**
2321     * thenCombineAsync result completes exceptionally if either source cancelled
2322     */
2323     public void testThenCombineAsync4E() {
2324 jsr166 1.18 CompletableFuture<Integer> f, g, h;
2325     ThreadExecutor e = new ThreadExecutor();
2326    
2327 jsr166 1.22 f = new CompletableFuture<>();
2328     g = new CompletableFuture<>();
2329 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2330 dl 1.5 assertTrue(f.cancel(true));
2331 jsr166 1.18 checkIncomplete(h);
2332     g.complete(1);
2333     checkCompletedWithWrappedCancellationException(h);
2334    
2335 jsr166 1.22 f = new CompletableFuture<>();
2336     g = new CompletableFuture<>();
2337 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2338     assertTrue(g.cancel(true));
2339     checkIncomplete(h);
2340     f.complete(3);
2341     checkCompletedWithWrappedCancellationException(h);
2342    
2343 jsr166 1.22 f = new CompletableFuture<>();
2344     g = new CompletableFuture<>();
2345 jsr166 1.18 assertTrue(g.cancel(true));
2346     h = f.thenCombineAsync(g, subtract, e);
2347     checkIncomplete(h);
2348     f.complete(3);
2349     checkCompletedWithWrappedCancellationException(h);
2350 jsr166 1.6
2351 jsr166 1.22 f = new CompletableFuture<>();
2352     g = new CompletableFuture<>();
2353 jsr166 1.18 assertTrue(f.cancel(true));
2354     assertTrue(g.cancel(true));
2355     h = f.thenCombineAsync(g, subtract, e);
2356     checkCompletedWithWrappedCancellationException(h);
2357    
2358     assertEquals(0, e.count.get());
2359 dl 1.5 }
2360    
2361     /**
2362     * thenAcceptBothAsync result completes normally after normal
2363     * completion of sources
2364     */
2365     public void testThenAcceptBothAsyncE() {
2366 jsr166 1.22 CompletableFuture<Integer> f, g;
2367     CompletableFuture<Void> h;
2368     SubtractAction r;
2369     ThreadExecutor e = new ThreadExecutor();
2370    
2371     f = new CompletableFuture<>();
2372     g = new CompletableFuture<>();
2373     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2374     f.complete(3);
2375     checkIncomplete(h);
2376     g.complete(1);
2377     checkCompletedNormally(h, null);
2378     assertEquals(r.value, 2);
2379    
2380     f = new CompletableFuture<>();
2381     g = new CompletableFuture<>();
2382     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2383     g.complete(1);
2384     checkIncomplete(h);
2385     f.complete(3);
2386     checkCompletedNormally(h, null);
2387     assertEquals(r.value, 2);
2388    
2389     f = new CompletableFuture<>();
2390     g = new CompletableFuture<>();
2391     g.complete(1);
2392     f.complete(3);
2393     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2394     checkCompletedNormally(h, null);
2395     assertEquals(r.value, 2);
2396    
2397     assertEquals(3, e.count.get());
2398 dl 1.5 }
2399    
2400     /**
2401     * thenAcceptBothAsync result completes exceptionally after exceptional
2402     * completion of source
2403     */
2404     public void testThenAcceptBothAsync2E() {
2405 jsr166 1.22 CompletableFuture<Integer> f, g;
2406     CompletableFuture<Void> h;
2407     SubtractAction r;
2408     ThreadExecutor e = new ThreadExecutor();
2409    
2410     f = new CompletableFuture<>();
2411     g = new CompletableFuture<>();
2412     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2413     f.completeExceptionally(new CFException());
2414     checkIncomplete(h);
2415     g.complete(1);
2416     checkCompletedWithWrappedCFException(h);
2417    
2418     f = new CompletableFuture<>();
2419     g = new CompletableFuture<>();
2420     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2421     g.completeExceptionally(new CFException());
2422     checkIncomplete(h);
2423     f.complete(3);
2424     checkCompletedWithWrappedCFException(h);
2425    
2426     f = new CompletableFuture<>();
2427     g = new CompletableFuture<>();
2428     f.complete(3);
2429     g.completeExceptionally(new CFException());
2430     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2431     checkCompletedWithWrappedCFException(h);
2432    
2433     f = new CompletableFuture<>();
2434     g = new CompletableFuture<>();
2435 dl 1.5 f.completeExceptionally(new CFException());
2436 jsr166 1.22 g.complete(3);
2437     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2438     checkCompletedWithWrappedCFException(h);
2439 dl 1.5
2440 jsr166 1.22 assertEquals(0, e.count.get());
2441 dl 1.5 }
2442    
2443     /**
2444     * thenAcceptBothAsync result completes exceptionally if action does
2445     */
2446     public void testThenAcceptBothAsync3E() {
2447 jsr166 1.22 CompletableFuture<Integer> f, g;
2448     CompletableFuture<Void> h;
2449     FailingBiConsumer r;
2450     ThreadExecutor e = new ThreadExecutor();
2451    
2452     f = new CompletableFuture<>();
2453     g = new CompletableFuture<>();
2454     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e);
2455     f.complete(3);
2456     checkIncomplete(h);
2457     g.complete(1);
2458     checkCompletedWithWrappedCFException(h);
2459    
2460     f = new CompletableFuture<>();
2461     g = new CompletableFuture<>();
2462     f.complete(3);
2463     g.complete(1);
2464     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e);
2465     checkCompletedWithWrappedCFException(h);
2466    
2467     assertEquals(2, e.count.get());
2468 dl 1.5 }
2469 jsr166 1.6
2470 dl 1.5 /**
2471     * thenAcceptBothAsync result completes exceptionally if either source cancelled
2472     */
2473     public void testThenAcceptBothAsync4E() {
2474 jsr166 1.22 CompletableFuture<Integer> f, g;
2475     CompletableFuture<Void> h;
2476     SubtractAction r;
2477     ThreadExecutor e = new ThreadExecutor();
2478    
2479     f = new CompletableFuture<>();
2480     g = new CompletableFuture<>();
2481     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2482 dl 1.5 assertTrue(f.cancel(true));
2483 jsr166 1.22 checkIncomplete(h);
2484     g.complete(1);
2485     checkCompletedWithWrappedCancellationException(h);
2486    
2487     f = new CompletableFuture<>();
2488     g = new CompletableFuture<>();
2489     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2490     assertTrue(g.cancel(true));
2491     checkIncomplete(h);
2492     f.complete(3);
2493     checkCompletedWithWrappedCancellationException(h);
2494    
2495     f = new CompletableFuture<>();
2496     g = new CompletableFuture<>();
2497     f.complete(3);
2498     assertTrue(g.cancel(true));
2499     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2500     checkCompletedWithWrappedCancellationException(h);
2501    
2502     f = new CompletableFuture<>();
2503     g = new CompletableFuture<>();
2504     assertTrue(f.cancel(true));
2505     g.complete(3);
2506     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2507     checkCompletedWithWrappedCancellationException(h);
2508 jsr166 1.6
2509 jsr166 1.22 assertEquals(0, e.count.get());
2510 dl 1.5 }
2511    
2512     /**
2513     * runAfterBothAsync result completes normally after normal
2514     * completion of sources
2515     */
2516     public void testRunAfterBothAsyncE() {
2517 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2518     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2519 dl 1.5 Noop r = new Noop();
2520     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2521     f.complete(one);
2522     checkIncomplete(g);
2523     f2.complete(two);
2524     checkCompletedNormally(g, null);
2525     assertTrue(r.ran);
2526     }
2527    
2528     /**
2529     * runAfterBothAsync result completes exceptionally after exceptional
2530     * completion of source
2531     */
2532     public void testRunAfterBothAsync2E() {
2533 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2534     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2535 dl 1.5 Noop r = new Noop();
2536     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2537     f.completeExceptionally(new CFException());
2538     f2.complete(two);
2539     checkCompletedWithWrappedCFException(g);
2540    
2541     r = new Noop();
2542 jsr166 1.22 f = new CompletableFuture<>();
2543     f2 = new CompletableFuture<>();
2544 dl 1.5 g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2545     f.complete(one);
2546     f2.completeExceptionally(new CFException());
2547     checkCompletedWithWrappedCFException(g);
2548     }
2549    
2550     /**
2551     * runAfterBothAsync result completes exceptionally if action does
2552     */
2553     public void testRunAfterBothAsync3E() {
2554 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2555     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2556 dl 1.5 FailingNoop r = new FailingNoop();
2557 jsr166 1.6 CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2558 dl 1.5 f.complete(one);
2559     checkIncomplete(g);
2560     f2.complete(two);
2561     checkCompletedWithWrappedCFException(g);
2562     }
2563 jsr166 1.6
2564 dl 1.5 /**
2565     * runAfterBothAsync result completes exceptionally if either source cancelled
2566     */
2567     public void testRunAfterBothAsync4E() {
2568 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2569     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2570 dl 1.5 Noop r = new Noop();
2571     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2572     assertTrue(f.cancel(true));
2573     f2.complete(two);
2574     checkCompletedWithWrappedCancellationException(g);
2575 jsr166 1.6
2576 dl 1.5 r = new Noop();
2577 jsr166 1.22 f = new CompletableFuture<>();
2578     f2 = new CompletableFuture<>();
2579 dl 1.5 g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2580     f.complete(one);
2581     assertTrue(f2.cancel(true));
2582     checkCompletedWithWrappedCancellationException(g);
2583     }
2584    
2585     /**
2586     * applyToEitherAsync result completes normally after normal
2587     * completion of sources
2588     */
2589     public void testApplyToEitherAsyncE() {
2590 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2591     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2592 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2593     f.complete(one);
2594     checkCompletedNormally(g, two);
2595    
2596 jsr166 1.22 f = new CompletableFuture<>();
2597 dl 1.5 f.complete(one);
2598 jsr166 1.22 f2 = new CompletableFuture<>();
2599 dl 1.5 g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2600     checkCompletedNormally(g, two);
2601     }
2602    
2603     /**
2604     * applyToEitherAsync result completes exceptionally after exceptional
2605     * completion of source
2606     */
2607     public void testApplyToEitherAsync2E() {
2608 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2609     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2610 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2611     f.completeExceptionally(new CFException());
2612     checkCompletedWithWrappedCFException(g);
2613    
2614 jsr166 1.22 f = new CompletableFuture<>();
2615     f2 = new CompletableFuture<>();
2616 dl 1.5 f2.completeExceptionally(new CFException());
2617     g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2618     f.complete(one);
2619     checkCompletedWithWrappedCFException(g);
2620     }
2621    
2622     /**
2623     * applyToEitherAsync result completes exceptionally if action does
2624     */
2625     public void testApplyToEitherAsync3E() {
2626 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2627     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2628 dl 1.5 FailingFunction r = new FailingFunction();
2629 jsr166 1.6 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, r, new ThreadExecutor());
2630 dl 1.5 f.complete(one);
2631     checkCompletedWithWrappedCFException(g);
2632     }
2633 jsr166 1.6
2634 dl 1.5 /**
2635     * applyToEitherAsync result completes exceptionally if either source cancelled
2636     */
2637     public void testApplyToEitherAsync4E() {
2638 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2639     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2640 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2641     assertTrue(f.cancel(true));
2642     checkCompletedWithWrappedCancellationException(g);
2643 jsr166 1.6
2644 jsr166 1.22 f = new CompletableFuture<>();
2645     f2 = new CompletableFuture<>();
2646 dl 1.5 assertTrue(f2.cancel(true));
2647     g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2648     checkCompletedWithWrappedCancellationException(g);
2649     }
2650    
2651     /**
2652     * acceptEitherAsync result completes normally after normal
2653     * completion of sources
2654     */
2655     public void testAcceptEitherAsyncE() {
2656 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2657     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2658 dl 1.5 IncAction r = new IncAction();
2659     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2660     f.complete(one);
2661     checkCompletedNormally(g, null);
2662     assertEquals(r.value, 2);
2663    
2664     r = new IncAction();
2665 jsr166 1.22 f = new CompletableFuture<>();
2666 dl 1.5 f.complete(one);
2667 jsr166 1.22 f2 = new CompletableFuture<>();
2668 dl 1.5 g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2669     checkCompletedNormally(g, null);
2670     assertEquals(r.value, 2);
2671     }
2672    
2673     /**
2674     * acceptEitherAsync result completes exceptionally after exceptional
2675     * completion of source
2676     */
2677     public void testAcceptEitherAsync2E() {
2678 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2679     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2680 dl 1.5 IncAction r = new IncAction();
2681     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2682     f.completeExceptionally(new CFException());
2683     checkCompletedWithWrappedCFException(g);
2684    
2685     r = new IncAction();
2686 jsr166 1.22 f = new CompletableFuture<>();
2687     f2 = new CompletableFuture<>();
2688 dl 1.5 f2.completeExceptionally(new CFException());
2689     g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2690     f.complete(one);
2691     checkCompletedWithWrappedCFException(g);
2692     }
2693    
2694     /**
2695     * acceptEitherAsync result completes exceptionally if action does
2696     */
2697     public void testAcceptEitherAsync3E() {
2698 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2699     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2700 dl 1.5 FailingConsumer r = new FailingConsumer();
2701 jsr166 1.6 CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2702 dl 1.5 f.complete(one);
2703     checkCompletedWithWrappedCFException(g);
2704     }
2705 jsr166 1.6
2706 dl 1.5 /**
2707     * acceptEitherAsync result completes exceptionally if either
2708     * source cancelled
2709     */
2710     public void testAcceptEitherAsync4E() {
2711 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2712     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2713 dl 1.5 IncAction r = new IncAction();
2714     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2715     assertTrue(f.cancel(true));
2716     checkCompletedWithWrappedCancellationException(g);
2717 jsr166 1.6
2718 dl 1.5 r = new IncAction();
2719 jsr166 1.22 f = new CompletableFuture<>();
2720     f2 = new CompletableFuture<>();
2721 dl 1.5 assertTrue(f2.cancel(true));
2722     g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2723     checkCompletedWithWrappedCancellationException(g);
2724     }
2725    
2726     /**
2727     * runAfterEitherAsync result completes normally after normal
2728     * completion of sources
2729     */
2730     public void testRunAfterEitherAsyncE() {
2731 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2732     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2733 dl 1.5 Noop r = new Noop();
2734     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2735     f.complete(one);
2736     checkCompletedNormally(g, null);
2737     assertTrue(r.ran);
2738    
2739     r = new Noop();
2740 jsr166 1.22 f = new CompletableFuture<>();
2741 dl 1.5 f.complete(one);
2742 jsr166 1.22 f2 = new CompletableFuture<>();
2743 dl 1.5 g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2744     checkCompletedNormally(g, null);
2745     assertTrue(r.ran);
2746     }
2747    
2748     /**
2749     * runAfterEitherAsync result completes exceptionally after exceptional
2750     * completion of source
2751     */
2752     public void testRunAfterEitherAsync2E() {
2753 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2754     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2755 dl 1.5 Noop r = new Noop();
2756     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2757     f.completeExceptionally(new CFException());
2758     checkCompletedWithWrappedCFException(g);
2759    
2760     r = new Noop();
2761 jsr166 1.22 f = new CompletableFuture<>();
2762     f2 = new CompletableFuture<>();
2763 dl 1.5 f2.completeExceptionally(new CFException());
2764     g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2765     f.complete(one);
2766     checkCompletedWithWrappedCFException(g);
2767     }
2768    
2769     /**
2770     * runAfterEitherAsync result completes exceptionally if action does
2771     */
2772     public void testRunAfterEitherAsync3E() {
2773 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2774     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2775 dl 1.5 FailingNoop r = new FailingNoop();
2776 jsr166 1.6 CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2777 dl 1.5 f.complete(one);
2778     checkCompletedWithWrappedCFException(g);
2779     }
2780 jsr166 1.6
2781 dl 1.5 /**
2782     * runAfterEitherAsync result completes exceptionally if either
2783     * source cancelled
2784     */
2785     public void testRunAfterEitherAsync4E() {
2786 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2787     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2788 dl 1.5 Noop r = new Noop();
2789     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2790     assertTrue(f.cancel(true));
2791     checkCompletedWithWrappedCancellationException(g);
2792 jsr166 1.6
2793 dl 1.5 r = new Noop();
2794 jsr166 1.22 f = new CompletableFuture<>();
2795     f2 = new CompletableFuture<>();
2796 dl 1.5 assertTrue(f2.cancel(true));
2797     g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2798     checkCompletedWithWrappedCancellationException(g);
2799     }
2800    
2801     /**
2802 jsr166 1.7 * thenComposeAsync result completes normally after normal
2803     * completion of source
2804 dl 1.5 */
2805     public void testThenComposeAsyncE() {
2806 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2807 dl 1.5 CompletableFutureInc r = new CompletableFutureInc();
2808     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2809     f.complete(one);
2810     checkCompletedNormally(g, two);
2811     }
2812    
2813     /**
2814 jsr166 1.7 * thenComposeAsync result completes exceptionally after
2815     * exceptional completion of source
2816 dl 1.5 */
2817     public void testThenComposeAsync2E() {
2818 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2819 dl 1.5 CompletableFutureInc r = new CompletableFutureInc();
2820     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2821     f.completeExceptionally(new CFException());
2822     checkCompletedWithWrappedCFException(g);
2823     }
2824    
2825     /**
2826     * thenComposeAsync result completes exceptionally if action does
2827     */
2828     public void testThenComposeAsync3E() {
2829 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2830 dl 1.5 FailingCompletableFutureFunction r = new FailingCompletableFutureFunction();
2831     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2832     f.complete(one);
2833     checkCompletedWithWrappedCFException(g);
2834     }
2835    
2836     /**
2837     * thenComposeAsync result completes exceptionally if source cancelled
2838     */
2839     public void testThenComposeAsync4E() {
2840 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2841 dl 1.5 CompletableFutureInc r = new CompletableFutureInc();
2842     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2843     assertTrue(f.cancel(true));
2844     checkCompletedWithWrappedCancellationException(g);
2845     }
2846    
2847 jsr166 1.6 // other static methods
2848 dl 1.5
2849     /**
2850     * allOf(no component futures) returns a future completed normally
2851     * with the value null
2852     */
2853     public void testAllOf_empty() throws Exception {
2854 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
2855 dl 1.5 checkCompletedNormally(f, null);
2856     }
2857    
2858     /**
2859 jsr166 1.25 * allOf returns a future completed normally with the value null
2860     * when all components complete normally
2861 dl 1.5 */
2862 jsr166 1.25 public void testAllOf_normal() throws Exception {
2863 dl 1.5 for (int k = 1; k < 20; ++k) {
2864 jsr166 1.22 CompletableFuture<Integer>[] fs = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2865 jsr166 1.6 for (int i = 0; i < k; ++i)
2866 jsr166 1.22 fs[i] = new CompletableFuture<>();
2867 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2868 dl 1.5 for (int i = 0; i < k; ++i) {
2869     checkIncomplete(f);
2870 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
2871 dl 1.5 fs[i].complete(one);
2872     }
2873 dl 1.9 checkCompletedNormally(f, null);
2874 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
2875 dl 1.5 }
2876     }
2877    
2878     /**
2879     * anyOf(no component futures) returns an incomplete future
2880     */
2881     public void testAnyOf_empty() throws Exception {
2882 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
2883 dl 1.5 checkIncomplete(f);
2884     }
2885    
2886     /**
2887 jsr166 1.25 * anyOf returns a future completed normally with a value when
2888     * a component future does
2889 dl 1.5 */
2890 jsr166 1.24 public void testAnyOf_normal() throws Exception {
2891     for (int k = 0; k < 10; ++k) {
2892 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
2893 jsr166 1.6 for (int i = 0; i < k; ++i)
2894 jsr166 1.22 fs[i] = new CompletableFuture<>();
2895 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2896 dl 1.5 checkIncomplete(f);
2897     for (int i = 0; i < k; ++i) {
2898     fs[i].complete(one);
2899 dl 1.9 checkCompletedNormally(f, one);
2900 jsr166 1.24 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
2901     }
2902     }
2903     }
2904    
2905     /**
2906     * anyOf result completes exceptionally when any component does.
2907     */
2908     public void testAnyOf_exceptional() throws Exception {
2909     for (int k = 0; k < 10; ++k) {
2910     CompletableFuture[] fs = new CompletableFuture[k];
2911     for (int i = 0; i < k; ++i)
2912     fs[i] = new CompletableFuture<>();
2913     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2914     checkIncomplete(f);
2915     for (int i = 0; i < k; ++i) {
2916     fs[i].completeExceptionally(new CFException());
2917     checkCompletedWithWrappedCFException(f);
2918     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
2919 dl 1.5 }
2920     }
2921     }
2922    
2923     /**
2924     * Completion methods throw NullPointerException with null arguments
2925     */
2926     public void testNPE() {
2927 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2928     CompletableFuture<Integer> g = new CompletableFuture<>();
2929 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
2930     CompletableFuture<?> h;
2931 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
2932 jsr166 1.14
2933     Runnable[] throwingActions = {
2934 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
2935     () -> CompletableFuture.supplyAsync(null, exec),
2936     () -> CompletableFuture.supplyAsync(supplyOne, null),
2937    
2938     () -> CompletableFuture.runAsync(null),
2939     () -> CompletableFuture.runAsync(null, exec),
2940     () -> CompletableFuture.runAsync(() -> {}, null),
2941    
2942     () -> f.completeExceptionally(null),
2943    
2944     () -> f.thenApply(null),
2945     () -> f.thenApplyAsync(null),
2946     () -> f.thenApplyAsync((x) -> x, null),
2947     () -> f.thenApplyAsync(null, exec),
2948    
2949     () -> f.thenAccept(null),
2950     () -> f.thenAcceptAsync(null),
2951     () -> f.thenAcceptAsync((x) -> {} , null),
2952     () -> f.thenAcceptAsync(null, exec),
2953    
2954     () -> f.thenRun(null),
2955     () -> f.thenRunAsync(null),
2956     () -> f.thenRunAsync(() -> {} , null),
2957     () -> f.thenRunAsync(null, exec),
2958    
2959     () -> f.thenCombine(g, null),
2960     () -> f.thenCombineAsync(g, null),
2961     () -> f.thenCombineAsync(g, null, exec),
2962     () -> f.thenCombine(nullFuture, (x, y) -> x),
2963     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
2964     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
2965     () -> f.thenCombineAsync(g, (x, y) -> x, null),
2966    
2967     () -> f.thenAcceptBoth(g, null),
2968     () -> f.thenAcceptBothAsync(g, null),
2969     () -> f.thenAcceptBothAsync(g, null, exec),
2970     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
2971     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
2972     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
2973     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
2974    
2975     () -> f.runAfterBoth(g, null),
2976     () -> f.runAfterBothAsync(g, null),
2977     () -> f.runAfterBothAsync(g, null, exec),
2978     () -> f.runAfterBoth(nullFuture, () -> {}),
2979     () -> f.runAfterBothAsync(nullFuture, () -> {}),
2980     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
2981     () -> f.runAfterBothAsync(g, () -> {}, null),
2982    
2983     () -> f.applyToEither(g, null),
2984     () -> f.applyToEitherAsync(g, null),
2985     () -> f.applyToEitherAsync(g, null, exec),
2986     () -> f.applyToEither(nullFuture, (x) -> x),
2987     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
2988     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
2989     () -> f.applyToEitherAsync(g, (x) -> x, null),
2990    
2991     () -> f.acceptEither(g, null),
2992     () -> f.acceptEitherAsync(g, null),
2993     () -> f.acceptEitherAsync(g, null, exec),
2994     () -> f.acceptEither(nullFuture, (x) -> {}),
2995     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
2996     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
2997     () -> f.acceptEitherAsync(g, (x) -> {}, null),
2998    
2999     () -> f.runAfterEither(g, null),
3000     () -> f.runAfterEitherAsync(g, null),
3001     () -> f.runAfterEitherAsync(g, null, exec),
3002     () -> f.runAfterEither(nullFuture, () -> {}),
3003     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3004     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3005     () -> f.runAfterEitherAsync(g, () -> {}, null),
3006    
3007     () -> f.thenCompose(null),
3008     () -> f.thenComposeAsync(null),
3009     () -> f.thenComposeAsync(new CompletableFutureInc(), null),
3010     () -> f.thenComposeAsync(null, exec),
3011    
3012     () -> f.exceptionally(null),
3013    
3014     () -> f.handle(null),
3015    
3016     () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3017     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3018     () -> CompletableFuture.allOf(f, null),
3019     () -> CompletableFuture.allOf(null, f),
3020    
3021     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3022     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3023     () -> CompletableFuture.anyOf(f, null),
3024     () -> CompletableFuture.anyOf(null, f),
3025 jsr166 1.32
3026     () -> f.obtrudeException(null),
3027 jsr166 1.14 };
3028 dl 1.5
3029 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3030 jsr166 1.17 assertEquals(0, exec.count.get());
3031 dl 1.5 }
3032    
3033 dl 1.26 /**
3034     * toCompletableFuture returns this CompletableFuture.
3035     */
3036     public void testToCompletableFuture() {
3037     CompletableFuture<Integer> f = new CompletableFuture<>();
3038     assertSame(f, f.toCompletableFuture());
3039     }
3040    
3041     /**
3042     * whenComplete action executes on normal completion, propagating
3043     * source result.
3044     */
3045     public void testWhenComplete1() {
3046     final AtomicInteger a = new AtomicInteger();
3047     CompletableFuture<Integer> f = new CompletableFuture<>();
3048     CompletableFuture<Integer> g =
3049     f.whenComplete((Integer x, Throwable t) -> a.getAndIncrement());
3050     f.complete(three);
3051     checkCompletedNormally(f, three);
3052     checkCompletedNormally(g, three);
3053     assertEquals(a.get(), 1);
3054     }
3055    
3056     /**
3057     * whenComplete action executes on exceptional completion, propagating
3058     * source result.
3059     */
3060     public void testWhenComplete2() {
3061     final AtomicInteger a = new AtomicInteger();
3062     CompletableFuture<Integer> f = new CompletableFuture<>();
3063     CompletableFuture<Integer> g =
3064     f.whenComplete((Integer x, Throwable t) -> a.getAndIncrement());
3065     f.completeExceptionally(new CFException());
3066     assertTrue(f.isCompletedExceptionally());
3067     assertTrue(g.isCompletedExceptionally());
3068     assertEquals(a.get(), 1);
3069     }
3070    
3071     /**
3072     * If a whenComplete action throws an exception when triggered by
3073     * a normal completion, it completes exceptionally
3074     */
3075     public void testWhenComplete3() {
3076     CompletableFuture<Integer> f = new CompletableFuture<>();
3077     CompletableFuture<Integer> g =
3078     f.whenComplete((Integer x, Throwable t) ->
3079     { throw new CFException(); } );
3080     f.complete(three);
3081     checkCompletedNormally(f, three);
3082     assertTrue(g.isCompletedExceptionally());
3083     checkCompletedWithWrappedCFException(g);
3084     }
3085    
3086     /**
3087     * whenCompleteAsync action executes on normal completion, propagating
3088     * source result.
3089     */
3090     public void testWhenCompleteAsync1() {
3091     final AtomicInteger a = new AtomicInteger();
3092     CompletableFuture<Integer> f = new CompletableFuture<>();
3093     CompletableFuture<Integer> g =
3094     f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement());
3095     f.complete(three);
3096     checkCompletedNormally(f, three);
3097     checkCompletedNormally(g, three);
3098     assertEquals(a.get(), 1);
3099     }
3100    
3101     /**
3102     * whenCompleteAsync action executes on exceptional completion, propagating
3103     * source result.
3104     */
3105     public void testWhenCompleteAsync2() {
3106     final AtomicInteger a = new AtomicInteger();
3107     CompletableFuture<Integer> f = new CompletableFuture<>();
3108     CompletableFuture<Integer> g =
3109     f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement());
3110     f.completeExceptionally(new CFException());
3111     checkCompletedWithWrappedCFException(f);
3112     checkCompletedWithWrappedCFException(g);
3113     }
3114    
3115     /**
3116     * If a whenCompleteAsync action throws an exception when
3117     * triggered by a normal completion, it completes exceptionally
3118     */
3119     public void testWhenCompleteAsync3() {
3120     CompletableFuture<Integer> f = new CompletableFuture<>();
3121     CompletableFuture<Integer> g =
3122     f.whenCompleteAsync((Integer x, Throwable t) ->
3123     { throw new CFException(); } );
3124     f.complete(three);
3125     checkCompletedNormally(f, three);
3126     checkCompletedWithWrappedCFException(g);
3127     }
3128    
3129     /**
3130     * whenCompleteAsync action executes on normal completion, propagating
3131     * source result.
3132     */
3133     public void testWhenCompleteAsync1e() {
3134     final AtomicInteger a = new AtomicInteger();
3135     ThreadExecutor exec = new ThreadExecutor();
3136     CompletableFuture<Integer> f = new CompletableFuture<>();
3137     CompletableFuture<Integer> g =
3138     f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement(),
3139     exec);
3140     f.complete(three);
3141     checkCompletedNormally(f, three);
3142     checkCompletedNormally(g, three);
3143     assertEquals(a.get(), 1);
3144     }
3145    
3146     /**
3147     * whenCompleteAsync action executes on exceptional completion, propagating
3148     * source result.
3149     */
3150     public void testWhenCompleteAsync2e() {
3151     final AtomicInteger a = new AtomicInteger();
3152     ThreadExecutor exec = new ThreadExecutor();
3153     CompletableFuture<Integer> f = new CompletableFuture<>();
3154     CompletableFuture<Integer> g =
3155     f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement(),
3156     exec);
3157     f.completeExceptionally(new CFException());
3158     checkCompletedWithWrappedCFException(f);
3159     checkCompletedWithWrappedCFException(g);
3160     }
3161    
3162     /**
3163     * If a whenCompleteAsync action throws an exception when triggered
3164     * by a normal completion, it completes exceptionally
3165     */
3166     public void testWhenCompleteAsync3e() {
3167     ThreadExecutor exec = new ThreadExecutor();
3168     CompletableFuture<Integer> f = new CompletableFuture<>();
3169     CompletableFuture<Integer> g =
3170     f.whenCompleteAsync((Integer x, Throwable t) ->
3171     { throw new CFException(); },
3172     exec);
3173     f.complete(three);
3174     checkCompletedNormally(f, three);
3175     checkCompletedWithWrappedCFException(g);
3176     }
3177    
3178     /**
3179 jsr166 1.27 * handleAsync action completes normally with function value on
3180     * either normal or exceptional completion of source
3181 dl 1.26 */
3182     public void testHandleAsync() {
3183     CompletableFuture<Integer> f, g;
3184     IntegerHandler r;
3185    
3186     f = new CompletableFuture<>();
3187     g = f.handleAsync(r = new IntegerHandler());
3188     assertFalse(r.ran);
3189     f.completeExceptionally(new CFException());
3190     checkCompletedWithWrappedCFException(f);
3191     checkCompletedNormally(g, three);
3192     assertTrue(r.ran);
3193    
3194     f = new CompletableFuture<>();
3195     g = f.handleAsync(r = new IntegerHandler());
3196     assertFalse(r.ran);
3197     f.completeExceptionally(new CFException());
3198     checkCompletedWithWrappedCFException(f);
3199     checkCompletedNormally(g, three);
3200     assertTrue(r.ran);
3201    
3202     f = new CompletableFuture<>();
3203     g = f.handleAsync(r = new IntegerHandler());
3204     assertFalse(r.ran);
3205     f.complete(one);
3206     checkCompletedNormally(f, one);
3207     checkCompletedNormally(g, two);
3208     assertTrue(r.ran);
3209    
3210     f = new CompletableFuture<>();
3211     g = f.handleAsync(r = new IntegerHandler());
3212     assertFalse(r.ran);
3213     f.complete(one);
3214     checkCompletedNormally(f, one);
3215     checkCompletedNormally(g, two);
3216     assertTrue(r.ran);
3217     }
3218    
3219     /**
3220     * handleAsync action with Executor completes normally with
3221     * function value on either normal or exceptional completion of
3222     * source
3223     */
3224     public void testHandleAsync2() {
3225     CompletableFuture<Integer> f, g;
3226     ThreadExecutor exec = new ThreadExecutor();
3227     IntegerHandler r;
3228    
3229     f = new CompletableFuture<>();
3230     g = f.handleAsync(r = new IntegerHandler(), exec);
3231     assertFalse(r.ran);
3232     f.completeExceptionally(new CFException());
3233     checkCompletedWithWrappedCFException(f);
3234     checkCompletedNormally(g, three);
3235     assertTrue(r.ran);
3236    
3237     f = new CompletableFuture<>();
3238     g = f.handleAsync(r = new IntegerHandler(), exec);
3239     assertFalse(r.ran);
3240     f.completeExceptionally(new CFException());
3241     checkCompletedWithWrappedCFException(f);
3242     checkCompletedNormally(g, three);
3243     assertTrue(r.ran);
3244    
3245     f = new CompletableFuture<>();
3246     g = f.handleAsync(r = new IntegerHandler(), exec);
3247     assertFalse(r.ran);
3248     f.complete(one);
3249     checkCompletedNormally(f, one);
3250     checkCompletedNormally(g, two);
3251     assertTrue(r.ran);
3252    
3253     f = new CompletableFuture<>();
3254     g = f.handleAsync(r = new IntegerHandler(), exec);
3255     assertFalse(r.ran);
3256     f.complete(one);
3257     checkCompletedNormally(f, one);
3258     checkCompletedNormally(g, two);
3259     assertTrue(r.ran);
3260     }
3261    
3262 jsr166 1.1 }