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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines