ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.28
Committed: Sun Jul 14 16:34:49 2013 UTC (10 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.27: +0 -7 lines
Log Message:
whitespace

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     * exception; otherwise with source value
379     */
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.6 } catch (Exception ok) {
1352 dl 1.5 }
1353     checkCompletedWithWrappedCFException(g);
1354     }
1355    
1356     /**
1357     * thenRunAsync result completes exceptionally if action does
1358     */
1359     public void testThenRunAsync3() {
1360 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1361 dl 1.5 FailingNoop r = new FailingNoop();
1362     CompletableFuture<Void> g = f.thenRunAsync(r);
1363     f.complete(null);
1364     checkCompletedWithWrappedCFException(g);
1365     }
1366 jsr166 1.6
1367 dl 1.5 /**
1368     * thenRunAsync result completes exceptionally if source cancelled
1369     */
1370     public void testThenRunAsync4() {
1371 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1372 dl 1.5 Noop r = new Noop();
1373     CompletableFuture<Void> g = f.thenRunAsync(r);
1374     assertTrue(f.cancel(true));
1375     checkCompletedWithWrappedCancellationException(g);
1376     }
1377    
1378     /**
1379     * thenApplyAsync result completes normally after normal completion of source
1380     */
1381     public void testThenApplyAsync() {
1382 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1383 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1384     f.complete(one);
1385     checkCompletedNormally(g, two);
1386     }
1387    
1388     /**
1389     * thenApplyAsync result completes exceptionally after exceptional
1390     * completion of source
1391     */
1392     public void testThenApplyAsync2() {
1393 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1394 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1395     f.completeExceptionally(new CFException());
1396     checkCompletedWithWrappedCFException(g);
1397     }
1398    
1399     /**
1400     * thenApplyAsync result completes exceptionally if action does
1401     */
1402     public void testThenApplyAsync3() {
1403 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1404 dl 1.5 FailingFunction r = new FailingFunction();
1405     CompletableFuture<Integer> g = f.thenApplyAsync(r);
1406     f.complete(null);
1407     checkCompletedWithWrappedCFException(g);
1408     }
1409 jsr166 1.6
1410 dl 1.5 /**
1411     * thenApplyAsync result completes exceptionally if source cancelled
1412     */
1413     public void testThenApplyAsync4() {
1414 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1415 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1416     assertTrue(f.cancel(true));
1417     checkCompletedWithWrappedCancellationException(g);
1418     }
1419    
1420     /**
1421     * thenAcceptAsync result completes normally after normal
1422     * completion of source
1423     */
1424     public void testThenAcceptAsync() {
1425 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1426 dl 1.5 IncAction r = new IncAction();
1427     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1428     f.complete(one);
1429     checkCompletedNormally(g, null);
1430     assertEquals(r.value, 2);
1431     }
1432    
1433     /**
1434     * thenAcceptAsync result completes exceptionally after exceptional
1435     * completion of source
1436     */
1437     public void testThenAcceptAsync2() {
1438 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1439 dl 1.5 IncAction r = new IncAction();
1440     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1441     f.completeExceptionally(new CFException());
1442     checkCompletedWithWrappedCFException(g);
1443     }
1444    
1445     /**
1446     * thenAcceptAsync result completes exceptionally if action does
1447     */
1448     public void testThenAcceptAsync3() {
1449 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1450 dl 1.5 FailingConsumer r = new FailingConsumer();
1451     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1452     f.complete(null);
1453     checkCompletedWithWrappedCFException(g);
1454     }
1455 jsr166 1.6
1456 dl 1.5 /**
1457     * thenAcceptAsync result completes exceptionally if source cancelled
1458     */
1459     public void testThenAcceptAsync4() {
1460 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1461 dl 1.5 IncAction r = new IncAction();
1462     CompletableFuture<Void> g = f.thenAcceptAsync(r);
1463     assertTrue(f.cancel(true));
1464     checkCompletedWithWrappedCancellationException(g);
1465     }
1466 jsr166 1.19
1467 dl 1.5 /**
1468     * thenCombineAsync result completes normally after normal
1469     * completion of sources
1470     */
1471     public void testThenCombineAsync() {
1472 jsr166 1.18 CompletableFuture<Integer> f, g, h;
1473    
1474 jsr166 1.22 f = new CompletableFuture<>();
1475     g = new CompletableFuture<>();
1476 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1477     f.complete(3);
1478     checkIncomplete(h);
1479     g.complete(1);
1480     checkCompletedNormally(h, 2);
1481    
1482 jsr166 1.22 f = new CompletableFuture<>();
1483     g = new CompletableFuture<>();
1484 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1485     g.complete(1);
1486     checkIncomplete(h);
1487     f.complete(3);
1488     checkCompletedNormally(h, 2);
1489    
1490 jsr166 1.22 f = new CompletableFuture<>();
1491     g = new CompletableFuture<>();
1492 jsr166 1.18 g.complete(1);
1493     f.complete(3);
1494     h = f.thenCombineAsync(g, subtract);
1495     checkCompletedNormally(h, 2);
1496 dl 1.5 }
1497    
1498     /**
1499     * thenCombineAsync result completes exceptionally after exceptional
1500 jsr166 1.18 * completion of either source
1501 dl 1.5 */
1502     public void testThenCombineAsync2() {
1503 jsr166 1.18 CompletableFuture<Integer> f, g, h;
1504    
1505 jsr166 1.22 f = new CompletableFuture<>();
1506     g = new CompletableFuture<>();
1507 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1508 dl 1.5 f.completeExceptionally(new CFException());
1509 jsr166 1.18 checkIncomplete(h);
1510     g.complete(1);
1511     checkCompletedWithWrappedCFException(h);
1512    
1513 jsr166 1.22 f = new CompletableFuture<>();
1514     g = new CompletableFuture<>();
1515 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1516     g.completeExceptionally(new CFException());
1517     checkIncomplete(h);
1518     f.complete(3);
1519     checkCompletedWithWrappedCFException(h);
1520 dl 1.5
1521 jsr166 1.22 f = new CompletableFuture<>();
1522     g = new CompletableFuture<>();
1523 jsr166 1.18 g.completeExceptionally(new CFException());
1524     f.complete(3);
1525     h = f.thenCombineAsync(g, subtract);
1526     checkCompletedWithWrappedCFException(h);
1527 dl 1.5 }
1528    
1529     /**
1530     * thenCombineAsync result completes exceptionally if action does
1531     */
1532     public void testThenCombineAsync3() {
1533 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1534     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1535 dl 1.5 FailingBiFunction r = new FailingBiFunction();
1536     CompletableFuture<Integer> g = f.thenCombineAsync(f2, r);
1537     f.complete(one);
1538     checkIncomplete(g);
1539 jsr166 1.18 assertFalse(r.ran);
1540 dl 1.5 f2.complete(two);
1541     checkCompletedWithWrappedCFException(g);
1542 jsr166 1.18 assertTrue(r.ran);
1543 dl 1.5 }
1544 jsr166 1.6
1545 dl 1.5 /**
1546     * thenCombineAsync result completes exceptionally if either source cancelled
1547     */
1548     public void testThenCombineAsync4() {
1549 jsr166 1.18 CompletableFuture<Integer> f, g, h;
1550    
1551 jsr166 1.22 f = new CompletableFuture<>();
1552     g = new CompletableFuture<>();
1553 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1554     assertTrue(f.cancel(true));
1555     checkIncomplete(h);
1556     g.complete(1);
1557     checkCompletedWithWrappedCancellationException(h);
1558    
1559 jsr166 1.22 f = new CompletableFuture<>();
1560     g = new CompletableFuture<>();
1561 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1562     assertTrue(g.cancel(true));
1563     checkIncomplete(h);
1564     f.complete(3);
1565     checkCompletedWithWrappedCancellationException(h);
1566    
1567 jsr166 1.22 f = new CompletableFuture<>();
1568     g = new CompletableFuture<>();
1569 jsr166 1.18 g.complete(3);
1570 dl 1.5 assertTrue(f.cancel(true));
1571 jsr166 1.18 h = f.thenCombineAsync(g, subtract);
1572     checkCompletedWithWrappedCancellationException(h);
1573 jsr166 1.6
1574 jsr166 1.22 f = new CompletableFuture<>();
1575     g = new CompletableFuture<>();
1576 jsr166 1.18 f.complete(3);
1577     assertTrue(g.cancel(true));
1578     h = f.thenCombineAsync(g, subtract);
1579     checkCompletedWithWrappedCancellationException(h);
1580 dl 1.5 }
1581    
1582     /**
1583     * thenAcceptBothAsync result completes normally after normal
1584     * completion of sources
1585     */
1586     public void testThenAcceptBothAsync() {
1587 jsr166 1.22 CompletableFuture<Integer> f, g;
1588     CompletableFuture<Void> h;
1589     SubtractAction r;
1590    
1591     f = new CompletableFuture<>();
1592     g = new CompletableFuture<>();
1593     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1594     f.complete(3);
1595     checkIncomplete(h);
1596     g.complete(1);
1597     checkCompletedNormally(h, null);
1598     assertEquals(r.value, 2);
1599    
1600     f = new CompletableFuture<>();
1601     g = new CompletableFuture<>();
1602     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1603     g.complete(1);
1604     checkIncomplete(h);
1605     f.complete(3);
1606     checkCompletedNormally(h, null);
1607     assertEquals(r.value, 2);
1608    
1609     f = new CompletableFuture<>();
1610     g = new CompletableFuture<>();
1611     g.complete(1);
1612     f.complete(3);
1613     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1614     checkCompletedNormally(h, null);
1615     assertEquals(r.value, 2);
1616 dl 1.5 }
1617    
1618     /**
1619     * thenAcceptBothAsync result completes exceptionally after exceptional
1620     * completion of source
1621     */
1622     public void testThenAcceptBothAsync2() {
1623 jsr166 1.22 CompletableFuture<Integer> f, g;
1624     CompletableFuture<Void> h;
1625     SubtractAction r;
1626    
1627     f = new CompletableFuture<>();
1628     g = new CompletableFuture<>();
1629     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1630 dl 1.5 f.completeExceptionally(new CFException());
1631 jsr166 1.22 checkIncomplete(h);
1632     g.complete(1);
1633     checkCompletedWithWrappedCFException(h);
1634    
1635     f = new CompletableFuture<>();
1636     g = new CompletableFuture<>();
1637     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1638     g.completeExceptionally(new CFException());
1639     checkIncomplete(h);
1640     f.complete(3);
1641     checkCompletedWithWrappedCFException(h);
1642    
1643     f = new CompletableFuture<>();
1644     g = new CompletableFuture<>();
1645     f.complete(3);
1646     g.completeExceptionally(new CFException());
1647     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1648     checkCompletedWithWrappedCFException(h);
1649 dl 1.5
1650 jsr166 1.22 f = new CompletableFuture<>();
1651     g = new CompletableFuture<>();
1652     f.completeExceptionally(new CFException());
1653     g.complete(3);
1654     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1655     checkCompletedWithWrappedCFException(h);
1656 dl 1.5 }
1657    
1658     /**
1659     * thenAcceptBothAsync result completes exceptionally if action does
1660     */
1661     public void testThenAcceptBothAsync3() {
1662 jsr166 1.22 CompletableFuture<Integer> f, g;
1663     CompletableFuture<Void> h;
1664     FailingBiConsumer r;
1665    
1666     f = new CompletableFuture<>();
1667     g = new CompletableFuture<>();
1668     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer());
1669     f.complete(3);
1670     checkIncomplete(h);
1671     g.complete(1);
1672     checkCompletedWithWrappedCFException(h);
1673    
1674     f = new CompletableFuture<>();
1675     g = new CompletableFuture<>();
1676     f.complete(3);
1677     g.complete(1);
1678     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer());
1679     checkCompletedWithWrappedCFException(h);
1680 dl 1.5 }
1681 jsr166 1.6
1682 dl 1.5 /**
1683     * thenAcceptBothAsync result completes exceptionally if either source cancelled
1684     */
1685     public void testThenAcceptBothAsync4() {
1686 jsr166 1.22 CompletableFuture<Integer> f, g;
1687     CompletableFuture<Void> h;
1688     SubtractAction r;
1689    
1690     f = new CompletableFuture<>();
1691     g = new CompletableFuture<>();
1692     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1693 dl 1.5 assertTrue(f.cancel(true));
1694 jsr166 1.22 checkIncomplete(h);
1695     g.complete(1);
1696     checkCompletedWithWrappedCancellationException(h);
1697    
1698     f = new CompletableFuture<>();
1699     g = new CompletableFuture<>();
1700     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1701     assertTrue(g.cancel(true));
1702     checkIncomplete(h);
1703     f.complete(3);
1704     checkCompletedWithWrappedCancellationException(h);
1705    
1706     f = new CompletableFuture<>();
1707     g = new CompletableFuture<>();
1708     f.complete(3);
1709     assertTrue(g.cancel(true));
1710     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1711     checkCompletedWithWrappedCancellationException(h);
1712 jsr166 1.6
1713 jsr166 1.22 f = new CompletableFuture<>();
1714     g = new CompletableFuture<>();
1715     assertTrue(f.cancel(true));
1716     g.complete(3);
1717     h = f.thenAcceptBothAsync(g, r = new SubtractAction());
1718     checkCompletedWithWrappedCancellationException(h);
1719 dl 1.5 }
1720    
1721     /**
1722     * runAfterBothAsync result completes normally after normal
1723     * completion of sources
1724     */
1725     public void testRunAfterBothAsync() {
1726 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1727     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1728 dl 1.5 Noop r = new Noop();
1729     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1730     f.complete(one);
1731     checkIncomplete(g);
1732     f2.complete(two);
1733     checkCompletedNormally(g, null);
1734     assertTrue(r.ran);
1735     }
1736    
1737     /**
1738     * runAfterBothAsync result completes exceptionally after exceptional
1739     * completion of source
1740     */
1741     public void testRunAfterBothAsync2() {
1742 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1743     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1744 dl 1.5 Noop r = new Noop();
1745     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1746     f.completeExceptionally(new CFException());
1747     f2.complete(two);
1748     checkCompletedWithWrappedCFException(g);
1749    
1750     r = new Noop();
1751 jsr166 1.22 f = new CompletableFuture<>();
1752     f2 = new CompletableFuture<>();
1753 dl 1.5 g = f.runAfterBothAsync(f2, r);
1754     f.complete(one);
1755     f2.completeExceptionally(new CFException());
1756     checkCompletedWithWrappedCFException(g);
1757     }
1758    
1759     /**
1760     * runAfterBothAsync result completes exceptionally if action does
1761     */
1762     public void testRunAfterBothAsync3() {
1763 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1764     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1765 dl 1.5 FailingNoop r = new FailingNoop();
1766 jsr166 1.6 CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1767 dl 1.5 f.complete(one);
1768     checkIncomplete(g);
1769     f2.complete(two);
1770     checkCompletedWithWrappedCFException(g);
1771     }
1772 jsr166 1.6
1773 dl 1.5 /**
1774     * runAfterBothAsync result completes exceptionally if either source cancelled
1775     */
1776     public void testRunAfterBothAsync4() {
1777 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1778     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1779 dl 1.5 Noop r = new Noop();
1780     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1781     assertTrue(f.cancel(true));
1782     f2.complete(two);
1783     checkCompletedWithWrappedCancellationException(g);
1784 jsr166 1.6
1785 dl 1.5 r = new Noop();
1786 jsr166 1.22 f = new CompletableFuture<>();
1787     f2 = new CompletableFuture<>();
1788 dl 1.5 g = f.runAfterBothAsync(f2, r);
1789     f.complete(one);
1790     assertTrue(f2.cancel(true));
1791     checkCompletedWithWrappedCancellationException(g);
1792     }
1793    
1794     /**
1795     * applyToEitherAsync result completes normally after normal
1796     * completion of sources
1797     */
1798     public void testApplyToEitherAsync() {
1799 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1800     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1801 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1802     f.complete(one);
1803     checkCompletedNormally(g, two);
1804    
1805 jsr166 1.22 f = new CompletableFuture<>();
1806 dl 1.5 f.complete(one);
1807 jsr166 1.22 f2 = new CompletableFuture<>();
1808 dl 1.5 g = f.applyToEitherAsync(f2, inc);
1809     checkCompletedNormally(g, two);
1810     }
1811    
1812     /**
1813     * applyToEitherAsync result completes exceptionally after exceptional
1814     * completion of source
1815     */
1816     public void testApplyToEitherAsync2() {
1817 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1818     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1819 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1820     f.completeExceptionally(new CFException());
1821     checkCompletedWithWrappedCFException(g);
1822    
1823 jsr166 1.22 f = new CompletableFuture<>();
1824     f2 = new CompletableFuture<>();
1825 dl 1.5 f2.completeExceptionally(new CFException());
1826     g = f.applyToEitherAsync(f2, inc);
1827     f.complete(one);
1828     checkCompletedWithWrappedCFException(g);
1829     }
1830    
1831     /**
1832     * applyToEitherAsync result completes exceptionally if action does
1833     */
1834     public void testApplyToEitherAsync3() {
1835 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1836     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1837 dl 1.5 FailingFunction r = new FailingFunction();
1838 jsr166 1.6 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, r);
1839 dl 1.5 f.complete(one);
1840     checkCompletedWithWrappedCFException(g);
1841     }
1842 jsr166 1.6
1843 dl 1.5 /**
1844     * applyToEitherAsync result completes exceptionally if either source cancelled
1845     */
1846     public void testApplyToEitherAsync4() {
1847 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1848     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1849 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1850     assertTrue(f.cancel(true));
1851     checkCompletedWithWrappedCancellationException(g);
1852 jsr166 1.6
1853 jsr166 1.22 f = new CompletableFuture<>();
1854     f2 = new CompletableFuture<>();
1855 dl 1.5 assertTrue(f2.cancel(true));
1856     g = f.applyToEitherAsync(f2, inc);
1857     checkCompletedWithWrappedCancellationException(g);
1858     }
1859    
1860     /**
1861     * acceptEitherAsync result completes normally after normal
1862     * completion of sources
1863     */
1864     public void testAcceptEitherAsync() {
1865 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1866     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1867 dl 1.5 IncAction r = new IncAction();
1868     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1869     f.complete(one);
1870     checkCompletedNormally(g, null);
1871     assertEquals(r.value, 2);
1872    
1873     r = new IncAction();
1874 jsr166 1.22 f = new CompletableFuture<>();
1875 dl 1.5 f.complete(one);
1876 jsr166 1.22 f2 = new CompletableFuture<>();
1877 dl 1.5 g = f.acceptEitherAsync(f2, r);
1878     checkCompletedNormally(g, null);
1879     assertEquals(r.value, 2);
1880     }
1881    
1882     /**
1883     * acceptEitherAsync result completes exceptionally after exceptional
1884     * completion of source
1885     */
1886     public void testAcceptEitherAsync2() {
1887 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1888     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1889 dl 1.5 IncAction r = new IncAction();
1890     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1891     f.completeExceptionally(new CFException());
1892     checkCompletedWithWrappedCFException(g);
1893    
1894     r = new IncAction();
1895 jsr166 1.22 f = new CompletableFuture<>();
1896     f2 = new CompletableFuture<>();
1897 dl 1.5 f2.completeExceptionally(new CFException());
1898     g = f.acceptEitherAsync(f2, r);
1899     f.complete(one);
1900     checkCompletedWithWrappedCFException(g);
1901     }
1902    
1903     /**
1904     * acceptEitherAsync result completes exceptionally if action does
1905     */
1906     public void testAcceptEitherAsync3() {
1907 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1908     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1909 dl 1.5 FailingConsumer r = new FailingConsumer();
1910 jsr166 1.6 CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1911 dl 1.5 f.complete(one);
1912     checkCompletedWithWrappedCFException(g);
1913     }
1914 jsr166 1.6
1915 dl 1.5 /**
1916     * acceptEitherAsync result completes exceptionally if either
1917     * source cancelled
1918     */
1919     public void testAcceptEitherAsync4() {
1920 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1921     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1922 dl 1.5 IncAction r = new IncAction();
1923     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1924     assertTrue(f.cancel(true));
1925     checkCompletedWithWrappedCancellationException(g);
1926 jsr166 1.6
1927 dl 1.5 r = new IncAction();
1928 jsr166 1.22 f = new CompletableFuture<>();
1929     f2 = new CompletableFuture<>();
1930 dl 1.5 assertTrue(f2.cancel(true));
1931     g = f.acceptEitherAsync(f2, r);
1932     checkCompletedWithWrappedCancellationException(g);
1933     }
1934    
1935     /**
1936     * runAfterEitherAsync result completes normally after normal
1937     * completion of sources
1938     */
1939     public void testRunAfterEitherAsync() {
1940 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1941     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1942 dl 1.5 Noop r = new Noop();
1943     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1944     f.complete(one);
1945     checkCompletedNormally(g, null);
1946     assertTrue(r.ran);
1947    
1948     r = new Noop();
1949 jsr166 1.22 f = new CompletableFuture<>();
1950 dl 1.5 f.complete(one);
1951 jsr166 1.22 f2 = new CompletableFuture<>();
1952 dl 1.5 g = f.runAfterEitherAsync(f2, r);
1953     checkCompletedNormally(g, null);
1954     assertTrue(r.ran);
1955     }
1956    
1957     /**
1958     * runAfterEitherAsync result completes exceptionally after exceptional
1959     * completion of source
1960     */
1961     public void testRunAfterEitherAsync2() {
1962 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1963     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1964 dl 1.5 Noop r = new Noop();
1965     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1966     f.completeExceptionally(new CFException());
1967     checkCompletedWithWrappedCFException(g);
1968    
1969     r = new Noop();
1970 jsr166 1.22 f = new CompletableFuture<>();
1971     f2 = new CompletableFuture<>();
1972 dl 1.5 f2.completeExceptionally(new CFException());
1973     g = f.runAfterEitherAsync(f2, r);
1974     f.complete(one);
1975     checkCompletedWithWrappedCFException(g);
1976     }
1977    
1978     /**
1979     * runAfterEitherAsync result completes exceptionally if action does
1980     */
1981     public void testRunAfterEitherAsync3() {
1982 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1983     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1984 dl 1.5 FailingNoop r = new FailingNoop();
1985 jsr166 1.6 CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1986 dl 1.5 f.complete(one);
1987     checkCompletedWithWrappedCFException(g);
1988     }
1989 jsr166 1.6
1990 dl 1.5 /**
1991     * runAfterEitherAsync result completes exceptionally if either
1992     * source cancelled
1993     */
1994     public void testRunAfterEitherAsync4() {
1995 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1996     CompletableFuture<Integer> f2 = new CompletableFuture<>();
1997 dl 1.5 Noop r = new Noop();
1998     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1999     assertTrue(f.cancel(true));
2000     checkCompletedWithWrappedCancellationException(g);
2001 jsr166 1.6
2002 dl 1.5 r = new Noop();
2003 jsr166 1.22 f = new CompletableFuture<>();
2004     f2 = new CompletableFuture<>();
2005 dl 1.5 assertTrue(f2.cancel(true));
2006     g = f.runAfterEitherAsync(f2, r);
2007     checkCompletedWithWrappedCancellationException(g);
2008     }
2009    
2010     /**
2011 jsr166 1.7 * thenComposeAsync result completes normally after normal
2012     * completion of source
2013 dl 1.5 */
2014     public void testThenComposeAsync() {
2015 jsr166 1.20 CompletableFuture<Integer> f, g;
2016     CompletableFutureInc r;
2017    
2018 jsr166 1.22 f = new CompletableFuture<>();
2019 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2020     f.complete(one);
2021     checkCompletedNormally(g, two);
2022    
2023 jsr166 1.22 f = new CompletableFuture<>();
2024 dl 1.5 f.complete(one);
2025 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2026 dl 1.5 checkCompletedNormally(g, two);
2027     }
2028    
2029     /**
2030 jsr166 1.7 * thenComposeAsync result completes exceptionally after
2031     * exceptional completion of source
2032 dl 1.5 */
2033     public void testThenComposeAsync2() {
2034 jsr166 1.20 CompletableFuture<Integer> f, g;
2035     CompletableFutureInc r;
2036    
2037 jsr166 1.22 f = new CompletableFuture<>();
2038 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2039     f.completeExceptionally(new CFException());
2040     checkCompletedWithWrappedCFException(g);
2041     assertFalse(r.ran);
2042    
2043 jsr166 1.22 f = new CompletableFuture<>();
2044 dl 1.5 f.completeExceptionally(new CFException());
2045 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2046 dl 1.5 checkCompletedWithWrappedCFException(g);
2047 jsr166 1.20 assertFalse(r.ran);
2048 dl 1.5 }
2049    
2050     /**
2051     * thenComposeAsync result completes exceptionally if action does
2052     */
2053     public void testThenComposeAsync3() {
2054 jsr166 1.20 CompletableFuture<Integer> f, g;
2055     FailingCompletableFutureFunction r;
2056 jsr166 1.21
2057 jsr166 1.22 f = new CompletableFuture<>();
2058 jsr166 1.20 g = f.thenComposeAsync(r = new FailingCompletableFutureFunction());
2059     f.complete(one);
2060     checkCompletedWithWrappedCFException(g);
2061 jsr166 1.21
2062 jsr166 1.22 f = new CompletableFuture<>();
2063 dl 1.5 f.complete(one);
2064 jsr166 1.20 g = f.thenComposeAsync(r = new FailingCompletableFutureFunction());
2065 dl 1.5 checkCompletedWithWrappedCFException(g);
2066     }
2067    
2068     /**
2069     * thenComposeAsync result completes exceptionally if source cancelled
2070     */
2071     public void testThenComposeAsync4() {
2072 jsr166 1.20 CompletableFuture<Integer> f, g;
2073     CompletableFutureInc r;
2074    
2075 jsr166 1.22 f = new CompletableFuture<>();
2076 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2077     assertTrue(f.cancel(true));
2078     checkCompletedWithWrappedCancellationException(g);
2079    
2080 jsr166 1.22 f = new CompletableFuture<>();
2081 dl 1.5 assertTrue(f.cancel(true));
2082 jsr166 1.20 g = f.thenComposeAsync(r = new CompletableFutureInc());
2083 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2084     }
2085    
2086 jsr166 1.7 // async with explicit executors
2087 dl 1.5
2088     /**
2089     * thenRunAsync result completes normally after normal completion of source
2090     */
2091     public void testThenRunAsyncE() {
2092 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2093 dl 1.5 Noop r = new Noop();
2094     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2095     f.complete(null);
2096     checkCompletedNormally(g, null);
2097    
2098     // reordered version
2099 jsr166 1.22 f = new CompletableFuture<>();
2100 dl 1.5 f.complete(null);
2101     r = new Noop();
2102     g = f.thenRunAsync(r, new ThreadExecutor());
2103     checkCompletedNormally(g, null);
2104     }
2105    
2106     /**
2107     * thenRunAsync result completes exceptionally after exceptional
2108     * completion of source
2109     */
2110     public void testThenRunAsync2E() {
2111 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2112 dl 1.5 Noop r = new Noop();
2113     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2114     f.completeExceptionally(new CFException());
2115     try {
2116     g.join();
2117     shouldThrow();
2118 jsr166 1.6 } catch (Exception ok) {
2119 dl 1.5 }
2120     checkCompletedWithWrappedCFException(g);
2121     }
2122    
2123     /**
2124     * thenRunAsync result completes exceptionally if action does
2125     */
2126     public void testThenRunAsync3E() {
2127 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2128 dl 1.5 FailingNoop r = new FailingNoop();
2129     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2130     f.complete(null);
2131     checkCompletedWithWrappedCFException(g);
2132     }
2133 jsr166 1.6
2134 dl 1.5 /**
2135     * thenRunAsync result completes exceptionally if source cancelled
2136     */
2137     public void testThenRunAsync4E() {
2138 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2139 dl 1.5 Noop r = new Noop();
2140     CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
2141     assertTrue(f.cancel(true));
2142     checkCompletedWithWrappedCancellationException(g);
2143     }
2144    
2145     /**
2146     * thenApplyAsync result completes normally after normal completion of source
2147     */
2148     public void testThenApplyAsyncE() {
2149 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2150 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
2151     f.complete(one);
2152     checkCompletedNormally(g, two);
2153     }
2154    
2155     /**
2156     * thenApplyAsync result completes exceptionally after exceptional
2157     * completion of source
2158     */
2159     public void testThenApplyAsync2E() {
2160 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2161 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
2162     f.completeExceptionally(new CFException());
2163     checkCompletedWithWrappedCFException(g);
2164     }
2165    
2166     /**
2167     * thenApplyAsync result completes exceptionally if action does
2168     */
2169     public void testThenApplyAsync3E() {
2170 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2171 dl 1.5 FailingFunction r = new FailingFunction();
2172     CompletableFuture<Integer> g = f.thenApplyAsync(r, new ThreadExecutor());
2173     f.complete(null);
2174     checkCompletedWithWrappedCFException(g);
2175     }
2176 jsr166 1.6
2177 dl 1.5 /**
2178     * thenApplyAsync result completes exceptionally if source cancelled
2179     */
2180     public void testThenApplyAsync4E() {
2181 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2182 dl 1.5 CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
2183     assertTrue(f.cancel(true));
2184     checkCompletedWithWrappedCancellationException(g);
2185     }
2186    
2187     /**
2188     * thenAcceptAsync result completes normally after normal
2189     * completion of source
2190     */
2191     public void testThenAcceptAsyncE() {
2192 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2193 dl 1.5 IncAction r = new IncAction();
2194     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2195     f.complete(one);
2196     checkCompletedNormally(g, null);
2197     assertEquals(r.value, 2);
2198     }
2199    
2200     /**
2201     * thenAcceptAsync result completes exceptionally after exceptional
2202     * completion of source
2203     */
2204     public void testThenAcceptAsync2E() {
2205 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2206 dl 1.5 IncAction r = new IncAction();
2207     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2208     f.completeExceptionally(new CFException());
2209     checkCompletedWithWrappedCFException(g);
2210     }
2211    
2212     /**
2213     * thenAcceptAsync result completes exceptionally if action does
2214     */
2215     public void testThenAcceptAsync3E() {
2216 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2217 dl 1.5 FailingConsumer r = new FailingConsumer();
2218     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2219     f.complete(null);
2220     checkCompletedWithWrappedCFException(g);
2221     }
2222 jsr166 1.6
2223 dl 1.5 /**
2224     * thenAcceptAsync result completes exceptionally if source cancelled
2225     */
2226     public void testThenAcceptAsync4E() {
2227 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2228 dl 1.5 IncAction r = new IncAction();
2229     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
2230     assertTrue(f.cancel(true));
2231     checkCompletedWithWrappedCancellationException(g);
2232     }
2233 jsr166 1.18
2234 dl 1.5 /**
2235     * thenCombineAsync result completes normally after normal
2236     * completion of sources
2237     */
2238     public void testThenCombineAsyncE() {
2239 jsr166 1.18 CompletableFuture<Integer> f, g, h;
2240     ThreadExecutor e = new ThreadExecutor();
2241     int count = 0;
2242    
2243 jsr166 1.22 f = new CompletableFuture<>();
2244     g = new CompletableFuture<>();
2245 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2246     f.complete(3);
2247     checkIncomplete(h);
2248     g.complete(1);
2249     checkCompletedNormally(h, 2);
2250     assertEquals(++count, e.count.get());
2251    
2252 jsr166 1.22 f = new CompletableFuture<>();
2253     g = new CompletableFuture<>();
2254 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2255     g.complete(1);
2256     checkIncomplete(h);
2257     f.complete(3);
2258     checkCompletedNormally(h, 2);
2259     assertEquals(++count, e.count.get());
2260    
2261 jsr166 1.22 f = new CompletableFuture<>();
2262     g = new CompletableFuture<>();
2263 jsr166 1.18 g.complete(1);
2264     f.complete(3);
2265     h = f.thenCombineAsync(g, subtract, e);
2266     checkCompletedNormally(h, 2);
2267     assertEquals(++count, e.count.get());
2268 dl 1.5 }
2269    
2270     /**
2271     * thenCombineAsync result completes exceptionally after exceptional
2272 jsr166 1.18 * completion of either source
2273 dl 1.5 */
2274     public void testThenCombineAsync2E() {
2275 jsr166 1.18 CompletableFuture<Integer> f, g, h;
2276     ThreadExecutor e = new ThreadExecutor();
2277     int count = 0;
2278    
2279 jsr166 1.22 f = new CompletableFuture<>();
2280     g = new CompletableFuture<>();
2281 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2282 dl 1.5 f.completeExceptionally(new CFException());
2283 jsr166 1.18 checkIncomplete(h);
2284     g.complete(1);
2285     checkCompletedWithWrappedCFException(h);
2286    
2287 jsr166 1.22 f = new CompletableFuture<>();
2288     g = new CompletableFuture<>();
2289 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2290     g.completeExceptionally(new CFException());
2291     checkIncomplete(h);
2292     f.complete(3);
2293     checkCompletedWithWrappedCFException(h);
2294 dl 1.5
2295 jsr166 1.22 f = new CompletableFuture<>();
2296     g = new CompletableFuture<>();
2297 jsr166 1.18 g.completeExceptionally(new CFException());
2298     h = f.thenCombineAsync(g, subtract, e);
2299     checkIncomplete(h);
2300     f.complete(3);
2301     checkCompletedWithWrappedCFException(h);
2302    
2303     assertEquals(0, e.count.get());
2304 dl 1.5 }
2305    
2306     /**
2307     * thenCombineAsync result completes exceptionally if action does
2308     */
2309     public void testThenCombineAsync3E() {
2310 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2311     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2312 dl 1.5 FailingBiFunction r = new FailingBiFunction();
2313     CompletableFuture<Integer> g = f.thenCombineAsync(f2, r, new ThreadExecutor());
2314     f.complete(one);
2315     checkIncomplete(g);
2316 jsr166 1.18 assertFalse(r.ran);
2317 dl 1.5 f2.complete(two);
2318     checkCompletedWithWrappedCFException(g);
2319 jsr166 1.18 assertTrue(r.ran);
2320 dl 1.5 }
2321 jsr166 1.6
2322 dl 1.5 /**
2323     * thenCombineAsync result completes exceptionally if either source cancelled
2324     */
2325     public void testThenCombineAsync4E() {
2326 jsr166 1.18 CompletableFuture<Integer> f, g, h;
2327     ThreadExecutor e = new ThreadExecutor();
2328    
2329 jsr166 1.22 f = new CompletableFuture<>();
2330     g = new CompletableFuture<>();
2331 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2332 dl 1.5 assertTrue(f.cancel(true));
2333 jsr166 1.18 checkIncomplete(h);
2334     g.complete(1);
2335     checkCompletedWithWrappedCancellationException(h);
2336    
2337 jsr166 1.22 f = new CompletableFuture<>();
2338     g = new CompletableFuture<>();
2339 jsr166 1.18 h = f.thenCombineAsync(g, subtract, e);
2340     assertTrue(g.cancel(true));
2341     checkIncomplete(h);
2342     f.complete(3);
2343     checkCompletedWithWrappedCancellationException(h);
2344    
2345 jsr166 1.22 f = new CompletableFuture<>();
2346     g = new CompletableFuture<>();
2347 jsr166 1.18 assertTrue(g.cancel(true));
2348     h = f.thenCombineAsync(g, subtract, e);
2349     checkIncomplete(h);
2350     f.complete(3);
2351     checkCompletedWithWrappedCancellationException(h);
2352 jsr166 1.6
2353 jsr166 1.22 f = new CompletableFuture<>();
2354     g = new CompletableFuture<>();
2355 jsr166 1.18 assertTrue(f.cancel(true));
2356     assertTrue(g.cancel(true));
2357     h = f.thenCombineAsync(g, subtract, e);
2358     checkCompletedWithWrappedCancellationException(h);
2359    
2360     assertEquals(0, e.count.get());
2361 dl 1.5 }
2362    
2363     /**
2364     * thenAcceptBothAsync result completes normally after normal
2365     * completion of sources
2366     */
2367     public void testThenAcceptBothAsyncE() {
2368 jsr166 1.22 CompletableFuture<Integer> f, g;
2369     CompletableFuture<Void> h;
2370     SubtractAction r;
2371     ThreadExecutor e = new ThreadExecutor();
2372    
2373     f = new CompletableFuture<>();
2374     g = new CompletableFuture<>();
2375     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2376     f.complete(3);
2377     checkIncomplete(h);
2378     g.complete(1);
2379     checkCompletedNormally(h, null);
2380     assertEquals(r.value, 2);
2381    
2382     f = new CompletableFuture<>();
2383     g = new CompletableFuture<>();
2384     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2385     g.complete(1);
2386     checkIncomplete(h);
2387     f.complete(3);
2388     checkCompletedNormally(h, null);
2389     assertEquals(r.value, 2);
2390    
2391     f = new CompletableFuture<>();
2392     g = new CompletableFuture<>();
2393     g.complete(1);
2394     f.complete(3);
2395     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2396     checkCompletedNormally(h, null);
2397     assertEquals(r.value, 2);
2398    
2399     assertEquals(3, e.count.get());
2400 dl 1.5 }
2401    
2402     /**
2403     * thenAcceptBothAsync result completes exceptionally after exceptional
2404     * completion of source
2405     */
2406     public void testThenAcceptBothAsync2E() {
2407 jsr166 1.22 CompletableFuture<Integer> f, g;
2408     CompletableFuture<Void> h;
2409     SubtractAction r;
2410     ThreadExecutor e = new ThreadExecutor();
2411    
2412     f = new CompletableFuture<>();
2413     g = new CompletableFuture<>();
2414     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2415     f.completeExceptionally(new CFException());
2416     checkIncomplete(h);
2417     g.complete(1);
2418     checkCompletedWithWrappedCFException(h);
2419    
2420     f = new CompletableFuture<>();
2421     g = new CompletableFuture<>();
2422     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2423     g.completeExceptionally(new CFException());
2424     checkIncomplete(h);
2425     f.complete(3);
2426     checkCompletedWithWrappedCFException(h);
2427    
2428     f = new CompletableFuture<>();
2429     g = new CompletableFuture<>();
2430     f.complete(3);
2431     g.completeExceptionally(new CFException());
2432     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2433     checkCompletedWithWrappedCFException(h);
2434    
2435     f = new CompletableFuture<>();
2436     g = new CompletableFuture<>();
2437 dl 1.5 f.completeExceptionally(new CFException());
2438 jsr166 1.22 g.complete(3);
2439     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2440     checkCompletedWithWrappedCFException(h);
2441 dl 1.5
2442 jsr166 1.22 assertEquals(0, e.count.get());
2443 dl 1.5 }
2444    
2445     /**
2446     * thenAcceptBothAsync result completes exceptionally if action does
2447     */
2448     public void testThenAcceptBothAsync3E() {
2449 jsr166 1.22 CompletableFuture<Integer> f, g;
2450     CompletableFuture<Void> h;
2451     FailingBiConsumer r;
2452     ThreadExecutor e = new ThreadExecutor();
2453    
2454     f = new CompletableFuture<>();
2455     g = new CompletableFuture<>();
2456     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e);
2457     f.complete(3);
2458     checkIncomplete(h);
2459     g.complete(1);
2460     checkCompletedWithWrappedCFException(h);
2461    
2462     f = new CompletableFuture<>();
2463     g = new CompletableFuture<>();
2464     f.complete(3);
2465     g.complete(1);
2466     h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e);
2467     checkCompletedWithWrappedCFException(h);
2468    
2469     assertEquals(2, e.count.get());
2470 dl 1.5 }
2471 jsr166 1.6
2472 dl 1.5 /**
2473     * thenAcceptBothAsync result completes exceptionally if either source cancelled
2474     */
2475     public void testThenAcceptBothAsync4E() {
2476 jsr166 1.22 CompletableFuture<Integer> f, g;
2477     CompletableFuture<Void> h;
2478     SubtractAction r;
2479     ThreadExecutor e = new ThreadExecutor();
2480    
2481     f = new CompletableFuture<>();
2482     g = new CompletableFuture<>();
2483     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2484 dl 1.5 assertTrue(f.cancel(true));
2485 jsr166 1.22 checkIncomplete(h);
2486     g.complete(1);
2487     checkCompletedWithWrappedCancellationException(h);
2488    
2489     f = new CompletableFuture<>();
2490     g = new CompletableFuture<>();
2491     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2492     assertTrue(g.cancel(true));
2493     checkIncomplete(h);
2494     f.complete(3);
2495     checkCompletedWithWrappedCancellationException(h);
2496    
2497     f = new CompletableFuture<>();
2498     g = new CompletableFuture<>();
2499     f.complete(3);
2500     assertTrue(g.cancel(true));
2501     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2502     checkCompletedWithWrappedCancellationException(h);
2503    
2504     f = new CompletableFuture<>();
2505     g = new CompletableFuture<>();
2506     assertTrue(f.cancel(true));
2507     g.complete(3);
2508     h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e);
2509     checkCompletedWithWrappedCancellationException(h);
2510 jsr166 1.6
2511 jsr166 1.22 assertEquals(0, e.count.get());
2512 dl 1.5 }
2513    
2514     /**
2515     * runAfterBothAsync result completes normally after normal
2516     * completion of sources
2517     */
2518     public void testRunAfterBothAsyncE() {
2519 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2520     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2521 dl 1.5 Noop r = new Noop();
2522     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2523     f.complete(one);
2524     checkIncomplete(g);
2525     f2.complete(two);
2526     checkCompletedNormally(g, null);
2527     assertTrue(r.ran);
2528     }
2529    
2530     /**
2531     * runAfterBothAsync result completes exceptionally after exceptional
2532     * completion of source
2533     */
2534     public void testRunAfterBothAsync2E() {
2535 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2536     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2537 dl 1.5 Noop r = new Noop();
2538     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2539     f.completeExceptionally(new CFException());
2540     f2.complete(two);
2541     checkCompletedWithWrappedCFException(g);
2542    
2543     r = new Noop();
2544 jsr166 1.22 f = new CompletableFuture<>();
2545     f2 = new CompletableFuture<>();
2546 dl 1.5 g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2547     f.complete(one);
2548     f2.completeExceptionally(new CFException());
2549     checkCompletedWithWrappedCFException(g);
2550     }
2551    
2552     /**
2553     * runAfterBothAsync result completes exceptionally if action does
2554     */
2555     public void testRunAfterBothAsync3E() {
2556 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2557     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2558 dl 1.5 FailingNoop r = new FailingNoop();
2559 jsr166 1.6 CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2560 dl 1.5 f.complete(one);
2561     checkIncomplete(g);
2562     f2.complete(two);
2563     checkCompletedWithWrappedCFException(g);
2564     }
2565 jsr166 1.6
2566 dl 1.5 /**
2567     * runAfterBothAsync result completes exceptionally if either source cancelled
2568     */
2569     public void testRunAfterBothAsync4E() {
2570 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2571     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2572 dl 1.5 Noop r = new Noop();
2573     CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2574     assertTrue(f.cancel(true));
2575     f2.complete(two);
2576     checkCompletedWithWrappedCancellationException(g);
2577 jsr166 1.6
2578 dl 1.5 r = new Noop();
2579 jsr166 1.22 f = new CompletableFuture<>();
2580     f2 = new CompletableFuture<>();
2581 dl 1.5 g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2582     f.complete(one);
2583     assertTrue(f2.cancel(true));
2584     checkCompletedWithWrappedCancellationException(g);
2585     }
2586    
2587     /**
2588     * applyToEitherAsync result completes normally after normal
2589     * completion of sources
2590     */
2591     public void testApplyToEitherAsyncE() {
2592 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2593     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2594 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2595     f.complete(one);
2596     checkCompletedNormally(g, two);
2597    
2598 jsr166 1.22 f = new CompletableFuture<>();
2599 dl 1.5 f.complete(one);
2600 jsr166 1.22 f2 = new CompletableFuture<>();
2601 dl 1.5 g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2602     checkCompletedNormally(g, two);
2603     }
2604    
2605     /**
2606     * applyToEitherAsync result completes exceptionally after exceptional
2607     * completion of source
2608     */
2609     public void testApplyToEitherAsync2E() {
2610 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2611     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2612 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2613     f.completeExceptionally(new CFException());
2614     checkCompletedWithWrappedCFException(g);
2615    
2616 jsr166 1.22 f = new CompletableFuture<>();
2617     f2 = new CompletableFuture<>();
2618 dl 1.5 f2.completeExceptionally(new CFException());
2619     g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2620     f.complete(one);
2621     checkCompletedWithWrappedCFException(g);
2622     }
2623    
2624     /**
2625     * applyToEitherAsync result completes exceptionally if action does
2626     */
2627     public void testApplyToEitherAsync3E() {
2628 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2629     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2630 dl 1.5 FailingFunction r = new FailingFunction();
2631 jsr166 1.6 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, r, new ThreadExecutor());
2632 dl 1.5 f.complete(one);
2633     checkCompletedWithWrappedCFException(g);
2634     }
2635 jsr166 1.6
2636 dl 1.5 /**
2637     * applyToEitherAsync result completes exceptionally if either source cancelled
2638     */
2639     public void testApplyToEitherAsync4E() {
2640 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2641     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2642 dl 1.5 CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2643     assertTrue(f.cancel(true));
2644     checkCompletedWithWrappedCancellationException(g);
2645 jsr166 1.6
2646 jsr166 1.22 f = new CompletableFuture<>();
2647     f2 = new CompletableFuture<>();
2648 dl 1.5 assertTrue(f2.cancel(true));
2649     g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2650     checkCompletedWithWrappedCancellationException(g);
2651     }
2652    
2653     /**
2654     * acceptEitherAsync result completes normally after normal
2655     * completion of sources
2656     */
2657     public void testAcceptEitherAsyncE() {
2658 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2659     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2660 dl 1.5 IncAction r = new IncAction();
2661     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2662     f.complete(one);
2663     checkCompletedNormally(g, null);
2664     assertEquals(r.value, 2);
2665    
2666     r = new IncAction();
2667 jsr166 1.22 f = new CompletableFuture<>();
2668 dl 1.5 f.complete(one);
2669 jsr166 1.22 f2 = new CompletableFuture<>();
2670 dl 1.5 g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2671     checkCompletedNormally(g, null);
2672     assertEquals(r.value, 2);
2673     }
2674    
2675     /**
2676     * acceptEitherAsync result completes exceptionally after exceptional
2677     * completion of source
2678     */
2679     public void testAcceptEitherAsync2E() {
2680 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2681     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2682 dl 1.5 IncAction r = new IncAction();
2683     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2684     f.completeExceptionally(new CFException());
2685     checkCompletedWithWrappedCFException(g);
2686    
2687     r = new IncAction();
2688 jsr166 1.22 f = new CompletableFuture<>();
2689     f2 = new CompletableFuture<>();
2690 dl 1.5 f2.completeExceptionally(new CFException());
2691     g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2692     f.complete(one);
2693     checkCompletedWithWrappedCFException(g);
2694     }
2695    
2696     /**
2697     * acceptEitherAsync result completes exceptionally if action does
2698     */
2699     public void testAcceptEitherAsync3E() {
2700 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2701     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2702 dl 1.5 FailingConsumer r = new FailingConsumer();
2703 jsr166 1.6 CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2704 dl 1.5 f.complete(one);
2705     checkCompletedWithWrappedCFException(g);
2706     }
2707 jsr166 1.6
2708 dl 1.5 /**
2709     * acceptEitherAsync result completes exceptionally if either
2710     * source cancelled
2711     */
2712     public void testAcceptEitherAsync4E() {
2713 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2714     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2715 dl 1.5 IncAction r = new IncAction();
2716     CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2717     assertTrue(f.cancel(true));
2718     checkCompletedWithWrappedCancellationException(g);
2719 jsr166 1.6
2720 dl 1.5 r = new IncAction();
2721 jsr166 1.22 f = new CompletableFuture<>();
2722     f2 = new CompletableFuture<>();
2723 dl 1.5 assertTrue(f2.cancel(true));
2724     g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2725     checkCompletedWithWrappedCancellationException(g);
2726     }
2727    
2728     /**
2729     * runAfterEitherAsync result completes normally after normal
2730     * completion of sources
2731     */
2732     public void testRunAfterEitherAsyncE() {
2733 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2734     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2735 dl 1.5 Noop r = new Noop();
2736     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2737     f.complete(one);
2738     checkCompletedNormally(g, null);
2739     assertTrue(r.ran);
2740    
2741     r = new Noop();
2742 jsr166 1.22 f = new CompletableFuture<>();
2743 dl 1.5 f.complete(one);
2744 jsr166 1.22 f2 = new CompletableFuture<>();
2745 dl 1.5 g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2746     checkCompletedNormally(g, null);
2747     assertTrue(r.ran);
2748     }
2749    
2750     /**
2751     * runAfterEitherAsync result completes exceptionally after exceptional
2752     * completion of source
2753     */
2754     public void testRunAfterEitherAsync2E() {
2755 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2756     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2757 dl 1.5 Noop r = new Noop();
2758     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2759     f.completeExceptionally(new CFException());
2760     checkCompletedWithWrappedCFException(g);
2761    
2762     r = new Noop();
2763 jsr166 1.22 f = new CompletableFuture<>();
2764     f2 = new CompletableFuture<>();
2765 dl 1.5 f2.completeExceptionally(new CFException());
2766     g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2767     f.complete(one);
2768     checkCompletedWithWrappedCFException(g);
2769     }
2770    
2771     /**
2772     * runAfterEitherAsync result completes exceptionally if action does
2773     */
2774     public void testRunAfterEitherAsync3E() {
2775 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2776     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2777 dl 1.5 FailingNoop r = new FailingNoop();
2778 jsr166 1.6 CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2779 dl 1.5 f.complete(one);
2780     checkCompletedWithWrappedCFException(g);
2781     }
2782 jsr166 1.6
2783 dl 1.5 /**
2784     * runAfterEitherAsync result completes exceptionally if either
2785     * source cancelled
2786     */
2787     public void testRunAfterEitherAsync4E() {
2788 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2789     CompletableFuture<Integer> f2 = new CompletableFuture<>();
2790 dl 1.5 Noop r = new Noop();
2791     CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2792     assertTrue(f.cancel(true));
2793     checkCompletedWithWrappedCancellationException(g);
2794 jsr166 1.6
2795 dl 1.5 r = new Noop();
2796 jsr166 1.22 f = new CompletableFuture<>();
2797     f2 = new CompletableFuture<>();
2798 dl 1.5 assertTrue(f2.cancel(true));
2799     g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2800     checkCompletedWithWrappedCancellationException(g);
2801     }
2802    
2803     /**
2804 jsr166 1.7 * thenComposeAsync result completes normally after normal
2805     * completion of source
2806 dl 1.5 */
2807     public void testThenComposeAsyncE() {
2808 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2809 dl 1.5 CompletableFutureInc r = new CompletableFutureInc();
2810     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2811     f.complete(one);
2812     checkCompletedNormally(g, two);
2813     }
2814    
2815     /**
2816 jsr166 1.7 * thenComposeAsync result completes exceptionally after
2817     * exceptional completion of source
2818 dl 1.5 */
2819     public void testThenComposeAsync2E() {
2820 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2821 dl 1.5 CompletableFutureInc r = new CompletableFutureInc();
2822     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2823     f.completeExceptionally(new CFException());
2824     checkCompletedWithWrappedCFException(g);
2825     }
2826    
2827     /**
2828     * thenComposeAsync result completes exceptionally if action does
2829     */
2830     public void testThenComposeAsync3E() {
2831 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2832 dl 1.5 FailingCompletableFutureFunction r = new FailingCompletableFutureFunction();
2833     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2834     f.complete(one);
2835     checkCompletedWithWrappedCFException(g);
2836     }
2837    
2838     /**
2839     * thenComposeAsync result completes exceptionally if source cancelled
2840     */
2841     public void testThenComposeAsync4E() {
2842 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2843 dl 1.5 CompletableFutureInc r = new CompletableFutureInc();
2844     CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2845     assertTrue(f.cancel(true));
2846     checkCompletedWithWrappedCancellationException(g);
2847     }
2848    
2849 jsr166 1.6 // other static methods
2850 dl 1.5
2851     /**
2852     * allOf(no component futures) returns a future completed normally
2853     * with the value null
2854     */
2855     public void testAllOf_empty() throws Exception {
2856 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
2857 dl 1.5 checkCompletedNormally(f, null);
2858     }
2859    
2860     /**
2861 jsr166 1.25 * allOf returns a future completed normally with the value null
2862     * when all components complete normally
2863 dl 1.5 */
2864 jsr166 1.25 public void testAllOf_normal() throws Exception {
2865 dl 1.5 for (int k = 1; k < 20; ++k) {
2866 jsr166 1.22 CompletableFuture<Integer>[] fs = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2867 jsr166 1.6 for (int i = 0; i < k; ++i)
2868 jsr166 1.22 fs[i] = new CompletableFuture<>();
2869 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2870 dl 1.5 for (int i = 0; i < k; ++i) {
2871     checkIncomplete(f);
2872 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
2873 dl 1.5 fs[i].complete(one);
2874     }
2875 dl 1.9 checkCompletedNormally(f, null);
2876 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
2877 dl 1.5 }
2878     }
2879    
2880     /**
2881     * anyOf(no component futures) returns an incomplete future
2882     */
2883     public void testAnyOf_empty() throws Exception {
2884 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
2885 dl 1.5 checkIncomplete(f);
2886     }
2887    
2888     /**
2889 jsr166 1.25 * anyOf returns a future completed normally with a value when
2890     * a component future does
2891 dl 1.5 */
2892 jsr166 1.24 public void testAnyOf_normal() throws Exception {
2893     for (int k = 0; k < 10; ++k) {
2894 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
2895 jsr166 1.6 for (int i = 0; i < k; ++i)
2896 jsr166 1.22 fs[i] = new CompletableFuture<>();
2897 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2898 dl 1.5 checkIncomplete(f);
2899     for (int i = 0; i < k; ++i) {
2900     fs[i].complete(one);
2901 dl 1.9 checkCompletedNormally(f, one);
2902 jsr166 1.24 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
2903     }
2904     }
2905     }
2906    
2907     /**
2908     * anyOf result completes exceptionally when any component does.
2909     */
2910     public void testAnyOf_exceptional() throws Exception {
2911     for (int k = 0; k < 10; ++k) {
2912     CompletableFuture[] fs = new CompletableFuture[k];
2913     for (int i = 0; i < k; ++i)
2914     fs[i] = new CompletableFuture<>();
2915     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2916     checkIncomplete(f);
2917     for (int i = 0; i < k; ++i) {
2918     fs[i].completeExceptionally(new CFException());
2919     checkCompletedWithWrappedCFException(f);
2920     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
2921 dl 1.5 }
2922     }
2923     }
2924    
2925     /**
2926     * Completion methods throw NullPointerException with null arguments
2927     */
2928     public void testNPE() {
2929 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2930     CompletableFuture<Integer> g = new CompletableFuture<>();
2931 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
2932     CompletableFuture<?> h;
2933 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
2934 jsr166 1.14
2935     Runnable[] throwingActions = {
2936     () -> { CompletableFuture.supplyAsync(null); },
2937     () -> { CompletableFuture.supplyAsync(null, exec); },
2938 jsr166 1.16 () -> { CompletableFuture.supplyAsync(supplyOne, null); },
2939 jsr166 1.14
2940     () -> { CompletableFuture.runAsync(null); },
2941     () -> { CompletableFuture.runAsync(null, exec); },
2942     () -> { CompletableFuture.runAsync(() -> {}, null); },
2943    
2944     () -> { f.completeExceptionally(null); },
2945    
2946     () -> { f.thenApply(null); },
2947     () -> { f.thenApplyAsync(null); },
2948     () -> { f.thenApplyAsync((x) -> x, null); },
2949     () -> { f.thenApplyAsync(null, exec); },
2950    
2951     () -> { f.thenAccept(null); },
2952     () -> { f.thenAcceptAsync(null); },
2953     () -> { f.thenAcceptAsync((x) -> { ; }, null); },
2954     () -> { f.thenAcceptAsync(null, exec); },
2955    
2956     () -> { f.thenRun(null); },
2957     () -> { f.thenRunAsync(null); },
2958     () -> { f.thenRunAsync(() -> { ; }, null); },
2959     () -> { f.thenRunAsync(null, exec); },
2960    
2961     () -> { f.thenCombine(g, null); },
2962     () -> { f.thenCombineAsync(g, null); },
2963     () -> { f.thenCombineAsync(g, null, exec); },
2964     () -> { f.thenCombine(nullFuture, (x, y) -> x); },
2965     () -> { f.thenCombineAsync(nullFuture, (x, y) -> x); },
2966     () -> { f.thenCombineAsync(nullFuture, (x, y) -> x, exec); },
2967     () -> { f.thenCombineAsync(g, (x, y) -> x, null); },
2968    
2969     () -> { f.thenAcceptBoth(g, null); },
2970     () -> { f.thenAcceptBothAsync(g, null); },
2971     () -> { f.thenAcceptBothAsync(g, null, exec); },
2972     () -> { f.thenAcceptBoth(nullFuture, (x, y) -> {}); },
2973     () -> { f.thenAcceptBothAsync(nullFuture, (x, y) -> {}); },
2974     () -> { f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec); },
2975     () -> { f.thenAcceptBothAsync(g, (x, y) -> {}, null); },
2976    
2977     () -> { f.runAfterBoth(g, null); },
2978     () -> { f.runAfterBothAsync(g, null); },
2979     () -> { f.runAfterBothAsync(g, null, exec); },
2980     () -> { f.runAfterBoth(nullFuture, () -> {}); },
2981     () -> { f.runAfterBothAsync(nullFuture, () -> {}); },
2982     () -> { f.runAfterBothAsync(nullFuture, () -> {}, exec); },
2983     () -> { f.runAfterBothAsync(g, () -> {}, null); },
2984    
2985     () -> { f.applyToEither(g, null); },
2986     () -> { f.applyToEitherAsync(g, null); },
2987     () -> { f.applyToEitherAsync(g, null, exec); },
2988     () -> { f.applyToEither(nullFuture, (x) -> x); },
2989     () -> { f.applyToEitherAsync(nullFuture, (x) -> x); },
2990     () -> { f.applyToEitherAsync(nullFuture, (x) -> x, exec); },
2991     () -> { f.applyToEitherAsync(g, (x) -> x, null); },
2992    
2993     () -> { f.acceptEither(g, null); },
2994     () -> { f.acceptEitherAsync(g, null); },
2995     () -> { f.acceptEitherAsync(g, null, exec); },
2996     () -> { f.acceptEither(nullFuture, (x) -> {}); },
2997     () -> { f.acceptEitherAsync(nullFuture, (x) -> {}); },
2998     () -> { f.acceptEitherAsync(nullFuture, (x) -> {}, exec); },
2999     () -> { f.acceptEitherAsync(g, (x) -> {}, null); },
3000    
3001     () -> { f.runAfterEither(g, null); },
3002     () -> { f.runAfterEitherAsync(g, null); },
3003     () -> { f.runAfterEitherAsync(g, null, exec); },
3004     () -> { f.runAfterEither(nullFuture, () -> {}); },
3005     () -> { f.runAfterEitherAsync(nullFuture, () -> {}); },
3006     () -> { f.runAfterEitherAsync(nullFuture, () -> {}, exec); },
3007     () -> { f.runAfterEitherAsync(g, () -> {}, null); },
3008    
3009     () -> { f.thenCompose(null); },
3010     () -> { f.thenComposeAsync(null); },
3011     () -> { f.thenComposeAsync(new CompletableFutureInc(), null); },
3012     () -> { f.thenComposeAsync(null, exec); },
3013    
3014     () -> { f.exceptionally(null); },
3015    
3016     () -> { f.handle(null); },
3017    
3018     () -> { CompletableFuture.allOf((CompletableFuture<?>)null); },
3019     () -> { CompletableFuture.allOf((CompletableFuture<?>[])null); },
3020     () -> { CompletableFuture.allOf(f, null); },
3021     () -> { CompletableFuture.allOf(null, f); },
3022    
3023     () -> { CompletableFuture.anyOf((CompletableFuture<?>)null); },
3024     () -> { CompletableFuture.anyOf((CompletableFuture<?>[])null); },
3025     () -> { CompletableFuture.anyOf(f, null); },
3026     () -> { CompletableFuture.anyOf(null, f); },
3027     };
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 }