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

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.35 public void testThenAcceptBoth_normalCompletion1() {
1361     for (ExecutionMode m : ExecutionMode.values())
1362     for (Integer v1 : new Integer[] { 1, null })
1363 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1364     {
1365 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1366     final CompletableFuture<Integer> g = new CompletableFuture<>();
1367     final SubtractAction r = new SubtractAction();
1368     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1369 jsr166 1.22
1370 jsr166 1.35 f.complete(v1);
1371 jsr166 1.22 checkIncomplete(h);
1372 jsr166 1.44 assertEquals(0, r.invocationCount);
1373 jsr166 1.35 g.complete(v2);
1374    
1375 jsr166 1.22 checkCompletedNormally(h, null);
1376 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1377 jsr166 1.35 checkCompletedNormally(f, v1);
1378     checkCompletedNormally(g, v2);
1379 jsr166 1.47 }}
1380 jsr166 1.35
1381     public void testThenAcceptBoth_normalCompletion2() {
1382     for (ExecutionMode m : ExecutionMode.values())
1383     for (Integer v1 : new Integer[] { 1, null })
1384 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1385     {
1386 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1387     final CompletableFuture<Integer> g = new CompletableFuture<>();
1388     final SubtractAction r = new SubtractAction();
1389     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1390 jsr166 1.22
1391 jsr166 1.35 g.complete(v2);
1392 jsr166 1.22 checkIncomplete(h);
1393 jsr166 1.44 assertEquals(0, r.invocationCount);
1394 jsr166 1.35 f.complete(v1);
1395    
1396     checkCompletedNormally(h, null);
1397 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1398 jsr166 1.35 checkCompletedNormally(f, v1);
1399     checkCompletedNormally(g, v2);
1400 jsr166 1.47 }}
1401 jsr166 1.35
1402     public void testThenAcceptBoth_normalCompletion3() {
1403     for (ExecutionMode m : ExecutionMode.values())
1404     for (Integer v1 : new Integer[] { 1, null })
1405 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1406     {
1407 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1408     final CompletableFuture<Integer> g = new CompletableFuture<>();
1409     final SubtractAction r = new SubtractAction();
1410    
1411     g.complete(v2);
1412     f.complete(v1);
1413     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1414    
1415 jsr166 1.22 checkCompletedNormally(h, null);
1416 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1417 jsr166 1.35 checkCompletedNormally(f, v1);
1418     checkCompletedNormally(g, v2);
1419 jsr166 1.47 }}
1420 jsr166 1.35
1421     public void testThenAcceptBoth_normalCompletion4() {
1422     for (ExecutionMode m : ExecutionMode.values())
1423     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 SubtractAction r = new SubtractAction();
1429    
1430     f.complete(v1);
1431     g.complete(v2);
1432     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1433 dl 1.5
1434 jsr166 1.22 checkCompletedNormally(h, null);
1435 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1436 jsr166 1.35 checkCompletedNormally(f, v1);
1437     checkCompletedNormally(g, v2);
1438 jsr166 1.47 }}
1439 dl 1.5
1440     /**
1441     * thenAcceptBoth result completes exceptionally after exceptional
1442     * completion of either source
1443     */
1444 jsr166 1.35 public void testThenAcceptBoth_exceptionalCompletion1() {
1445     for (ExecutionMode m : ExecutionMode.values())
1446 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1447     {
1448 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1449     final CompletableFuture<Integer> g = new CompletableFuture<>();
1450     final SubtractAction r = new SubtractAction();
1451     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1452     final CFException ex = new CFException();
1453 jsr166 1.22
1454 jsr166 1.35 f.completeExceptionally(ex);
1455 jsr166 1.22 checkIncomplete(h);
1456 jsr166 1.35 g.complete(v1);
1457    
1458     checkCompletedWithWrappedCFException(h, ex);
1459     checkCompletedWithWrappedCFException(f, ex);
1460 jsr166 1.44 assertEquals(0, r.invocationCount);
1461 jsr166 1.35 checkCompletedNormally(g, v1);
1462 jsr166 1.47 }}
1463 jsr166 1.35
1464     public void testThenAcceptBoth_exceptionalCompletion2() {
1465     for (ExecutionMode m : ExecutionMode.values())
1466 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1467     {
1468 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1469     final CompletableFuture<Integer> g = new CompletableFuture<>();
1470     final SubtractAction r = new SubtractAction();
1471     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1472     final CFException ex = new CFException();
1473 jsr166 1.22
1474 jsr166 1.35 g.completeExceptionally(ex);
1475 jsr166 1.22 checkIncomplete(h);
1476 jsr166 1.35 f.complete(v1);
1477    
1478     checkCompletedWithWrappedCFException(h, ex);
1479     checkCompletedWithWrappedCFException(g, ex);
1480 jsr166 1.44 assertEquals(0, r.invocationCount);
1481 jsr166 1.35 checkCompletedNormally(f, v1);
1482 jsr166 1.47 }}
1483 jsr166 1.35
1484     public void testThenAcceptBoth_exceptionalCompletion3() {
1485     for (ExecutionMode m : ExecutionMode.values())
1486 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1487     {
1488 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1489     final CompletableFuture<Integer> g = new CompletableFuture<>();
1490     final SubtractAction r = new SubtractAction();
1491     final CFException ex = new CFException();
1492    
1493     g.completeExceptionally(ex);
1494     f.complete(v1);
1495     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1496    
1497     checkCompletedWithWrappedCFException(h, ex);
1498     checkCompletedWithWrappedCFException(g, ex);
1499 jsr166 1.44 assertEquals(0, r.invocationCount);
1500 jsr166 1.35 checkCompletedNormally(f, v1);
1501 jsr166 1.47 }}
1502 jsr166 1.35
1503     public void testThenAcceptBoth_exceptionalCompletion4() {
1504     for (ExecutionMode m : ExecutionMode.values())
1505 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1506     {
1507 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1508     final CompletableFuture<Integer> g = new CompletableFuture<>();
1509     final SubtractAction r = new SubtractAction();
1510     final CFException ex = new CFException();
1511 jsr166 1.22
1512 jsr166 1.35 f.completeExceptionally(ex);
1513     g.complete(v1);
1514     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1515 dl 1.5
1516 jsr166 1.35 checkCompletedWithWrappedCFException(h, ex);
1517     checkCompletedWithWrappedCFException(f, ex);
1518 jsr166 1.44 assertEquals(0, r.invocationCount);
1519 jsr166 1.35 checkCompletedNormally(g, v1);
1520 jsr166 1.47 }}
1521 dl 1.5
1522     /**
1523     * thenAcceptBoth result completes exceptionally if action does
1524     */
1525 jsr166 1.35 public void testThenAcceptBoth_actionFailed1() {
1526     for (ExecutionMode m : ExecutionMode.values())
1527     for (Integer v1 : new Integer[] { 1, null })
1528 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1529     {
1530 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1531     final CompletableFuture<Integer> g = new CompletableFuture<>();
1532     final FailingBiConsumer r = new FailingBiConsumer();
1533     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1534 jsr166 1.22
1535 jsr166 1.35 f.complete(v1);
1536 jsr166 1.22 checkIncomplete(h);
1537 jsr166 1.35 g.complete(v2);
1538    
1539 jsr166 1.22 checkCompletedWithWrappedCFException(h);
1540 jsr166 1.35 checkCompletedNormally(f, v1);
1541     checkCompletedNormally(g, v2);
1542 jsr166 1.47 }}
1543 jsr166 1.35
1544     public void testThenAcceptBoth_actionFailed2() {
1545     for (ExecutionMode m : ExecutionMode.values())
1546     for (Integer v1 : new Integer[] { 1, null })
1547 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1548     {
1549 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1550     final CompletableFuture<Integer> g = new CompletableFuture<>();
1551     final FailingBiConsumer r = new FailingBiConsumer();
1552     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1553    
1554     g.complete(v2);
1555     checkIncomplete(h);
1556     f.complete(v1);
1557 jsr166 1.22
1558     checkCompletedWithWrappedCFException(h);
1559 jsr166 1.35 checkCompletedNormally(f, v1);
1560     checkCompletedNormally(g, v2);
1561 jsr166 1.47 }}
1562 dl 1.5
1563     /**
1564     * thenAcceptBoth result completes exceptionally if either source cancelled
1565     */
1566 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled1() {
1567     for (ExecutionMode m : ExecutionMode.values())
1568     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1569 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1570     {
1571 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1572     final CompletableFuture<Integer> g = new CompletableFuture<>();
1573     final SubtractAction r = new SubtractAction();
1574     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1575 jsr166 1.22
1576 jsr166 1.35 assertTrue(f.cancel(mayInterruptIfRunning));
1577 jsr166 1.22 checkIncomplete(h);
1578 jsr166 1.35 g.complete(v1);
1579    
1580 jsr166 1.22 checkCompletedWithWrappedCancellationException(h);
1581 jsr166 1.35 checkCancelled(f);
1582 jsr166 1.44 assertEquals(0, r.invocationCount);
1583 jsr166 1.35 checkCompletedNormally(g, v1);
1584 jsr166 1.47 }}
1585 jsr166 1.22
1586 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled2() {
1587     for (ExecutionMode m : ExecutionMode.values())
1588     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1589 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1590     {
1591 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1592     final CompletableFuture<Integer> g = new CompletableFuture<>();
1593     final SubtractAction r = new SubtractAction();
1594     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1595    
1596     assertTrue(g.cancel(mayInterruptIfRunning));
1597 jsr166 1.22 checkIncomplete(h);
1598 jsr166 1.35 f.complete(v1);
1599    
1600 jsr166 1.22 checkCompletedWithWrappedCancellationException(h);
1601 jsr166 1.35 checkCancelled(g);
1602 jsr166 1.44 assertEquals(0, r.invocationCount);
1603 jsr166 1.35 checkCompletedNormally(f, v1);
1604 jsr166 1.47 }}
1605 jsr166 1.35
1606     public void testThenAcceptBoth_sourceCancelled3() {
1607     for (ExecutionMode m : ExecutionMode.values())
1608     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1609 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1610     {
1611 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1612     final CompletableFuture<Integer> g = new CompletableFuture<>();
1613     final SubtractAction r = new SubtractAction();
1614 jsr166 1.22
1615 jsr166 1.35 assertTrue(g.cancel(mayInterruptIfRunning));
1616     f.complete(v1);
1617     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1618 jsr166 1.22
1619     checkCompletedWithWrappedCancellationException(h);
1620 jsr166 1.35 checkCancelled(g);
1621 jsr166 1.44 assertEquals(0, r.invocationCount);
1622 jsr166 1.35 checkCompletedNormally(f, v1);
1623 jsr166 1.47 }}
1624 dl 1.5
1625 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled4() {
1626     for (ExecutionMode m : ExecutionMode.values())
1627     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1628 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1629     {
1630 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1631     final CompletableFuture<Integer> g = new CompletableFuture<>();
1632     final SubtractAction r = new SubtractAction();
1633 jsr166 1.34
1634 jsr166 1.35 assertTrue(f.cancel(mayInterruptIfRunning));
1635     g.complete(v1);
1636     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1637 jsr166 1.34
1638 jsr166 1.35 checkCompletedWithWrappedCancellationException(h);
1639     checkCancelled(f);
1640 jsr166 1.44 assertEquals(0, r.invocationCount);
1641 jsr166 1.35 checkCompletedNormally(g, v1);
1642 jsr166 1.47 }}
1643 jsr166 1.34
1644     /**
1645 dl 1.5 * runAfterBoth result completes normally after normal
1646     * completion of sources
1647     */
1648 jsr166 1.33 public void testRunAfterBoth_normalCompletion1() {
1649 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1650 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1651 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1652     {
1653 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1654     final CompletableFuture<Integer> g = new CompletableFuture<>();
1655     final Noop r = new Noop();
1656 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1657 jsr166 1.22
1658 jsr166 1.33 f.complete(v1);
1659 jsr166 1.22 checkIncomplete(h);
1660 jsr166 1.44 assertEquals(0, r.invocationCount);
1661 jsr166 1.33 g.complete(v2);
1662    
1663 jsr166 1.22 checkCompletedNormally(h, null);
1664 jsr166 1.44 assertEquals(1, r.invocationCount);
1665 jsr166 1.33 checkCompletedNormally(f, v1);
1666     checkCompletedNormally(g, v2);
1667 jsr166 1.47 }}
1668 jsr166 1.33
1669     public void testRunAfterBoth_normalCompletion2() {
1670 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1671 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1672 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1673     {
1674 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1675     final CompletableFuture<Integer> g = new CompletableFuture<>();
1676     final Noop r = new Noop();
1677 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1678 jsr166 1.22
1679 jsr166 1.33 g.complete(v2);
1680 jsr166 1.22 checkIncomplete(h);
1681 jsr166 1.44 assertEquals(0, r.invocationCount);
1682 jsr166 1.33 f.complete(v1);
1683    
1684     checkCompletedNormally(h, null);
1685 jsr166 1.44 assertEquals(1, r.invocationCount);
1686 jsr166 1.33 checkCompletedNormally(f, v1);
1687     checkCompletedNormally(g, v2);
1688 jsr166 1.47 }}
1689 jsr166 1.33
1690     public void testRunAfterBoth_normalCompletion3() {
1691 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1692 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1693 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1694     {
1695 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1696     final CompletableFuture<Integer> g = new CompletableFuture<>();
1697     final Noop r = new Noop();
1698    
1699     g.complete(v2);
1700     f.complete(v1);
1701 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1702 jsr166 1.33
1703 jsr166 1.22 checkCompletedNormally(h, null);
1704 jsr166 1.44 assertEquals(1, r.invocationCount);
1705 jsr166 1.33 checkCompletedNormally(f, v1);
1706     checkCompletedNormally(g, v2);
1707 jsr166 1.47 }}
1708 jsr166 1.33
1709     public void testRunAfterBoth_normalCompletion4() {
1710 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1711 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1712 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1713     {
1714 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1715     final CompletableFuture<Integer> g = new CompletableFuture<>();
1716     final Noop r = new Noop();
1717    
1718     f.complete(v1);
1719     g.complete(v2);
1720 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1721 dl 1.5
1722 jsr166 1.22 checkCompletedNormally(h, null);
1723 jsr166 1.44 assertEquals(1, r.invocationCount);
1724 jsr166 1.33 checkCompletedNormally(f, v1);
1725     checkCompletedNormally(g, v2);
1726 jsr166 1.47 }}
1727 dl 1.5
1728     /**
1729     * runAfterBoth result completes exceptionally after exceptional
1730     * completion of either source
1731     */
1732 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion1() {
1733 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1734 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1735     {
1736 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1737     final CompletableFuture<Integer> g = new CompletableFuture<>();
1738     final Noop r = new Noop();
1739 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1740 jsr166 1.33 final CFException ex = new CFException();
1741 jsr166 1.22
1742 jsr166 1.33 f.completeExceptionally(ex);
1743 jsr166 1.22 checkIncomplete(h);
1744 jsr166 1.33 g.complete(v1);
1745    
1746     checkCompletedWithWrappedCFException(h, ex);
1747     checkCompletedWithWrappedCFException(f, ex);
1748 jsr166 1.44 assertEquals(0, r.invocationCount);
1749 jsr166 1.33 checkCompletedNormally(g, v1);
1750 jsr166 1.47 }}
1751 jsr166 1.22
1752 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion2() {
1753 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1754 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1755     {
1756 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1757     final CompletableFuture<Integer> g = new CompletableFuture<>();
1758     final Noop r = new Noop();
1759 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1760 jsr166 1.33 final CFException ex = new CFException();
1761    
1762     g.completeExceptionally(ex);
1763 jsr166 1.22 checkIncomplete(h);
1764 jsr166 1.33 f.complete(v1);
1765    
1766     checkCompletedWithWrappedCFException(h, ex);
1767     checkCompletedWithWrappedCFException(g, ex);
1768 jsr166 1.44 assertEquals(0, r.invocationCount);
1769 jsr166 1.33 checkCompletedNormally(f, v1);
1770 jsr166 1.47 }}
1771 jsr166 1.22
1772 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion3() {
1773 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1774 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1775     {
1776 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1777     final CompletableFuture<Integer> g = new CompletableFuture<>();
1778     final Noop r = new Noop();
1779     final CFException ex = new CFException();
1780    
1781     g.completeExceptionally(ex);
1782     f.complete(v1);
1783 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1784 jsr166 1.33
1785     checkCompletedWithWrappedCFException(h, ex);
1786     checkCompletedWithWrappedCFException(g, ex);
1787 jsr166 1.44 assertEquals(0, r.invocationCount);
1788 jsr166 1.33 checkCompletedNormally(f, v1);
1789 jsr166 1.47 }}
1790 jsr166 1.33
1791     public void testRunAfterBoth_exceptionalCompletion4() {
1792 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1793 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1794     {
1795 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1796     final CompletableFuture<Integer> g = new CompletableFuture<>();
1797     final Noop r = new Noop();
1798     final CFException ex = new CFException();
1799    
1800     f.completeExceptionally(ex);
1801     g.complete(v1);
1802 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1803 dl 1.5
1804 jsr166 1.33 checkCompletedWithWrappedCFException(h, ex);
1805     checkCompletedWithWrappedCFException(f, ex);
1806 jsr166 1.44 assertEquals(0, r.invocationCount);
1807 jsr166 1.33 checkCompletedNormally(g, v1);
1808 jsr166 1.47 }}
1809 dl 1.5
1810 jsr166 1.4 /**
1811 dl 1.5 * runAfterBoth result completes exceptionally if action does
1812 jsr166 1.4 */
1813 jsr166 1.33 public void testRunAfterBoth_actionFailed1() {
1814 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1815 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1816 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1817     {
1818 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1819     final CompletableFuture<Integer> g = new CompletableFuture<>();
1820 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
1821 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1822 jsr166 1.33
1823     f.complete(v1);
1824     checkIncomplete(h);
1825     g.complete(v2);
1826    
1827     checkCompletedWithWrappedCFException(h);
1828     checkCompletedNormally(f, v1);
1829     checkCompletedNormally(g, v2);
1830 jsr166 1.47 }}
1831 jsr166 1.33
1832     public void testRunAfterBoth_actionFailed2() {
1833 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1834 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1835 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1836     {
1837 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1838     final CompletableFuture<Integer> g = new CompletableFuture<>();
1839 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
1840 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1841 jsr166 1.33
1842     g.complete(v2);
1843     checkIncomplete(h);
1844     f.complete(v1);
1845    
1846     checkCompletedWithWrappedCFException(h);
1847     checkCompletedNormally(f, v1);
1848     checkCompletedNormally(g, v2);
1849 jsr166 1.47 }}
1850 jsr166 1.4
1851     /**
1852 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
1853 jsr166 1.4 */
1854 jsr166 1.33 public void testRunAfterBoth_sourceCancelled1() {
1855 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1856 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1857 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1858     {
1859 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1860     final CompletableFuture<Integer> g = new CompletableFuture<>();
1861     final Noop r = new Noop();
1862 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1863 jsr166 1.33
1864     assertTrue(f.cancel(mayInterruptIfRunning));
1865     checkIncomplete(h);
1866     g.complete(v1);
1867    
1868     checkCompletedWithWrappedCancellationException(h);
1869     checkCancelled(f);
1870 jsr166 1.44 assertEquals(0, r.invocationCount);
1871 jsr166 1.33 checkCompletedNormally(g, v1);
1872 jsr166 1.47 }}
1873 jsr166 1.33
1874     public void testRunAfterBoth_sourceCancelled2() {
1875 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1876 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1877 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1878     {
1879 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1880     final CompletableFuture<Integer> g = new CompletableFuture<>();
1881     final Noop r = new Noop();
1882 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1883 jsr166 1.33
1884     assertTrue(g.cancel(mayInterruptIfRunning));
1885     checkIncomplete(h);
1886     f.complete(v1);
1887    
1888     checkCompletedWithWrappedCancellationException(h);
1889     checkCancelled(g);
1890 jsr166 1.44 assertEquals(0, r.invocationCount);
1891 jsr166 1.33 checkCompletedNormally(f, v1);
1892 jsr166 1.47 }}
1893 jsr166 1.33
1894     public void testRunAfterBoth_sourceCancelled3() {
1895 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1896 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1897 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1898     {
1899 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1900     final CompletableFuture<Integer> g = new CompletableFuture<>();
1901     final Noop r = new Noop();
1902    
1903     assertTrue(g.cancel(mayInterruptIfRunning));
1904     f.complete(v1);
1905 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1906 jsr166 1.33
1907     checkCompletedWithWrappedCancellationException(h);
1908     checkCancelled(g);
1909 jsr166 1.44 assertEquals(0, r.invocationCount);
1910 jsr166 1.33 checkCompletedNormally(f, v1);
1911 jsr166 1.47 }}
1912 jsr166 1.33
1913     public void testRunAfterBoth_sourceCancelled4() {
1914 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1915 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1916 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1917     {
1918 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1919     final CompletableFuture<Integer> g = new CompletableFuture<>();
1920     final Noop r = new Noop();
1921    
1922     assertTrue(f.cancel(mayInterruptIfRunning));
1923     g.complete(v1);
1924 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1925 jsr166 1.33
1926     checkCompletedWithWrappedCancellationException(h);
1927     checkCancelled(f);
1928 jsr166 1.44 assertEquals(0, r.invocationCount);
1929 jsr166 1.33 checkCompletedNormally(g, v1);
1930 jsr166 1.47 }}
1931 dl 1.5
1932     /**
1933     * applyToEither result completes normally after normal completion
1934     * of either source
1935     */
1936 jsr166 1.39 public void testApplyToEither_normalCompletion1() {
1937     for (ExecutionMode m : ExecutionMode.values())
1938     for (Integer v1 : new Integer[] { 1, null })
1939 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1940     {
1941 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
1942     final CompletableFuture<Integer> g = new CompletableFuture<>();
1943     final IncFunction r = new IncFunction();
1944     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1945    
1946     f.complete(v1);
1947     checkCompletedNormally(h, inc(v1));
1948     g.complete(v2);
1949    
1950     checkCompletedNormally(f, v1);
1951     checkCompletedNormally(g, v2);
1952     checkCompletedNormally(h, inc(v1));
1953 jsr166 1.47 }}
1954 dl 1.5
1955 jsr166 1.39 public void testApplyToEither_normalCompletion2() {
1956     for (ExecutionMode m : ExecutionMode.values())
1957     for (Integer v1 : new Integer[] { 1, null })
1958 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1959     {
1960 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
1961     final CompletableFuture<Integer> g = new CompletableFuture<>();
1962     final IncFunction r = new IncFunction();
1963     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1964    
1965     g.complete(v2);
1966     checkCompletedNormally(h, inc(v2));
1967     f.complete(v1);
1968    
1969     checkCompletedNormally(f, v1);
1970     checkCompletedNormally(g, v2);
1971     checkCompletedNormally(h, inc(v2));
1972 jsr166 1.47 }}
1973    
1974 jsr166 1.39 public void testApplyToEither_normalCompletion3() {
1975     for (ExecutionMode m : ExecutionMode.values())
1976     for (Integer v1 : new Integer[] { 1, null })
1977 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1978     {
1979 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
1980     final CompletableFuture<Integer> g = new CompletableFuture<>();
1981     final IncFunction r = new IncFunction();
1982    
1983     f.complete(v1);
1984     g.complete(v2);
1985     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1986    
1987     checkCompletedNormally(f, v1);
1988     checkCompletedNormally(g, v2);
1989    
1990     // unspecified behavior
1991     assertTrue(Objects.equals(h.join(), inc(v1)) ||
1992     Objects.equals(h.join(), inc(v2)));
1993 jsr166 1.44 assertEquals(1, r.invocationCount);
1994 jsr166 1.47 }}
1995 dl 1.5
1996     /**
1997     * applyToEither result completes exceptionally after exceptional
1998     * completion of either source
1999     */
2000 jsr166 1.39 public void testApplyToEither_exceptionalCompletion1() {
2001     for (ExecutionMode m : ExecutionMode.values())
2002 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2003     {
2004 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2005     final CompletableFuture<Integer> g = new CompletableFuture<>();
2006     final IncFunction r = new IncFunction();
2007     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2008     final CFException ex = new CFException();
2009    
2010     f.completeExceptionally(ex);
2011     checkCompletedWithWrappedCFException(h, ex);
2012     g.complete(v1);
2013    
2014 jsr166 1.44 assertEquals(0, r.invocationCount);
2015 jsr166 1.39 checkCompletedNormally(g, v1);
2016     checkCompletedWithWrappedCFException(f, ex);
2017     checkCompletedWithWrappedCFException(h, ex);
2018 jsr166 1.47 }}
2019 jsr166 1.39
2020     public void testApplyToEither_exceptionalCompletion2() {
2021     for (ExecutionMode m : ExecutionMode.values())
2022 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2023     {
2024 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2025     final CompletableFuture<Integer> g = new CompletableFuture<>();
2026     final IncFunction r = new IncFunction();
2027     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2028     final CFException ex = new CFException();
2029    
2030     g.completeExceptionally(ex);
2031     checkCompletedWithWrappedCFException(h, ex);
2032     f.complete(v1);
2033    
2034 jsr166 1.44 assertEquals(0, r.invocationCount);
2035 jsr166 1.39 checkCompletedNormally(f, v1);
2036     checkCompletedWithWrappedCFException(g, ex);
2037     checkCompletedWithWrappedCFException(h, ex);
2038 jsr166 1.47 }}
2039 jsr166 1.39
2040     public void testApplyToEither_exceptionalCompletion3() {
2041     for (ExecutionMode m : ExecutionMode.values())
2042 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2043     {
2044 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2045     final CompletableFuture<Integer> g = new CompletableFuture<>();
2046     final IncFunction r = new IncFunction();
2047     final CFException ex = new CFException();
2048    
2049     g.completeExceptionally(ex);
2050     f.complete(v1);
2051     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2052    
2053     // unspecified behavior
2054     Integer v;
2055     try {
2056 jsr166 1.46 assertEquals(inc(v1), h.join());
2057 jsr166 1.44 assertEquals(1, r.invocationCount);
2058 jsr166 1.39 } catch (CompletionException ok) {
2059     checkCompletedWithWrappedCFException(h, ex);
2060 jsr166 1.44 assertEquals(0, r.invocationCount);
2061 jsr166 1.39 }
2062    
2063     checkCompletedWithWrappedCFException(g, ex);
2064     checkCompletedNormally(f, v1);
2065 jsr166 1.47 }}
2066 jsr166 1.39
2067     public void testApplyToEither_exceptionalCompletion4() {
2068     for (ExecutionMode m : ExecutionMode.values())
2069 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2070     {
2071 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2072     final CompletableFuture<Integer> g = new CompletableFuture<>();
2073     final IncFunction r = new IncFunction();
2074     final CFException ex = new CFException();
2075    
2076     f.completeExceptionally(ex);
2077     g.complete(v1);
2078     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2079    
2080     // unspecified behavior
2081     Integer v;
2082     try {
2083 jsr166 1.46 assertEquals(inc(v1), h.join());
2084 jsr166 1.44 assertEquals(1, r.invocationCount);
2085 jsr166 1.39 } catch (CompletionException ok) {
2086     checkCompletedWithWrappedCFException(h, ex);
2087 jsr166 1.44 assertEquals(0, r.invocationCount);
2088 jsr166 1.39 }
2089 dl 1.5
2090 jsr166 1.39 checkCompletedWithWrappedCFException(f, ex);
2091     checkCompletedNormally(g, v1);
2092 jsr166 1.47 }}
2093 dl 1.5
2094     /**
2095     * applyToEither result completes exceptionally if action does
2096     */
2097 jsr166 1.39 public void testApplyToEither_actionFailed1() {
2098     for (ExecutionMode m : ExecutionMode.values())
2099     for (Integer v1 : new Integer[] { 1, null })
2100 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2101     {
2102 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2103     final CompletableFuture<Integer> g = new CompletableFuture<>();
2104     final FailingFunction r = new FailingFunction();
2105     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2106    
2107     f.complete(v1);
2108     checkCompletedWithWrappedCFException(h);
2109     g.complete(v2);
2110     checkCompletedNormally(f, v1);
2111     checkCompletedNormally(g, v2);
2112 jsr166 1.47 }}
2113 jsr166 1.39
2114     public void testApplyToEither_actionFailed2() {
2115     for (ExecutionMode m : ExecutionMode.values())
2116     for (Integer v1 : new Integer[] { 1, null })
2117 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2118     {
2119 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2120     final CompletableFuture<Integer> g = new CompletableFuture<>();
2121     final FailingFunction r = new FailingFunction();
2122     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2123    
2124     g.complete(v2);
2125     checkCompletedWithWrappedCFException(h);
2126     f.complete(v1);
2127     checkCompletedNormally(f, v1);
2128     checkCompletedNormally(g, v2);
2129 jsr166 1.47 }}
2130 dl 1.5
2131     /**
2132     * applyToEither result completes exceptionally if either source cancelled
2133     */
2134 jsr166 1.39 public void testApplyToEither_sourceCancelled1() {
2135     for (ExecutionMode m : ExecutionMode.values())
2136     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2137 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2138     {
2139 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2140     final CompletableFuture<Integer> g = new CompletableFuture<>();
2141     final IncFunction r = new IncFunction();
2142     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2143    
2144     assertTrue(f.cancel(mayInterruptIfRunning));
2145     checkCompletedWithWrappedCancellationException(h);
2146     g.complete(v1);
2147    
2148     checkCancelled(f);
2149 jsr166 1.44 assertEquals(0, r.invocationCount);
2150 jsr166 1.39 checkCompletedNormally(g, v1);
2151     checkCompletedWithWrappedCancellationException(h);
2152 jsr166 1.47 }}
2153 jsr166 1.39
2154     public void testApplyToEither_sourceCancelled2() {
2155     for (ExecutionMode m : ExecutionMode.values())
2156     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2157 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2158     {
2159 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2160     final CompletableFuture<Integer> g = new CompletableFuture<>();
2161     final IncFunction r = new IncFunction();
2162     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2163    
2164     assertTrue(g.cancel(mayInterruptIfRunning));
2165     checkCompletedWithWrappedCancellationException(h);
2166     f.complete(v1);
2167    
2168     checkCancelled(g);
2169 jsr166 1.44 assertEquals(0, r.invocationCount);
2170 jsr166 1.39 checkCompletedNormally(f, v1);
2171     checkCompletedWithWrappedCancellationException(h);
2172 jsr166 1.47 }}
2173 jsr166 1.39
2174     public void testApplyToEither_sourceCancelled3() {
2175     for (ExecutionMode m : ExecutionMode.values())
2176     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2177 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2178     {
2179 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2180     final CompletableFuture<Integer> g = new CompletableFuture<>();
2181     final IncFunction r = new IncFunction();
2182    
2183     assertTrue(g.cancel(mayInterruptIfRunning));
2184     f.complete(v1);
2185     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2186    
2187     // unspecified behavior
2188     Integer v;
2189     try {
2190 jsr166 1.46 assertEquals(inc(v1), h.join());
2191 jsr166 1.44 assertEquals(1, r.invocationCount);
2192 jsr166 1.39 } catch (CompletionException ok) {
2193     checkCompletedWithWrappedCancellationException(h);
2194 jsr166 1.44 assertEquals(0, r.invocationCount);
2195 jsr166 1.39 }
2196    
2197     checkCancelled(g);
2198     checkCompletedNormally(f, v1);
2199 jsr166 1.47 }}
2200 jsr166 1.39
2201     public void testApplyToEither_sourceCancelled4() {
2202     for (ExecutionMode m : ExecutionMode.values())
2203     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2204 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2205     {
2206 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2207     final CompletableFuture<Integer> g = new CompletableFuture<>();
2208     final IncFunction r = new IncFunction();
2209    
2210     assertTrue(f.cancel(mayInterruptIfRunning));
2211     g.complete(v1);
2212     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2213    
2214     // unspecified behavior
2215     Integer v;
2216     try {
2217 jsr166 1.46 assertEquals(inc(v1), h.join());
2218 jsr166 1.44 assertEquals(1, r.invocationCount);
2219 jsr166 1.39 } catch (CompletionException ok) {
2220     checkCompletedWithWrappedCancellationException(h);
2221 jsr166 1.44 assertEquals(0, r.invocationCount);
2222 jsr166 1.39 }
2223    
2224     checkCancelled(f);
2225     checkCompletedNormally(g, v1);
2226 jsr166 1.47 }}
2227 dl 1.5
2228     /**
2229     * acceptEither result completes normally after normal completion
2230     * of either source
2231     */
2232 jsr166 1.40 public void testAcceptEither_normalCompletion1() {
2233     for (ExecutionMode m : ExecutionMode.values())
2234     for (Integer v1 : new Integer[] { 1, null })
2235 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2236     {
2237 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2238     final CompletableFuture<Integer> g = new CompletableFuture<>();
2239     final IncAction r = new IncAction();
2240     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2241    
2242     f.complete(v1);
2243     checkCompletedNormally(h, null);
2244 jsr166 1.46 assertEquals(inc(v1), r.value);
2245 jsr166 1.40 g.complete(v2);
2246    
2247     checkCompletedNormally(f, v1);
2248     checkCompletedNormally(g, v2);
2249     checkCompletedNormally(h, null);
2250 jsr166 1.47 }}
2251 dl 1.5
2252 jsr166 1.40 public void testAcceptEither_normalCompletion2() {
2253     for (ExecutionMode m : ExecutionMode.values())
2254     for (Integer v1 : new Integer[] { 1, null })
2255 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2256     {
2257 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2258     final CompletableFuture<Integer> g = new CompletableFuture<>();
2259     final IncAction r = new IncAction();
2260     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2261    
2262     g.complete(v2);
2263     checkCompletedNormally(h, null);
2264 jsr166 1.46 assertEquals(inc(v2), r.value);
2265 jsr166 1.40 f.complete(v1);
2266    
2267     checkCompletedNormally(f, v1);
2268     checkCompletedNormally(g, v2);
2269     checkCompletedNormally(h, null);
2270 jsr166 1.47 }}
2271    
2272 jsr166 1.40 public void testAcceptEither_normalCompletion3() {
2273     for (ExecutionMode m : ExecutionMode.values())
2274     for (Integer v1 : new Integer[] { 1, null })
2275 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2276     {
2277 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2278     final CompletableFuture<Integer> g = new CompletableFuture<>();
2279     final IncAction r = new IncAction();
2280    
2281     f.complete(v1);
2282     g.complete(v2);
2283     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2284    
2285     checkCompletedNormally(h, null);
2286     checkCompletedNormally(f, v1);
2287     checkCompletedNormally(g, v2);
2288    
2289     // unspecified behavior
2290     assertTrue(Objects.equals(r.value, inc(v1)) ||
2291     Objects.equals(r.value, inc(v2)));
2292 jsr166 1.47 }}
2293 dl 1.5
2294     /**
2295     * acceptEither result completes exceptionally after exceptional
2296     * completion of either source
2297     */
2298 jsr166 1.40 public void testAcceptEither_exceptionalCompletion1() {
2299     for (ExecutionMode m : ExecutionMode.values())
2300 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2301     {
2302 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2303     final CompletableFuture<Integer> g = new CompletableFuture<>();
2304     final IncAction r = new IncAction();
2305     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2306     final CFException ex = new CFException();
2307    
2308     f.completeExceptionally(ex);
2309     checkCompletedWithWrappedCFException(h, ex);
2310     g.complete(v1);
2311    
2312 jsr166 1.44 assertEquals(0, r.invocationCount);
2313 jsr166 1.40 checkCompletedNormally(g, v1);
2314     checkCompletedWithWrappedCFException(f, ex);
2315     checkCompletedWithWrappedCFException(h, ex);
2316 jsr166 1.47 }}
2317 jsr166 1.40
2318     public void testAcceptEither_exceptionalCompletion2() {
2319     for (ExecutionMode m : ExecutionMode.values())
2320 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2321     {
2322 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2323     final CompletableFuture<Integer> g = new CompletableFuture<>();
2324     final IncAction r = new IncAction();
2325     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2326     final CFException ex = new CFException();
2327    
2328     g.completeExceptionally(ex);
2329     checkCompletedWithWrappedCFException(h, ex);
2330     f.complete(v1);
2331    
2332 jsr166 1.44 assertEquals(0, r.invocationCount);
2333 jsr166 1.40 checkCompletedNormally(f, v1);
2334     checkCompletedWithWrappedCFException(g, ex);
2335     checkCompletedWithWrappedCFException(h, ex);
2336 jsr166 1.47 }}
2337 jsr166 1.40
2338     public void testAcceptEither_exceptionalCompletion3() {
2339     for (ExecutionMode m : ExecutionMode.values())
2340 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2341     {
2342 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2343     final CompletableFuture<Integer> g = new CompletableFuture<>();
2344     final IncAction r = new IncAction();
2345     final CFException ex = new CFException();
2346    
2347     g.completeExceptionally(ex);
2348     f.complete(v1);
2349     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2350    
2351     // unspecified behavior
2352     Integer v;
2353     try {
2354 jsr166 1.46 assertNull(h.join());
2355 jsr166 1.44 assertEquals(1, r.invocationCount);
2356 jsr166 1.40 assertEquals(inc(v1), r.value);
2357     } catch (CompletionException ok) {
2358     checkCompletedWithWrappedCFException(h, ex);
2359 jsr166 1.44 assertEquals(0, r.invocationCount);
2360 jsr166 1.40 }
2361    
2362     checkCompletedWithWrappedCFException(g, ex);
2363     checkCompletedNormally(f, v1);
2364 jsr166 1.47 }}
2365 jsr166 1.40
2366     public void testAcceptEither_exceptionalCompletion4() {
2367     for (ExecutionMode m : ExecutionMode.values())
2368 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2369     {
2370 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2371     final CompletableFuture<Integer> g = new CompletableFuture<>();
2372     final IncAction r = new IncAction();
2373     final CFException ex = new CFException();
2374    
2375     f.completeExceptionally(ex);
2376     g.complete(v1);
2377     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2378    
2379     // unspecified behavior
2380     Integer v;
2381     try {
2382 jsr166 1.46 assertNull(h.join());
2383 jsr166 1.44 assertEquals(1, r.invocationCount);
2384 jsr166 1.40 assertEquals(inc(v1), r.value);
2385     } catch (CompletionException ok) {
2386     checkCompletedWithWrappedCFException(h, ex);
2387 jsr166 1.44 assertEquals(0, r.invocationCount);
2388 jsr166 1.40 }
2389 dl 1.5
2390 jsr166 1.40 checkCompletedWithWrappedCFException(f, ex);
2391     checkCompletedNormally(g, v1);
2392 jsr166 1.47 }}
2393 dl 1.5
2394     /**
2395     * acceptEither result completes exceptionally if action does
2396     */
2397 jsr166 1.40 public void testAcceptEither_actionFailed1() {
2398     for (ExecutionMode m : ExecutionMode.values())
2399     for (Integer v1 : new Integer[] { 1, null })
2400 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2401     {
2402 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2403     final CompletableFuture<Integer> g = new CompletableFuture<>();
2404     final FailingConsumer r = new FailingConsumer();
2405     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2406    
2407     f.complete(v1);
2408     checkCompletedWithWrappedCFException(h);
2409     g.complete(v2);
2410     checkCompletedNormally(f, v1);
2411     checkCompletedNormally(g, v2);
2412 jsr166 1.47 }}
2413 jsr166 1.40
2414     public void testAcceptEither_actionFailed2() {
2415     for (ExecutionMode m : ExecutionMode.values())
2416     for (Integer v1 : new Integer[] { 1, null })
2417 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2418     {
2419 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2420     final CompletableFuture<Integer> g = new CompletableFuture<>();
2421     final FailingConsumer r = new FailingConsumer();
2422     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2423    
2424     g.complete(v2);
2425     checkCompletedWithWrappedCFException(h);
2426     f.complete(v1);
2427     checkCompletedNormally(f, v1);
2428     checkCompletedNormally(g, v2);
2429 jsr166 1.47 }}
2430 dl 1.5
2431     /**
2432     * acceptEither result completes exceptionally if either source cancelled
2433     */
2434 jsr166 1.40 public void testAcceptEither_sourceCancelled1() {
2435     for (ExecutionMode m : ExecutionMode.values())
2436     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2437 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2438     {
2439 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2440     final CompletableFuture<Integer> g = new CompletableFuture<>();
2441     final IncAction r = new IncAction();
2442     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2443    
2444     assertTrue(f.cancel(mayInterruptIfRunning));
2445     checkCompletedWithWrappedCancellationException(h);
2446     g.complete(v1);
2447    
2448     checkCancelled(f);
2449 jsr166 1.44 assertEquals(0, r.invocationCount);
2450 jsr166 1.40 checkCompletedNormally(g, v1);
2451     checkCompletedWithWrappedCancellationException(h);
2452 jsr166 1.47 }}
2453 jsr166 1.40
2454     public void testAcceptEither_sourceCancelled2() {
2455     for (ExecutionMode m : ExecutionMode.values())
2456     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2457 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2458     {
2459 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2460     final CompletableFuture<Integer> g = new CompletableFuture<>();
2461     final IncAction r = new IncAction();
2462     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2463    
2464     assertTrue(g.cancel(mayInterruptIfRunning));
2465     checkCompletedWithWrappedCancellationException(h);
2466     f.complete(v1);
2467    
2468     checkCancelled(g);
2469 jsr166 1.44 assertEquals(0, r.invocationCount);
2470 jsr166 1.40 checkCompletedNormally(f, v1);
2471     checkCompletedWithWrappedCancellationException(h);
2472 jsr166 1.47 }}
2473 jsr166 1.40
2474     public void testAcceptEither_sourceCancelled3() {
2475     for (ExecutionMode m : ExecutionMode.values())
2476     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2477 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2478     {
2479 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2480     final CompletableFuture<Integer> g = new CompletableFuture<>();
2481     final IncAction r = new IncAction();
2482    
2483     assertTrue(g.cancel(mayInterruptIfRunning));
2484     f.complete(v1);
2485     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2486    
2487     // unspecified behavior
2488     Integer v;
2489     try {
2490 jsr166 1.46 assertNull(h.join());
2491 jsr166 1.44 assertEquals(1, r.invocationCount);
2492 jsr166 1.40 assertEquals(inc(v1), r.value);
2493     } catch (CompletionException ok) {
2494     checkCompletedWithWrappedCancellationException(h);
2495 jsr166 1.44 assertEquals(0, r.invocationCount);
2496 jsr166 1.40 }
2497    
2498     checkCancelled(g);
2499     checkCompletedNormally(f, v1);
2500 jsr166 1.47 }}
2501 jsr166 1.40
2502     public void testAcceptEither_sourceCancelled4() {
2503     for (ExecutionMode m : ExecutionMode.values())
2504     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2505 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2506     {
2507 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2508     final CompletableFuture<Integer> g = new CompletableFuture<>();
2509     final IncAction r = new IncAction();
2510    
2511     assertTrue(f.cancel(mayInterruptIfRunning));
2512     g.complete(v1);
2513     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2514    
2515     // unspecified behavior
2516     Integer v;
2517     try {
2518 jsr166 1.46 assertNull(h.join());
2519 jsr166 1.44 assertEquals(1, r.invocationCount);
2520 jsr166 1.40 assertEquals(inc(v1), r.value);
2521     } catch (CompletionException ok) {
2522     checkCompletedWithWrappedCancellationException(h);
2523 jsr166 1.44 assertEquals(0, r.invocationCount);
2524 jsr166 1.40 }
2525    
2526     checkCancelled(f);
2527     checkCompletedNormally(g, v1);
2528 jsr166 1.47 }}
2529 dl 1.5
2530     /**
2531     * runAfterEither result completes normally after normal completion
2532     * of either source
2533     */
2534 jsr166 1.41 public void testRunAfterEither_normalCompletion1() {
2535     for (ExecutionMode m : ExecutionMode.values())
2536     for (Integer v1 : new Integer[] { 1, null })
2537 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2538     {
2539 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2540     final CompletableFuture<Integer> g = new CompletableFuture<>();
2541     final Noop r = new Noop();
2542     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2543    
2544     f.complete(v1);
2545     checkCompletedNormally(h, null);
2546 jsr166 1.44 assertEquals(1, r.invocationCount);
2547 jsr166 1.41 g.complete(v2);
2548    
2549     checkCompletedNormally(f, v1);
2550     checkCompletedNormally(g, v2);
2551     checkCompletedNormally(h, null);
2552 jsr166 1.44 assertEquals(1, r.invocationCount);
2553 jsr166 1.47 }}
2554 jsr166 1.41
2555     public void testRunAfterEither_normalCompletion2() {
2556     for (ExecutionMode m : ExecutionMode.values())
2557     for (Integer v1 : new Integer[] { 1, null })
2558 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2559     {
2560 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2561     final CompletableFuture<Integer> g = new CompletableFuture<>();
2562     final Noop r = new Noop();
2563     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2564    
2565     g.complete(v2);
2566     checkCompletedNormally(h, null);
2567 jsr166 1.44 assertEquals(1, r.invocationCount);
2568 jsr166 1.41 f.complete(v1);
2569    
2570     checkCompletedNormally(f, v1);
2571     checkCompletedNormally(g, v2);
2572     checkCompletedNormally(h, null);
2573 jsr166 1.44 assertEquals(1, r.invocationCount);
2574 jsr166 1.47 }}
2575    
2576 jsr166 1.41 public void testRunAfterEither_normalCompletion3() {
2577     for (ExecutionMode m : ExecutionMode.values())
2578     for (Integer v1 : new Integer[] { 1, null })
2579 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2580     {
2581 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2582     final CompletableFuture<Integer> g = new CompletableFuture<>();
2583     final Noop r = new Noop();
2584    
2585     f.complete(v1);
2586     g.complete(v2);
2587     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2588 dl 1.5
2589 jsr166 1.41 checkCompletedNormally(h, null);
2590     checkCompletedNormally(f, v1);
2591     checkCompletedNormally(g, v2);
2592 jsr166 1.44 assertEquals(1, r.invocationCount);
2593 jsr166 1.47 }}
2594 dl 1.5
2595     /**
2596     * runAfterEither result completes exceptionally after exceptional
2597     * completion of either source
2598     */
2599 jsr166 1.41 public void testRunAfterEither_exceptionalCompletion1() {
2600     for (ExecutionMode m : ExecutionMode.values())
2601 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2602     {
2603 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2604     final CompletableFuture<Integer> g = new CompletableFuture<>();
2605     final Noop r = new Noop();
2606     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2607     final CFException ex = new CFException();
2608    
2609     f.completeExceptionally(ex);
2610     checkCompletedWithWrappedCFException(h, ex);
2611     g.complete(v1);
2612    
2613 jsr166 1.44 assertEquals(0, r.invocationCount);
2614 jsr166 1.41 checkCompletedNormally(g, v1);
2615     checkCompletedWithWrappedCFException(f, ex);
2616     checkCompletedWithWrappedCFException(h, ex);
2617 jsr166 1.47 }}
2618 jsr166 1.41
2619     public void testRunAfterEither_exceptionalCompletion2() {
2620     for (ExecutionMode m : ExecutionMode.values())
2621 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2622     {
2623 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2624     final CompletableFuture<Integer> g = new CompletableFuture<>();
2625     final Noop r = new Noop();
2626     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2627     final CFException ex = new CFException();
2628    
2629     g.completeExceptionally(ex);
2630     checkCompletedWithWrappedCFException(h, ex);
2631     f.complete(v1);
2632    
2633 jsr166 1.44 assertEquals(0, r.invocationCount);
2634 jsr166 1.41 checkCompletedNormally(f, v1);
2635     checkCompletedWithWrappedCFException(g, ex);
2636     checkCompletedWithWrappedCFException(h, ex);
2637 jsr166 1.47 }}
2638 jsr166 1.41
2639     public void testRunAfterEither_exceptionalCompletion3() {
2640     for (ExecutionMode m : ExecutionMode.values())
2641 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2642     {
2643 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2644     final CompletableFuture<Integer> g = new CompletableFuture<>();
2645     final Noop r = new Noop();
2646     final CFException ex = new CFException();
2647    
2648     g.completeExceptionally(ex);
2649     f.complete(v1);
2650     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2651    
2652     // unspecified behavior
2653     Integer v;
2654     try {
2655 jsr166 1.46 assertNull(h.join());
2656 jsr166 1.44 assertEquals(1, r.invocationCount);
2657 jsr166 1.41 } catch (CompletionException ok) {
2658     checkCompletedWithWrappedCFException(h, ex);
2659 jsr166 1.44 assertEquals(0, r.invocationCount);
2660 jsr166 1.41 }
2661    
2662     checkCompletedWithWrappedCFException(g, ex);
2663     checkCompletedNormally(f, v1);
2664 jsr166 1.47 }}
2665 jsr166 1.41
2666     public void testRunAfterEither_exceptionalCompletion4() {
2667     for (ExecutionMode m : ExecutionMode.values())
2668 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2669     {
2670 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2671     final CompletableFuture<Integer> g = new CompletableFuture<>();
2672     final Noop r = new Noop();
2673     final CFException ex = new CFException();
2674    
2675     f.completeExceptionally(ex);
2676     g.complete(v1);
2677     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2678    
2679     // unspecified behavior
2680     Integer v;
2681     try {
2682 jsr166 1.46 assertNull(h.join());
2683 jsr166 1.44 assertEquals(1, r.invocationCount);
2684 jsr166 1.41 } catch (CompletionException ok) {
2685     checkCompletedWithWrappedCFException(h, ex);
2686 jsr166 1.44 assertEquals(0, r.invocationCount);
2687 jsr166 1.41 }
2688 dl 1.5
2689 jsr166 1.41 checkCompletedWithWrappedCFException(f, ex);
2690     checkCompletedNormally(g, v1);
2691 jsr166 1.47 }}
2692 dl 1.5
2693     /**
2694     * runAfterEither result completes exceptionally if action does
2695     */
2696 jsr166 1.41 public void testRunAfterEither_actionFailed1() {
2697     for (ExecutionMode m : ExecutionMode.values())
2698     for (Integer v1 : new Integer[] { 1, null })
2699 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2700     {
2701 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2702     final CompletableFuture<Integer> g = new CompletableFuture<>();
2703 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
2704 jsr166 1.41 final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2705    
2706     f.complete(v1);
2707     checkCompletedWithWrappedCFException(h);
2708     g.complete(v2);
2709     checkCompletedNormally(f, v1);
2710     checkCompletedNormally(g, v2);
2711 jsr166 1.47 }}
2712 jsr166 1.41
2713     public void testRunAfterEither_actionFailed2() {
2714     for (ExecutionMode m : ExecutionMode.values())
2715     for (Integer v1 : new Integer[] { 1, null })
2716 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2717     {
2718 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2719     final CompletableFuture<Integer> g = new CompletableFuture<>();
2720 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
2721 jsr166 1.41 final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2722    
2723     g.complete(v2);
2724     checkCompletedWithWrappedCFException(h);
2725     f.complete(v1);
2726     checkCompletedNormally(f, v1);
2727     checkCompletedNormally(g, v2);
2728 jsr166 1.47 }}
2729 dl 1.5
2730     /**
2731     * runAfterEither result completes exceptionally if either source cancelled
2732     */
2733 jsr166 1.41 public void testRunAfterEither_sourceCancelled1() {
2734     for (ExecutionMode m : ExecutionMode.values())
2735     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2736 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2737     {
2738 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2739     final CompletableFuture<Integer> g = new CompletableFuture<>();
2740     final Noop r = new Noop();
2741     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2742    
2743     assertTrue(f.cancel(mayInterruptIfRunning));
2744     checkCompletedWithWrappedCancellationException(h);
2745     g.complete(v1);
2746    
2747     checkCancelled(f);
2748 jsr166 1.44 assertEquals(0, r.invocationCount);
2749 jsr166 1.41 checkCompletedNormally(g, v1);
2750     checkCompletedWithWrappedCancellationException(h);
2751 jsr166 1.47 }}
2752 jsr166 1.41
2753     public void testRunAfterEither_sourceCancelled2() {
2754     for (ExecutionMode m : ExecutionMode.values())
2755     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2756 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2757     {
2758 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2759     final CompletableFuture<Integer> g = new CompletableFuture<>();
2760     final Noop r = new Noop();
2761     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2762    
2763     assertTrue(g.cancel(mayInterruptIfRunning));
2764     checkCompletedWithWrappedCancellationException(h);
2765     f.complete(v1);
2766    
2767     checkCancelled(g);
2768 jsr166 1.44 assertEquals(0, r.invocationCount);
2769 jsr166 1.41 checkCompletedNormally(f, v1);
2770     checkCompletedWithWrappedCancellationException(h);
2771 jsr166 1.47 }}
2772 jsr166 1.41
2773     public void testRunAfterEither_sourceCancelled3() {
2774     for (ExecutionMode m : ExecutionMode.values())
2775     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2776 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2777     {
2778 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2779     final CompletableFuture<Integer> g = new CompletableFuture<>();
2780     final Noop r = new Noop();
2781    
2782     assertTrue(g.cancel(mayInterruptIfRunning));
2783     f.complete(v1);
2784     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2785    
2786     // unspecified behavior
2787     Integer v;
2788     try {
2789 jsr166 1.46 assertNull(h.join());
2790 jsr166 1.44 assertEquals(1, r.invocationCount);
2791 jsr166 1.41 } catch (CompletionException ok) {
2792     checkCompletedWithWrappedCancellationException(h);
2793 jsr166 1.44 assertEquals(0, r.invocationCount);
2794 jsr166 1.41 }
2795    
2796     checkCancelled(g);
2797     checkCompletedNormally(f, v1);
2798 jsr166 1.47 }}
2799 jsr166 1.41
2800     public void testRunAfterEither_sourceCancelled4() {
2801     for (ExecutionMode m : ExecutionMode.values())
2802     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2803 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2804     {
2805 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2806     final CompletableFuture<Integer> g = new CompletableFuture<>();
2807     final Noop r = new Noop();
2808    
2809     assertTrue(f.cancel(mayInterruptIfRunning));
2810     g.complete(v1);
2811     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2812    
2813     // unspecified behavior
2814     Integer v;
2815     try {
2816 jsr166 1.46 assertNull(h.join());
2817 jsr166 1.44 assertEquals(1, r.invocationCount);
2818 jsr166 1.41 } catch (CompletionException ok) {
2819     checkCompletedWithWrappedCancellationException(h);
2820 jsr166 1.44 assertEquals(0, r.invocationCount);
2821 jsr166 1.41 }
2822    
2823     checkCancelled(f);
2824     checkCompletedNormally(g, v1);
2825 jsr166 1.47 }}
2826 dl 1.5
2827     /**
2828     * thenCompose result completes normally after normal completion of source
2829     */
2830 jsr166 1.48 public void testThenCompose_normalCompletion() {
2831 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2832 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2833 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2834     {
2835 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2836     final CompletableFutureInc r = new CompletableFutureInc();
2837 jsr166 1.48 if (!createIncomplete) f.complete(v1);
2838 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2839 jsr166 1.48 if (createIncomplete) f.complete(v1);
2840 jsr166 1.21
2841 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2842     checkCompletedNormally(f, v1);
2843     assertEquals(1, r.invocationCount);
2844 jsr166 1.47 }}
2845 dl 1.5
2846     /**
2847     * thenCompose result completes exceptionally after exceptional
2848     * completion of source
2849     */
2850 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2851 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2852 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2853 jsr166 1.47 {
2854 jsr166 1.44 final CFException ex = new CFException();
2855     final CompletableFutureInc r = new CompletableFutureInc();
2856     final CompletableFuture<Integer> f = new CompletableFuture<>();
2857 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2858 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2859 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2860 jsr166 1.21
2861 jsr166 1.44 checkCompletedWithWrappedCFException(g, ex);
2862     checkCompletedWithWrappedCFException(f, ex);
2863 jsr166 1.48 assertEquals(0, r.invocationCount);
2864 jsr166 1.47 }}
2865 dl 1.5
2866     /**
2867     * thenCompose result completes exceptionally if action does
2868     */
2869 jsr166 1.48 public void testThenCompose_actionFailed() {
2870 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2871 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2872 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2873     {
2874 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2875     final FailingCompletableFutureFunction r
2876     = new FailingCompletableFutureFunction();
2877 jsr166 1.48 if (!createIncomplete) f.complete(v1);
2878 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2879 jsr166 1.48 if (createIncomplete) f.complete(v1);
2880 jsr166 1.44
2881 dl 1.5 checkCompletedWithWrappedCFException(g);
2882 jsr166 1.44 checkCompletedNormally(f, v1);
2883 jsr166 1.47 }}
2884 dl 1.5
2885     /**
2886     * thenCompose result completes exceptionally if source cancelled
2887     */
2888 jsr166 1.48 public void testThenCompose_sourceCancelled() {
2889 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2890 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2891 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2892     {
2893 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2894     final CompletableFutureInc r = new CompletableFutureInc();
2895 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2896 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2897 jsr166 1.50 if (createIncomplete) {
2898     checkIncomplete(g);
2899     assertTrue(f.cancel(mayInterruptIfRunning));
2900     }
2901 jsr166 1.44
2902 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2903 jsr166 1.44 checkCancelled(f);
2904 jsr166 1.47 }}
2905 dl 1.5
2906 jsr166 1.6 // other static methods
2907 dl 1.5
2908     /**
2909     * allOf(no component futures) returns a future completed normally
2910     * with the value null
2911     */
2912     public void testAllOf_empty() throws Exception {
2913 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
2914 dl 1.5 checkCompletedNormally(f, null);
2915     }
2916    
2917     /**
2918 jsr166 1.25 * allOf returns a future completed normally with the value null
2919     * when all components complete normally
2920 dl 1.5 */
2921 jsr166 1.25 public void testAllOf_normal() throws Exception {
2922 dl 1.5 for (int k = 1; k < 20; ++k) {
2923 jsr166 1.22 CompletableFuture<Integer>[] fs = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2924 jsr166 1.6 for (int i = 0; i < k; ++i)
2925 jsr166 1.22 fs[i] = new CompletableFuture<>();
2926 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2927 dl 1.5 for (int i = 0; i < k; ++i) {
2928     checkIncomplete(f);
2929 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
2930 dl 1.5 fs[i].complete(one);
2931     }
2932 dl 1.9 checkCompletedNormally(f, null);
2933 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
2934 dl 1.5 }
2935     }
2936    
2937     /**
2938     * anyOf(no component futures) returns an incomplete future
2939     */
2940     public void testAnyOf_empty() throws Exception {
2941 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
2942 dl 1.5 checkIncomplete(f);
2943     }
2944    
2945     /**
2946 jsr166 1.25 * anyOf returns a future completed normally with a value when
2947     * a component future does
2948 dl 1.5 */
2949 jsr166 1.24 public void testAnyOf_normal() throws Exception {
2950     for (int k = 0; k < 10; ++k) {
2951 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
2952 jsr166 1.6 for (int i = 0; i < k; ++i)
2953 jsr166 1.22 fs[i] = new CompletableFuture<>();
2954 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2955 dl 1.5 checkIncomplete(f);
2956     for (int i = 0; i < k; ++i) {
2957     fs[i].complete(one);
2958 dl 1.9 checkCompletedNormally(f, one);
2959 jsr166 1.24 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
2960     }
2961     }
2962     }
2963    
2964     /**
2965     * anyOf result completes exceptionally when any component does.
2966     */
2967     public void testAnyOf_exceptional() throws Exception {
2968     for (int k = 0; k < 10; ++k) {
2969     CompletableFuture[] fs = new CompletableFuture[k];
2970     for (int i = 0; i < k; ++i)
2971     fs[i] = new CompletableFuture<>();
2972     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2973     checkIncomplete(f);
2974     for (int i = 0; i < k; ++i) {
2975     fs[i].completeExceptionally(new CFException());
2976     checkCompletedWithWrappedCFException(f);
2977     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
2978 dl 1.5 }
2979     }
2980     }
2981    
2982     /**
2983     * Completion methods throw NullPointerException with null arguments
2984     */
2985     public void testNPE() {
2986 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2987     CompletableFuture<Integer> g = new CompletableFuture<>();
2988 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
2989     CompletableFuture<?> h;
2990 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
2991 jsr166 1.14
2992     Runnable[] throwingActions = {
2993 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
2994     () -> CompletableFuture.supplyAsync(null, exec),
2995     () -> CompletableFuture.supplyAsync(supplyOne, null),
2996    
2997     () -> CompletableFuture.runAsync(null),
2998     () -> CompletableFuture.runAsync(null, exec),
2999     () -> CompletableFuture.runAsync(() -> {}, null),
3000    
3001     () -> f.completeExceptionally(null),
3002    
3003     () -> f.thenApply(null),
3004     () -> f.thenApplyAsync(null),
3005     () -> f.thenApplyAsync((x) -> x, null),
3006     () -> f.thenApplyAsync(null, exec),
3007    
3008     () -> f.thenAccept(null),
3009     () -> f.thenAcceptAsync(null),
3010     () -> f.thenAcceptAsync((x) -> {} , null),
3011     () -> f.thenAcceptAsync(null, exec),
3012    
3013     () -> f.thenRun(null),
3014     () -> f.thenRunAsync(null),
3015     () -> f.thenRunAsync(() -> {} , null),
3016     () -> f.thenRunAsync(null, exec),
3017    
3018     () -> f.thenCombine(g, null),
3019     () -> f.thenCombineAsync(g, null),
3020     () -> f.thenCombineAsync(g, null, exec),
3021     () -> f.thenCombine(nullFuture, (x, y) -> x),
3022     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3023     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3024     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3025    
3026     () -> f.thenAcceptBoth(g, null),
3027     () -> f.thenAcceptBothAsync(g, null),
3028     () -> f.thenAcceptBothAsync(g, null, exec),
3029     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3030     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3031     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3032     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3033    
3034     () -> f.runAfterBoth(g, null),
3035     () -> f.runAfterBothAsync(g, null),
3036     () -> f.runAfterBothAsync(g, null, exec),
3037     () -> f.runAfterBoth(nullFuture, () -> {}),
3038     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3039     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3040     () -> f.runAfterBothAsync(g, () -> {}, null),
3041    
3042     () -> f.applyToEither(g, null),
3043     () -> f.applyToEitherAsync(g, null),
3044     () -> f.applyToEitherAsync(g, null, exec),
3045     () -> f.applyToEither(nullFuture, (x) -> x),
3046     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3047     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3048     () -> f.applyToEitherAsync(g, (x) -> x, null),
3049    
3050     () -> f.acceptEither(g, null),
3051     () -> f.acceptEitherAsync(g, null),
3052     () -> f.acceptEitherAsync(g, null, exec),
3053     () -> f.acceptEither(nullFuture, (x) -> {}),
3054     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3055     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3056     () -> f.acceptEitherAsync(g, (x) -> {}, null),
3057    
3058     () -> f.runAfterEither(g, null),
3059     () -> f.runAfterEitherAsync(g, null),
3060     () -> f.runAfterEitherAsync(g, null, exec),
3061     () -> f.runAfterEither(nullFuture, () -> {}),
3062     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3063     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3064     () -> f.runAfterEitherAsync(g, () -> {}, null),
3065    
3066     () -> f.thenCompose(null),
3067     () -> f.thenComposeAsync(null),
3068     () -> f.thenComposeAsync(new CompletableFutureInc(), null),
3069     () -> f.thenComposeAsync(null, exec),
3070    
3071     () -> f.exceptionally(null),
3072    
3073     () -> f.handle(null),
3074    
3075     () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3076     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3077     () -> CompletableFuture.allOf(f, null),
3078     () -> CompletableFuture.allOf(null, f),
3079    
3080     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3081     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3082     () -> CompletableFuture.anyOf(f, null),
3083     () -> CompletableFuture.anyOf(null, f),
3084 jsr166 1.32
3085     () -> f.obtrudeException(null),
3086 jsr166 1.14 };
3087 dl 1.5
3088 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3089 jsr166 1.17 assertEquals(0, exec.count.get());
3090 dl 1.5 }
3091    
3092 dl 1.26 /**
3093     * toCompletableFuture returns this CompletableFuture.
3094     */
3095     public void testToCompletableFuture() {
3096     CompletableFuture<Integer> f = new CompletableFuture<>();
3097     assertSame(f, f.toCompletableFuture());
3098     }
3099    
3100     /**
3101     * whenComplete action executes on normal completion, propagating
3102     * source result.
3103     */
3104 jsr166 1.42 public void testWhenComplete_normalCompletion1() {
3105 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
3106 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3107 jsr166 1.46 for (Integer v1 : new Integer[] { 1, null })
3108     {
3109     final AtomicInteger a = new AtomicInteger(0);
3110 jsr166 1.42 final CompletableFuture<Integer> f = new CompletableFuture<>();
3111 jsr166 1.44 if (!createIncomplete) f.complete(v1);
3112 jsr166 1.46 final CompletableFuture<Integer> g = m.whenComplete
3113     (f,
3114     (Integer x, Throwable t) -> {
3115     threadAssertSame(x, v1);
3116     threadAssertNull(t);
3117     a.getAndIncrement();
3118     });
3119 jsr166 1.44 if (createIncomplete) f.complete(v1);
3120 jsr166 1.46
3121     checkCompletedNormally(g, v1);
3122 jsr166 1.42 checkCompletedNormally(f, v1);
3123 jsr166 1.46 assertEquals(1, a.get());
3124     }}
3125 dl 1.26
3126     /**
3127     * whenComplete action executes on exceptional completion, propagating
3128     * source result.
3129     */
3130 jsr166 1.42 public void testWhenComplete_exceptionalCompletion() {
3131 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
3132 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3133 jsr166 1.46 for (Integer v1 : new Integer[] { 1, null })
3134     {
3135     final AtomicInteger a = new AtomicInteger(0);
3136 jsr166 1.42 final CFException ex = new CFException();
3137     final CompletableFuture<Integer> f = new CompletableFuture<>();
3138 jsr166 1.44 if (!createIncomplete) f.completeExceptionally(ex);
3139 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3140     (f,
3141     (Integer x, Throwable t) -> {
3142     threadAssertNull(x);
3143     threadAssertSame(t, ex);
3144     a.getAndIncrement();
3145     });
3146 jsr166 1.44 if (createIncomplete) f.completeExceptionally(ex);
3147 jsr166 1.42 checkCompletedWithWrappedCFException(f, ex);
3148     checkCompletedWithWrappedCFException(g, ex);
3149 jsr166 1.46 assertEquals(1, a.get());
3150     }}
3151    
3152     /**
3153     * whenComplete action executes on cancelled source, propagating
3154     * CancellationException.
3155     */
3156     public void testWhenComplete_sourceCancelled() {
3157     for (ExecutionMode m : ExecutionMode.values())
3158     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3159     for (boolean createIncomplete : new boolean[] { true, false })
3160     {
3161     final AtomicInteger a = new AtomicInteger(0);
3162     final CompletableFuture<Integer> f = new CompletableFuture<>();
3163     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3164     final CompletableFuture<Integer> g = m.whenComplete
3165     (f,
3166     (Integer x, Throwable t) -> {
3167     threadAssertNull(x);
3168     threadAssertTrue(t instanceof CancellationException);
3169     a.getAndIncrement();
3170     });
3171     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3172    
3173     //try { g.join(); } catch (Throwable t) { throw new Error(t); }
3174     checkCompletedWithWrappedCancellationException(g);
3175     checkCancelled(f);
3176     assertEquals(1, a.get());
3177     }}
3178 dl 1.26
3179     /**
3180     * If a whenComplete action throws an exception when triggered by
3181     * a normal completion, it completes exceptionally
3182     */
3183 jsr166 1.42 public void testWhenComplete_actionFailed() {
3184 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3185 jsr166 1.42 for (ExecutionMode m : ExecutionMode.values())
3186 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3187     {
3188 jsr166 1.46 final AtomicInteger a = new AtomicInteger(0);
3189 jsr166 1.42 final CFException ex = new CFException();
3190     final CompletableFuture<Integer> f = new CompletableFuture<>();
3191 jsr166 1.44 if (!createIncomplete) f.complete(v1);
3192 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3193     (f,
3194     (Integer x, Throwable t) -> {
3195     threadAssertSame(x, v1);
3196     threadAssertNull(t);
3197 jsr166 1.46 a.getAndIncrement();
3198 jsr166 1.42 throw ex;
3199     });
3200 jsr166 1.44 if (createIncomplete) f.complete(v1);
3201 jsr166 1.42 checkCompletedNormally(f, v1);
3202     checkCompletedWithWrappedCFException(g, ex);
3203 jsr166 1.46 assertEquals(1, a.get());
3204 jsr166 1.47 }}
3205 dl 1.26
3206     /**
3207 jsr166 1.42 * If a whenComplete action throws an exception when triggered by
3208     * a source completion that also throws an exception, the source
3209     * exception takes precedence.
3210 dl 1.26 */
3211 jsr166 1.42 public void testWhenComplete_actionFailedSourceFailed() {
3212 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3213 jsr166 1.42 for (ExecutionMode m : ExecutionMode.values())
3214 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3215     {
3216 jsr166 1.46 final AtomicInteger a = new AtomicInteger(0);
3217 jsr166 1.42 final CFException ex1 = new CFException();
3218     final CFException ex2 = new CFException();
3219     final CompletableFuture<Integer> f = new CompletableFuture<>();
3220 jsr166 1.44
3221     if (!createIncomplete) f.completeExceptionally(ex1);
3222 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3223     (f,
3224     (Integer x, Throwable t) -> {
3225     threadAssertSame(t, ex1);
3226     threadAssertNull(x);
3227 jsr166 1.46 a.getAndIncrement();
3228 jsr166 1.42 throw ex2;
3229     });
3230 jsr166 1.44 if (createIncomplete) f.completeExceptionally(ex1);
3231    
3232 jsr166 1.42 checkCompletedWithWrappedCFException(f, ex1);
3233     checkCompletedWithWrappedCFException(g, ex1);
3234 jsr166 1.46 assertEquals(1, a.get());
3235 jsr166 1.47 }}
3236 dl 1.26
3237 jsr166 1.1 }