ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.53
Committed: Mon Jun 2 20:20:47 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.52: +44 -215 lines
Log Message:
improve tests for thenAcceptBoth

File Contents

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