ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.35
Committed: Sun Jun 1 22:22:49 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.34: +334 -405 lines
Log Message:
improve tests for thenAcceptBoth

File Contents

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