ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.99
Committed: Wed Jan 7 07:59:20 2015 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.98: +52 -0 lines
Log Message:
add testThenCompose_actionReturnsFailingFuture

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