ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.39
Committed: Mon Jun 2 00:46:52 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.38: +284 -174 lines
Log Message:
improve tests for applyToEither

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