ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.134
Committed: Sun Nov 15 19:55:38 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.133: +29 -26 lines
Log Message:
cosmetic improvements to handle and whenComplete tests

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