ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.49
Committed: Mon Jun 2 19:20:51 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.48: +64 -110 lines
Log Message:
improve tests for thenApply

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     static final class FailingNoop 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     FailingNoop r = new FailingNoop();
937     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     if (createIncomplete) f.complete(v1);
987 jsr166 1.23
988 dl 1.5 checkCompletedNormally(g, null);
989 jsr166 1.48 checkCompletedNormally(f, v1);
990 jsr166 1.44 assertEquals(1, r.invocationCount);
991 jsr166 1.48 }}
992 dl 1.5
993     /**
994     * thenRun result completes exceptionally after exceptional
995     * completion of source
996     */
997 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
998     for (ExecutionMode m : ExecutionMode.values())
999     for (boolean createIncomplete : new boolean[] { true, false })
1000     {
1001     final CFException ex = new CFException();
1002     final CompletableFuture<Integer> f = new CompletableFuture<>();
1003     final Noop r = new Noop();
1004     if (!createIncomplete) f.completeExceptionally(ex);
1005     final CompletableFuture<Void> g = m.thenRun(f, r);
1006     if (createIncomplete) f.completeExceptionally(ex);
1007 jsr166 1.23
1008 jsr166 1.48 checkCompletedWithWrappedCFException(g, ex);
1009     checkCompletedWithWrappedCFException(f, ex);
1010 jsr166 1.44 assertEquals(0, r.invocationCount);
1011 jsr166 1.48 }}
1012    
1013     /**
1014     * thenRun result completes exceptionally if source cancelled
1015     */
1016     public void testThenRun_sourceCancelled() {
1017     for (ExecutionMode m : ExecutionMode.values())
1018     for (boolean createIncomplete : new boolean[] { true, false })
1019     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1020     {
1021     final CompletableFuture<Integer> f = new CompletableFuture<>();
1022     final Noop r = new Noop();
1023     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1024     final CompletableFuture<Void> g = f.thenRun(r);
1025     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1026 jsr166 1.23
1027 jsr166 1.48 checkCompletedWithWrappedCancellationException(g);
1028     checkCancelled(f);
1029 jsr166 1.44 assertEquals(0, r.invocationCount);
1030 jsr166 1.48 }}
1031 dl 1.5
1032     /**
1033     * thenRun result completes exceptionally if action does
1034     */
1035 jsr166 1.48 public void testThenRun_actionFailed() {
1036     for (ExecutionMode m : ExecutionMode.values())
1037     for (boolean createIncomplete : new boolean[] { true, false })
1038     for (Integer v1 : new Integer[] { 1, null })
1039     {
1040     final CompletableFuture<Integer> f = new CompletableFuture<>();
1041     final FailingNoop r = new FailingNoop();
1042     if (!createIncomplete) f.complete(v1);
1043     final CompletableFuture<Void> g = f.thenRun(r);
1044     if (createIncomplete) f.complete(v1);
1045 jsr166 1.23
1046     checkCompletedWithWrappedCFException(g);
1047 jsr166 1.48 checkCompletedNormally(f, v1);
1048     }}
1049 dl 1.5
1050     /**
1051     * thenApply result completes normally after normal completion of source
1052     */
1053 jsr166 1.49 public void testThenApply_normalCompletion() {
1054     for (ExecutionMode m : ExecutionMode.values())
1055     for (boolean createIncomplete : new boolean[] { true, false })
1056     for (Integer v1 : new Integer[] { 1, null })
1057     {
1058     final CompletableFuture<Integer> f = new CompletableFuture<>();
1059     final IncFunction r = new IncFunction();
1060     if (!createIncomplete) f.complete(v1);
1061     final CompletableFuture<Integer> g = m.thenApply(f, r);
1062     if (createIncomplete) {
1063     checkIncomplete(g);
1064     f.complete(v1);
1065     }
1066    
1067     checkCompletedNormally(g, inc(v1));
1068     checkCompletedNormally(f, v1);
1069     assertEquals(1, r.invocationCount);
1070     }}
1071 dl 1.5
1072     /**
1073     * thenApply result completes exceptionally after exceptional
1074     * completion of source
1075     */
1076 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1077     for (ExecutionMode m : ExecutionMode.values())
1078     for (boolean createIncomplete : new boolean[] { true, false })
1079     {
1080     final CFException ex = new CFException();
1081     final CompletableFuture<Integer> f = new CompletableFuture<>();
1082     final IncFunction r = new IncFunction();
1083     if (!createIncomplete) f.completeExceptionally(ex);
1084     final CompletableFuture<Integer> g = m.thenApply(f, r);
1085     if (createIncomplete) f.completeExceptionally(ex);
1086    
1087     checkCompletedWithWrappedCFException(g, ex);
1088     checkCompletedWithWrappedCFException(f, ex);
1089     assertEquals(0, r.invocationCount);
1090     }}
1091 dl 1.5
1092     /**
1093 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1094 dl 1.5 */
1095 jsr166 1.49 public void testThenApply_sourceCancelled() {
1096     for (ExecutionMode m : ExecutionMode.values())
1097     for (boolean createIncomplete : new boolean[] { true, false })
1098     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1099     {
1100     final CompletableFuture<Integer> f = new CompletableFuture<>();
1101     final IncFunction r = new IncFunction();
1102     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1103     final CompletableFuture<Integer> g = f.thenApply(r);
1104     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1105    
1106     checkCompletedWithWrappedCancellationException(g);
1107     checkCancelled(f);
1108     assertEquals(0, r.invocationCount);
1109     }}
1110 dl 1.5
1111     /**
1112 jsr166 1.49 * thenApply result completes exceptionally if action does
1113 dl 1.5 */
1114 jsr166 1.49 public void testThenApply_actionFailed() {
1115     for (ExecutionMode m : ExecutionMode.values())
1116     for (boolean createIncomplete : new boolean[] { true, false })
1117     for (Integer v1 : new Integer[] { 1, null })
1118     {
1119     final CompletableFuture<Integer> f = new CompletableFuture<>();
1120     final FailingFunction r = new FailingFunction();
1121     if (!createIncomplete) f.complete(v1);
1122     final CompletableFuture<Integer> g = f.thenApply(r);
1123     if (createIncomplete) f.complete(v1);
1124    
1125     checkCompletedWithWrappedCFException(g);
1126     checkCompletedNormally(f, v1);
1127     }}
1128 dl 1.5
1129     /**
1130     * thenAccept result completes normally after normal completion of source
1131     */
1132     public void testThenAccept() {
1133 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1134 dl 1.5 IncAction r = new IncAction();
1135     CompletableFuture<Void> g = f.thenAccept(r);
1136     f.complete(one);
1137     checkCompletedNormally(g, null);
1138 jsr166 1.38 assertEquals(r.value, (Integer) 2);
1139 dl 1.5 }
1140    
1141     /**
1142     * thenAccept result completes exceptionally after exceptional
1143     * completion of source
1144     */
1145     public void testThenAccept2() {
1146 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1147 dl 1.5 IncAction r = new IncAction();
1148     CompletableFuture<Void> g = f.thenAccept(r);
1149     f.completeExceptionally(new CFException());
1150     checkCompletedWithWrappedCFException(g);
1151     }
1152    
1153     /**
1154     * thenAccept result completes exceptionally if action does
1155     */
1156     public void testThenAccept3() {
1157 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1158 dl 1.5 FailingConsumer r = new FailingConsumer();
1159     CompletableFuture<Void> g = f.thenAccept(r);
1160     f.complete(one);
1161     checkCompletedWithWrappedCFException(g);
1162 jsr166 1.44 assertEquals(1, r.invocationCount);
1163 dl 1.5 }
1164    
1165     /**
1166     * thenAccept result completes exceptionally if source cancelled
1167     */
1168     public void testThenAccept4() {
1169 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
1170 dl 1.5 IncAction r = new IncAction();
1171     CompletableFuture<Void> g = f.thenAccept(r);
1172     assertTrue(f.cancel(true));
1173     checkCompletedWithWrappedCancellationException(g);
1174     }
1175    
1176     /**
1177 jsr166 1.18 * thenCombine result completes normally after normal completion
1178     * of sources
1179 dl 1.5 */
1180 jsr166 1.36 public void testThenCombine_normalCompletion1() {
1181 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
1182 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1183 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1184     for (Integer v1 : new Integer[] { 1, null })
1185 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1186     {
1187 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1188     final CompletableFuture<Integer> g = new CompletableFuture<>();
1189     final SubtractFunction r = new SubtractFunction();
1190 jsr166 1.43 CompletableFuture<Integer> h = null;
1191 jsr166 1.44 if (createIncomplete) h = m.thenCombine(f, g, r);
1192 jsr166 1.36
1193 jsr166 1.43 if (fFirst)
1194     f.complete(v1);
1195     else
1196     g.complete(v2);
1197 jsr166 1.44 if (createIncomplete) checkIncomplete(h);
1198     assertEquals(0, r.invocationCount);
1199 jsr166 1.43 if (!fFirst)
1200     f.complete(v1);
1201     else
1202     g.complete(v2);
1203 jsr166 1.44 if (!createIncomplete) h = m.thenCombine(f, g, r);
1204 jsr166 1.36
1205     checkCompletedNormally(h, subtract(v1, v2));
1206     checkCompletedNormally(f, v1);
1207     checkCompletedNormally(g, v2);
1208 jsr166 1.44 assertEquals(1, r.invocationCount);
1209 jsr166 1.47 }}
1210 dl 1.5
1211     /**
1212     * thenCombine result completes exceptionally after exceptional
1213     * completion of either source
1214     */
1215 jsr166 1.36 public void testThenCombine_exceptionalCompletion1() {
1216     for (ExecutionMode m : ExecutionMode.values())
1217 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1218     {
1219 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1220     final CompletableFuture<Integer> g = new CompletableFuture<>();
1221     final SubtractFunction r = new SubtractFunction();
1222     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1223     final CFException ex = new CFException();
1224 jsr166 1.18
1225 jsr166 1.36 f.completeExceptionally(ex);
1226 jsr166 1.18 checkIncomplete(h);
1227 jsr166 1.36 g.complete(v1);
1228    
1229     checkCompletedWithWrappedCFException(h, ex);
1230     checkCompletedWithWrappedCFException(f, ex);
1231 jsr166 1.44 assertEquals(0, r.invocationCount);
1232 jsr166 1.36 checkCompletedNormally(g, v1);
1233 jsr166 1.47 }}
1234 jsr166 1.36
1235     public void testThenCombine_exceptionalCompletion2() {
1236     for (ExecutionMode m : ExecutionMode.values())
1237 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1238     {
1239 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1240     final CompletableFuture<Integer> g = new CompletableFuture<>();
1241     final SubtractFunction r = new SubtractFunction();
1242 jsr166 1.37 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1243 jsr166 1.36 final CFException ex = new CFException();
1244 jsr166 1.18
1245 jsr166 1.36 g.completeExceptionally(ex);
1246 jsr166 1.18 checkIncomplete(h);
1247 jsr166 1.36 f.complete(v1);
1248    
1249     checkCompletedWithWrappedCFException(h, ex);
1250     checkCompletedWithWrappedCFException(g, ex);
1251 jsr166 1.44 assertEquals(0, r.invocationCount);
1252 jsr166 1.36 checkCompletedNormally(f, v1);
1253 jsr166 1.47 }}
1254 jsr166 1.36
1255     public void testThenCombine_exceptionalCompletion3() {
1256     for (ExecutionMode m : ExecutionMode.values())
1257 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1258     {
1259 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1260     final CompletableFuture<Integer> g = new CompletableFuture<>();
1261     final SubtractFunction r = new SubtractFunction();
1262     final CFException ex = new CFException();
1263    
1264     g.completeExceptionally(ex);
1265     f.complete(v1);
1266     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1267    
1268     checkCompletedWithWrappedCFException(h, ex);
1269     checkCompletedWithWrappedCFException(g, ex);
1270 jsr166 1.44 assertEquals(0, r.invocationCount);
1271 jsr166 1.36 checkCompletedNormally(f, v1);
1272 jsr166 1.47 }}
1273 jsr166 1.36
1274     public void testThenCombine_exceptionalCompletion4() {
1275     for (ExecutionMode m : ExecutionMode.values())
1276 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1277     {
1278 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1279     final CompletableFuture<Integer> g = new CompletableFuture<>();
1280     final SubtractFunction r = new SubtractFunction();
1281     final CFException ex = new CFException();
1282 jsr166 1.18
1283 jsr166 1.36 f.completeExceptionally(ex);
1284     g.complete(v1);
1285 jsr166 1.37 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1286 dl 1.5
1287 jsr166 1.36 checkCompletedWithWrappedCFException(h, ex);
1288     checkCompletedWithWrappedCFException(f, ex);
1289 jsr166 1.44 assertEquals(0, r.invocationCount);
1290 jsr166 1.36 checkCompletedNormally(g, v1);
1291 jsr166 1.47 }}
1292 dl 1.5
1293     /**
1294     * thenCombine result completes exceptionally if action does
1295     */
1296 jsr166 1.36 public void testThenCombine_actionFailed1() {
1297     for (ExecutionMode m : ExecutionMode.values())
1298     for (Integer v1 : new Integer[] { 1, null })
1299 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1300     {
1301 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1302     final CompletableFuture<Integer> g = new CompletableFuture<>();
1303     final FailingBiFunction r = new FailingBiFunction();
1304     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1305    
1306     f.complete(v1);
1307     checkIncomplete(h);
1308     g.complete(v2);
1309    
1310     checkCompletedWithWrappedCFException(h);
1311     checkCompletedNormally(f, v1);
1312     checkCompletedNormally(g, v2);
1313 jsr166 1.47 }}
1314 jsr166 1.36
1315     public void testThenCombine_actionFailed2() {
1316     for (ExecutionMode m : ExecutionMode.values())
1317     for (Integer v1 : new Integer[] { 1, null })
1318 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1319     {
1320 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1321     final CompletableFuture<Integer> g = new CompletableFuture<>();
1322     final FailingBiFunction r = new FailingBiFunction();
1323     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1324    
1325     g.complete(v2);
1326     checkIncomplete(h);
1327     f.complete(v1);
1328    
1329     checkCompletedWithWrappedCFException(h);
1330     checkCompletedNormally(f, v1);
1331     checkCompletedNormally(g, v2);
1332 jsr166 1.47 }}
1333 dl 1.5
1334     /**
1335     * thenCombine result completes exceptionally if either source cancelled
1336     */
1337 jsr166 1.36 public void testThenCombine_sourceCancelled1() {
1338     for (ExecutionMode m : ExecutionMode.values())
1339     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1340 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1341     {
1342 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1343     final CompletableFuture<Integer> g = new CompletableFuture<>();
1344     final SubtractFunction r = new SubtractFunction();
1345     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1346 jsr166 1.18
1347 jsr166 1.36 assertTrue(f.cancel(mayInterruptIfRunning));
1348 jsr166 1.18 checkIncomplete(h);
1349 jsr166 1.36 g.complete(v1);
1350    
1351 jsr166 1.18 checkCompletedWithWrappedCancellationException(h);
1352 jsr166 1.36 checkCancelled(f);
1353 jsr166 1.44 assertEquals(0, r.invocationCount);
1354 jsr166 1.36 checkCompletedNormally(g, v1);
1355 jsr166 1.47 }}
1356 jsr166 1.36
1357     public void testThenCombine_sourceCancelled2() {
1358     for (ExecutionMode m : ExecutionMode.values())
1359     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1360 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1361     {
1362 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1363     final CompletableFuture<Integer> g = new CompletableFuture<>();
1364     final SubtractFunction r = new SubtractFunction();
1365     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1366    
1367     assertTrue(g.cancel(mayInterruptIfRunning));
1368 jsr166 1.18 checkIncomplete(h);
1369 jsr166 1.36 f.complete(v1);
1370    
1371     checkCompletedWithWrappedCancellationException(h);
1372     checkCancelled(g);
1373 jsr166 1.44 assertEquals(0, r.invocationCount);
1374 jsr166 1.36 checkCompletedNormally(f, v1);
1375 jsr166 1.47 }}
1376 jsr166 1.36
1377     public void testThenCombine_sourceCancelled3() {
1378     for (ExecutionMode m : ExecutionMode.values())
1379     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1380 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1381     {
1382 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1383     final CompletableFuture<Integer> g = new CompletableFuture<>();
1384     final SubtractFunction r = new SubtractFunction();
1385    
1386     assertTrue(g.cancel(mayInterruptIfRunning));
1387     f.complete(v1);
1388     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1389    
1390 jsr166 1.18 checkCompletedWithWrappedCancellationException(h);
1391 jsr166 1.36 checkCancelled(g);
1392 jsr166 1.44 assertEquals(0, r.invocationCount);
1393 jsr166 1.36 checkCompletedNormally(f, v1);
1394 jsr166 1.47 }}
1395 jsr166 1.36
1396     public void testThenCombine_sourceCancelled4() {
1397     for (ExecutionMode m : ExecutionMode.values())
1398     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1399 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1400     {
1401 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1402     final CompletableFuture<Integer> g = new CompletableFuture<>();
1403     final SubtractFunction r = new SubtractFunction();
1404    
1405     assertTrue(f.cancel(mayInterruptIfRunning));
1406     g.complete(v1);
1407     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1408 jsr166 1.18
1409     checkCompletedWithWrappedCancellationException(h);
1410 jsr166 1.36 checkCancelled(f);
1411 jsr166 1.44 assertEquals(0, r.invocationCount);
1412 jsr166 1.36 checkCompletedNormally(g, v1);
1413 jsr166 1.47 }}
1414 dl 1.5
1415     /**
1416     * thenAcceptBoth result completes normally after normal
1417     * completion of sources
1418     */
1419 jsr166 1.35 public void testThenAcceptBoth_normalCompletion1() {
1420     for (ExecutionMode m : ExecutionMode.values())
1421     for (Integer v1 : new Integer[] { 1, null })
1422 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1423     {
1424 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1425     final CompletableFuture<Integer> g = new CompletableFuture<>();
1426     final SubtractAction r = new SubtractAction();
1427     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1428 jsr166 1.22
1429 jsr166 1.35 f.complete(v1);
1430 jsr166 1.22 checkIncomplete(h);
1431 jsr166 1.44 assertEquals(0, r.invocationCount);
1432 jsr166 1.35 g.complete(v2);
1433    
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 jsr166 1.35
1440     public void testThenAcceptBoth_normalCompletion2() {
1441     for (ExecutionMode m : ExecutionMode.values())
1442     for (Integer v1 : new Integer[] { 1, null })
1443 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1444     {
1445 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1446     final CompletableFuture<Integer> g = new CompletableFuture<>();
1447     final SubtractAction r = new SubtractAction();
1448     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1449 jsr166 1.22
1450 jsr166 1.35 g.complete(v2);
1451 jsr166 1.22 checkIncomplete(h);
1452 jsr166 1.44 assertEquals(0, r.invocationCount);
1453 jsr166 1.35 f.complete(v1);
1454    
1455     checkCompletedNormally(h, null);
1456 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1457 jsr166 1.35 checkCompletedNormally(f, v1);
1458     checkCompletedNormally(g, v2);
1459 jsr166 1.47 }}
1460 jsr166 1.35
1461     public void testThenAcceptBoth_normalCompletion3() {
1462     for (ExecutionMode m : ExecutionMode.values())
1463     for (Integer v1 : new Integer[] { 1, null })
1464 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1465     {
1466 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1467     final CompletableFuture<Integer> g = new CompletableFuture<>();
1468     final SubtractAction r = new SubtractAction();
1469    
1470     g.complete(v2);
1471     f.complete(v1);
1472     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1473    
1474 jsr166 1.22 checkCompletedNormally(h, null);
1475 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1476 jsr166 1.35 checkCompletedNormally(f, v1);
1477     checkCompletedNormally(g, v2);
1478 jsr166 1.47 }}
1479 jsr166 1.35
1480     public void testThenAcceptBoth_normalCompletion4() {
1481     for (ExecutionMode m : ExecutionMode.values())
1482     for (Integer v1 : new Integer[] { 1, null })
1483 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1484     {
1485 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1486     final CompletableFuture<Integer> g = new CompletableFuture<>();
1487     final SubtractAction r = new SubtractAction();
1488    
1489     f.complete(v1);
1490     g.complete(v2);
1491     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1492 dl 1.5
1493 jsr166 1.22 checkCompletedNormally(h, null);
1494 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1495 jsr166 1.35 checkCompletedNormally(f, v1);
1496     checkCompletedNormally(g, v2);
1497 jsr166 1.47 }}
1498 dl 1.5
1499     /**
1500     * thenAcceptBoth result completes exceptionally after exceptional
1501     * completion of either source
1502     */
1503 jsr166 1.35 public void testThenAcceptBoth_exceptionalCompletion1() {
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 CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1511     final CFException ex = new CFException();
1512 jsr166 1.22
1513 jsr166 1.35 f.completeExceptionally(ex);
1514 jsr166 1.22 checkIncomplete(h);
1515 jsr166 1.35 g.complete(v1);
1516    
1517     checkCompletedWithWrappedCFException(h, ex);
1518     checkCompletedWithWrappedCFException(f, ex);
1519 jsr166 1.44 assertEquals(0, r.invocationCount);
1520 jsr166 1.35 checkCompletedNormally(g, v1);
1521 jsr166 1.47 }}
1522 jsr166 1.35
1523     public void testThenAcceptBoth_exceptionalCompletion2() {
1524     for (ExecutionMode m : ExecutionMode.values())
1525 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1526     {
1527 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1528     final CompletableFuture<Integer> g = new CompletableFuture<>();
1529     final SubtractAction r = new SubtractAction();
1530     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1531     final CFException ex = new CFException();
1532 jsr166 1.22
1533 jsr166 1.35 g.completeExceptionally(ex);
1534 jsr166 1.22 checkIncomplete(h);
1535 jsr166 1.35 f.complete(v1);
1536    
1537     checkCompletedWithWrappedCFException(h, ex);
1538     checkCompletedWithWrappedCFException(g, ex);
1539 jsr166 1.44 assertEquals(0, r.invocationCount);
1540 jsr166 1.35 checkCompletedNormally(f, v1);
1541 jsr166 1.47 }}
1542 jsr166 1.35
1543     public void testThenAcceptBoth_exceptionalCompletion3() {
1544     for (ExecutionMode m : ExecutionMode.values())
1545 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1546     {
1547 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1548     final CompletableFuture<Integer> g = new CompletableFuture<>();
1549     final SubtractAction r = new SubtractAction();
1550     final CFException ex = new CFException();
1551    
1552     g.completeExceptionally(ex);
1553     f.complete(v1);
1554     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1555    
1556     checkCompletedWithWrappedCFException(h, ex);
1557     checkCompletedWithWrappedCFException(g, ex);
1558 jsr166 1.44 assertEquals(0, r.invocationCount);
1559 jsr166 1.35 checkCompletedNormally(f, v1);
1560 jsr166 1.47 }}
1561 jsr166 1.35
1562     public void testThenAcceptBoth_exceptionalCompletion4() {
1563     for (ExecutionMode m : ExecutionMode.values())
1564 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1565     {
1566 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1567     final CompletableFuture<Integer> g = new CompletableFuture<>();
1568     final SubtractAction r = new SubtractAction();
1569     final CFException ex = new CFException();
1570 jsr166 1.22
1571 jsr166 1.35 f.completeExceptionally(ex);
1572     g.complete(v1);
1573     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1574 dl 1.5
1575 jsr166 1.35 checkCompletedWithWrappedCFException(h, ex);
1576     checkCompletedWithWrappedCFException(f, ex);
1577 jsr166 1.44 assertEquals(0, r.invocationCount);
1578 jsr166 1.35 checkCompletedNormally(g, v1);
1579 jsr166 1.47 }}
1580 dl 1.5
1581     /**
1582     * thenAcceptBoth result completes exceptionally if action does
1583     */
1584 jsr166 1.35 public void testThenAcceptBoth_actionFailed1() {
1585     for (ExecutionMode m : ExecutionMode.values())
1586     for (Integer v1 : new Integer[] { 1, null })
1587 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1588     {
1589 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1590     final CompletableFuture<Integer> g = new CompletableFuture<>();
1591     final FailingBiConsumer r = new FailingBiConsumer();
1592     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1593 jsr166 1.22
1594 jsr166 1.35 f.complete(v1);
1595 jsr166 1.22 checkIncomplete(h);
1596 jsr166 1.35 g.complete(v2);
1597    
1598 jsr166 1.22 checkCompletedWithWrappedCFException(h);
1599 jsr166 1.35 checkCompletedNormally(f, v1);
1600     checkCompletedNormally(g, v2);
1601 jsr166 1.47 }}
1602 jsr166 1.35
1603     public void testThenAcceptBoth_actionFailed2() {
1604     for (ExecutionMode m : ExecutionMode.values())
1605     for (Integer v1 : new Integer[] { 1, null })
1606 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1607     {
1608 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1609     final CompletableFuture<Integer> g = new CompletableFuture<>();
1610     final FailingBiConsumer r = new FailingBiConsumer();
1611     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1612    
1613     g.complete(v2);
1614     checkIncomplete(h);
1615     f.complete(v1);
1616 jsr166 1.22
1617     checkCompletedWithWrappedCFException(h);
1618 jsr166 1.35 checkCompletedNormally(f, v1);
1619     checkCompletedNormally(g, v2);
1620 jsr166 1.47 }}
1621 dl 1.5
1622     /**
1623     * thenAcceptBoth result completes exceptionally if either source cancelled
1624     */
1625 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled1() {
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     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1634 jsr166 1.22
1635 jsr166 1.35 assertTrue(f.cancel(mayInterruptIfRunning));
1636 jsr166 1.22 checkIncomplete(h);
1637 jsr166 1.35 g.complete(v1);
1638    
1639 jsr166 1.22 checkCompletedWithWrappedCancellationException(h);
1640 jsr166 1.35 checkCancelled(f);
1641 jsr166 1.44 assertEquals(0, r.invocationCount);
1642 jsr166 1.35 checkCompletedNormally(g, v1);
1643 jsr166 1.47 }}
1644 jsr166 1.22
1645 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled2() {
1646     for (ExecutionMode m : ExecutionMode.values())
1647     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1648 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1649     {
1650 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1651     final CompletableFuture<Integer> g = new CompletableFuture<>();
1652     final SubtractAction r = new SubtractAction();
1653     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1654    
1655     assertTrue(g.cancel(mayInterruptIfRunning));
1656 jsr166 1.22 checkIncomplete(h);
1657 jsr166 1.35 f.complete(v1);
1658    
1659 jsr166 1.22 checkCompletedWithWrappedCancellationException(h);
1660 jsr166 1.35 checkCancelled(g);
1661 jsr166 1.44 assertEquals(0, r.invocationCount);
1662 jsr166 1.35 checkCompletedNormally(f, v1);
1663 jsr166 1.47 }}
1664 jsr166 1.35
1665     public void testThenAcceptBoth_sourceCancelled3() {
1666     for (ExecutionMode m : ExecutionMode.values())
1667     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1668 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1669     {
1670 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1671     final CompletableFuture<Integer> g = new CompletableFuture<>();
1672     final SubtractAction r = new SubtractAction();
1673 jsr166 1.22
1674 jsr166 1.35 assertTrue(g.cancel(mayInterruptIfRunning));
1675     f.complete(v1);
1676     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1677 jsr166 1.22
1678     checkCompletedWithWrappedCancellationException(h);
1679 jsr166 1.35 checkCancelled(g);
1680 jsr166 1.44 assertEquals(0, r.invocationCount);
1681 jsr166 1.35 checkCompletedNormally(f, v1);
1682 jsr166 1.47 }}
1683 dl 1.5
1684 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled4() {
1685     for (ExecutionMode m : ExecutionMode.values())
1686     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1687 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1688     {
1689 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1690     final CompletableFuture<Integer> g = new CompletableFuture<>();
1691     final SubtractAction r = new SubtractAction();
1692 jsr166 1.34
1693 jsr166 1.35 assertTrue(f.cancel(mayInterruptIfRunning));
1694     g.complete(v1);
1695     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1696 jsr166 1.34
1697 jsr166 1.35 checkCompletedWithWrappedCancellationException(h);
1698     checkCancelled(f);
1699 jsr166 1.44 assertEquals(0, r.invocationCount);
1700 jsr166 1.35 checkCompletedNormally(g, v1);
1701 jsr166 1.47 }}
1702 jsr166 1.34
1703     /**
1704 dl 1.5 * runAfterBoth result completes normally after normal
1705     * completion of sources
1706     */
1707 jsr166 1.33 public void testRunAfterBoth_normalCompletion1() {
1708 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1709 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1710 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1711     {
1712 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1713     final CompletableFuture<Integer> g = new CompletableFuture<>();
1714     final Noop r = new Noop();
1715 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1716 jsr166 1.22
1717 jsr166 1.33 f.complete(v1);
1718 jsr166 1.22 checkIncomplete(h);
1719 jsr166 1.44 assertEquals(0, r.invocationCount);
1720 jsr166 1.33 g.complete(v2);
1721    
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 jsr166 1.33
1728     public void testRunAfterBoth_normalCompletion2() {
1729 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1730 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1731 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1732     {
1733 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1734     final CompletableFuture<Integer> g = new CompletableFuture<>();
1735     final Noop r = new Noop();
1736 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1737 jsr166 1.22
1738 jsr166 1.33 g.complete(v2);
1739 jsr166 1.22 checkIncomplete(h);
1740 jsr166 1.44 assertEquals(0, r.invocationCount);
1741 jsr166 1.33 f.complete(v1);
1742    
1743     checkCompletedNormally(h, null);
1744 jsr166 1.44 assertEquals(1, r.invocationCount);
1745 jsr166 1.33 checkCompletedNormally(f, v1);
1746     checkCompletedNormally(g, v2);
1747 jsr166 1.47 }}
1748 jsr166 1.33
1749     public void testRunAfterBoth_normalCompletion3() {
1750 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1751 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1752 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1753     {
1754 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1755     final CompletableFuture<Integer> g = new CompletableFuture<>();
1756     final Noop r = new Noop();
1757    
1758     g.complete(v2);
1759     f.complete(v1);
1760 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1761 jsr166 1.33
1762 jsr166 1.22 checkCompletedNormally(h, null);
1763 jsr166 1.44 assertEquals(1, r.invocationCount);
1764 jsr166 1.33 checkCompletedNormally(f, v1);
1765     checkCompletedNormally(g, v2);
1766 jsr166 1.47 }}
1767 jsr166 1.33
1768     public void testRunAfterBoth_normalCompletion4() {
1769 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1770 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1771 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1772     {
1773 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1774     final CompletableFuture<Integer> g = new CompletableFuture<>();
1775     final Noop r = new Noop();
1776    
1777     f.complete(v1);
1778     g.complete(v2);
1779 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1780 dl 1.5
1781 jsr166 1.22 checkCompletedNormally(h, null);
1782 jsr166 1.44 assertEquals(1, r.invocationCount);
1783 jsr166 1.33 checkCompletedNormally(f, v1);
1784     checkCompletedNormally(g, v2);
1785 jsr166 1.47 }}
1786 dl 1.5
1787     /**
1788     * runAfterBoth result completes exceptionally after exceptional
1789     * completion of either source
1790     */
1791 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion1() {
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 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1799 jsr166 1.33 final CFException ex = new CFException();
1800 jsr166 1.22
1801 jsr166 1.33 f.completeExceptionally(ex);
1802 jsr166 1.22 checkIncomplete(h);
1803 jsr166 1.33 g.complete(v1);
1804    
1805     checkCompletedWithWrappedCFException(h, ex);
1806     checkCompletedWithWrappedCFException(f, ex);
1807 jsr166 1.44 assertEquals(0, r.invocationCount);
1808 jsr166 1.33 checkCompletedNormally(g, v1);
1809 jsr166 1.47 }}
1810 jsr166 1.22
1811 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion2() {
1812 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1813 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1814     {
1815 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1816     final CompletableFuture<Integer> g = new CompletableFuture<>();
1817     final Noop r = new Noop();
1818 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1819 jsr166 1.33 final CFException ex = new CFException();
1820    
1821     g.completeExceptionally(ex);
1822 jsr166 1.22 checkIncomplete(h);
1823 jsr166 1.33 f.complete(v1);
1824    
1825     checkCompletedWithWrappedCFException(h, ex);
1826     checkCompletedWithWrappedCFException(g, ex);
1827 jsr166 1.44 assertEquals(0, r.invocationCount);
1828 jsr166 1.33 checkCompletedNormally(f, v1);
1829 jsr166 1.47 }}
1830 jsr166 1.22
1831 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion3() {
1832 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1833 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1834     {
1835 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1836     final CompletableFuture<Integer> g = new CompletableFuture<>();
1837     final Noop r = new Noop();
1838     final CFException ex = new CFException();
1839    
1840     g.completeExceptionally(ex);
1841     f.complete(v1);
1842 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1843 jsr166 1.33
1844     checkCompletedWithWrappedCFException(h, ex);
1845     checkCompletedWithWrappedCFException(g, ex);
1846 jsr166 1.44 assertEquals(0, r.invocationCount);
1847 jsr166 1.33 checkCompletedNormally(f, v1);
1848 jsr166 1.47 }}
1849 jsr166 1.33
1850     public void testRunAfterBoth_exceptionalCompletion4() {
1851 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1852 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1853     {
1854 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1855     final CompletableFuture<Integer> g = new CompletableFuture<>();
1856     final Noop r = new Noop();
1857     final CFException ex = new CFException();
1858    
1859     f.completeExceptionally(ex);
1860     g.complete(v1);
1861 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1862 dl 1.5
1863 jsr166 1.33 checkCompletedWithWrappedCFException(h, ex);
1864     checkCompletedWithWrappedCFException(f, ex);
1865 jsr166 1.44 assertEquals(0, r.invocationCount);
1866 jsr166 1.33 checkCompletedNormally(g, v1);
1867 jsr166 1.47 }}
1868 dl 1.5
1869 jsr166 1.4 /**
1870 dl 1.5 * runAfterBoth result completes exceptionally if action does
1871 jsr166 1.4 */
1872 jsr166 1.33 public void testRunAfterBoth_actionFailed1() {
1873 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1874 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1875 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1876     {
1877 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1878     final CompletableFuture<Integer> g = new CompletableFuture<>();
1879     final FailingNoop r = new FailingNoop();
1880 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1881 jsr166 1.33
1882     f.complete(v1);
1883     checkIncomplete(h);
1884     g.complete(v2);
1885    
1886     checkCompletedWithWrappedCFException(h);
1887     checkCompletedNormally(f, v1);
1888     checkCompletedNormally(g, v2);
1889 jsr166 1.47 }}
1890 jsr166 1.33
1891     public void testRunAfterBoth_actionFailed2() {
1892 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1893 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1894 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1895     {
1896 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1897     final CompletableFuture<Integer> g = new CompletableFuture<>();
1898     final FailingNoop r = new FailingNoop();
1899 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1900 jsr166 1.33
1901     g.complete(v2);
1902     checkIncomplete(h);
1903     f.complete(v1);
1904    
1905     checkCompletedWithWrappedCFException(h);
1906     checkCompletedNormally(f, v1);
1907     checkCompletedNormally(g, v2);
1908 jsr166 1.47 }}
1909 jsr166 1.4
1910     /**
1911 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
1912 jsr166 1.4 */
1913 jsr166 1.33 public void testRunAfterBoth_sourceCancelled1() {
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 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1922 jsr166 1.33
1923     assertTrue(f.cancel(mayInterruptIfRunning));
1924     checkIncomplete(h);
1925     g.complete(v1);
1926    
1927     checkCompletedWithWrappedCancellationException(h);
1928     checkCancelled(f);
1929 jsr166 1.44 assertEquals(0, r.invocationCount);
1930 jsr166 1.33 checkCompletedNormally(g, v1);
1931 jsr166 1.47 }}
1932 jsr166 1.33
1933     public void testRunAfterBoth_sourceCancelled2() {
1934 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1935 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1936 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1937     {
1938 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1939     final CompletableFuture<Integer> g = new CompletableFuture<>();
1940     final Noop r = new Noop();
1941 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1942 jsr166 1.33
1943     assertTrue(g.cancel(mayInterruptIfRunning));
1944     checkIncomplete(h);
1945     f.complete(v1);
1946    
1947     checkCompletedWithWrappedCancellationException(h);
1948     checkCancelled(g);
1949 jsr166 1.44 assertEquals(0, r.invocationCount);
1950 jsr166 1.33 checkCompletedNormally(f, v1);
1951 jsr166 1.47 }}
1952 jsr166 1.33
1953     public void testRunAfterBoth_sourceCancelled3() {
1954 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1955 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1956 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1957     {
1958 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1959     final CompletableFuture<Integer> g = new CompletableFuture<>();
1960     final Noop r = new Noop();
1961    
1962     assertTrue(g.cancel(mayInterruptIfRunning));
1963     f.complete(v1);
1964 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1965 jsr166 1.33
1966     checkCompletedWithWrappedCancellationException(h);
1967     checkCancelled(g);
1968 jsr166 1.44 assertEquals(0, r.invocationCount);
1969 jsr166 1.33 checkCompletedNormally(f, v1);
1970 jsr166 1.47 }}
1971 jsr166 1.33
1972     public void testRunAfterBoth_sourceCancelled4() {
1973 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1974 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1975 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1976     {
1977 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1978     final CompletableFuture<Integer> g = new CompletableFuture<>();
1979     final Noop r = new Noop();
1980    
1981     assertTrue(f.cancel(mayInterruptIfRunning));
1982     g.complete(v1);
1983 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1984 jsr166 1.33
1985     checkCompletedWithWrappedCancellationException(h);
1986     checkCancelled(f);
1987 jsr166 1.44 assertEquals(0, r.invocationCount);
1988 jsr166 1.33 checkCompletedNormally(g, v1);
1989 jsr166 1.47 }}
1990 dl 1.5
1991     /**
1992     * applyToEither result completes normally after normal completion
1993     * of either source
1994     */
1995 jsr166 1.39 public void testApplyToEither_normalCompletion1() {
1996     for (ExecutionMode m : ExecutionMode.values())
1997     for (Integer v1 : new Integer[] { 1, null })
1998 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1999     {
2000 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2001     final CompletableFuture<Integer> g = new CompletableFuture<>();
2002     final IncFunction r = new IncFunction();
2003     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2004    
2005     f.complete(v1);
2006     checkCompletedNormally(h, inc(v1));
2007     g.complete(v2);
2008    
2009     checkCompletedNormally(f, v1);
2010     checkCompletedNormally(g, v2);
2011     checkCompletedNormally(h, inc(v1));
2012 jsr166 1.47 }}
2013 dl 1.5
2014 jsr166 1.39 public void testApplyToEither_normalCompletion2() {
2015     for (ExecutionMode m : ExecutionMode.values())
2016     for (Integer v1 : new Integer[] { 1, null })
2017 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2018     {
2019 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2020     final CompletableFuture<Integer> g = new CompletableFuture<>();
2021     final IncFunction r = new IncFunction();
2022     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2023    
2024     g.complete(v2);
2025     checkCompletedNormally(h, inc(v2));
2026     f.complete(v1);
2027    
2028     checkCompletedNormally(f, v1);
2029     checkCompletedNormally(g, v2);
2030     checkCompletedNormally(h, inc(v2));
2031 jsr166 1.47 }}
2032    
2033 jsr166 1.39 public void testApplyToEither_normalCompletion3() {
2034     for (ExecutionMode m : ExecutionMode.values())
2035     for (Integer v1 : new Integer[] { 1, null })
2036 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2037     {
2038 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2039     final CompletableFuture<Integer> g = new CompletableFuture<>();
2040     final IncFunction r = new IncFunction();
2041    
2042     f.complete(v1);
2043     g.complete(v2);
2044     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2045    
2046     checkCompletedNormally(f, v1);
2047     checkCompletedNormally(g, v2);
2048    
2049     // unspecified behavior
2050     assertTrue(Objects.equals(h.join(), inc(v1)) ||
2051     Objects.equals(h.join(), inc(v2)));
2052 jsr166 1.44 assertEquals(1, r.invocationCount);
2053 jsr166 1.47 }}
2054 dl 1.5
2055     /**
2056     * applyToEither result completes exceptionally after exceptional
2057     * completion of either source
2058     */
2059 jsr166 1.39 public void testApplyToEither_exceptionalCompletion1() {
2060     for (ExecutionMode m : ExecutionMode.values())
2061 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2062     {
2063 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2064     final CompletableFuture<Integer> g = new CompletableFuture<>();
2065     final IncFunction r = new IncFunction();
2066     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2067     final CFException ex = new CFException();
2068    
2069     f.completeExceptionally(ex);
2070     checkCompletedWithWrappedCFException(h, ex);
2071     g.complete(v1);
2072    
2073 jsr166 1.44 assertEquals(0, r.invocationCount);
2074 jsr166 1.39 checkCompletedNormally(g, v1);
2075     checkCompletedWithWrappedCFException(f, ex);
2076     checkCompletedWithWrappedCFException(h, ex);
2077 jsr166 1.47 }}
2078 jsr166 1.39
2079     public void testApplyToEither_exceptionalCompletion2() {
2080     for (ExecutionMode m : ExecutionMode.values())
2081 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2082     {
2083 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2084     final CompletableFuture<Integer> g = new CompletableFuture<>();
2085     final IncFunction r = new IncFunction();
2086     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2087     final CFException ex = new CFException();
2088    
2089     g.completeExceptionally(ex);
2090     checkCompletedWithWrappedCFException(h, ex);
2091     f.complete(v1);
2092    
2093 jsr166 1.44 assertEquals(0, r.invocationCount);
2094 jsr166 1.39 checkCompletedNormally(f, v1);
2095     checkCompletedWithWrappedCFException(g, ex);
2096     checkCompletedWithWrappedCFException(h, ex);
2097 jsr166 1.47 }}
2098 jsr166 1.39
2099     public void testApplyToEither_exceptionalCompletion3() {
2100     for (ExecutionMode m : ExecutionMode.values())
2101 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2102     {
2103 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2104     final CompletableFuture<Integer> g = new CompletableFuture<>();
2105     final IncFunction r = new IncFunction();
2106     final CFException ex = new CFException();
2107    
2108     g.completeExceptionally(ex);
2109     f.complete(v1);
2110     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2111    
2112     // unspecified behavior
2113     Integer v;
2114     try {
2115 jsr166 1.46 assertEquals(inc(v1), h.join());
2116 jsr166 1.44 assertEquals(1, r.invocationCount);
2117 jsr166 1.39 } catch (CompletionException ok) {
2118     checkCompletedWithWrappedCFException(h, ex);
2119 jsr166 1.44 assertEquals(0, r.invocationCount);
2120 jsr166 1.39 }
2121    
2122     checkCompletedWithWrappedCFException(g, ex);
2123     checkCompletedNormally(f, v1);
2124 jsr166 1.47 }}
2125 jsr166 1.39
2126     public void testApplyToEither_exceptionalCompletion4() {
2127     for (ExecutionMode m : ExecutionMode.values())
2128 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2129     {
2130 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2131     final CompletableFuture<Integer> g = new CompletableFuture<>();
2132     final IncFunction r = new IncFunction();
2133     final CFException ex = new CFException();
2134    
2135     f.completeExceptionally(ex);
2136     g.complete(v1);
2137     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2138    
2139     // unspecified behavior
2140     Integer v;
2141     try {
2142 jsr166 1.46 assertEquals(inc(v1), h.join());
2143 jsr166 1.44 assertEquals(1, r.invocationCount);
2144 jsr166 1.39 } catch (CompletionException ok) {
2145     checkCompletedWithWrappedCFException(h, ex);
2146 jsr166 1.44 assertEquals(0, r.invocationCount);
2147 jsr166 1.39 }
2148 dl 1.5
2149 jsr166 1.39 checkCompletedWithWrappedCFException(f, ex);
2150     checkCompletedNormally(g, v1);
2151 jsr166 1.47 }}
2152 dl 1.5
2153     /**
2154     * applyToEither result completes exceptionally if action does
2155     */
2156 jsr166 1.39 public void testApplyToEither_actionFailed1() {
2157     for (ExecutionMode m : ExecutionMode.values())
2158     for (Integer v1 : new Integer[] { 1, null })
2159 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2160     {
2161 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2162     final CompletableFuture<Integer> g = new CompletableFuture<>();
2163     final FailingFunction r = new FailingFunction();
2164     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2165    
2166     f.complete(v1);
2167     checkCompletedWithWrappedCFException(h);
2168     g.complete(v2);
2169     checkCompletedNormally(f, v1);
2170     checkCompletedNormally(g, v2);
2171 jsr166 1.47 }}
2172 jsr166 1.39
2173     public void testApplyToEither_actionFailed2() {
2174     for (ExecutionMode m : ExecutionMode.values())
2175     for (Integer v1 : new Integer[] { 1, null })
2176 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2177     {
2178 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2179     final CompletableFuture<Integer> g = new CompletableFuture<>();
2180     final FailingFunction r = new FailingFunction();
2181     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2182    
2183     g.complete(v2);
2184     checkCompletedWithWrappedCFException(h);
2185     f.complete(v1);
2186     checkCompletedNormally(f, v1);
2187     checkCompletedNormally(g, v2);
2188 jsr166 1.47 }}
2189 dl 1.5
2190     /**
2191     * applyToEither result completes exceptionally if either source cancelled
2192     */
2193 jsr166 1.39 public void testApplyToEither_sourceCancelled1() {
2194     for (ExecutionMode m : ExecutionMode.values())
2195     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2196 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2197     {
2198 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2199     final CompletableFuture<Integer> g = new CompletableFuture<>();
2200     final IncFunction r = new IncFunction();
2201     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2202    
2203     assertTrue(f.cancel(mayInterruptIfRunning));
2204     checkCompletedWithWrappedCancellationException(h);
2205     g.complete(v1);
2206    
2207     checkCancelled(f);
2208 jsr166 1.44 assertEquals(0, r.invocationCount);
2209 jsr166 1.39 checkCompletedNormally(g, v1);
2210     checkCompletedWithWrappedCancellationException(h);
2211 jsr166 1.47 }}
2212 jsr166 1.39
2213     public void testApplyToEither_sourceCancelled2() {
2214     for (ExecutionMode m : ExecutionMode.values())
2215     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2216 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2217     {
2218 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2219     final CompletableFuture<Integer> g = new CompletableFuture<>();
2220     final IncFunction r = new IncFunction();
2221     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2222    
2223     assertTrue(g.cancel(mayInterruptIfRunning));
2224     checkCompletedWithWrappedCancellationException(h);
2225     f.complete(v1);
2226    
2227     checkCancelled(g);
2228 jsr166 1.44 assertEquals(0, r.invocationCount);
2229 jsr166 1.39 checkCompletedNormally(f, v1);
2230     checkCompletedWithWrappedCancellationException(h);
2231 jsr166 1.47 }}
2232 jsr166 1.39
2233     public void testApplyToEither_sourceCancelled3() {
2234     for (ExecutionMode m : ExecutionMode.values())
2235     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2236 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2237     {
2238 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2239     final CompletableFuture<Integer> g = new CompletableFuture<>();
2240     final IncFunction r = new IncFunction();
2241    
2242     assertTrue(g.cancel(mayInterruptIfRunning));
2243     f.complete(v1);
2244     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2245    
2246     // unspecified behavior
2247     Integer v;
2248     try {
2249 jsr166 1.46 assertEquals(inc(v1), h.join());
2250 jsr166 1.44 assertEquals(1, r.invocationCount);
2251 jsr166 1.39 } catch (CompletionException ok) {
2252     checkCompletedWithWrappedCancellationException(h);
2253 jsr166 1.44 assertEquals(0, r.invocationCount);
2254 jsr166 1.39 }
2255    
2256     checkCancelled(g);
2257     checkCompletedNormally(f, v1);
2258 jsr166 1.47 }}
2259 jsr166 1.39
2260     public void testApplyToEither_sourceCancelled4() {
2261     for (ExecutionMode m : ExecutionMode.values())
2262     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2263 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2264     {
2265 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2266     final CompletableFuture<Integer> g = new CompletableFuture<>();
2267     final IncFunction r = new IncFunction();
2268    
2269     assertTrue(f.cancel(mayInterruptIfRunning));
2270     g.complete(v1);
2271     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2272    
2273     // unspecified behavior
2274     Integer v;
2275     try {
2276 jsr166 1.46 assertEquals(inc(v1), h.join());
2277 jsr166 1.44 assertEquals(1, r.invocationCount);
2278 jsr166 1.39 } catch (CompletionException ok) {
2279     checkCompletedWithWrappedCancellationException(h);
2280 jsr166 1.44 assertEquals(0, r.invocationCount);
2281 jsr166 1.39 }
2282    
2283     checkCancelled(f);
2284     checkCompletedNormally(g, v1);
2285 jsr166 1.47 }}
2286 dl 1.5
2287     /**
2288     * acceptEither result completes normally after normal completion
2289     * of either source
2290     */
2291 jsr166 1.40 public void testAcceptEither_normalCompletion1() {
2292     for (ExecutionMode m : ExecutionMode.values())
2293     for (Integer v1 : new Integer[] { 1, null })
2294 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2295     {
2296 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2297     final CompletableFuture<Integer> g = new CompletableFuture<>();
2298     final IncAction r = new IncAction();
2299     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2300    
2301     f.complete(v1);
2302     checkCompletedNormally(h, null);
2303 jsr166 1.46 assertEquals(inc(v1), r.value);
2304 jsr166 1.40 g.complete(v2);
2305    
2306     checkCompletedNormally(f, v1);
2307     checkCompletedNormally(g, v2);
2308     checkCompletedNormally(h, null);
2309 jsr166 1.47 }}
2310 dl 1.5
2311 jsr166 1.40 public void testAcceptEither_normalCompletion2() {
2312     for (ExecutionMode m : ExecutionMode.values())
2313     for (Integer v1 : new Integer[] { 1, null })
2314 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2315     {
2316 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2317     final CompletableFuture<Integer> g = new CompletableFuture<>();
2318     final IncAction r = new IncAction();
2319     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2320    
2321     g.complete(v2);
2322     checkCompletedNormally(h, null);
2323 jsr166 1.46 assertEquals(inc(v2), r.value);
2324 jsr166 1.40 f.complete(v1);
2325    
2326     checkCompletedNormally(f, v1);
2327     checkCompletedNormally(g, v2);
2328     checkCompletedNormally(h, null);
2329 jsr166 1.47 }}
2330    
2331 jsr166 1.40 public void testAcceptEither_normalCompletion3() {
2332     for (ExecutionMode m : ExecutionMode.values())
2333     for (Integer v1 : new Integer[] { 1, null })
2334 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2335     {
2336 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2337     final CompletableFuture<Integer> g = new CompletableFuture<>();
2338     final IncAction r = new IncAction();
2339    
2340     f.complete(v1);
2341     g.complete(v2);
2342     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2343    
2344     checkCompletedNormally(h, null);
2345     checkCompletedNormally(f, v1);
2346     checkCompletedNormally(g, v2);
2347    
2348     // unspecified behavior
2349     assertTrue(Objects.equals(r.value, inc(v1)) ||
2350     Objects.equals(r.value, inc(v2)));
2351 jsr166 1.47 }}
2352 dl 1.5
2353     /**
2354     * acceptEither result completes exceptionally after exceptional
2355     * completion of either source
2356     */
2357 jsr166 1.40 public void testAcceptEither_exceptionalCompletion1() {
2358     for (ExecutionMode m : ExecutionMode.values())
2359 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2360     {
2361 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2362     final CompletableFuture<Integer> g = new CompletableFuture<>();
2363     final IncAction r = new IncAction();
2364     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2365     final CFException ex = new CFException();
2366    
2367     f.completeExceptionally(ex);
2368     checkCompletedWithWrappedCFException(h, ex);
2369     g.complete(v1);
2370    
2371 jsr166 1.44 assertEquals(0, r.invocationCount);
2372 jsr166 1.40 checkCompletedNormally(g, v1);
2373     checkCompletedWithWrappedCFException(f, ex);
2374     checkCompletedWithWrappedCFException(h, ex);
2375 jsr166 1.47 }}
2376 jsr166 1.40
2377     public void testAcceptEither_exceptionalCompletion2() {
2378     for (ExecutionMode m : ExecutionMode.values())
2379 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2380     {
2381 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2382     final CompletableFuture<Integer> g = new CompletableFuture<>();
2383     final IncAction r = new IncAction();
2384     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2385     final CFException ex = new CFException();
2386    
2387     g.completeExceptionally(ex);
2388     checkCompletedWithWrappedCFException(h, ex);
2389     f.complete(v1);
2390    
2391 jsr166 1.44 assertEquals(0, r.invocationCount);
2392 jsr166 1.40 checkCompletedNormally(f, v1);
2393     checkCompletedWithWrappedCFException(g, ex);
2394     checkCompletedWithWrappedCFException(h, ex);
2395 jsr166 1.47 }}
2396 jsr166 1.40
2397     public void testAcceptEither_exceptionalCompletion3() {
2398     for (ExecutionMode m : ExecutionMode.values())
2399 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2400     {
2401 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2402     final CompletableFuture<Integer> g = new CompletableFuture<>();
2403     final IncAction r = new IncAction();
2404     final CFException ex = new CFException();
2405    
2406     g.completeExceptionally(ex);
2407     f.complete(v1);
2408     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2409    
2410     // unspecified behavior
2411     Integer v;
2412     try {
2413 jsr166 1.46 assertNull(h.join());
2414 jsr166 1.44 assertEquals(1, r.invocationCount);
2415 jsr166 1.40 assertEquals(inc(v1), r.value);
2416     } catch (CompletionException ok) {
2417     checkCompletedWithWrappedCFException(h, ex);
2418 jsr166 1.44 assertEquals(0, r.invocationCount);
2419 jsr166 1.40 }
2420    
2421     checkCompletedWithWrappedCFException(g, ex);
2422     checkCompletedNormally(f, v1);
2423 jsr166 1.47 }}
2424 jsr166 1.40
2425     public void testAcceptEither_exceptionalCompletion4() {
2426     for (ExecutionMode m : ExecutionMode.values())
2427 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2428     {
2429 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2430     final CompletableFuture<Integer> g = new CompletableFuture<>();
2431     final IncAction r = new IncAction();
2432     final CFException ex = new CFException();
2433    
2434     f.completeExceptionally(ex);
2435     g.complete(v1);
2436     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2437    
2438     // unspecified behavior
2439     Integer v;
2440     try {
2441 jsr166 1.46 assertNull(h.join());
2442 jsr166 1.44 assertEquals(1, r.invocationCount);
2443 jsr166 1.40 assertEquals(inc(v1), r.value);
2444     } catch (CompletionException ok) {
2445     checkCompletedWithWrappedCFException(h, ex);
2446 jsr166 1.44 assertEquals(0, r.invocationCount);
2447 jsr166 1.40 }
2448 dl 1.5
2449 jsr166 1.40 checkCompletedWithWrappedCFException(f, ex);
2450     checkCompletedNormally(g, v1);
2451 jsr166 1.47 }}
2452 dl 1.5
2453     /**
2454     * acceptEither result completes exceptionally if action does
2455     */
2456 jsr166 1.40 public void testAcceptEither_actionFailed1() {
2457     for (ExecutionMode m : ExecutionMode.values())
2458     for (Integer v1 : new Integer[] { 1, null })
2459 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2460     {
2461 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2462     final CompletableFuture<Integer> g = new CompletableFuture<>();
2463     final FailingConsumer r = new FailingConsumer();
2464     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2465    
2466     f.complete(v1);
2467     checkCompletedWithWrappedCFException(h);
2468     g.complete(v2);
2469     checkCompletedNormally(f, v1);
2470     checkCompletedNormally(g, v2);
2471 jsr166 1.47 }}
2472 jsr166 1.40
2473     public void testAcceptEither_actionFailed2() {
2474     for (ExecutionMode m : ExecutionMode.values())
2475     for (Integer v1 : new Integer[] { 1, null })
2476 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2477     {
2478 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2479     final CompletableFuture<Integer> g = new CompletableFuture<>();
2480     final FailingConsumer r = new FailingConsumer();
2481     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2482    
2483     g.complete(v2);
2484     checkCompletedWithWrappedCFException(h);
2485     f.complete(v1);
2486     checkCompletedNormally(f, v1);
2487     checkCompletedNormally(g, v2);
2488 jsr166 1.47 }}
2489 dl 1.5
2490     /**
2491     * acceptEither result completes exceptionally if either source cancelled
2492     */
2493 jsr166 1.40 public void testAcceptEither_sourceCancelled1() {
2494     for (ExecutionMode m : ExecutionMode.values())
2495     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2496 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2497     {
2498 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2499     final CompletableFuture<Integer> g = new CompletableFuture<>();
2500     final IncAction r = new IncAction();
2501     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2502    
2503     assertTrue(f.cancel(mayInterruptIfRunning));
2504     checkCompletedWithWrappedCancellationException(h);
2505     g.complete(v1);
2506    
2507     checkCancelled(f);
2508 jsr166 1.44 assertEquals(0, r.invocationCount);
2509 jsr166 1.40 checkCompletedNormally(g, v1);
2510     checkCompletedWithWrappedCancellationException(h);
2511 jsr166 1.47 }}
2512 jsr166 1.40
2513     public void testAcceptEither_sourceCancelled2() {
2514     for (ExecutionMode m : ExecutionMode.values())
2515     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2516 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2517     {
2518 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2519     final CompletableFuture<Integer> g = new CompletableFuture<>();
2520     final IncAction r = new IncAction();
2521     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2522    
2523     assertTrue(g.cancel(mayInterruptIfRunning));
2524     checkCompletedWithWrappedCancellationException(h);
2525     f.complete(v1);
2526    
2527     checkCancelled(g);
2528 jsr166 1.44 assertEquals(0, r.invocationCount);
2529 jsr166 1.40 checkCompletedNormally(f, v1);
2530     checkCompletedWithWrappedCancellationException(h);
2531 jsr166 1.47 }}
2532 jsr166 1.40
2533     public void testAcceptEither_sourceCancelled3() {
2534     for (ExecutionMode m : ExecutionMode.values())
2535     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2536 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2537     {
2538 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2539     final CompletableFuture<Integer> g = new CompletableFuture<>();
2540     final IncAction r = new IncAction();
2541    
2542     assertTrue(g.cancel(mayInterruptIfRunning));
2543     f.complete(v1);
2544     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2545    
2546     // unspecified behavior
2547     Integer v;
2548     try {
2549 jsr166 1.46 assertNull(h.join());
2550 jsr166 1.44 assertEquals(1, r.invocationCount);
2551 jsr166 1.40 assertEquals(inc(v1), r.value);
2552     } catch (CompletionException ok) {
2553     checkCompletedWithWrappedCancellationException(h);
2554 jsr166 1.44 assertEquals(0, r.invocationCount);
2555 jsr166 1.40 }
2556    
2557     checkCancelled(g);
2558     checkCompletedNormally(f, v1);
2559 jsr166 1.47 }}
2560 jsr166 1.40
2561     public void testAcceptEither_sourceCancelled4() {
2562     for (ExecutionMode m : ExecutionMode.values())
2563     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2564 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2565     {
2566 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2567     final CompletableFuture<Integer> g = new CompletableFuture<>();
2568     final IncAction r = new IncAction();
2569    
2570     assertTrue(f.cancel(mayInterruptIfRunning));
2571     g.complete(v1);
2572     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2573    
2574     // unspecified behavior
2575     Integer v;
2576     try {
2577 jsr166 1.46 assertNull(h.join());
2578 jsr166 1.44 assertEquals(1, r.invocationCount);
2579 jsr166 1.40 assertEquals(inc(v1), r.value);
2580     } catch (CompletionException ok) {
2581     checkCompletedWithWrappedCancellationException(h);
2582 jsr166 1.44 assertEquals(0, r.invocationCount);
2583 jsr166 1.40 }
2584    
2585     checkCancelled(f);
2586     checkCompletedNormally(g, v1);
2587 jsr166 1.47 }}
2588 dl 1.5
2589     /**
2590     * runAfterEither result completes normally after normal completion
2591     * of either source
2592     */
2593 jsr166 1.41 public void testRunAfterEither_normalCompletion1() {
2594     for (ExecutionMode m : ExecutionMode.values())
2595     for (Integer v1 : new Integer[] { 1, null })
2596 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2597     {
2598 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2599     final CompletableFuture<Integer> g = new CompletableFuture<>();
2600     final Noop r = new Noop();
2601     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2602    
2603     f.complete(v1);
2604     checkCompletedNormally(h, null);
2605 jsr166 1.44 assertEquals(1, r.invocationCount);
2606 jsr166 1.41 g.complete(v2);
2607    
2608     checkCompletedNormally(f, v1);
2609     checkCompletedNormally(g, v2);
2610     checkCompletedNormally(h, null);
2611 jsr166 1.44 assertEquals(1, r.invocationCount);
2612 jsr166 1.47 }}
2613 jsr166 1.41
2614     public void testRunAfterEither_normalCompletion2() {
2615     for (ExecutionMode m : ExecutionMode.values())
2616     for (Integer v1 : new Integer[] { 1, null })
2617 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2618     {
2619 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2620     final CompletableFuture<Integer> g = new CompletableFuture<>();
2621     final Noop r = new Noop();
2622     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2623    
2624     g.complete(v2);
2625     checkCompletedNormally(h, null);
2626 jsr166 1.44 assertEquals(1, r.invocationCount);
2627 jsr166 1.41 f.complete(v1);
2628    
2629     checkCompletedNormally(f, v1);
2630     checkCompletedNormally(g, v2);
2631     checkCompletedNormally(h, null);
2632 jsr166 1.44 assertEquals(1, r.invocationCount);
2633 jsr166 1.47 }}
2634    
2635 jsr166 1.41 public void testRunAfterEither_normalCompletion3() {
2636     for (ExecutionMode m : ExecutionMode.values())
2637     for (Integer v1 : new Integer[] { 1, null })
2638 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2639     {
2640 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2641     final CompletableFuture<Integer> g = new CompletableFuture<>();
2642     final Noop r = new Noop();
2643    
2644     f.complete(v1);
2645     g.complete(v2);
2646     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2647 dl 1.5
2648 jsr166 1.41 checkCompletedNormally(h, null);
2649     checkCompletedNormally(f, v1);
2650     checkCompletedNormally(g, v2);
2651 jsr166 1.44 assertEquals(1, r.invocationCount);
2652 jsr166 1.47 }}
2653 dl 1.5
2654     /**
2655     * runAfterEither result completes exceptionally after exceptional
2656     * completion of either source
2657     */
2658 jsr166 1.41 public void testRunAfterEither_exceptionalCompletion1() {
2659     for (ExecutionMode m : ExecutionMode.values())
2660 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2661     {
2662 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2663     final CompletableFuture<Integer> g = new CompletableFuture<>();
2664     final Noop r = new Noop();
2665     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2666     final CFException ex = new CFException();
2667    
2668     f.completeExceptionally(ex);
2669     checkCompletedWithWrappedCFException(h, ex);
2670     g.complete(v1);
2671    
2672 jsr166 1.44 assertEquals(0, r.invocationCount);
2673 jsr166 1.41 checkCompletedNormally(g, v1);
2674     checkCompletedWithWrappedCFException(f, ex);
2675     checkCompletedWithWrappedCFException(h, ex);
2676 jsr166 1.47 }}
2677 jsr166 1.41
2678     public void testRunAfterEither_exceptionalCompletion2() {
2679     for (ExecutionMode m : ExecutionMode.values())
2680 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2681     {
2682 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2683     final CompletableFuture<Integer> g = new CompletableFuture<>();
2684     final Noop r = new Noop();
2685     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2686     final CFException ex = new CFException();
2687    
2688     g.completeExceptionally(ex);
2689     checkCompletedWithWrappedCFException(h, ex);
2690     f.complete(v1);
2691    
2692 jsr166 1.44 assertEquals(0, r.invocationCount);
2693 jsr166 1.41 checkCompletedNormally(f, v1);
2694     checkCompletedWithWrappedCFException(g, ex);
2695     checkCompletedWithWrappedCFException(h, ex);
2696 jsr166 1.47 }}
2697 jsr166 1.41
2698     public void testRunAfterEither_exceptionalCompletion3() {
2699     for (ExecutionMode m : ExecutionMode.values())
2700 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2701     {
2702 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2703     final CompletableFuture<Integer> g = new CompletableFuture<>();
2704     final Noop r = new Noop();
2705     final CFException ex = new CFException();
2706    
2707     g.completeExceptionally(ex);
2708     f.complete(v1);
2709     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2710    
2711     // unspecified behavior
2712     Integer v;
2713     try {
2714 jsr166 1.46 assertNull(h.join());
2715 jsr166 1.44 assertEquals(1, r.invocationCount);
2716 jsr166 1.41 } catch (CompletionException ok) {
2717     checkCompletedWithWrappedCFException(h, ex);
2718 jsr166 1.44 assertEquals(0, r.invocationCount);
2719 jsr166 1.41 }
2720    
2721     checkCompletedWithWrappedCFException(g, ex);
2722     checkCompletedNormally(f, v1);
2723 jsr166 1.47 }}
2724 jsr166 1.41
2725     public void testRunAfterEither_exceptionalCompletion4() {
2726     for (ExecutionMode m : ExecutionMode.values())
2727 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2728     {
2729 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2730     final CompletableFuture<Integer> g = new CompletableFuture<>();
2731     final Noop r = new Noop();
2732     final CFException ex = new CFException();
2733    
2734     f.completeExceptionally(ex);
2735     g.complete(v1);
2736     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2737    
2738     // unspecified behavior
2739     Integer v;
2740     try {
2741 jsr166 1.46 assertNull(h.join());
2742 jsr166 1.44 assertEquals(1, r.invocationCount);
2743 jsr166 1.41 } catch (CompletionException ok) {
2744     checkCompletedWithWrappedCFException(h, ex);
2745 jsr166 1.44 assertEquals(0, r.invocationCount);
2746 jsr166 1.41 }
2747 dl 1.5
2748 jsr166 1.41 checkCompletedWithWrappedCFException(f, ex);
2749     checkCompletedNormally(g, v1);
2750 jsr166 1.47 }}
2751 dl 1.5
2752     /**
2753     * runAfterEither result completes exceptionally if action does
2754     */
2755 jsr166 1.41 public void testRunAfterEither_actionFailed1() {
2756     for (ExecutionMode m : ExecutionMode.values())
2757     for (Integer v1 : new Integer[] { 1, null })
2758 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2759     {
2760 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2761     final CompletableFuture<Integer> g = new CompletableFuture<>();
2762     final FailingNoop r = new FailingNoop();
2763     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2764    
2765     f.complete(v1);
2766     checkCompletedWithWrappedCFException(h);
2767     g.complete(v2);
2768     checkCompletedNormally(f, v1);
2769     checkCompletedNormally(g, v2);
2770 jsr166 1.47 }}
2771 jsr166 1.41
2772     public void testRunAfterEither_actionFailed2() {
2773     for (ExecutionMode m : ExecutionMode.values())
2774     for (Integer v1 : new Integer[] { 1, null })
2775 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2776     {
2777 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2778     final CompletableFuture<Integer> g = new CompletableFuture<>();
2779     final FailingNoop r = new FailingNoop();
2780     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2781    
2782     g.complete(v2);
2783     checkCompletedWithWrappedCFException(h);
2784     f.complete(v1);
2785     checkCompletedNormally(f, v1);
2786     checkCompletedNormally(g, v2);
2787 jsr166 1.47 }}
2788 dl 1.5
2789     /**
2790     * runAfterEither result completes exceptionally if either source cancelled
2791     */
2792 jsr166 1.41 public void testRunAfterEither_sourceCancelled1() {
2793     for (ExecutionMode m : ExecutionMode.values())
2794     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2795 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2796     {
2797 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2798     final CompletableFuture<Integer> g = new CompletableFuture<>();
2799     final Noop r = new Noop();
2800     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2801    
2802     assertTrue(f.cancel(mayInterruptIfRunning));
2803     checkCompletedWithWrappedCancellationException(h);
2804     g.complete(v1);
2805    
2806     checkCancelled(f);
2807 jsr166 1.44 assertEquals(0, r.invocationCount);
2808 jsr166 1.41 checkCompletedNormally(g, v1);
2809     checkCompletedWithWrappedCancellationException(h);
2810 jsr166 1.47 }}
2811 jsr166 1.41
2812     public void testRunAfterEither_sourceCancelled2() {
2813     for (ExecutionMode m : ExecutionMode.values())
2814     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2815 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2816     {
2817 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2818     final CompletableFuture<Integer> g = new CompletableFuture<>();
2819     final Noop r = new Noop();
2820     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2821    
2822     assertTrue(g.cancel(mayInterruptIfRunning));
2823     checkCompletedWithWrappedCancellationException(h);
2824     f.complete(v1);
2825    
2826     checkCancelled(g);
2827 jsr166 1.44 assertEquals(0, r.invocationCount);
2828 jsr166 1.41 checkCompletedNormally(f, v1);
2829     checkCompletedWithWrappedCancellationException(h);
2830 jsr166 1.47 }}
2831 jsr166 1.41
2832     public void testRunAfterEither_sourceCancelled3() {
2833     for (ExecutionMode m : ExecutionMode.values())
2834     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2835 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2836     {
2837 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2838     final CompletableFuture<Integer> g = new CompletableFuture<>();
2839     final Noop r = new Noop();
2840    
2841     assertTrue(g.cancel(mayInterruptIfRunning));
2842     f.complete(v1);
2843     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2844    
2845     // unspecified behavior
2846     Integer v;
2847     try {
2848 jsr166 1.46 assertNull(h.join());
2849 jsr166 1.44 assertEquals(1, r.invocationCount);
2850 jsr166 1.41 } catch (CompletionException ok) {
2851     checkCompletedWithWrappedCancellationException(h);
2852 jsr166 1.44 assertEquals(0, r.invocationCount);
2853 jsr166 1.41 }
2854    
2855     checkCancelled(g);
2856     checkCompletedNormally(f, v1);
2857 jsr166 1.47 }}
2858 jsr166 1.41
2859     public void testRunAfterEither_sourceCancelled4() {
2860     for (ExecutionMode m : ExecutionMode.values())
2861     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2862 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2863     {
2864 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2865     final CompletableFuture<Integer> g = new CompletableFuture<>();
2866     final Noop r = new Noop();
2867    
2868     assertTrue(f.cancel(mayInterruptIfRunning));
2869     g.complete(v1);
2870     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2871    
2872     // unspecified behavior
2873     Integer v;
2874     try {
2875 jsr166 1.46 assertNull(h.join());
2876 jsr166 1.44 assertEquals(1, r.invocationCount);
2877 jsr166 1.41 } catch (CompletionException ok) {
2878     checkCompletedWithWrappedCancellationException(h);
2879 jsr166 1.44 assertEquals(0, r.invocationCount);
2880 jsr166 1.41 }
2881    
2882     checkCancelled(f);
2883     checkCompletedNormally(g, v1);
2884 jsr166 1.47 }}
2885 dl 1.5
2886     /**
2887     * thenCompose result completes normally after normal completion of source
2888     */
2889 jsr166 1.48 public void testThenCompose_normalCompletion() {
2890 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2891 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2892 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2893     {
2894 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2895     final CompletableFutureInc r = new CompletableFutureInc();
2896 jsr166 1.48 if (!createIncomplete) f.complete(v1);
2897 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2898 jsr166 1.48 if (createIncomplete) f.complete(v1);
2899 jsr166 1.21
2900 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2901     checkCompletedNormally(f, v1);
2902     assertEquals(1, r.invocationCount);
2903 jsr166 1.47 }}
2904 dl 1.5
2905     /**
2906     * thenCompose result completes exceptionally after exceptional
2907     * completion of source
2908     */
2909 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2910 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2911 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2912 jsr166 1.47 {
2913 jsr166 1.44 final CFException ex = new CFException();
2914     final CompletableFutureInc r = new CompletableFutureInc();
2915     final CompletableFuture<Integer> f = new CompletableFuture<>();
2916 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2917 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2918 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2919 jsr166 1.21
2920 jsr166 1.44 checkCompletedWithWrappedCFException(g, ex);
2921     checkCompletedWithWrappedCFException(f, ex);
2922 jsr166 1.48 assertEquals(0, r.invocationCount);
2923 jsr166 1.47 }}
2924 dl 1.5
2925     /**
2926     * thenCompose result completes exceptionally if action does
2927     */
2928 jsr166 1.48 public void testThenCompose_actionFailed() {
2929 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2930 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2931 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2932     {
2933 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2934     final FailingCompletableFutureFunction r
2935     = new FailingCompletableFutureFunction();
2936 jsr166 1.48 if (!createIncomplete) f.complete(v1);
2937 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2938 jsr166 1.48 if (createIncomplete) f.complete(v1);
2939 jsr166 1.44
2940 dl 1.5 checkCompletedWithWrappedCFException(g);
2941 jsr166 1.44 checkCompletedNormally(f, v1);
2942 jsr166 1.47 }}
2943 dl 1.5
2944     /**
2945     * thenCompose result completes exceptionally if source cancelled
2946     */
2947 jsr166 1.48 public void testThenCompose_sourceCancelled() {
2948 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2949 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2950 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2951     {
2952 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2953     final CompletableFutureInc r = new CompletableFutureInc();
2954 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2955 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2956 jsr166 1.48 if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2957 jsr166 1.44
2958 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2959 jsr166 1.44 checkCancelled(f);
2960 jsr166 1.47 }}
2961 dl 1.5
2962     // asyncs
2963    
2964     /**
2965     * thenAcceptAsync result completes normally after normal
2966     * completion of source
2967     */
2968     public void testThenAcceptAsync() {
2969 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2970 dl 1.5 IncAction r = new IncAction();
2971     CompletableFuture<Void> g = f.thenAcceptAsync(r);
2972     f.complete(one);
2973     checkCompletedNormally(g, null);
2974 jsr166 1.38 assertEquals(r.value, (Integer) 2);
2975 dl 1.5 }
2976    
2977     /**
2978     * thenAcceptAsync result completes exceptionally after exceptional
2979     * completion of source
2980     */
2981     public void testThenAcceptAsync2() {
2982 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2983 dl 1.5 IncAction r = new IncAction();
2984     CompletableFuture<Void> g = f.thenAcceptAsync(r);
2985     f.completeExceptionally(new CFException());
2986     checkCompletedWithWrappedCFException(g);
2987     }
2988    
2989     /**
2990     * thenAcceptAsync result completes exceptionally if action does
2991     */
2992     public void testThenAcceptAsync3() {
2993 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2994 dl 1.5 FailingConsumer r = new FailingConsumer();
2995     CompletableFuture<Void> g = f.thenAcceptAsync(r);
2996     f.complete(null);
2997     checkCompletedWithWrappedCFException(g);
2998     }
2999 jsr166 1.6
3000 dl 1.5 /**
3001     * thenAcceptAsync result completes exceptionally if source cancelled
3002     */
3003     public void testThenAcceptAsync4() {
3004 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3005 dl 1.5 IncAction r = new IncAction();
3006     CompletableFuture<Void> g = f.thenAcceptAsync(r);
3007     assertTrue(f.cancel(true));
3008     checkCompletedWithWrappedCancellationException(g);
3009     }
3010 jsr166 1.19
3011 jsr166 1.7 // async with explicit executors
3012 dl 1.5
3013     /**
3014     * thenAcceptAsync result completes normally after normal
3015     * completion of source
3016     */
3017     public void testThenAcceptAsyncE() {
3018 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3019 dl 1.5 IncAction r = new IncAction();
3020     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
3021     f.complete(one);
3022     checkCompletedNormally(g, null);
3023 jsr166 1.38 assertEquals(r.value, (Integer) 2);
3024 dl 1.5 }
3025    
3026     /**
3027     * thenAcceptAsync result completes exceptionally after exceptional
3028     * completion of source
3029     */
3030     public void testThenAcceptAsync2E() {
3031 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3032 dl 1.5 IncAction r = new IncAction();
3033     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
3034     f.completeExceptionally(new CFException());
3035     checkCompletedWithWrappedCFException(g);
3036     }
3037    
3038     /**
3039     * thenAcceptAsync result completes exceptionally if action does
3040     */
3041     public void testThenAcceptAsync3E() {
3042 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3043 dl 1.5 FailingConsumer r = new FailingConsumer();
3044     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
3045     f.complete(null);
3046     checkCompletedWithWrappedCFException(g);
3047     }
3048 jsr166 1.6
3049 dl 1.5 /**
3050     * thenAcceptAsync result completes exceptionally if source cancelled
3051     */
3052     public void testThenAcceptAsync4E() {
3053 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3054 dl 1.5 IncAction r = new IncAction();
3055     CompletableFuture<Void> g = f.thenAcceptAsync(r, new ThreadExecutor());
3056     assertTrue(f.cancel(true));
3057     checkCompletedWithWrappedCancellationException(g);
3058     }
3059 jsr166 1.18
3060 jsr166 1.6 // other static methods
3061 dl 1.5
3062     /**
3063     * allOf(no component futures) returns a future completed normally
3064     * with the value null
3065     */
3066     public void testAllOf_empty() throws Exception {
3067 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
3068 dl 1.5 checkCompletedNormally(f, null);
3069     }
3070    
3071     /**
3072 jsr166 1.25 * allOf returns a future completed normally with the value null
3073     * when all components complete normally
3074 dl 1.5 */
3075 jsr166 1.25 public void testAllOf_normal() throws Exception {
3076 dl 1.5 for (int k = 1; k < 20; ++k) {
3077 jsr166 1.22 CompletableFuture<Integer>[] fs = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3078 jsr166 1.6 for (int i = 0; i < k; ++i)
3079 jsr166 1.22 fs[i] = new CompletableFuture<>();
3080 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3081 dl 1.5 for (int i = 0; i < k; ++i) {
3082     checkIncomplete(f);
3083 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
3084 dl 1.5 fs[i].complete(one);
3085     }
3086 dl 1.9 checkCompletedNormally(f, null);
3087 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3088 dl 1.5 }
3089     }
3090    
3091     /**
3092     * anyOf(no component futures) returns an incomplete future
3093     */
3094     public void testAnyOf_empty() throws Exception {
3095 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
3096 dl 1.5 checkIncomplete(f);
3097     }
3098    
3099     /**
3100 jsr166 1.25 * anyOf returns a future completed normally with a value when
3101     * a component future does
3102 dl 1.5 */
3103 jsr166 1.24 public void testAnyOf_normal() throws Exception {
3104     for (int k = 0; k < 10; ++k) {
3105 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
3106 jsr166 1.6 for (int i = 0; i < k; ++i)
3107 jsr166 1.22 fs[i] = new CompletableFuture<>();
3108 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3109 dl 1.5 checkIncomplete(f);
3110     for (int i = 0; i < k; ++i) {
3111     fs[i].complete(one);
3112 dl 1.9 checkCompletedNormally(f, one);
3113 jsr166 1.24 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
3114     }
3115     }
3116     }
3117    
3118     /**
3119     * anyOf result completes exceptionally when any component does.
3120     */
3121     public void testAnyOf_exceptional() throws Exception {
3122     for (int k = 0; k < 10; ++k) {
3123     CompletableFuture[] fs = new CompletableFuture[k];
3124     for (int i = 0; i < k; ++i)
3125     fs[i] = new CompletableFuture<>();
3126     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3127     checkIncomplete(f);
3128     for (int i = 0; i < k; ++i) {
3129     fs[i].completeExceptionally(new CFException());
3130     checkCompletedWithWrappedCFException(f);
3131     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3132 dl 1.5 }
3133     }
3134     }
3135    
3136     /**
3137     * Completion methods throw NullPointerException with null arguments
3138     */
3139     public void testNPE() {
3140 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3141     CompletableFuture<Integer> g = new CompletableFuture<>();
3142 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3143     CompletableFuture<?> h;
3144 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
3145 jsr166 1.14
3146     Runnable[] throwingActions = {
3147 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
3148     () -> CompletableFuture.supplyAsync(null, exec),
3149     () -> CompletableFuture.supplyAsync(supplyOne, null),
3150    
3151     () -> CompletableFuture.runAsync(null),
3152     () -> CompletableFuture.runAsync(null, exec),
3153     () -> CompletableFuture.runAsync(() -> {}, null),
3154    
3155     () -> f.completeExceptionally(null),
3156    
3157     () -> f.thenApply(null),
3158     () -> f.thenApplyAsync(null),
3159     () -> f.thenApplyAsync((x) -> x, null),
3160     () -> f.thenApplyAsync(null, exec),
3161    
3162     () -> f.thenAccept(null),
3163     () -> f.thenAcceptAsync(null),
3164     () -> f.thenAcceptAsync((x) -> {} , null),
3165     () -> f.thenAcceptAsync(null, exec),
3166    
3167     () -> f.thenRun(null),
3168     () -> f.thenRunAsync(null),
3169     () -> f.thenRunAsync(() -> {} , null),
3170     () -> f.thenRunAsync(null, exec),
3171    
3172     () -> f.thenCombine(g, null),
3173     () -> f.thenCombineAsync(g, null),
3174     () -> f.thenCombineAsync(g, null, exec),
3175     () -> f.thenCombine(nullFuture, (x, y) -> x),
3176     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3177     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3178     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3179    
3180     () -> f.thenAcceptBoth(g, null),
3181     () -> f.thenAcceptBothAsync(g, null),
3182     () -> f.thenAcceptBothAsync(g, null, exec),
3183     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3184     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3185     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3186     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3187    
3188     () -> f.runAfterBoth(g, null),
3189     () -> f.runAfterBothAsync(g, null),
3190     () -> f.runAfterBothAsync(g, null, exec),
3191     () -> f.runAfterBoth(nullFuture, () -> {}),
3192     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3193     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3194     () -> f.runAfterBothAsync(g, () -> {}, null),
3195    
3196     () -> f.applyToEither(g, null),
3197     () -> f.applyToEitherAsync(g, null),
3198     () -> f.applyToEitherAsync(g, null, exec),
3199     () -> f.applyToEither(nullFuture, (x) -> x),
3200     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3201     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3202     () -> f.applyToEitherAsync(g, (x) -> x, null),
3203    
3204     () -> f.acceptEither(g, null),
3205     () -> f.acceptEitherAsync(g, null),
3206     () -> f.acceptEitherAsync(g, null, exec),
3207     () -> f.acceptEither(nullFuture, (x) -> {}),
3208     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3209     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3210     () -> f.acceptEitherAsync(g, (x) -> {}, null),
3211    
3212     () -> f.runAfterEither(g, null),
3213     () -> f.runAfterEitherAsync(g, null),
3214     () -> f.runAfterEitherAsync(g, null, exec),
3215     () -> f.runAfterEither(nullFuture, () -> {}),
3216     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3217     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3218     () -> f.runAfterEitherAsync(g, () -> {}, null),
3219    
3220     () -> f.thenCompose(null),
3221     () -> f.thenComposeAsync(null),
3222     () -> f.thenComposeAsync(new CompletableFutureInc(), null),
3223     () -> f.thenComposeAsync(null, exec),
3224    
3225     () -> f.exceptionally(null),
3226    
3227     () -> f.handle(null),
3228    
3229     () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3230     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3231     () -> CompletableFuture.allOf(f, null),
3232     () -> CompletableFuture.allOf(null, f),
3233    
3234     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3235     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3236     () -> CompletableFuture.anyOf(f, null),
3237     () -> CompletableFuture.anyOf(null, f),
3238 jsr166 1.32
3239     () -> f.obtrudeException(null),
3240 jsr166 1.14 };
3241 dl 1.5
3242 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3243 jsr166 1.17 assertEquals(0, exec.count.get());
3244 dl 1.5 }
3245    
3246 dl 1.26 /**
3247     * toCompletableFuture returns this CompletableFuture.
3248     */
3249     public void testToCompletableFuture() {
3250     CompletableFuture<Integer> f = new CompletableFuture<>();
3251     assertSame(f, f.toCompletableFuture());
3252     }
3253    
3254     /**
3255     * whenComplete action executes on normal completion, propagating
3256     * source result.
3257     */
3258 jsr166 1.42 public void testWhenComplete_normalCompletion1() {
3259 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
3260 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3261 jsr166 1.46 for (Integer v1 : new Integer[] { 1, null })
3262     {
3263     final AtomicInteger a = new AtomicInteger(0);
3264 jsr166 1.42 final CompletableFuture<Integer> f = new CompletableFuture<>();
3265 jsr166 1.44 if (!createIncomplete) f.complete(v1);
3266 jsr166 1.46 final CompletableFuture<Integer> g = m.whenComplete
3267     (f,
3268     (Integer x, Throwable t) -> {
3269     threadAssertSame(x, v1);
3270     threadAssertNull(t);
3271     a.getAndIncrement();
3272     });
3273 jsr166 1.44 if (createIncomplete) f.complete(v1);
3274 jsr166 1.46
3275     checkCompletedNormally(g, v1);
3276 jsr166 1.42 checkCompletedNormally(f, v1);
3277 jsr166 1.46 assertEquals(1, a.get());
3278     }}
3279 dl 1.26
3280     /**
3281     * whenComplete action executes on exceptional completion, propagating
3282     * source result.
3283     */
3284 jsr166 1.42 public void testWhenComplete_exceptionalCompletion() {
3285 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
3286 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3287 jsr166 1.46 for (Integer v1 : new Integer[] { 1, null })
3288     {
3289     final AtomicInteger a = new AtomicInteger(0);
3290 jsr166 1.42 final CFException ex = new CFException();
3291     final CompletableFuture<Integer> f = new CompletableFuture<>();
3292 jsr166 1.44 if (!createIncomplete) f.completeExceptionally(ex);
3293 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3294     (f,
3295     (Integer x, Throwable t) -> {
3296     threadAssertNull(x);
3297     threadAssertSame(t, ex);
3298     a.getAndIncrement();
3299     });
3300 jsr166 1.44 if (createIncomplete) f.completeExceptionally(ex);
3301 jsr166 1.42 checkCompletedWithWrappedCFException(f, ex);
3302     checkCompletedWithWrappedCFException(g, ex);
3303 jsr166 1.46 assertEquals(1, a.get());
3304     }}
3305    
3306     /**
3307     * whenComplete action executes on cancelled source, propagating
3308     * CancellationException.
3309     */
3310     public void testWhenComplete_sourceCancelled() {
3311     for (ExecutionMode m : ExecutionMode.values())
3312     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3313     for (boolean createIncomplete : new boolean[] { true, false })
3314     {
3315     final AtomicInteger a = new AtomicInteger(0);
3316     final CompletableFuture<Integer> f = new CompletableFuture<>();
3317     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3318     final CompletableFuture<Integer> g = m.whenComplete
3319     (f,
3320     (Integer x, Throwable t) -> {
3321     threadAssertNull(x);
3322     threadAssertTrue(t instanceof CancellationException);
3323     a.getAndIncrement();
3324     });
3325     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3326    
3327     //try { g.join(); } catch (Throwable t) { throw new Error(t); }
3328     checkCompletedWithWrappedCancellationException(g);
3329     checkCancelled(f);
3330     assertEquals(1, a.get());
3331     }}
3332 dl 1.26
3333     /**
3334     * If a whenComplete action throws an exception when triggered by
3335     * a normal completion, it completes exceptionally
3336     */
3337 jsr166 1.42 public void testWhenComplete_actionFailed() {
3338 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3339 jsr166 1.42 for (ExecutionMode m : ExecutionMode.values())
3340 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3341     {
3342 jsr166 1.46 final AtomicInteger a = new AtomicInteger(0);
3343 jsr166 1.42 final CFException ex = new CFException();
3344     final CompletableFuture<Integer> f = new CompletableFuture<>();
3345 jsr166 1.44 if (!createIncomplete) f.complete(v1);
3346 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3347     (f,
3348     (Integer x, Throwable t) -> {
3349     threadAssertSame(x, v1);
3350     threadAssertNull(t);
3351 jsr166 1.46 a.getAndIncrement();
3352 jsr166 1.42 throw ex;
3353     });
3354 jsr166 1.44 if (createIncomplete) f.complete(v1);
3355 jsr166 1.42 checkCompletedNormally(f, v1);
3356     checkCompletedWithWrappedCFException(g, ex);
3357 jsr166 1.46 assertEquals(1, a.get());
3358 jsr166 1.47 }}
3359 dl 1.26
3360     /**
3361 jsr166 1.42 * If a whenComplete action throws an exception when triggered by
3362     * a source completion that also throws an exception, the source
3363     * exception takes precedence.
3364 dl 1.26 */
3365 jsr166 1.42 public void testWhenComplete_actionFailedSourceFailed() {
3366 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3367 jsr166 1.42 for (ExecutionMode m : ExecutionMode.values())
3368 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3369     {
3370 jsr166 1.46 final AtomicInteger a = new AtomicInteger(0);
3371 jsr166 1.42 final CFException ex1 = new CFException();
3372     final CFException ex2 = new CFException();
3373     final CompletableFuture<Integer> f = new CompletableFuture<>();
3374 jsr166 1.44
3375     if (!createIncomplete) f.completeExceptionally(ex1);
3376 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3377     (f,
3378     (Integer x, Throwable t) -> {
3379     threadAssertSame(t, ex1);
3380     threadAssertNull(x);
3381 jsr166 1.46 a.getAndIncrement();
3382 jsr166 1.42 throw ex2;
3383     });
3384 jsr166 1.44 if (createIncomplete) f.completeExceptionally(ex1);
3385    
3386 jsr166 1.42 checkCompletedWithWrappedCFException(f, ex1);
3387     checkCompletedWithWrappedCFException(g, ex1);
3388 jsr166 1.46 assertEquals(1, a.get());
3389 jsr166 1.47 }}
3390 dl 1.26
3391 jsr166 1.1 }