ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.41
Committed: Mon Jun 2 01:46:11 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.40: +347 -254 lines
Log Message:
improve tests for runAfterEither

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