ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
(Generate patch)

Comparing jsr166/src/test/tck/CompletableFutureTest.java (file contents):
Revision 1.2 by jsr166, Wed Feb 6 20:29:55 2013 UTC vs.
Revision 1.17 by jsr166, Thu Apr 4 04:16:02 2013 UTC

# Line 1 | Line 1
1   /*
2 < * Written by Doug Lea with assistance from members of JCP JSR-166
3 < * Expert Group and released to the public domain, as explained at
2 > * Written by Doug Lea and Martin Buchholz with assistance from
3 > * members of JCP JSR-166 Expert Group and released to the public
4 > * domain, as explained at
5   * http://creativecommons.org/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
6   */
7  
8   import junit.framework.*;
9   import java.util.concurrent.Callable;
10 + import java.util.concurrent.Executor;
11 + import java.util.concurrent.ExecutorService;
12 + import java.util.concurrent.Executors;
13   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 + import java.util.concurrent.CompletionException;
19   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 + 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  
30   public class CompletableFutureTest extends JSR166TestCase {
31  
# Line 28 | Line 36 | public class CompletableFutureTest exten
36          return new TestSuite(CompletableFutureTest.class);
37      }
38  
39 +    static class CFException extends RuntimeException {}
40 +
41 +    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 +    <T> void checkCompletedNormally(CompletableFuture<T> f, T value) {
57 +        try {
58 +            assertEquals(value, f.join());
59 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
60 +        try {
61 +            assertEquals(value, f.getNow(null));
62 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
63 +        try {
64 +            assertEquals(value, f.get());
65 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
66 +        try {
67 +            assertEquals(value, f.get(0L, SECONDS));
68 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
69 +        assertTrue(f.isDone());
70 +        assertFalse(f.isCancelled());
71 +        assertTrue(f.toString().contains("[Completed normally]"));
72 +    }
73 +
74 +    void checkCompletedWithWrappedCFException(CompletableFuture<?> f) {
75 +        try {
76 +            f.join();
77 +            shouldThrow();
78 +        } catch (CompletionException success) {
79 +            assertTrue(success.getCause() instanceof CFException);
80 +        }
81 +        try {
82 +            f.getNow(null);
83 +            shouldThrow();
84 +        } catch (CompletionException success) {
85 +            assertTrue(success.getCause() instanceof CFException);
86 +        }
87 +        try {
88 +            f.get();
89 +            shouldThrow();
90 +        } catch (ExecutionException success) {
91 +            assertTrue(success.getCause() instanceof CFException);
92 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
93 +        try {
94 +            f.get(0L, SECONDS);
95 +            shouldThrow();
96 +        } catch (ExecutionException success) {
97 +            assertTrue(success.getCause() instanceof CFException);
98 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
99 +        assertTrue(f.isDone());
100 +        assertFalse(f.isCancelled());
101 +        assertTrue(f.toString().contains("[Completed exceptionally]"));
102 +    }
103 +
104 +    void checkCancelled(CompletableFuture<?> f) {
105 +        try {
106 +            f.join();
107 +            shouldThrow();
108 +        } catch (CancellationException success) {}
109 +        try {
110 +            f.getNow(null);
111 +            shouldThrow();
112 +        } catch (CancellationException success) {}
113 +        try {
114 +            f.get();
115 +            shouldThrow();
116 +        } catch (CancellationException success) {
117 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
118 +        try {
119 +            f.get(0L, SECONDS);
120 +            shouldThrow();
121 +        } catch (CancellationException success) {
122 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
123 +        assertTrue(f.isDone());
124 +        assertTrue(f.isCancelled());
125 +        assertTrue(f.toString().contains("[Completed exceptionally]"));
126 +    }
127 +
128 +    void checkCompletedWithWrappedCancellationException(CompletableFuture<?> f) {
129 +        try {
130 +            f.join();
131 +            shouldThrow();
132 +        } catch (CompletionException success) {
133 +            assertTrue(success.getCause() instanceof CancellationException);
134 +        }
135 +        try {
136 +            f.getNow(null);
137 +            shouldThrow();
138 +        } catch (CompletionException success) {
139 +            assertTrue(success.getCause() instanceof CancellationException);
140 +        }
141 +        try {
142 +            f.get();
143 +            shouldThrow();
144 +        } catch (ExecutionException success) {
145 +            assertTrue(success.getCause() instanceof CancellationException);
146 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
147 +        try {
148 +            f.get(0L, SECONDS);
149 +            shouldThrow();
150 +        } catch (ExecutionException success) {
151 +            assertTrue(success.getCause() instanceof CancellationException);
152 +        } catch (Throwable fail) { threadUnexpectedException(fail); }
153 +        assertTrue(f.isDone());
154 +        assertFalse(f.isCancelled());
155 +        assertTrue(f.toString().contains("[Completed exceptionally]"));
156 +    }
157 +
158 +    /**
159 +     * A newly constructed CompletableFuture is incomplete, as indicated
160 +     * by methods isDone, isCancelled, and getNow
161 +     */
162 +    public void testConstructor() {
163 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
164 +        checkIncomplete(f);
165 +    }
166 +
167 +    /**
168 +     * complete completes normally, as indicated by methods isDone,
169 +     * isCancelled, join, get, and getNow
170 +     */
171 +    public void testComplete() {
172 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
173 +        checkIncomplete(f);
174 +        f.complete(one);
175 +        checkCompletedNormally(f, one);
176 +    }
177 +
178 +    /**
179 +     * completeExceptionally completes exceptionally, as indicated by
180 +     * methods isDone, isCancelled, join, get, and getNow
181 +     */
182 +    public void testCompleteExceptionally() {
183 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
184 +        checkIncomplete(f);
185 +        f.completeExceptionally(new CFException());
186 +        checkCompletedWithWrappedCFException(f);
187 +    }
188 +
189 +    /**
190 +     * cancel completes exceptionally and reports cancelled, as indicated by
191 +     * methods isDone, isCancelled, join, get, and getNow
192 +     */
193 +    public void testCancel() {
194 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
195 +        checkIncomplete(f);
196 +        assertTrue(f.cancel(true));
197 +        checkCancelled(f);
198 +    }
199 +
200 +    /**
201 +     * obtrudeValue forces completion with given value
202 +     */
203 +    public void testObtrudeValue() {
204 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
205 +        checkIncomplete(f);
206 +        f.complete(one);
207 +        checkCompletedNormally(f, one);
208 +        f.obtrudeValue(three);
209 +        checkCompletedNormally(f, three);
210 +        f.obtrudeValue(two);
211 +        checkCompletedNormally(f, two);
212 +        f = new CompletableFuture<Integer>();
213 +        f.obtrudeValue(three);
214 +        checkCompletedNormally(f, three);
215 +        f = new CompletableFuture<Integer>();
216 +        f.completeExceptionally(new CFException());
217 +        f.obtrudeValue(four);
218 +        checkCompletedNormally(f, four);
219 +    }
220 +
221 +    /**
222 +     * obtrudeException forces completion with given exception
223 +     */
224 +    public void testObtrudeException() {
225 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
226 +        checkIncomplete(f);
227 +        f.complete(one);
228 +        checkCompletedNormally(f, one);
229 +        f.obtrudeException(new CFException());
230 +        checkCompletedWithWrappedCFException(f);
231 +        f = new CompletableFuture<Integer>();
232 +        f.obtrudeException(new CFException());
233 +        checkCompletedWithWrappedCFException(f);
234 +        f = new CompletableFuture<Integer>();
235 +        f.completeExceptionally(new CFException());
236 +        f.obtrudeValue(four);
237 +        checkCompletedNormally(f, four);
238 +        f.obtrudeException(new CFException());
239 +        checkCompletedWithWrappedCFException(f);
240 +    }
241 +
242 +    /**
243 +     * getNumberOfDependents returns number of dependent tasks
244 +     */
245 +    public void testGetNumberOfDependents() {
246 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
247 +        assertEquals(f.getNumberOfDependents(), 0);
248 +        CompletableFuture g = f.thenRun(new Noop());
249 +        assertEquals(f.getNumberOfDependents(), 1);
250 +        assertEquals(g.getNumberOfDependents(), 0);
251 +        CompletableFuture h = f.thenRun(new Noop());
252 +        assertEquals(f.getNumberOfDependents(), 2);
253 +        f.complete(1);
254 +        checkCompletedNormally(g, null);
255 +        assertEquals(f.getNumberOfDependents(), 0);
256 +        assertEquals(g.getNumberOfDependents(), 0);
257 +    }
258 +
259 +
260 +    /**
261 +     * toString indicates current completion state
262 +     */
263      public void testToString() {
264          CompletableFuture<String> f;
265  
# Line 41 | Line 273 | public class CompletableFutureTest exten
273          f.completeExceptionally(new IndexOutOfBoundsException());
274          assertTrue(f.toString().contains("[Completed exceptionally]"));
275      }
276 +
277 +    /**
278 +     * completedFuture returns a completed CompletableFuture with given value
279 +     */
280 +    public void testCompletedFuture() {
281 +        CompletableFuture<String> f = CompletableFuture.completedFuture("test");
282 +        checkCompletedNormally(f, "test");
283 +    }
284 +
285 +    static final Supplier<Integer> supplyOne =
286 +        () -> Integer.valueOf(1);
287 +    static final Function<Integer, Integer> inc =
288 +        (Integer x) -> Integer.valueOf(x.intValue() + 1);
289 +    static final BiFunction<Integer, Integer, Integer> add =
290 +        (Integer x, Integer y) -> Integer.valueOf(x.intValue() + y.intValue());
291 +    static final class IncAction implements Consumer<Integer> {
292 +        int value;
293 +        public void accept(Integer x) { value = x.intValue() + 1; }
294 +    }
295 +    static final class AddAction implements BiConsumer<Integer, Integer> {
296 +        int value;
297 +        public void accept(Integer x, Integer y) {
298 +            value = x.intValue() + y.intValue();
299 +        }
300 +    }
301 +    static final class Noop implements Runnable {
302 +        boolean ran;
303 +        public void run() { ran = true; }
304 +    }
305 +
306 +    static final class FailingSupplier implements Supplier<Integer> {
307 +        boolean ran;
308 +        public Integer get() { ran = true; throw new CFException(); }
309 +    }
310 +    static final class FailingConsumer implements Consumer<Integer> {
311 +        boolean ran;
312 +        public void accept(Integer x) { ran = true; throw new CFException(); }
313 +    }
314 +    static final class FailingBiConsumer implements BiConsumer<Integer, Integer> {
315 +        boolean ran;
316 +        public void accept(Integer x, Integer y) { ran = true; throw new CFException(); }
317 +    }
318 +    static final class FailingFunction implements Function<Integer, Integer> {
319 +        boolean ran;
320 +        public Integer apply(Integer x) { ran = true; throw new CFException(); }
321 +    }
322 +    static final class FailingBiFunction implements BiFunction<Integer, Integer, Integer> {
323 +        boolean ran;
324 +        public Integer apply(Integer x, Integer y) { ran = true; throw new CFException(); }
325 +    }
326 +    static final class FailingNoop implements Runnable {
327 +        boolean ran;
328 +        public void run() { ran = true; throw new CFException(); }
329 +    }
330 +
331 +    static final class CompletableFutureInc implements Function<Integer, CompletableFuture<Integer>> {
332 +        public CompletableFuture<Integer> apply(Integer x) {
333 +            CompletableFuture<Integer> f = new CompletableFuture<Integer>();
334 +            f.complete(Integer.valueOf(x.intValue() + 1));
335 +            return f;
336 +        }
337 +    }
338 +
339 +    static final class FailingCompletableFutureFunction implements Function<Integer, CompletableFuture<Integer>> {
340 +        boolean ran;
341 +        public CompletableFuture<Integer> apply(Integer x) {
342 +            ran = true; throw new CFException();
343 +        }
344 +    }
345 +
346 +    // Used for explicit executor tests
347 +    static final class ThreadExecutor implements Executor {
348 +        AtomicInteger count = new AtomicInteger(0);
349 +
350 +        public void execute(Runnable r) {
351 +            count.getAndIncrement();
352 +            new Thread(r).start();
353 +        }
354 +    }
355 +
356 +    static final class ExceptionToInteger implements Function<Throwable, Integer> {
357 +        public Integer apply(Throwable x) { return Integer.valueOf(3); }
358 +    }
359 +
360 +    static final class IntegerHandler implements BiFunction<Integer, Throwable, Integer> {
361 +        boolean ran;
362 +        public Integer apply(Integer x, Throwable t) {
363 +            ran = true;
364 +            return (t == null) ? two : three;
365 +        }
366 +    }
367 +
368 +
369 +    /**
370 +     * exceptionally action completes with function value on source
371 +     * exception;  otherwise with source value
372 +     */
373 +    public void testExceptionally() {
374 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
375 +        ExceptionToInteger r = new ExceptionToInteger();
376 +        CompletableFuture<Integer> g = f.exceptionally(r);
377 +        f.completeExceptionally(new CFException());
378 +        checkCompletedNormally(g, three);
379 +
380 +        f = new CompletableFuture<Integer>();
381 +        r = new ExceptionToInteger();
382 +        g = f.exceptionally(r);
383 +        f.complete(one);
384 +        checkCompletedNormally(g, one);
385 +    }
386 +
387 +    /**
388 +     * handle action completes normally with function value on either
389 +     * normal or exceptional completion of source
390 +     */
391 +    public void testHandle() {
392 +        CompletableFuture<Integer> f, g;
393 +        IntegerHandler r;
394 +
395 +        f = new CompletableFuture<Integer>();
396 +        f.completeExceptionally(new CFException());
397 +        g = f.handle(r = new IntegerHandler());
398 +        assertTrue(r.ran);
399 +        checkCompletedNormally(g, three);
400 +
401 +        f = new CompletableFuture<Integer>();
402 +        g = f.handle(r = new IntegerHandler());
403 +        assertFalse(r.ran);
404 +        f.completeExceptionally(new CFException());
405 +        checkCompletedNormally(g, three);
406 +        assertTrue(r.ran);
407 +
408 +        f = new CompletableFuture<Integer>();
409 +        f.complete(one);
410 +        g = f.handle(r = new IntegerHandler());
411 +        assertTrue(r.ran);
412 +        checkCompletedNormally(g, two);
413 +
414 +        f = new CompletableFuture<Integer>();
415 +        g = f.handle(r = new IntegerHandler());
416 +        assertFalse(r.ran);
417 +        f.complete(one);
418 +        assertTrue(r.ran);
419 +        checkCompletedNormally(g, two);
420 +    }
421 +
422 +    /**
423 +     * runAsync completes after running Runnable
424 +     */
425 +    public void testRunAsync() {
426 +        Noop r = new Noop();
427 +        CompletableFuture<Void> f = CompletableFuture.runAsync(r);
428 +        assertNull(f.join());
429 +        assertTrue(r.ran);
430 +        checkCompletedNormally(f, null);
431 +    }
432 +
433 +    /**
434 +     * runAsync with executor completes after running Runnable
435 +     */
436 +    public void testRunAsync2() {
437 +        Noop r = new Noop();
438 +        ThreadExecutor exec = new ThreadExecutor();
439 +        CompletableFuture<Void> f = CompletableFuture.runAsync(r, exec);
440 +        assertNull(f.join());
441 +        assertTrue(r.ran);
442 +        checkCompletedNormally(f, null);
443 +        assertEquals(1, exec.count.get());
444 +    }
445 +
446 +    /**
447 +     * failing runAsync completes exceptionally after running Runnable
448 +     */
449 +    public void testRunAsync3() {
450 +        FailingNoop r = new FailingNoop();
451 +        CompletableFuture<Void> f = CompletableFuture.runAsync(r);
452 +        checkCompletedWithWrappedCFException(f);
453 +        assertTrue(r.ran);
454 +    }
455 +
456 +    /**
457 +     * supplyAsync completes with result of supplier
458 +     */
459 +    public void testSupplyAsync() {
460 +        CompletableFuture<Integer> f;
461 +        f = CompletableFuture.supplyAsync(supplyOne);
462 +        assertEquals(f.join(), one);
463 +        checkCompletedNormally(f, one);
464 +    }
465 +
466 +    /**
467 +     * supplyAsync with executor completes with result of supplier
468 +     */
469 +    public void testSupplyAsync2() {
470 +        CompletableFuture<Integer> f;
471 +        f = CompletableFuture.supplyAsync(supplyOne, new ThreadExecutor());
472 +        assertEquals(f.join(), one);
473 +        checkCompletedNormally(f, one);
474 +    }
475 +
476 +    /**
477 +     * Failing supplyAsync completes exceptionally
478 +     */
479 +    public void testSupplyAsync3() {
480 +        FailingSupplier r = new FailingSupplier();
481 +        CompletableFuture<Integer> f = CompletableFuture.supplyAsync(r);
482 +        checkCompletedWithWrappedCFException(f);
483 +        assertTrue(r.ran);
484 +    }
485 +
486 +    // seq completion methods
487 +
488 +    /**
489 +     * thenRun result completes normally after normal completion of source
490 +     */
491 +    public void testThenRun() {
492 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
493 +        Noop r = new Noop();
494 +        CompletableFuture<Void> g = f.thenRun(r);
495 +        f.complete(null);
496 +        checkCompletedNormally(g, null);
497 +        // reordered version
498 +        f = new CompletableFuture<Integer>();
499 +        f.complete(null);
500 +        r = new Noop();
501 +        g = f.thenRun(r);
502 +        checkCompletedNormally(g, null);
503 +    }
504 +
505 +    /**
506 +     * thenRun result completes exceptionally after exceptional
507 +     * completion of source
508 +     */
509 +    public void testThenRun2() {
510 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
511 +        Noop r = new Noop();
512 +        CompletableFuture<Void> g = f.thenRun(r);
513 +        f.completeExceptionally(new CFException());
514 +        checkCompletedWithWrappedCFException(g);
515 +    }
516 +
517 +    /**
518 +     * thenRun result completes exceptionally if action does
519 +     */
520 +    public void testThenRun3() {
521 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
522 +        FailingNoop r = new FailingNoop();
523 +        CompletableFuture<Void> g = f.thenRun(r);
524 +        f.complete(null);
525 +        checkCompletedWithWrappedCFException(g);
526 +    }
527 +
528 +    /**
529 +     * thenRun result completes exceptionally if source cancelled
530 +     */
531 +    public void testThenRun4() {
532 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
533 +        Noop r = new Noop();
534 +        CompletableFuture<Void> g = f.thenRun(r);
535 +        assertTrue(f.cancel(true));
536 +        checkCompletedWithWrappedCancellationException(g);
537 +    }
538 +
539 +    /**
540 +     * thenApply result completes normally after normal completion of source
541 +     */
542 +    public void testThenApply() {
543 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
544 +        CompletableFuture<Integer> g = f.thenApply(inc);
545 +        f.complete(one);
546 +        checkCompletedNormally(g, two);
547 +    }
548 +
549 +    /**
550 +     * thenApply result completes exceptionally after exceptional
551 +     * completion of source
552 +     */
553 +    public void testThenApply2() {
554 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
555 +        CompletableFuture<Integer> g = f.thenApply(inc);
556 +        f.completeExceptionally(new CFException());
557 +        checkCompletedWithWrappedCFException(g);
558 +    }
559 +
560 +    /**
561 +     * thenApply result completes exceptionally if action does
562 +     */
563 +    public void testThenApply3() {
564 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
565 +        CompletableFuture<Integer> g = f.thenApply(new FailingFunction());
566 +        f.complete(one);
567 +        checkCompletedWithWrappedCFException(g);
568 +    }
569 +
570 +    /**
571 +     * thenApply result completes exceptionally if source cancelled
572 +     */
573 +    public void testThenApply4() {
574 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
575 +        CompletableFuture<Integer> g = f.thenApply(inc);
576 +        assertTrue(f.cancel(true));
577 +        checkCompletedWithWrappedCancellationException(g);
578 +    }
579 +
580 +    /**
581 +     * thenAccept result completes normally after normal completion of source
582 +     */
583 +    public void testThenAccept() {
584 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
585 +        IncAction r = new IncAction();
586 +        CompletableFuture<Void> g = f.thenAccept(r);
587 +        f.complete(one);
588 +        checkCompletedNormally(g, null);
589 +        assertEquals(r.value, 2);
590 +    }
591 +
592 +    /**
593 +     * thenAccept result completes exceptionally after exceptional
594 +     * completion of source
595 +     */
596 +    public void testThenAccept2() {
597 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
598 +        IncAction r = new IncAction();
599 +        CompletableFuture<Void> g = f.thenAccept(r);
600 +        f.completeExceptionally(new CFException());
601 +        checkCompletedWithWrappedCFException(g);
602 +    }
603 +
604 +    /**
605 +     * thenAccept result completes exceptionally if action does
606 +     */
607 +    public void testThenAccept3() {
608 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
609 +        FailingConsumer r = new FailingConsumer();
610 +        CompletableFuture<Void> g = f.thenAccept(r);
611 +        f.complete(one);
612 +        checkCompletedWithWrappedCFException(g);
613 +        assertTrue(r.ran);
614 +    }
615 +
616 +    /**
617 +     * thenAccept result completes exceptionally if source cancelled
618 +     */
619 +    public void testThenAccept4() {
620 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
621 +        IncAction r = new IncAction();
622 +        CompletableFuture<Void> g = f.thenAccept(r);
623 +        assertTrue(f.cancel(true));
624 +        checkCompletedWithWrappedCancellationException(g);
625 +    }
626 +
627 +
628 +    /**
629 +     * thenCombine result completes normally after normal completion of sources
630 +     */
631 +    public void testThenCombine() {
632 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
633 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
634 +        CompletableFuture<Integer> g = f.thenCombine(f2, add);
635 +        f.complete(one);
636 +        checkIncomplete(g);
637 +        f2.complete(two);
638 +        checkCompletedNormally(g, three);
639 +
640 +        f = new CompletableFuture<Integer>();
641 +        f.complete(one);
642 +        f2 = new CompletableFuture<Integer>();
643 +        g = f.thenCombine(f2, add);
644 +        checkIncomplete(g);
645 +        f2.complete(two);
646 +        checkCompletedNormally(g, three);
647 +    }
648 +
649 +    /**
650 +     * thenCombine result completes exceptionally after exceptional
651 +     * completion of either source
652 +     */
653 +    public void testThenCombine2() {
654 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
655 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
656 +        CompletableFuture<Integer> g = f.thenCombine(f2, add);
657 +        f.completeExceptionally(new CFException());
658 +        f2.complete(two);
659 +        checkCompletedWithWrappedCFException(g);
660 +
661 +        f = new CompletableFuture<Integer>();
662 +        f.complete(one);
663 +        f2 = new CompletableFuture<Integer>();
664 +        g = f.thenCombine(f2, add);
665 +        f2.completeExceptionally(new CFException());
666 +        checkCompletedWithWrappedCFException(g);
667 +    }
668 +
669 +    /**
670 +     * thenCombine result completes exceptionally if action does
671 +     */
672 +    public void testThenCombine3() {
673 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
674 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
675 +        FailingBiFunction r = new FailingBiFunction();
676 +        CompletableFuture<Integer> g = f.thenCombine(f2, r);
677 +        f.complete(one);
678 +        checkIncomplete(g);
679 +        f2.complete(two);
680 +        checkCompletedWithWrappedCFException(g);
681 +    }
682 +
683 +    /**
684 +     * thenCombine result completes exceptionally if either source cancelled
685 +     */
686 +    public void testThenCombine4() {
687 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
688 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
689 +        CompletableFuture<Integer> g = f.thenCombine(f2, add);
690 +        assertTrue(f.cancel(true));
691 +        f2.complete(two);
692 +        checkCompletedWithWrappedCancellationException(g);
693 +        f = new CompletableFuture<Integer>();
694 +        f2 = new CompletableFuture<Integer>();
695 +        g = f.thenCombine(f2, add);
696 +        f.complete(one);
697 +        assertTrue(f2.cancel(true));
698 +        checkCompletedWithWrappedCancellationException(g);
699 +    }
700 +
701 +    /**
702 +     * thenAcceptBoth result completes normally after normal
703 +     * completion of sources
704 +     */
705 +    public void testThenAcceptBoth() {
706 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
707 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
708 +        AddAction r = new AddAction();
709 +        CompletableFuture<Void> g = f.thenAcceptBoth(f2, r);
710 +        f.complete(one);
711 +        checkIncomplete(g);
712 +        f2.complete(two);
713 +        checkCompletedNormally(g, null);
714 +        assertEquals(r.value, 3);
715 +
716 +        r = new AddAction();
717 +        f = new CompletableFuture<Integer>();
718 +        f.complete(one);
719 +        f2 = new CompletableFuture<Integer>();
720 +        g = f.thenAcceptBoth(f2, r);
721 +        checkIncomplete(g);
722 +        f2.complete(two);
723 +        checkCompletedNormally(g, null);
724 +        assertEquals(r.value, 3);
725 +    }
726 +
727 +    /**
728 +     * thenAcceptBoth result completes exceptionally after exceptional
729 +     * completion of either source
730 +     */
731 +    public void testThenAcceptBoth2() {
732 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
733 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
734 +        AddAction r = new AddAction();
735 +        CompletableFuture<Void> g = f.thenAcceptBoth(f2, r);
736 +        f.completeExceptionally(new CFException());
737 +        f2.complete(two);
738 +        checkCompletedWithWrappedCFException(g);
739 +
740 +        r = new AddAction();
741 +        f = new CompletableFuture<Integer>();
742 +        f.complete(one);
743 +        f2 = new CompletableFuture<Integer>();
744 +        g = f.thenAcceptBoth(f2, r);
745 +        f2.completeExceptionally(new CFException());
746 +        checkCompletedWithWrappedCFException(g);
747 +    }
748 +
749 +    /**
750 +     * thenAcceptBoth result completes exceptionally if action does
751 +     */
752 +    public void testThenAcceptBoth3() {
753 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
754 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
755 +        FailingBiConsumer r = new FailingBiConsumer();
756 +        CompletableFuture<Void> g = f.thenAcceptBoth(f2, r);
757 +        f.complete(one);
758 +        checkIncomplete(g);
759 +        f2.complete(two);
760 +        checkCompletedWithWrappedCFException(g);
761 +    }
762 +
763 +    /**
764 +     * thenAcceptBoth result completes exceptionally if either source cancelled
765 +     */
766 +    public void testThenAcceptBoth4() {
767 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
768 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
769 +        AddAction r = new AddAction();
770 +        CompletableFuture<Void> g = f.thenAcceptBoth(f2, r);
771 +        assertTrue(f.cancel(true));
772 +        f2.complete(two);
773 +        checkCompletedWithWrappedCancellationException(g);
774 +        f = new CompletableFuture<Integer>();
775 +        f2 = new CompletableFuture<Integer>();
776 +        r = new AddAction();
777 +        g = f.thenAcceptBoth(f2, r);
778 +        f.complete(one);
779 +        assertTrue(f2.cancel(true));
780 +        checkCompletedWithWrappedCancellationException(g);
781 +    }
782 +
783 +    /**
784 +     * runAfterBoth result completes normally after normal
785 +     * completion of sources
786 +     */
787 +    public void testRunAfterBoth() {
788 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
789 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
790 +        Noop r = new Noop();
791 +        CompletableFuture<Void> g = f.runAfterBoth(f2, r);
792 +        f.complete(one);
793 +        checkIncomplete(g);
794 +        f2.complete(two);
795 +        checkCompletedNormally(g, null);
796 +        assertTrue(r.ran);
797 +
798 +        r = new Noop();
799 +        f = new CompletableFuture<Integer>();
800 +        f.complete(one);
801 +        f2 = new CompletableFuture<Integer>();
802 +        g = f.runAfterBoth(f2, r);
803 +        checkIncomplete(g);
804 +        f2.complete(two);
805 +        checkCompletedNormally(g, null);
806 +        assertTrue(r.ran);
807 +    }
808 +
809 +    /**
810 +     * runAfterBoth result completes exceptionally after exceptional
811 +     * completion of either source
812 +     */
813 +    public void testRunAfterBoth2() {
814 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
815 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
816 +        Noop r = new Noop();
817 +        CompletableFuture<Void> g = f.runAfterBoth(f2, r);
818 +        f.completeExceptionally(new CFException());
819 +        f2.complete(two);
820 +        checkCompletedWithWrappedCFException(g);
821 +
822 +        r = new Noop();
823 +        f = new CompletableFuture<Integer>();
824 +        f.complete(one);
825 +        f2 = new CompletableFuture<Integer>();
826 +        g = f.runAfterBoth(f2, r);
827 +        f2.completeExceptionally(new CFException());
828 +        checkCompletedWithWrappedCFException(g);
829 +    }
830 +
831 +    /**
832 +     * runAfterBoth result completes exceptionally if action does
833 +     */
834 +    public void testRunAfterBoth3() {
835 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
836 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
837 +        FailingNoop r = new FailingNoop();
838 +        CompletableFuture<Void> g = f.runAfterBoth(f2, r);
839 +        f.complete(one);
840 +        checkIncomplete(g);
841 +        f2.complete(two);
842 +        checkCompletedWithWrappedCFException(g);
843 +    }
844 +
845 +    /**
846 +     * runAfterBoth result completes exceptionally if either source cancelled
847 +     */
848 +    public void testRunAfterBoth4() {
849 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
850 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
851 +        Noop r = new Noop();
852 +        CompletableFuture<Void> g = f.runAfterBoth(f2, r);
853 +        assertTrue(f.cancel(true));
854 +        f2.complete(two);
855 +        checkCompletedWithWrappedCancellationException(g);
856 +        f = new CompletableFuture<Integer>();
857 +        f2 = new CompletableFuture<Integer>();
858 +        r = new Noop();
859 +        g = f.runAfterBoth(f2, r);
860 +        f.complete(one);
861 +        assertTrue(f2.cancel(true));
862 +        checkCompletedWithWrappedCancellationException(g);
863 +    }
864 +
865 +    /**
866 +     * applyToEither result completes normally after normal completion
867 +     * of either source
868 +     */
869 +    public void testApplyToEither() {
870 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
871 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
872 +        CompletableFuture<Integer> g = f.applyToEither(f2, inc);
873 +        f.complete(one);
874 +        checkCompletedNormally(g, two);
875 +        f2.complete(one);
876 +        checkCompletedNormally(g, two);
877 +
878 +        f = new CompletableFuture<Integer>();
879 +        f.complete(one);
880 +        f2 = new CompletableFuture<Integer>();
881 +        g = f.applyToEither(f2, inc);
882 +        checkCompletedNormally(g, two);
883 +    }
884 +
885 +    /**
886 +     * applyToEither result completes exceptionally after exceptional
887 +     * completion of either source
888 +     */
889 +    public void testApplyToEither2() {
890 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
891 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
892 +        CompletableFuture<Integer> g = f.applyToEither(f2, inc);
893 +        f.completeExceptionally(new CFException());
894 +        f2.complete(one);
895 +        checkCompletedWithWrappedCFException(g);
896 +
897 +        f = new CompletableFuture<Integer>();
898 +        f2 = new CompletableFuture<Integer>();
899 +        f2.completeExceptionally(new CFException());
900 +        g = f.applyToEither(f2, inc);
901 +        checkCompletedWithWrappedCFException(g);
902 +    }
903 +
904 +    /**
905 +     * applyToEither result completes exceptionally if action does
906 +     */
907 +    public void testApplyToEither3() {
908 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
909 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
910 +        FailingFunction r = new FailingFunction();
911 +        CompletableFuture<Integer> g = f.applyToEither(f2, r);
912 +        f2.complete(two);
913 +        checkCompletedWithWrappedCFException(g);
914 +    }
915 +
916 +    /**
917 +     * applyToEither result completes exceptionally if either source cancelled
918 +     */
919 +    public void testApplyToEither4() {
920 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
921 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
922 +        CompletableFuture<Integer> g = f.applyToEither(f2, inc);
923 +        assertTrue(f.cancel(true));
924 +        checkCompletedWithWrappedCancellationException(g);
925 +        f = new CompletableFuture<Integer>();
926 +        f2 = new CompletableFuture<Integer>();
927 +        assertTrue(f2.cancel(true));
928 +        checkCompletedWithWrappedCancellationException(g);
929 +    }
930 +
931 +    /**
932 +     * acceptEither result completes normally after normal completion
933 +     * of either source
934 +     */
935 +    public void testAcceptEither() {
936 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
937 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
938 +        IncAction r = new IncAction();
939 +        CompletableFuture<Void> g = f.acceptEither(f2, r);
940 +        f.complete(one);
941 +        checkCompletedNormally(g, null);
942 +        f2.complete(one);
943 +        checkCompletedNormally(g, null);
944 +        assertEquals(r.value, 2);
945 +
946 +        r = new IncAction();
947 +        f = new CompletableFuture<Integer>();
948 +        f.complete(one);
949 +        f2 = new CompletableFuture<Integer>();
950 +        g = f.acceptEither(f2, r);
951 +        checkCompletedNormally(g, null);
952 +        assertEquals(r.value, 2);
953 +    }
954 +
955 +    /**
956 +     * acceptEither result completes exceptionally after exceptional
957 +     * completion of either source
958 +     */
959 +    public void testAcceptEither2() {
960 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
961 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
962 +        IncAction r = new IncAction();
963 +        CompletableFuture<Void> g = f.acceptEither(f2, r);
964 +        f.completeExceptionally(new CFException());
965 +        f2.complete(one);
966 +        checkCompletedWithWrappedCFException(g);
967 +
968 +        r = new IncAction();
969 +        f = new CompletableFuture<Integer>();
970 +        f2 = new CompletableFuture<Integer>();
971 +        f2.completeExceptionally(new CFException());
972 +        g = f.acceptEither(f2, r);
973 +        checkCompletedWithWrappedCFException(g);
974 +    }
975 +
976 +    /**
977 +     * acceptEither result completes exceptionally if action does
978 +     */
979 +    public void testAcceptEither3() {
980 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
981 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
982 +        FailingConsumer r = new FailingConsumer();
983 +        CompletableFuture<Void> g = f.acceptEither(f2, r);
984 +        f2.complete(two);
985 +        checkCompletedWithWrappedCFException(g);
986 +    }
987 +
988 +    /**
989 +     * acceptEither result completes exceptionally if either source cancelled
990 +     */
991 +    public void testAcceptEither4() {
992 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
993 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
994 +        IncAction r = new IncAction();
995 +        CompletableFuture<Void> g = f.acceptEither(f2, r);
996 +        assertTrue(f.cancel(true));
997 +        checkCompletedWithWrappedCancellationException(g);
998 +        f = new CompletableFuture<Integer>();
999 +        f2 = new CompletableFuture<Integer>();
1000 +        assertTrue(f2.cancel(true));
1001 +        checkCompletedWithWrappedCancellationException(g);
1002 +    }
1003 +
1004 +
1005 +    /**
1006 +     * runAfterEither result completes normally after normal completion
1007 +     * of either source
1008 +     */
1009 +    public void testRunAfterEither() {
1010 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1011 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1012 +        Noop r = new Noop();
1013 +        CompletableFuture<Void> g = f.runAfterEither(f2, r);
1014 +        f.complete(one);
1015 +        checkCompletedNormally(g, null);
1016 +        f2.complete(one);
1017 +        checkCompletedNormally(g, null);
1018 +        assertTrue(r.ran);
1019 +
1020 +        r = new Noop();
1021 +        f = new CompletableFuture<Integer>();
1022 +        f.complete(one);
1023 +        f2 = new CompletableFuture<Integer>();
1024 +        g = f.runAfterEither(f2, r);
1025 +        checkCompletedNormally(g, null);
1026 +        assertTrue(r.ran);
1027 +    }
1028 +
1029 +    /**
1030 +     * runAfterEither result completes exceptionally after exceptional
1031 +     * completion of either source
1032 +     */
1033 +    public void testRunAfterEither2() {
1034 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1035 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1036 +        Noop r = new Noop();
1037 +        CompletableFuture<Void> g = f.runAfterEither(f2, r);
1038 +        f.completeExceptionally(new CFException());
1039 +        f2.complete(one);
1040 +        checkCompletedWithWrappedCFException(g);
1041 +
1042 +        r = new Noop();
1043 +        f = new CompletableFuture<Integer>();
1044 +        f2 = new CompletableFuture<Integer>();
1045 +        f2.completeExceptionally(new CFException());
1046 +        g = f.runAfterEither(f2, r);
1047 +        checkCompletedWithWrappedCFException(g);
1048 +    }
1049 +
1050 +    /**
1051 +     * runAfterEither result completes exceptionally if action does
1052 +     */
1053 +    public void testRunAfterEither3() {
1054 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1055 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1056 +        FailingNoop r = new FailingNoop();
1057 +        CompletableFuture<Void> g = f.runAfterEither(f2, r);
1058 +        f2.complete(two);
1059 +        checkCompletedWithWrappedCFException(g);
1060 +    }
1061 +
1062 +    /**
1063 +     * runAfterEither result completes exceptionally if either source cancelled
1064 +     */
1065 +    public void testRunAfterEither4() {
1066 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1067 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1068 +        Noop r = new Noop();
1069 +        CompletableFuture<Void> g = f.runAfterEither(f2, r);
1070 +        assertTrue(f.cancel(true));
1071 +        checkCompletedWithWrappedCancellationException(g);
1072 +        f = new CompletableFuture<Integer>();
1073 +        f2 = new CompletableFuture<Integer>();
1074 +        assertTrue(f2.cancel(true));
1075 +        checkCompletedWithWrappedCancellationException(g);
1076 +    }
1077 +
1078 +    /**
1079 +     * thenCompose result completes normally after normal completion of source
1080 +     */
1081 +    public void testThenCompose() {
1082 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1083 +        CompletableFutureInc r = new CompletableFutureInc();
1084 +        CompletableFuture<Integer> g = f.thenCompose(r);
1085 +        f.complete(one);
1086 +        checkCompletedNormally(g, two);
1087 +    }
1088 +
1089 +    /**
1090 +     * thenCompose result completes exceptionally after exceptional
1091 +     * completion of source
1092 +     */
1093 +    public void testThenCompose2() {
1094 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1095 +        CompletableFutureInc r = new CompletableFutureInc();
1096 +        CompletableFuture<Integer> g = f.thenCompose(r);
1097 +        f.completeExceptionally(new CFException());
1098 +        checkCompletedWithWrappedCFException(g);
1099 +    }
1100 +
1101 +    /**
1102 +     * thenCompose result completes exceptionally if action does
1103 +     */
1104 +    public void testThenCompose3() {
1105 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1106 +        FailingCompletableFutureFunction r = new FailingCompletableFutureFunction();
1107 +        CompletableFuture<Integer> g = f.thenCompose(r);
1108 +        f.complete(one);
1109 +        checkCompletedWithWrappedCFException(g);
1110 +    }
1111 +
1112 +    /**
1113 +     * thenCompose result completes exceptionally if source cancelled
1114 +     */
1115 +    public void testThenCompose4() {
1116 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1117 +        CompletableFutureInc r = new CompletableFutureInc();
1118 +        CompletableFuture<Integer> g = f.thenCompose(r);
1119 +        assertTrue(f.cancel(true));
1120 +        checkCompletedWithWrappedCancellationException(g);
1121 +    }
1122 +
1123 +
1124 +    // asyncs
1125 +
1126 +    /**
1127 +     * thenRunAsync result completes normally after normal completion of source
1128 +     */
1129 +    public void testThenRunAsync() {
1130 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1131 +        Noop r = new Noop();
1132 +        CompletableFuture<Void> g = f.thenRunAsync(r);
1133 +        f.complete(null);
1134 +        checkCompletedNormally(g, null);
1135 +
1136 +        // reordered version
1137 +        f = new CompletableFuture<Integer>();
1138 +        f.complete(null);
1139 +        r = new Noop();
1140 +        g = f.thenRunAsync(r);
1141 +        checkCompletedNormally(g, null);
1142 +    }
1143 +
1144 +    /**
1145 +     * thenRunAsync result completes exceptionally after exceptional
1146 +     * completion of source
1147 +     */
1148 +    public void testThenRunAsync2() {
1149 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1150 +        Noop r = new Noop();
1151 +        CompletableFuture<Void> g = f.thenRunAsync(r);
1152 +        f.completeExceptionally(new CFException());
1153 +        try {
1154 +            g.join();
1155 +            shouldThrow();
1156 +        } catch (Exception ok) {
1157 +        }
1158 +        checkCompletedWithWrappedCFException(g);
1159 +    }
1160 +
1161 +    /**
1162 +     * thenRunAsync result completes exceptionally if action does
1163 +     */
1164 +    public void testThenRunAsync3() {
1165 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1166 +        FailingNoop r = new FailingNoop();
1167 +        CompletableFuture<Void> g = f.thenRunAsync(r);
1168 +        f.complete(null);
1169 +        checkCompletedWithWrappedCFException(g);
1170 +    }
1171 +
1172 +    /**
1173 +     * thenRunAsync result completes exceptionally if source cancelled
1174 +     */
1175 +    public void testThenRunAsync4() {
1176 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1177 +        Noop r = new Noop();
1178 +        CompletableFuture<Void> g = f.thenRunAsync(r);
1179 +        assertTrue(f.cancel(true));
1180 +        checkCompletedWithWrappedCancellationException(g);
1181 +    }
1182 +
1183 +    /**
1184 +     * thenApplyAsync result completes normally after normal completion of source
1185 +     */
1186 +    public void testThenApplyAsync() {
1187 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1188 +        CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1189 +        f.complete(one);
1190 +        checkCompletedNormally(g, two);
1191 +    }
1192 +
1193 +    /**
1194 +     * thenApplyAsync result completes exceptionally after exceptional
1195 +     * completion of source
1196 +     */
1197 +    public void testThenApplyAsync2() {
1198 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1199 +        CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1200 +        f.completeExceptionally(new CFException());
1201 +        checkCompletedWithWrappedCFException(g);
1202 +    }
1203 +
1204 +    /**
1205 +     * thenApplyAsync result completes exceptionally if action does
1206 +     */
1207 +    public void testThenApplyAsync3() {
1208 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1209 +        FailingFunction r = new FailingFunction();
1210 +        CompletableFuture<Integer> g = f.thenApplyAsync(r);
1211 +        f.complete(null);
1212 +        checkCompletedWithWrappedCFException(g);
1213 +    }
1214 +
1215 +    /**
1216 +     * thenApplyAsync result completes exceptionally if source cancelled
1217 +     */
1218 +    public void testThenApplyAsync4() {
1219 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1220 +        CompletableFuture<Integer> g = f.thenApplyAsync(inc);
1221 +        assertTrue(f.cancel(true));
1222 +        checkCompletedWithWrappedCancellationException(g);
1223 +    }
1224 +
1225 +    /**
1226 +     * thenAcceptAsync result completes normally after normal
1227 +     * completion of source
1228 +     */
1229 +    public void testThenAcceptAsync() {
1230 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1231 +        IncAction r = new IncAction();
1232 +        CompletableFuture<Void> g = f.thenAcceptAsync(r);
1233 +        f.complete(one);
1234 +        checkCompletedNormally(g, null);
1235 +        assertEquals(r.value, 2);
1236 +    }
1237 +
1238 +    /**
1239 +     * thenAcceptAsync result completes exceptionally after exceptional
1240 +     * completion of source
1241 +     */
1242 +    public void testThenAcceptAsync2() {
1243 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1244 +        IncAction r = new IncAction();
1245 +        CompletableFuture<Void> g = f.thenAcceptAsync(r);
1246 +        f.completeExceptionally(new CFException());
1247 +        checkCompletedWithWrappedCFException(g);
1248 +    }
1249 +
1250 +    /**
1251 +     * thenAcceptAsync result completes exceptionally if action does
1252 +     */
1253 +    public void testThenAcceptAsync3() {
1254 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1255 +        FailingConsumer r = new FailingConsumer();
1256 +        CompletableFuture<Void> g = f.thenAcceptAsync(r);
1257 +        f.complete(null);
1258 +        checkCompletedWithWrappedCFException(g);
1259 +    }
1260 +
1261 +    /**
1262 +     * thenAcceptAsync result completes exceptionally if source cancelled
1263 +     */
1264 +    public void testThenAcceptAsync4() {
1265 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1266 +        IncAction r = new IncAction();
1267 +        CompletableFuture<Void> g = f.thenAcceptAsync(r);
1268 +        assertTrue(f.cancel(true));
1269 +        checkCompletedWithWrappedCancellationException(g);
1270 +    }
1271 +    /**
1272 +     * thenCombineAsync result completes normally after normal
1273 +     * completion of sources
1274 +     */
1275 +    public void testThenCombineAsync() {
1276 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1277 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1278 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, add);
1279 +        f.complete(one);
1280 +        checkIncomplete(g);
1281 +        f2.complete(two);
1282 +        checkCompletedNormally(g, three);
1283 +    }
1284 +
1285 +    /**
1286 +     * thenCombineAsync result completes exceptionally after exceptional
1287 +     * completion of source
1288 +     */
1289 +    public void testThenCombineAsync2() {
1290 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1291 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1292 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, add);
1293 +        f.completeExceptionally(new CFException());
1294 +        f2.complete(two);
1295 +        checkCompletedWithWrappedCFException(g);
1296 +
1297 +        f = new CompletableFuture<Integer>();
1298 +        f2 = new CompletableFuture<Integer>();
1299 +        g = f.thenCombineAsync(f2, add);
1300 +        f.complete(one);
1301 +        f2.completeExceptionally(new CFException());
1302 +        checkCompletedWithWrappedCFException(g);
1303 +    }
1304 +
1305 +    /**
1306 +     * thenCombineAsync result completes exceptionally if action does
1307 +     */
1308 +    public void testThenCombineAsync3() {
1309 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1310 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1311 +        FailingBiFunction r = new FailingBiFunction();
1312 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, r);
1313 +        f.complete(one);
1314 +        checkIncomplete(g);
1315 +        f2.complete(two);
1316 +        checkCompletedWithWrappedCFException(g);
1317 +    }
1318 +
1319 +    /**
1320 +     * thenCombineAsync result completes exceptionally if either source cancelled
1321 +     */
1322 +    public void testThenCombineAsync4() {
1323 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1324 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1325 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, add);
1326 +        assertTrue(f.cancel(true));
1327 +        f2.complete(two);
1328 +        checkCompletedWithWrappedCancellationException(g);
1329 +
1330 +        f = new CompletableFuture<Integer>();
1331 +        f2 = new CompletableFuture<Integer>();
1332 +        g = f.thenCombineAsync(f2, add);
1333 +        f.complete(one);
1334 +        assertTrue(f2.cancel(true));
1335 +        checkCompletedWithWrappedCancellationException(g);
1336 +    }
1337 +
1338 +    /**
1339 +     * thenAcceptBothAsync result completes normally after normal
1340 +     * completion of sources
1341 +     */
1342 +    public void testThenAcceptBothAsync() {
1343 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1344 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1345 +        AddAction r = new AddAction();
1346 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r);
1347 +        f.complete(one);
1348 +        checkIncomplete(g);
1349 +        f2.complete(two);
1350 +        checkCompletedNormally(g, null);
1351 +        assertEquals(r.value, 3);
1352 +    }
1353 +
1354 +    /**
1355 +     * thenAcceptBothAsync result completes exceptionally after exceptional
1356 +     * completion of source
1357 +     */
1358 +    public void testThenAcceptBothAsync2() {
1359 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1360 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1361 +        AddAction r = new AddAction();
1362 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r);
1363 +        f.completeExceptionally(new CFException());
1364 +        f2.complete(two);
1365 +        checkCompletedWithWrappedCFException(g);
1366 +
1367 +        r = new AddAction();
1368 +        f = new CompletableFuture<Integer>();
1369 +        f2 = new CompletableFuture<Integer>();
1370 +        g = f.thenAcceptBothAsync(f2, r);
1371 +        f.complete(one);
1372 +        f2.completeExceptionally(new CFException());
1373 +        checkCompletedWithWrappedCFException(g);
1374 +    }
1375 +
1376 +    /**
1377 +     * thenAcceptBothAsync result completes exceptionally if action does
1378 +     */
1379 +    public void testThenAcceptBothAsync3() {
1380 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1381 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1382 +        FailingBiConsumer r = new FailingBiConsumer();
1383 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r);
1384 +        f.complete(one);
1385 +        checkIncomplete(g);
1386 +        f2.complete(two);
1387 +        checkCompletedWithWrappedCFException(g);
1388 +    }
1389 +
1390 +    /**
1391 +     * thenAcceptBothAsync result completes exceptionally if either source cancelled
1392 +     */
1393 +    public void testThenAcceptBothAsync4() {
1394 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1395 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1396 +        AddAction r = new AddAction();
1397 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r);
1398 +        assertTrue(f.cancel(true));
1399 +        f2.complete(two);
1400 +        checkCompletedWithWrappedCancellationException(g);
1401 +
1402 +        r = new AddAction();
1403 +        f = new CompletableFuture<Integer>();
1404 +        f2 = new CompletableFuture<Integer>();
1405 +        g = f.thenAcceptBothAsync(f2, r);
1406 +        f.complete(one);
1407 +        assertTrue(f2.cancel(true));
1408 +        checkCompletedWithWrappedCancellationException(g);
1409 +    }
1410 +
1411 +    /**
1412 +     * runAfterBothAsync result completes normally after normal
1413 +     * completion of sources
1414 +     */
1415 +    public void testRunAfterBothAsync() {
1416 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1417 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1418 +        Noop r = new Noop();
1419 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1420 +        f.complete(one);
1421 +        checkIncomplete(g);
1422 +        f2.complete(two);
1423 +        checkCompletedNormally(g, null);
1424 +        assertTrue(r.ran);
1425 +    }
1426 +
1427 +    /**
1428 +     * runAfterBothAsync result completes exceptionally after exceptional
1429 +     * completion of source
1430 +     */
1431 +    public void testRunAfterBothAsync2() {
1432 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1433 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1434 +        Noop r = new Noop();
1435 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1436 +        f.completeExceptionally(new CFException());
1437 +        f2.complete(two);
1438 +        checkCompletedWithWrappedCFException(g);
1439 +
1440 +        r = new Noop();
1441 +        f = new CompletableFuture<Integer>();
1442 +        f2 = new CompletableFuture<Integer>();
1443 +        g = f.runAfterBothAsync(f2, r);
1444 +        f.complete(one);
1445 +        f2.completeExceptionally(new CFException());
1446 +        checkCompletedWithWrappedCFException(g);
1447 +    }
1448 +
1449 +    /**
1450 +     * runAfterBothAsync result completes exceptionally if action does
1451 +     */
1452 +    public void testRunAfterBothAsync3() {
1453 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1454 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1455 +        FailingNoop r = new FailingNoop();
1456 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1457 +        f.complete(one);
1458 +        checkIncomplete(g);
1459 +        f2.complete(two);
1460 +        checkCompletedWithWrappedCFException(g);
1461 +    }
1462 +
1463 +    /**
1464 +     * runAfterBothAsync result completes exceptionally if either source cancelled
1465 +     */
1466 +    public void testRunAfterBothAsync4() {
1467 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1468 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1469 +        Noop r = new Noop();
1470 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r);
1471 +        assertTrue(f.cancel(true));
1472 +        f2.complete(two);
1473 +        checkCompletedWithWrappedCancellationException(g);
1474 +
1475 +        r = new Noop();
1476 +        f = new CompletableFuture<Integer>();
1477 +        f2 = new CompletableFuture<Integer>();
1478 +        g = f.runAfterBothAsync(f2, r);
1479 +        f.complete(one);
1480 +        assertTrue(f2.cancel(true));
1481 +        checkCompletedWithWrappedCancellationException(g);
1482 +    }
1483 +
1484 +    /**
1485 +     * applyToEitherAsync result completes normally after normal
1486 +     * completion of sources
1487 +     */
1488 +    public void testApplyToEitherAsync() {
1489 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1490 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1491 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1492 +        f.complete(one);
1493 +        checkCompletedNormally(g, two);
1494 +
1495 +        f = new CompletableFuture<Integer>();
1496 +        f.complete(one);
1497 +        f2 = new CompletableFuture<Integer>();
1498 +        g = f.applyToEitherAsync(f2, inc);
1499 +        checkCompletedNormally(g, two);
1500 +    }
1501 +
1502 +    /**
1503 +     * applyToEitherAsync result completes exceptionally after exceptional
1504 +     * completion of source
1505 +     */
1506 +    public void testApplyToEitherAsync2() {
1507 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1508 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1509 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1510 +        f.completeExceptionally(new CFException());
1511 +        checkCompletedWithWrappedCFException(g);
1512 +
1513 +        f = new CompletableFuture<Integer>();
1514 +        f2 = new CompletableFuture<Integer>();
1515 +        f2.completeExceptionally(new CFException());
1516 +        g = f.applyToEitherAsync(f2, inc);
1517 +        f.complete(one);
1518 +        checkCompletedWithWrappedCFException(g);
1519 +    }
1520 +
1521 +    /**
1522 +     * applyToEitherAsync result completes exceptionally if action does
1523 +     */
1524 +    public void testApplyToEitherAsync3() {
1525 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1526 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1527 +        FailingFunction r = new FailingFunction();
1528 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, r);
1529 +        f.complete(one);
1530 +        checkCompletedWithWrappedCFException(g);
1531 +    }
1532 +
1533 +    /**
1534 +     * applyToEitherAsync result completes exceptionally if either source cancelled
1535 +     */
1536 +    public void testApplyToEitherAsync4() {
1537 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1538 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1539 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc);
1540 +        assertTrue(f.cancel(true));
1541 +        checkCompletedWithWrappedCancellationException(g);
1542 +
1543 +        f = new CompletableFuture<Integer>();
1544 +        f2 = new CompletableFuture<Integer>();
1545 +        assertTrue(f2.cancel(true));
1546 +        g = f.applyToEitherAsync(f2, inc);
1547 +        checkCompletedWithWrappedCancellationException(g);
1548 +    }
1549 +
1550 +    /**
1551 +     * acceptEitherAsync result completes normally after normal
1552 +     * completion of sources
1553 +     */
1554 +    public void testAcceptEitherAsync() {
1555 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1556 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1557 +        IncAction r = new IncAction();
1558 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1559 +        f.complete(one);
1560 +        checkCompletedNormally(g, null);
1561 +        assertEquals(r.value, 2);
1562 +
1563 +        r = new IncAction();
1564 +        f = new CompletableFuture<Integer>();
1565 +        f.complete(one);
1566 +        f2 = new CompletableFuture<Integer>();
1567 +        g = f.acceptEitherAsync(f2, r);
1568 +        checkCompletedNormally(g, null);
1569 +        assertEquals(r.value, 2);
1570 +    }
1571 +
1572 +    /**
1573 +     * acceptEitherAsync result completes exceptionally after exceptional
1574 +     * completion of source
1575 +     */
1576 +    public void testAcceptEitherAsync2() {
1577 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1578 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1579 +        IncAction r = new IncAction();
1580 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1581 +        f.completeExceptionally(new CFException());
1582 +        checkCompletedWithWrappedCFException(g);
1583 +
1584 +        r = new IncAction();
1585 +        f = new CompletableFuture<Integer>();
1586 +        f2 = new CompletableFuture<Integer>();
1587 +        f2.completeExceptionally(new CFException());
1588 +        g = f.acceptEitherAsync(f2, r);
1589 +        f.complete(one);
1590 +        checkCompletedWithWrappedCFException(g);
1591 +    }
1592 +
1593 +    /**
1594 +     * acceptEitherAsync result completes exceptionally if action does
1595 +     */
1596 +    public void testAcceptEitherAsync3() {
1597 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1598 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1599 +        FailingConsumer r = new FailingConsumer();
1600 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1601 +        f.complete(one);
1602 +        checkCompletedWithWrappedCFException(g);
1603 +    }
1604 +
1605 +    /**
1606 +     * acceptEitherAsync result completes exceptionally if either
1607 +     * source cancelled
1608 +     */
1609 +    public void testAcceptEitherAsync4() {
1610 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1611 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1612 +        IncAction r = new IncAction();
1613 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r);
1614 +        assertTrue(f.cancel(true));
1615 +        checkCompletedWithWrappedCancellationException(g);
1616 +
1617 +        r = new IncAction();
1618 +        f = new CompletableFuture<Integer>();
1619 +        f2 = new CompletableFuture<Integer>();
1620 +        assertTrue(f2.cancel(true));
1621 +        g = f.acceptEitherAsync(f2, r);
1622 +        checkCompletedWithWrappedCancellationException(g);
1623 +    }
1624 +
1625 +    /**
1626 +     * runAfterEitherAsync result completes normally after normal
1627 +     * completion of sources
1628 +     */
1629 +    public void testRunAfterEitherAsync() {
1630 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1631 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1632 +        Noop r = new Noop();
1633 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1634 +        f.complete(one);
1635 +        checkCompletedNormally(g, null);
1636 +        assertTrue(r.ran);
1637 +
1638 +        r = new Noop();
1639 +        f = new CompletableFuture<Integer>();
1640 +        f.complete(one);
1641 +        f2 = new CompletableFuture<Integer>();
1642 +        g = f.runAfterEitherAsync(f2, r);
1643 +        checkCompletedNormally(g, null);
1644 +        assertTrue(r.ran);
1645 +    }
1646 +
1647 +    /**
1648 +     * runAfterEitherAsync result completes exceptionally after exceptional
1649 +     * completion of source
1650 +     */
1651 +    public void testRunAfterEitherAsync2() {
1652 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1653 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1654 +        Noop r = new Noop();
1655 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1656 +        f.completeExceptionally(new CFException());
1657 +        checkCompletedWithWrappedCFException(g);
1658 +
1659 +        r = new Noop();
1660 +        f = new CompletableFuture<Integer>();
1661 +        f2 = new CompletableFuture<Integer>();
1662 +        f2.completeExceptionally(new CFException());
1663 +        g = f.runAfterEitherAsync(f2, r);
1664 +        f.complete(one);
1665 +        checkCompletedWithWrappedCFException(g);
1666 +    }
1667 +
1668 +    /**
1669 +     * runAfterEitherAsync result completes exceptionally if action does
1670 +     */
1671 +    public void testRunAfterEitherAsync3() {
1672 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1673 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1674 +        FailingNoop r = new FailingNoop();
1675 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1676 +        f.complete(one);
1677 +        checkCompletedWithWrappedCFException(g);
1678 +    }
1679 +
1680 +    /**
1681 +     * runAfterEitherAsync result completes exceptionally if either
1682 +     * source cancelled
1683 +     */
1684 +    public void testRunAfterEitherAsync4() {
1685 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1686 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1687 +        Noop r = new Noop();
1688 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r);
1689 +        assertTrue(f.cancel(true));
1690 +        checkCompletedWithWrappedCancellationException(g);
1691 +
1692 +        r = new Noop();
1693 +        f = new CompletableFuture<Integer>();
1694 +        f2 = new CompletableFuture<Integer>();
1695 +        assertTrue(f2.cancel(true));
1696 +        g = f.runAfterEitherAsync(f2, r);
1697 +        checkCompletedWithWrappedCancellationException(g);
1698 +    }
1699 +
1700 +    /**
1701 +     * thenComposeAsync result completes normally after normal
1702 +     * completion of source
1703 +     */
1704 +    public void testThenComposeAsync() {
1705 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1706 +        CompletableFutureInc r = new CompletableFutureInc();
1707 +        CompletableFuture<Integer> g = f.thenComposeAsync(r);
1708 +        f.complete(one);
1709 +        checkCompletedNormally(g, two);
1710 +    }
1711 +
1712 +    /**
1713 +     * thenComposeAsync result completes exceptionally after
1714 +     * exceptional completion of source
1715 +     */
1716 +    public void testThenComposeAsync2() {
1717 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1718 +        CompletableFutureInc r = new CompletableFutureInc();
1719 +        CompletableFuture<Integer> g = f.thenComposeAsync(r);
1720 +        f.completeExceptionally(new CFException());
1721 +        checkCompletedWithWrappedCFException(g);
1722 +    }
1723 +
1724 +    /**
1725 +     * thenComposeAsync result completes exceptionally if action does
1726 +     */
1727 +    public void testThenComposeAsync3() {
1728 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1729 +        FailingCompletableFutureFunction r = new FailingCompletableFutureFunction();
1730 +        CompletableFuture<Integer> g = f.thenComposeAsync(r);
1731 +        f.complete(one);
1732 +        checkCompletedWithWrappedCFException(g);
1733 +    }
1734 +
1735 +    /**
1736 +     * thenComposeAsync result completes exceptionally if source cancelled
1737 +     */
1738 +    public void testThenComposeAsync4() {
1739 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1740 +        CompletableFutureInc r = new CompletableFutureInc();
1741 +        CompletableFuture<Integer> g = f.thenComposeAsync(r);
1742 +        assertTrue(f.cancel(true));
1743 +        checkCompletedWithWrappedCancellationException(g);
1744 +    }
1745 +
1746 +
1747 +    // async with explicit executors
1748 +
1749 +    /**
1750 +     * thenRunAsync result completes normally after normal completion of source
1751 +     */
1752 +    public void testThenRunAsyncE() {
1753 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1754 +        Noop r = new Noop();
1755 +        CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
1756 +        f.complete(null);
1757 +        checkCompletedNormally(g, null);
1758 +
1759 +        // reordered version
1760 +        f = new CompletableFuture<Integer>();
1761 +        f.complete(null);
1762 +        r = new Noop();
1763 +        g = f.thenRunAsync(r, new ThreadExecutor());
1764 +        checkCompletedNormally(g, null);
1765 +    }
1766 +
1767 +    /**
1768 +     * thenRunAsync result completes exceptionally after exceptional
1769 +     * completion of source
1770 +     */
1771 +    public void testThenRunAsync2E() {
1772 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1773 +        Noop r = new Noop();
1774 +        CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
1775 +        f.completeExceptionally(new CFException());
1776 +        try {
1777 +            g.join();
1778 +            shouldThrow();
1779 +        } catch (Exception ok) {
1780 +        }
1781 +        checkCompletedWithWrappedCFException(g);
1782 +    }
1783 +
1784 +    /**
1785 +     * thenRunAsync result completes exceptionally if action does
1786 +     */
1787 +    public void testThenRunAsync3E() {
1788 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1789 +        FailingNoop r = new FailingNoop();
1790 +        CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
1791 +        f.complete(null);
1792 +        checkCompletedWithWrappedCFException(g);
1793 +    }
1794 +
1795 +    /**
1796 +     * thenRunAsync result completes exceptionally if source cancelled
1797 +     */
1798 +    public void testThenRunAsync4E() {
1799 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1800 +        Noop r = new Noop();
1801 +        CompletableFuture<Void> g = f.thenRunAsync(r, new ThreadExecutor());
1802 +        assertTrue(f.cancel(true));
1803 +        checkCompletedWithWrappedCancellationException(g);
1804 +    }
1805 +
1806 +    /**
1807 +     * thenApplyAsync result completes normally after normal completion of source
1808 +     */
1809 +    public void testThenApplyAsyncE() {
1810 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1811 +        CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
1812 +        f.complete(one);
1813 +        checkCompletedNormally(g, two);
1814 +    }
1815 +
1816 +    /**
1817 +     * thenApplyAsync result completes exceptionally after exceptional
1818 +     * completion of source
1819 +     */
1820 +    public void testThenApplyAsync2E() {
1821 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1822 +        CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
1823 +        f.completeExceptionally(new CFException());
1824 +        checkCompletedWithWrappedCFException(g);
1825 +    }
1826 +
1827 +    /**
1828 +     * thenApplyAsync result completes exceptionally if action does
1829 +     */
1830 +    public void testThenApplyAsync3E() {
1831 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1832 +        FailingFunction r = new FailingFunction();
1833 +        CompletableFuture<Integer> g = f.thenApplyAsync(r, new ThreadExecutor());
1834 +        f.complete(null);
1835 +        checkCompletedWithWrappedCFException(g);
1836 +    }
1837 +
1838 +    /**
1839 +     * thenApplyAsync result completes exceptionally if source cancelled
1840 +     */
1841 +    public void testThenApplyAsync4E() {
1842 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1843 +        CompletableFuture<Integer> g = f.thenApplyAsync(inc, new ThreadExecutor());
1844 +        assertTrue(f.cancel(true));
1845 +        checkCompletedWithWrappedCancellationException(g);
1846 +    }
1847 +
1848 +    /**
1849 +     * thenAcceptAsync result completes normally after normal
1850 +     * completion of source
1851 +     */
1852 +    public void testThenAcceptAsyncE() {
1853 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1854 +        IncAction r = new IncAction();
1855 +        CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
1856 +        f.complete(one);
1857 +        checkCompletedNormally(g, null);
1858 +        assertEquals(r.value, 2);
1859 +    }
1860 +
1861 +    /**
1862 +     * thenAcceptAsync result completes exceptionally after exceptional
1863 +     * completion of source
1864 +     */
1865 +    public void testThenAcceptAsync2E() {
1866 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1867 +        IncAction r = new IncAction();
1868 +        CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
1869 +        f.completeExceptionally(new CFException());
1870 +        checkCompletedWithWrappedCFException(g);
1871 +    }
1872 +
1873 +    /**
1874 +     * thenAcceptAsync result completes exceptionally if action does
1875 +     */
1876 +    public void testThenAcceptAsync3E() {
1877 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1878 +        FailingConsumer r = new FailingConsumer();
1879 +        CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
1880 +        f.complete(null);
1881 +        checkCompletedWithWrappedCFException(g);
1882 +    }
1883 +
1884 +    /**
1885 +     * thenAcceptAsync result completes exceptionally if source cancelled
1886 +     */
1887 +    public void testThenAcceptAsync4E() {
1888 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1889 +        IncAction r = new IncAction();
1890 +        CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
1891 +        assertTrue(f.cancel(true));
1892 +        checkCompletedWithWrappedCancellationException(g);
1893 +    }
1894 +    /**
1895 +     * thenCombineAsync result completes normally after normal
1896 +     * completion of sources
1897 +     */
1898 +    public void testThenCombineAsyncE() {
1899 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1900 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1901 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, add, new ThreadExecutor());
1902 +        f.complete(one);
1903 +        checkIncomplete(g);
1904 +        f2.complete(two);
1905 +        checkCompletedNormally(g, three);
1906 +    }
1907 +
1908 +    /**
1909 +     * thenCombineAsync result completes exceptionally after exceptional
1910 +     * completion of source
1911 +     */
1912 +    public void testThenCombineAsync2E() {
1913 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1914 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1915 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, add, new ThreadExecutor());
1916 +        f.completeExceptionally(new CFException());
1917 +        f2.complete(two);
1918 +        checkCompletedWithWrappedCFException(g);
1919 +
1920 +        f = new CompletableFuture<Integer>();
1921 +        f2 = new CompletableFuture<Integer>();
1922 +        g = f.thenCombineAsync(f2, add, new ThreadExecutor());
1923 +        f.complete(one);
1924 +        f2.completeExceptionally(new CFException());
1925 +        checkCompletedWithWrappedCFException(g);
1926 +    }
1927 +
1928 +    /**
1929 +     * thenCombineAsync result completes exceptionally if action does
1930 +     */
1931 +    public void testThenCombineAsync3E() {
1932 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1933 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1934 +        FailingBiFunction r = new FailingBiFunction();
1935 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, r, new ThreadExecutor());
1936 +        f.complete(one);
1937 +        checkIncomplete(g);
1938 +        f2.complete(two);
1939 +        checkCompletedWithWrappedCFException(g);
1940 +    }
1941 +
1942 +    /**
1943 +     * thenCombineAsync result completes exceptionally if either source cancelled
1944 +     */
1945 +    public void testThenCombineAsync4E() {
1946 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1947 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1948 +        CompletableFuture<Integer> g = f.thenCombineAsync(f2, add, new ThreadExecutor());
1949 +        assertTrue(f.cancel(true));
1950 +        f2.complete(two);
1951 +        checkCompletedWithWrappedCancellationException(g);
1952 +
1953 +        f = new CompletableFuture<Integer>();
1954 +        f2 = new CompletableFuture<Integer>();
1955 +        g = f.thenCombineAsync(f2, add, new ThreadExecutor());
1956 +        f.complete(one);
1957 +        assertTrue(f2.cancel(true));
1958 +        checkCompletedWithWrappedCancellationException(g);
1959 +    }
1960 +
1961 +    /**
1962 +     * thenAcceptBothAsync result completes normally after normal
1963 +     * completion of sources
1964 +     */
1965 +    public void testThenAcceptBothAsyncE() {
1966 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1967 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1968 +        AddAction r = new AddAction();
1969 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor());
1970 +        f.complete(one);
1971 +        checkIncomplete(g);
1972 +        f2.complete(two);
1973 +        checkCompletedNormally(g, null);
1974 +        assertEquals(r.value, 3);
1975 +    }
1976 +
1977 +    /**
1978 +     * thenAcceptBothAsync result completes exceptionally after exceptional
1979 +     * completion of source
1980 +     */
1981 +    public void testThenAcceptBothAsync2E() {
1982 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
1983 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
1984 +        AddAction r = new AddAction();
1985 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor());
1986 +        f.completeExceptionally(new CFException());
1987 +        f2.complete(two);
1988 +        checkCompletedWithWrappedCFException(g);
1989 +
1990 +        r = new AddAction();
1991 +        f = new CompletableFuture<Integer>();
1992 +        f2 = new CompletableFuture<Integer>();
1993 +        g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor());
1994 +        f.complete(one);
1995 +        f2.completeExceptionally(new CFException());
1996 +        checkCompletedWithWrappedCFException(g);
1997 +    }
1998 +
1999 +    /**
2000 +     * thenAcceptBothAsync result completes exceptionally if action does
2001 +     */
2002 +    public void testThenAcceptBothAsync3E() {
2003 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2004 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2005 +        FailingBiConsumer r = new FailingBiConsumer();
2006 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor());
2007 +        f.complete(one);
2008 +        checkIncomplete(g);
2009 +        f2.complete(two);
2010 +        checkCompletedWithWrappedCFException(g);
2011 +    }
2012 +
2013 +    /**
2014 +     * thenAcceptBothAsync result completes exceptionally if either source cancelled
2015 +     */
2016 +    public void testThenAcceptBothAsync4E() {
2017 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2018 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2019 +        AddAction r = new AddAction();
2020 +        CompletableFuture<Void> g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor());
2021 +        assertTrue(f.cancel(true));
2022 +        f2.complete(two);
2023 +        checkCompletedWithWrappedCancellationException(g);
2024 +
2025 +        r = new AddAction();
2026 +        f = new CompletableFuture<Integer>();
2027 +        f2 = new CompletableFuture<Integer>();
2028 +        g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor());
2029 +        f.complete(one);
2030 +        assertTrue(f2.cancel(true));
2031 +        checkCompletedWithWrappedCancellationException(g);
2032 +    }
2033 +
2034 +    /**
2035 +     * runAfterBothAsync result completes normally after normal
2036 +     * completion of sources
2037 +     */
2038 +    public void testRunAfterBothAsyncE() {
2039 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2040 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2041 +        Noop r = new Noop();
2042 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2043 +        f.complete(one);
2044 +        checkIncomplete(g);
2045 +        f2.complete(two);
2046 +        checkCompletedNormally(g, null);
2047 +        assertTrue(r.ran);
2048 +    }
2049 +
2050 +    /**
2051 +     * runAfterBothAsync result completes exceptionally after exceptional
2052 +     * completion of source
2053 +     */
2054 +    public void testRunAfterBothAsync2E() {
2055 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2056 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2057 +        Noop r = new Noop();
2058 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2059 +        f.completeExceptionally(new CFException());
2060 +        f2.complete(two);
2061 +        checkCompletedWithWrappedCFException(g);
2062 +
2063 +        r = new Noop();
2064 +        f = new CompletableFuture<Integer>();
2065 +        f2 = new CompletableFuture<Integer>();
2066 +        g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2067 +        f.complete(one);
2068 +        f2.completeExceptionally(new CFException());
2069 +        checkCompletedWithWrappedCFException(g);
2070 +    }
2071 +
2072 +    /**
2073 +     * runAfterBothAsync result completes exceptionally if action does
2074 +     */
2075 +    public void testRunAfterBothAsync3E() {
2076 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2077 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2078 +        FailingNoop r = new FailingNoop();
2079 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2080 +        f.complete(one);
2081 +        checkIncomplete(g);
2082 +        f2.complete(two);
2083 +        checkCompletedWithWrappedCFException(g);
2084 +    }
2085 +
2086 +    /**
2087 +     * runAfterBothAsync result completes exceptionally if either source cancelled
2088 +     */
2089 +    public void testRunAfterBothAsync4E() {
2090 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2091 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2092 +        Noop r = new Noop();
2093 +        CompletableFuture<Void> g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2094 +        assertTrue(f.cancel(true));
2095 +        f2.complete(two);
2096 +        checkCompletedWithWrappedCancellationException(g);
2097 +
2098 +        r = new Noop();
2099 +        f = new CompletableFuture<Integer>();
2100 +        f2 = new CompletableFuture<Integer>();
2101 +        g = f.runAfterBothAsync(f2, r, new ThreadExecutor());
2102 +        f.complete(one);
2103 +        assertTrue(f2.cancel(true));
2104 +        checkCompletedWithWrappedCancellationException(g);
2105 +    }
2106 +
2107 +    /**
2108 +     * applyToEitherAsync result completes normally after normal
2109 +     * completion of sources
2110 +     */
2111 +    public void testApplyToEitherAsyncE() {
2112 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2113 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2114 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2115 +        f.complete(one);
2116 +        checkCompletedNormally(g, two);
2117 +
2118 +        f = new CompletableFuture<Integer>();
2119 +        f.complete(one);
2120 +        f2 = new CompletableFuture<Integer>();
2121 +        g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2122 +        checkCompletedNormally(g, two);
2123 +    }
2124 +
2125 +    /**
2126 +     * applyToEitherAsync result completes exceptionally after exceptional
2127 +     * completion of source
2128 +     */
2129 +    public void testApplyToEitherAsync2E() {
2130 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2131 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2132 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2133 +        f.completeExceptionally(new CFException());
2134 +        checkCompletedWithWrappedCFException(g);
2135 +
2136 +        f = new CompletableFuture<Integer>();
2137 +        f2 = new CompletableFuture<Integer>();
2138 +        f2.completeExceptionally(new CFException());
2139 +        g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2140 +        f.complete(one);
2141 +        checkCompletedWithWrappedCFException(g);
2142 +    }
2143 +
2144 +    /**
2145 +     * applyToEitherAsync result completes exceptionally if action does
2146 +     */
2147 +    public void testApplyToEitherAsync3E() {
2148 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2149 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2150 +        FailingFunction r = new FailingFunction();
2151 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, r, new ThreadExecutor());
2152 +        f.complete(one);
2153 +        checkCompletedWithWrappedCFException(g);
2154 +    }
2155 +
2156 +    /**
2157 +     * applyToEitherAsync result completes exceptionally if either source cancelled
2158 +     */
2159 +    public void testApplyToEitherAsync4E() {
2160 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2161 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2162 +        CompletableFuture<Integer> g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2163 +        assertTrue(f.cancel(true));
2164 +        checkCompletedWithWrappedCancellationException(g);
2165 +
2166 +        f = new CompletableFuture<Integer>();
2167 +        f2 = new CompletableFuture<Integer>();
2168 +        assertTrue(f2.cancel(true));
2169 +        g = f.applyToEitherAsync(f2, inc, new ThreadExecutor());
2170 +        checkCompletedWithWrappedCancellationException(g);
2171 +    }
2172 +
2173 +    /**
2174 +     * acceptEitherAsync result completes normally after normal
2175 +     * completion of sources
2176 +     */
2177 +    public void testAcceptEitherAsyncE() {
2178 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2179 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2180 +        IncAction r = new IncAction();
2181 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2182 +        f.complete(one);
2183 +        checkCompletedNormally(g, null);
2184 +        assertEquals(r.value, 2);
2185 +
2186 +        r = new IncAction();
2187 +        f = new CompletableFuture<Integer>();
2188 +        f.complete(one);
2189 +        f2 = new CompletableFuture<Integer>();
2190 +        g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2191 +        checkCompletedNormally(g, null);
2192 +        assertEquals(r.value, 2);
2193 +    }
2194 +
2195 +    /**
2196 +     * acceptEitherAsync result completes exceptionally after exceptional
2197 +     * completion of source
2198 +     */
2199 +    public void testAcceptEitherAsync2E() {
2200 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2201 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2202 +        IncAction r = new IncAction();
2203 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2204 +        f.completeExceptionally(new CFException());
2205 +        checkCompletedWithWrappedCFException(g);
2206 +
2207 +        r = new IncAction();
2208 +        f = new CompletableFuture<Integer>();
2209 +        f2 = new CompletableFuture<Integer>();
2210 +        f2.completeExceptionally(new CFException());
2211 +        g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2212 +        f.complete(one);
2213 +        checkCompletedWithWrappedCFException(g);
2214 +    }
2215 +
2216 +    /**
2217 +     * acceptEitherAsync result completes exceptionally if action does
2218 +     */
2219 +    public void testAcceptEitherAsync3E() {
2220 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2221 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2222 +        FailingConsumer r = new FailingConsumer();
2223 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2224 +        f.complete(one);
2225 +        checkCompletedWithWrappedCFException(g);
2226 +    }
2227 +
2228 +    /**
2229 +     * acceptEitherAsync result completes exceptionally if either
2230 +     * source cancelled
2231 +     */
2232 +    public void testAcceptEitherAsync4E() {
2233 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2234 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2235 +        IncAction r = new IncAction();
2236 +        CompletableFuture<Void> g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2237 +        assertTrue(f.cancel(true));
2238 +        checkCompletedWithWrappedCancellationException(g);
2239 +
2240 +        r = new IncAction();
2241 +        f = new CompletableFuture<Integer>();
2242 +        f2 = new CompletableFuture<Integer>();
2243 +        assertTrue(f2.cancel(true));
2244 +        g = f.acceptEitherAsync(f2, r, new ThreadExecutor());
2245 +        checkCompletedWithWrappedCancellationException(g);
2246 +    }
2247 +
2248 +    /**
2249 +     * runAfterEitherAsync result completes normally after normal
2250 +     * completion of sources
2251 +     */
2252 +    public void testRunAfterEitherAsyncE() {
2253 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2254 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2255 +        Noop r = new Noop();
2256 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2257 +        f.complete(one);
2258 +        checkCompletedNormally(g, null);
2259 +        assertTrue(r.ran);
2260 +
2261 +        r = new Noop();
2262 +        f = new CompletableFuture<Integer>();
2263 +        f.complete(one);
2264 +        f2 = new CompletableFuture<Integer>();
2265 +        g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2266 +        checkCompletedNormally(g, null);
2267 +        assertTrue(r.ran);
2268 +    }
2269 +
2270 +    /**
2271 +     * runAfterEitherAsync result completes exceptionally after exceptional
2272 +     * completion of source
2273 +     */
2274 +    public void testRunAfterEitherAsync2E() {
2275 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2276 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2277 +        Noop r = new Noop();
2278 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2279 +        f.completeExceptionally(new CFException());
2280 +        checkCompletedWithWrappedCFException(g);
2281 +
2282 +        r = new Noop();
2283 +        f = new CompletableFuture<Integer>();
2284 +        f2 = new CompletableFuture<Integer>();
2285 +        f2.completeExceptionally(new CFException());
2286 +        g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2287 +        f.complete(one);
2288 +        checkCompletedWithWrappedCFException(g);
2289 +    }
2290 +
2291 +    /**
2292 +     * runAfterEitherAsync result completes exceptionally if action does
2293 +     */
2294 +    public void testRunAfterEitherAsync3E() {
2295 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2296 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2297 +        FailingNoop r = new FailingNoop();
2298 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2299 +        f.complete(one);
2300 +        checkCompletedWithWrappedCFException(g);
2301 +    }
2302 +
2303 +    /**
2304 +     * runAfterEitherAsync result completes exceptionally if either
2305 +     * source cancelled
2306 +     */
2307 +    public void testRunAfterEitherAsync4E() {
2308 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2309 +        CompletableFuture<Integer> f2 = new CompletableFuture<Integer>();
2310 +        Noop r = new Noop();
2311 +        CompletableFuture<Void> g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2312 +        assertTrue(f.cancel(true));
2313 +        checkCompletedWithWrappedCancellationException(g);
2314 +
2315 +        r = new Noop();
2316 +        f = new CompletableFuture<Integer>();
2317 +        f2 = new CompletableFuture<Integer>();
2318 +        assertTrue(f2.cancel(true));
2319 +        g = f.runAfterEitherAsync(f2, r, new ThreadExecutor());
2320 +        checkCompletedWithWrappedCancellationException(g);
2321 +    }
2322 +
2323 +    /**
2324 +     * thenComposeAsync result completes normally after normal
2325 +     * completion of source
2326 +     */
2327 +    public void testThenComposeAsyncE() {
2328 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2329 +        CompletableFutureInc r = new CompletableFutureInc();
2330 +        CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2331 +        f.complete(one);
2332 +        checkCompletedNormally(g, two);
2333 +    }
2334 +
2335 +    /**
2336 +     * thenComposeAsync result completes exceptionally after
2337 +     * exceptional completion of source
2338 +     */
2339 +    public void testThenComposeAsync2E() {
2340 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2341 +        CompletableFutureInc r = new CompletableFutureInc();
2342 +        CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2343 +        f.completeExceptionally(new CFException());
2344 +        checkCompletedWithWrappedCFException(g);
2345 +    }
2346 +
2347 +    /**
2348 +     * thenComposeAsync result completes exceptionally if action does
2349 +     */
2350 +    public void testThenComposeAsync3E() {
2351 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2352 +        FailingCompletableFutureFunction r = new FailingCompletableFutureFunction();
2353 +        CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2354 +        f.complete(one);
2355 +        checkCompletedWithWrappedCFException(g);
2356 +    }
2357 +
2358 +    /**
2359 +     * thenComposeAsync result completes exceptionally if source cancelled
2360 +     */
2361 +    public void testThenComposeAsync4E() {
2362 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2363 +        CompletableFutureInc r = new CompletableFutureInc();
2364 +        CompletableFuture<Integer> g = f.thenComposeAsync(r, new ThreadExecutor());
2365 +        assertTrue(f.cancel(true));
2366 +        checkCompletedWithWrappedCancellationException(g);
2367 +    }
2368 +
2369 +    // other static methods
2370 +
2371 +    /**
2372 +     * allOf(no component futures) returns a future completed normally
2373 +     * with the value null
2374 +     */
2375 +    public void testAllOf_empty() throws Exception {
2376 +        CompletableFuture<?> f = CompletableFuture.allOf();
2377 +        checkCompletedNormally(f, null);
2378 +    }
2379 +
2380 +    /**
2381 +     * allOf returns a future completed when all components complete
2382 +     */
2383 +    public void testAllOf() throws Exception {
2384 +        for (int k = 1; k < 20; ++k) {
2385 +            CompletableFuture[] fs = new CompletableFuture[k];
2386 +            for (int i = 0; i < k; ++i)
2387 +                fs[i] = new CompletableFuture<Integer>();
2388 +            CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2389 +            for (int i = 0; i < k; ++i) {
2390 +                checkIncomplete(f);
2391 +                fs[i].complete(one);
2392 +            }
2393 +            checkCompletedNormally(f, null);
2394 +        }
2395 +    }
2396 +
2397 +    /**
2398 +     * anyOf(no component futures) returns an incomplete future
2399 +     */
2400 +    public void testAnyOf_empty() throws Exception {
2401 +        CompletableFuture<?> f = CompletableFuture.anyOf();
2402 +        checkIncomplete(f);
2403 +    }
2404 +
2405 +    /**
2406 +     * anyOf returns a future completed when any components complete
2407 +     */
2408 +    public void testAnyOf() throws Exception {
2409 +        for (int k = 1; k < 20; ++k) {
2410 +            CompletableFuture[] fs = new CompletableFuture[k];
2411 +            for (int i = 0; i < k; ++i)
2412 +                fs[i] = new CompletableFuture<Integer>();
2413 +            CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2414 +            checkIncomplete(f);
2415 +            for (int i = 0; i < k; ++i) {
2416 +                fs[i].complete(one);
2417 +                checkCompletedNormally(f, one);
2418 +            }
2419 +        }
2420 +    }
2421 +
2422 +    /**
2423 +     * Completion methods throw NullPointerException with null arguments
2424 +     */
2425 +    public void testNPE() {
2426 +        CompletableFuture<Integer> f = new CompletableFuture<Integer>();
2427 +        CompletableFuture<Integer> g = new CompletableFuture<Integer>();
2428 +        CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
2429 +        CompletableFuture<?> h;
2430 +        ThreadExecutor exec = new ThreadExecutor();
2431 +
2432 +        Runnable[] throwingActions = {
2433 +            () -> { CompletableFuture.supplyAsync(null); },
2434 +            () -> { CompletableFuture.supplyAsync(null, exec); },
2435 +            () -> { CompletableFuture.supplyAsync(supplyOne, null); },
2436 +
2437 +            () -> { CompletableFuture.runAsync(null); },
2438 +            () -> { CompletableFuture.runAsync(null, exec); },
2439 +            () -> { CompletableFuture.runAsync(() -> {}, null); },
2440 +
2441 +            () -> { f.completeExceptionally(null); },
2442 +
2443 +            () -> { f.thenApply(null); },
2444 +            () -> { f.thenApplyAsync(null); },
2445 +            () -> { f.thenApplyAsync((x) -> x, null); },
2446 +            () -> { f.thenApplyAsync(null, exec); },
2447 +
2448 +            () -> { f.thenAccept(null); },
2449 +            () -> { f.thenAcceptAsync(null); },
2450 +            () -> { f.thenAcceptAsync((x) -> { ; }, null); },
2451 +            () -> { f.thenAcceptAsync(null, exec); },
2452 +
2453 +            () -> { f.thenRun(null); },
2454 +            () -> { f.thenRunAsync(null); },
2455 +            () -> { f.thenRunAsync(() -> { ; }, null); },
2456 +            () -> { f.thenRunAsync(null, exec); },
2457 +
2458 +            () -> { f.thenCombine(g, null); },
2459 +            () -> { f.thenCombineAsync(g, null); },
2460 +            () -> { f.thenCombineAsync(g, null, exec); },
2461 +            () -> { f.thenCombine(nullFuture, (x, y) -> x); },
2462 +            () -> { f.thenCombineAsync(nullFuture, (x, y) -> x); },
2463 +            () -> { f.thenCombineAsync(nullFuture, (x, y) -> x, exec); },
2464 +            () -> { f.thenCombineAsync(g, (x, y) -> x, null); },
2465 +
2466 +            () -> { f.thenAcceptBoth(g, null); },
2467 +            () -> { f.thenAcceptBothAsync(g, null); },
2468 +            () -> { f.thenAcceptBothAsync(g, null, exec); },
2469 +            () -> { f.thenAcceptBoth(nullFuture, (x, y) -> {}); },
2470 +            () -> { f.thenAcceptBothAsync(nullFuture, (x, y) -> {}); },
2471 +            () -> { f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec); },
2472 +            () -> { f.thenAcceptBothAsync(g, (x, y) -> {}, null); },
2473 +
2474 +            () -> { f.runAfterBoth(g, null); },
2475 +            () -> { f.runAfterBothAsync(g, null); },
2476 +            () -> { f.runAfterBothAsync(g, null, exec); },
2477 +            () -> { f.runAfterBoth(nullFuture, () -> {}); },
2478 +            () -> { f.runAfterBothAsync(nullFuture, () -> {}); },
2479 +            () -> { f.runAfterBothAsync(nullFuture, () -> {}, exec); },
2480 +            () -> { f.runAfterBothAsync(g, () -> {}, null); },
2481 +
2482 +            () -> { f.applyToEither(g, null); },
2483 +            () -> { f.applyToEitherAsync(g, null); },
2484 +            () -> { f.applyToEitherAsync(g, null, exec); },
2485 +            () -> { f.applyToEither(nullFuture, (x) -> x); },
2486 +            () -> { f.applyToEitherAsync(nullFuture, (x) -> x); },
2487 +            () -> { f.applyToEitherAsync(nullFuture, (x) -> x, exec); },
2488 +            () -> { f.applyToEitherAsync(g, (x) -> x, null); },
2489 +
2490 +            () -> { f.acceptEither(g, null); },
2491 +            () -> { f.acceptEitherAsync(g, null); },
2492 +            () -> { f.acceptEitherAsync(g, null, exec); },
2493 +            () -> { f.acceptEither(nullFuture, (x) -> {}); },
2494 +            () -> { f.acceptEitherAsync(nullFuture, (x) -> {}); },
2495 +            () -> { f.acceptEitherAsync(nullFuture, (x) -> {}, exec); },
2496 +            () -> { f.acceptEitherAsync(g, (x) -> {}, null); },
2497 +
2498 +            () -> { f.runAfterEither(g, null); },
2499 +            () -> { f.runAfterEitherAsync(g, null); },
2500 +            () -> { f.runAfterEitherAsync(g, null, exec); },
2501 +            () -> { f.runAfterEither(nullFuture, () -> {}); },
2502 +            () -> { f.runAfterEitherAsync(nullFuture, () -> {}); },
2503 +            () -> { f.runAfterEitherAsync(nullFuture, () -> {}, exec); },
2504 +            () -> { f.runAfterEitherAsync(g, () -> {}, null); },
2505 +
2506 +            () -> { f.thenCompose(null); },
2507 +            () -> { f.thenComposeAsync(null); },
2508 +            () -> { f.thenComposeAsync(new CompletableFutureInc(), null); },
2509 +            () -> { f.thenComposeAsync(null, exec); },
2510 +
2511 +            () -> { f.exceptionally(null); },
2512 +
2513 +            () -> { f.handle(null); },
2514 +
2515 +            () -> { CompletableFuture.allOf((CompletableFuture<?>)null); },
2516 +            () -> { CompletableFuture.allOf((CompletableFuture<?>[])null); },
2517 +            () -> { CompletableFuture.allOf(f, null); },
2518 +            () -> { CompletableFuture.allOf(null, f); },
2519 +
2520 +            () -> { CompletableFuture.anyOf((CompletableFuture<?>)null); },
2521 +            () -> { CompletableFuture.anyOf((CompletableFuture<?>[])null); },
2522 +            () -> { CompletableFuture.anyOf(f, null); },
2523 +            () -> { CompletableFuture.anyOf(null, f); },
2524 +        };
2525 +
2526 +        assertThrows(NullPointerException.class, throwingActions);
2527 +        assertEquals(0, exec.count.get());
2528 +    }
2529 +
2530   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines