ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.138
Committed: Sun Nov 15 23:31:51 2015 UTC (8 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.137: +2 -0 lines
Log Message:
use suppressed exception facility with whenComplete

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 jsr166 1.136 /**
880     * If an "exceptionally action" throws an exception, it completes
881     * exceptionally with that exception
882     */
883 jsr166 1.46 public void testExceptionally_exceptionalCompletionActionFailed() {
884     for (boolean createIncomplete : new boolean[] { true, false })
885     {
886     final AtomicInteger a = new AtomicInteger(0);
887     final CFException ex1 = new CFException();
888     final CFException ex2 = new CFException();
889     final CompletableFuture<Integer> f = new CompletableFuture<>();
890     if (!createIncomplete) f.completeExceptionally(ex1);
891     final CompletableFuture<Integer> g = f.exceptionally
892     ((Throwable t) -> {
893 jsr166 1.95 ExecutionMode.SYNC.checkExecutionMode();
894 jsr166 1.46 threadAssertSame(t, ex1);
895     a.getAndIncrement();
896     throw ex2;
897     });
898     if (createIncomplete) f.completeExceptionally(ex1);
899    
900 jsr166 1.72 checkCompletedWithWrappedException(g, ex2);
901 jsr166 1.136 checkCompletedExceptionally(f, ex1);
902 jsr166 1.46 assertEquals(1, a.get());
903     }}
904    
905     /**
906 jsr166 1.75 * whenComplete action executes on normal completion, propagating
907     * source result.
908     */
909 jsr166 1.126 public void testWhenComplete_normalCompletion() {
910 jsr166 1.75 for (ExecutionMode m : ExecutionMode.values())
911     for (boolean createIncomplete : new boolean[] { true, false })
912     for (Integer v1 : new Integer[] { 1, null })
913     {
914     final AtomicInteger a = new AtomicInteger(0);
915     final CompletableFuture<Integer> f = new CompletableFuture<>();
916 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
917 jsr166 1.75 final CompletableFuture<Integer> g = m.whenComplete
918     (f,
919 jsr166 1.135 (Integer result, Throwable t) -> {
920 jsr166 1.75 m.checkExecutionMode();
921 jsr166 1.135 threadAssertSame(result, v1);
922 jsr166 1.75 threadAssertNull(t);
923     a.getAndIncrement();
924     });
925 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
926 jsr166 1.75
927     checkCompletedNormally(g, v1);
928     checkCompletedNormally(f, v1);
929     assertEquals(1, a.get());
930     }}
931    
932     /**
933     * whenComplete action executes on exceptional completion, propagating
934     * source result.
935     */
936     public void testWhenComplete_exceptionalCompletion() {
937     for (ExecutionMode m : ExecutionMode.values())
938     for (boolean createIncomplete : new boolean[] { true, false })
939     {
940     final AtomicInteger a = new AtomicInteger(0);
941     final CFException ex = new CFException();
942     final CompletableFuture<Integer> f = new CompletableFuture<>();
943     if (!createIncomplete) f.completeExceptionally(ex);
944     final CompletableFuture<Integer> g = m.whenComplete
945     (f,
946 jsr166 1.135 (Integer result, Throwable t) -> {
947 jsr166 1.75 m.checkExecutionMode();
948 jsr166 1.135 threadAssertNull(result);
949 jsr166 1.75 threadAssertSame(t, ex);
950     a.getAndIncrement();
951     });
952     if (createIncomplete) f.completeExceptionally(ex);
953    
954     checkCompletedWithWrappedException(g, ex);
955     checkCompletedExceptionally(f, ex);
956     assertEquals(1, a.get());
957     }}
958    
959     /**
960     * whenComplete action executes on cancelled source, propagating
961     * CancellationException.
962     */
963     public void testWhenComplete_sourceCancelled() {
964     for (ExecutionMode m : ExecutionMode.values())
965     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
966     for (boolean createIncomplete : new boolean[] { true, false })
967     {
968     final AtomicInteger a = new AtomicInteger(0);
969     final CompletableFuture<Integer> f = new CompletableFuture<>();
970     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
971     final CompletableFuture<Integer> g = m.whenComplete
972     (f,
973 jsr166 1.135 (Integer result, Throwable t) -> {
974 jsr166 1.75 m.checkExecutionMode();
975 jsr166 1.135 threadAssertNull(result);
976 jsr166 1.75 threadAssertTrue(t instanceof CancellationException);
977     a.getAndIncrement();
978     });
979     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
980    
981     checkCompletedWithWrappedCancellationException(g);
982     checkCancelled(f);
983     assertEquals(1, a.get());
984     }}
985    
986     /**
987     * If a whenComplete action throws an exception when triggered by
988     * a normal completion, it completes exceptionally
989     */
990 jsr166 1.132 public void testWhenComplete_sourceCompletedNormallyActionFailed() {
991 jsr166 1.75 for (boolean createIncomplete : new boolean[] { true, false })
992     for (ExecutionMode m : ExecutionMode.values())
993     for (Integer v1 : new Integer[] { 1, null })
994     {
995     final AtomicInteger a = new AtomicInteger(0);
996     final CFException ex = new CFException();
997     final CompletableFuture<Integer> f = new CompletableFuture<>();
998 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
999 jsr166 1.75 final CompletableFuture<Integer> g = m.whenComplete
1000     (f,
1001 jsr166 1.135 (Integer result, Throwable t) -> {
1002 jsr166 1.75 m.checkExecutionMode();
1003 jsr166 1.135 threadAssertSame(result, v1);
1004 jsr166 1.75 threadAssertNull(t);
1005     a.getAndIncrement();
1006     throw ex;
1007     });
1008 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1009 jsr166 1.75
1010     checkCompletedWithWrappedException(g, ex);
1011     checkCompletedNormally(f, v1);
1012     assertEquals(1, a.get());
1013     }}
1014    
1015     /**
1016     * If a whenComplete action throws an exception when triggered by
1017     * a source completion that also throws an exception, the source
1018 jsr166 1.134 * exception takes precedence (unlike handle)
1019 jsr166 1.75 */
1020 jsr166 1.134 public void testWhenComplete_sourceFailedActionFailed() {
1021 jsr166 1.75 for (boolean createIncomplete : new boolean[] { true, false })
1022     for (ExecutionMode m : ExecutionMode.values())
1023     {
1024     final AtomicInteger a = new AtomicInteger(0);
1025     final CFException ex1 = new CFException();
1026     final CFException ex2 = new CFException();
1027     final CompletableFuture<Integer> f = new CompletableFuture<>();
1028    
1029     if (!createIncomplete) f.completeExceptionally(ex1);
1030     final CompletableFuture<Integer> g = m.whenComplete
1031     (f,
1032 jsr166 1.135 (Integer result, Throwable t) -> {
1033 jsr166 1.75 m.checkExecutionMode();
1034     threadAssertSame(t, ex1);
1035 jsr166 1.135 threadAssertNull(result);
1036 jsr166 1.75 a.getAndIncrement();
1037     throw ex2;
1038     });
1039     if (createIncomplete) f.completeExceptionally(ex1);
1040    
1041     checkCompletedWithWrappedException(g, ex1);
1042     checkCompletedExceptionally(f, ex1);
1043 jsr166 1.138 assertEquals(1, ex1.getSuppressed().length);
1044     assertSame(ex2, ex1.getSuppressed()[0]);
1045 jsr166 1.75 assertEquals(1, a.get());
1046     }}
1047    
1048     /**
1049 jsr166 1.46 * handle action completes normally with function value on normal
1050     * completion of source
1051     */
1052     public void testHandle_normalCompletion() {
1053     for (ExecutionMode m : ExecutionMode.values())
1054     for (boolean createIncomplete : new boolean[] { true, false })
1055     for (Integer v1 : new Integer[] { 1, null })
1056     {
1057     final CompletableFuture<Integer> f = new CompletableFuture<>();
1058     final AtomicInteger a = new AtomicInteger(0);
1059 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1060 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1061     (f,
1062 jsr166 1.135 (Integer result, Throwable t) -> {
1063 jsr166 1.57 m.checkExecutionMode();
1064 jsr166 1.135 threadAssertSame(result, v1);
1065 jsr166 1.46 threadAssertNull(t);
1066     a.getAndIncrement();
1067     return inc(v1);
1068     });
1069 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
1070 jsr166 1.46
1071     checkCompletedNormally(g, inc(v1));
1072     checkCompletedNormally(f, v1);
1073     assertEquals(1, a.get());
1074     }}
1075    
1076     /**
1077     * handle action completes normally with function value on
1078     * exceptional completion of source
1079 dl 1.5 */
1080 jsr166 1.46 public void testHandle_exceptionalCompletion() {
1081     for (ExecutionMode m : ExecutionMode.values())
1082     for (boolean createIncomplete : new boolean[] { true, false })
1083     for (Integer v1 : new Integer[] { 1, null })
1084     {
1085     final CompletableFuture<Integer> f = new CompletableFuture<>();
1086     final AtomicInteger a = new AtomicInteger(0);
1087     final CFException ex = new CFException();
1088     if (!createIncomplete) f.completeExceptionally(ex);
1089     final CompletableFuture<Integer> g = m.handle
1090     (f,
1091 jsr166 1.135 (Integer result, Throwable t) -> {
1092 jsr166 1.57 m.checkExecutionMode();
1093 jsr166 1.135 threadAssertNull(result);
1094 jsr166 1.46 threadAssertSame(t, ex);
1095     a.getAndIncrement();
1096     return v1;
1097     });
1098     if (createIncomplete) f.completeExceptionally(ex);
1099 dl 1.5
1100 jsr166 1.46 checkCompletedNormally(g, v1);
1101 jsr166 1.72 checkCompletedExceptionally(f, ex);
1102 jsr166 1.46 assertEquals(1, a.get());
1103     }}
1104 dl 1.5
1105     /**
1106 jsr166 1.46 * handle action completes normally with function value on
1107     * cancelled source
1108 dl 1.5 */
1109 jsr166 1.46 public void testHandle_sourceCancelled() {
1110     for (ExecutionMode m : ExecutionMode.values())
1111     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1112     for (boolean createIncomplete : new boolean[] { true, false })
1113     for (Integer v1 : new Integer[] { 1, null })
1114     {
1115     final CompletableFuture<Integer> f = new CompletableFuture<>();
1116     final AtomicInteger a = new AtomicInteger(0);
1117     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1118     final CompletableFuture<Integer> g = m.handle
1119     (f,
1120 jsr166 1.135 (Integer result, Throwable t) -> {
1121 jsr166 1.57 m.checkExecutionMode();
1122 jsr166 1.135 threadAssertNull(result);
1123 jsr166 1.46 threadAssertTrue(t instanceof CancellationException);
1124     a.getAndIncrement();
1125     return v1;
1126     });
1127     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1128    
1129     checkCompletedNormally(g, v1);
1130     checkCancelled(f);
1131     assertEquals(1, a.get());
1132     }}
1133 jsr166 1.15
1134 jsr166 1.46 /**
1135 jsr166 1.134 * If a "handle action" throws an exception when triggered by
1136     * a normal completion, it completes exceptionally
1137 jsr166 1.46 */
1138 jsr166 1.134 public void testHandle_sourceCompletedNormallyActionFailed() {
1139 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
1140     for (boolean createIncomplete : new boolean[] { true, false })
1141 jsr166 1.134 for (Integer v1 : new Integer[] { 1, null })
1142 jsr166 1.46 {
1143     final CompletableFuture<Integer> f = new CompletableFuture<>();
1144     final AtomicInteger a = new AtomicInteger(0);
1145 jsr166 1.134 final CFException ex = new CFException();
1146     if (!createIncomplete) assertTrue(f.complete(v1));
1147 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1148     (f,
1149 jsr166 1.135 (Integer result, Throwable t) -> {
1150 jsr166 1.57 m.checkExecutionMode();
1151 jsr166 1.135 threadAssertSame(result, v1);
1152 jsr166 1.134 threadAssertNull(t);
1153 jsr166 1.46 a.getAndIncrement();
1154 jsr166 1.134 throw ex;
1155 jsr166 1.46 });
1156 jsr166 1.134 if (createIncomplete) assertTrue(f.complete(v1));
1157 dl 1.5
1158 jsr166 1.134 checkCompletedWithWrappedException(g, ex);
1159     checkCompletedNormally(f, v1);
1160 jsr166 1.46 assertEquals(1, a.get());
1161     }}
1162 jsr166 1.15
1163 jsr166 1.133 /**
1164     * If a "handle action" throws an exception when triggered by
1165 jsr166 1.134 * a source completion that also throws an exception, the action
1166     * exception takes precedence (unlike whenComplete)
1167 jsr166 1.133 */
1168 jsr166 1.134 public void testHandle_sourceFailedActionFailed() {
1169     for (boolean createIncomplete : new boolean[] { true, false })
1170 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
1171     {
1172 jsr166 1.134 final AtomicInteger a = new AtomicInteger(0);
1173     final CFException ex1 = new CFException();
1174     final CFException ex2 = new CFException();
1175 jsr166 1.46 final CompletableFuture<Integer> f = new CompletableFuture<>();
1176 jsr166 1.134
1177     if (!createIncomplete) f.completeExceptionally(ex1);
1178 jsr166 1.46 final CompletableFuture<Integer> g = m.handle
1179     (f,
1180 jsr166 1.135 (Integer result, Throwable t) -> {
1181 jsr166 1.57 m.checkExecutionMode();
1182 jsr166 1.135 threadAssertNull(result);
1183 jsr166 1.134 threadAssertSame(ex1, t);
1184 jsr166 1.46 a.getAndIncrement();
1185 jsr166 1.134 throw ex2;
1186 jsr166 1.46 });
1187 jsr166 1.134 if (createIncomplete) f.completeExceptionally(ex1);
1188 jsr166 1.15
1189 jsr166 1.134 checkCompletedWithWrappedException(g, ex2);
1190     checkCompletedExceptionally(f, ex1);
1191 jsr166 1.46 assertEquals(1, a.get());
1192     }}
1193 dl 1.5
1194     /**
1195     * runAsync completes after running Runnable
1196     */
1197 jsr166 1.57 public void testRunAsync_normalCompletion() {
1198     ExecutionMode[] executionModes = {
1199     ExecutionMode.ASYNC,
1200     ExecutionMode.EXECUTOR,
1201     };
1202     for (ExecutionMode m : executionModes)
1203     {
1204     final Noop r = new Noop(m);
1205     final CompletableFuture<Void> f = m.runAsync(r);
1206 dl 1.5 assertNull(f.join());
1207 jsr166 1.14 checkCompletedNormally(f, null);
1208 jsr166 1.62 r.assertInvoked();
1209 jsr166 1.57 }}
1210 dl 1.5
1211     /**
1212     * failing runAsync completes exceptionally after running Runnable
1213     */
1214 jsr166 1.57 public void testRunAsync_exceptionalCompletion() {
1215     ExecutionMode[] executionModes = {
1216     ExecutionMode.ASYNC,
1217     ExecutionMode.EXECUTOR,
1218     };
1219     for (ExecutionMode m : executionModes)
1220     {
1221     final FailingRunnable r = new FailingRunnable(m);
1222     final CompletableFuture<Void> f = m.runAsync(r);
1223 dl 1.5 checkCompletedWithWrappedCFException(f);
1224 jsr166 1.62 r.assertInvoked();
1225 jsr166 1.57 }}
1226 dl 1.5
1227     /**
1228     * supplyAsync completes with result of supplier
1229     */
1230 jsr166 1.58 public void testSupplyAsync_normalCompletion() {
1231     ExecutionMode[] executionModes = {
1232     ExecutionMode.ASYNC,
1233     ExecutionMode.EXECUTOR,
1234     };
1235     for (ExecutionMode m : executionModes)
1236     for (Integer v1 : new Integer[] { 1, null })
1237     {
1238     final IntegerSupplier r = new IntegerSupplier(m, v1);
1239     final CompletableFuture<Integer> f = m.supplyAsync(r);
1240     assertSame(v1, f.join());
1241     checkCompletedNormally(f, v1);
1242 jsr166 1.62 r.assertInvoked();
1243 jsr166 1.58 }}
1244 dl 1.5
1245     /**
1246     * Failing supplyAsync completes exceptionally
1247     */
1248 jsr166 1.58 public void testSupplyAsync_exceptionalCompletion() {
1249     ExecutionMode[] executionModes = {
1250     ExecutionMode.ASYNC,
1251     ExecutionMode.EXECUTOR,
1252     };
1253     for (ExecutionMode m : executionModes)
1254     {
1255     FailingSupplier r = new FailingSupplier(m);
1256     CompletableFuture<Integer> f = m.supplyAsync(r);
1257 dl 1.5 checkCompletedWithWrappedCFException(f);
1258 jsr166 1.62 r.assertInvoked();
1259 jsr166 1.58 }}
1260 dl 1.5
1261 jsr166 1.7 // seq completion methods
1262 jsr166 1.6
1263 dl 1.5 /**
1264     * thenRun result completes normally after normal completion of source
1265     */
1266 jsr166 1.48 public void testThenRun_normalCompletion() {
1267     for (ExecutionMode m : ExecutionMode.values())
1268     for (Integer v1 : new Integer[] { 1, null })
1269     {
1270     final CompletableFuture<Integer> f = new CompletableFuture<>();
1271 jsr166 1.90 final Noop[] rs = new Noop[6];
1272     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1273    
1274     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1275     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1276     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1277     checkIncomplete(h0);
1278     checkIncomplete(h1);
1279     checkIncomplete(h2);
1280     assertTrue(f.complete(v1));
1281     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1282     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1283     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1284 jsr166 1.23
1285 jsr166 1.90 checkCompletedNormally(h0, null);
1286     checkCompletedNormally(h1, null);
1287     checkCompletedNormally(h2, null);
1288     checkCompletedNormally(h3, null);
1289     checkCompletedNormally(h4, null);
1290     checkCompletedNormally(h5, null);
1291 jsr166 1.48 checkCompletedNormally(f, v1);
1292 jsr166 1.90 for (Noop r : rs) r.assertInvoked();
1293 jsr166 1.48 }}
1294 dl 1.5
1295     /**
1296     * thenRun result completes exceptionally after exceptional
1297     * completion of source
1298     */
1299 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
1300     for (ExecutionMode m : ExecutionMode.values())
1301     {
1302     final CFException ex = new CFException();
1303     final CompletableFuture<Integer> f = new CompletableFuture<>();
1304 jsr166 1.90 final Noop[] rs = new Noop[6];
1305     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1306    
1307     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1308     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1309     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1310     checkIncomplete(h0);
1311     checkIncomplete(h1);
1312     checkIncomplete(h2);
1313     assertTrue(f.completeExceptionally(ex));
1314     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1315     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1316     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1317 jsr166 1.23
1318 jsr166 1.90 checkCompletedWithWrappedException(h0, ex);
1319     checkCompletedWithWrappedException(h1, ex);
1320     checkCompletedWithWrappedException(h2, ex);
1321     checkCompletedWithWrappedException(h3, ex);
1322     checkCompletedWithWrappedException(h4, ex);
1323     checkCompletedWithWrappedException(h5, ex);
1324 jsr166 1.72 checkCompletedExceptionally(f, ex);
1325 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1326 jsr166 1.48 }}
1327    
1328     /**
1329     * thenRun result completes exceptionally if source cancelled
1330     */
1331     public void testThenRun_sourceCancelled() {
1332     for (ExecutionMode m : ExecutionMode.values())
1333     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1334     {
1335     final CompletableFuture<Integer> f = new CompletableFuture<>();
1336 jsr166 1.90 final Noop[] rs = new Noop[6];
1337     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
1338    
1339     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1340     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1341     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1342     checkIncomplete(h0);
1343     checkIncomplete(h1);
1344     checkIncomplete(h2);
1345     assertTrue(f.cancel(mayInterruptIfRunning));
1346     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1347     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1348     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1349 jsr166 1.23
1350 jsr166 1.90 checkCompletedWithWrappedCancellationException(h0);
1351     checkCompletedWithWrappedCancellationException(h1);
1352     checkCompletedWithWrappedCancellationException(h2);
1353     checkCompletedWithWrappedCancellationException(h3);
1354     checkCompletedWithWrappedCancellationException(h4);
1355     checkCompletedWithWrappedCancellationException(h5);
1356 jsr166 1.48 checkCancelled(f);
1357 jsr166 1.90 for (Noop r : rs) r.assertNotInvoked();
1358 jsr166 1.48 }}
1359 dl 1.5
1360     /**
1361     * thenRun result completes exceptionally if action does
1362     */
1363 jsr166 1.48 public void testThenRun_actionFailed() {
1364     for (ExecutionMode m : ExecutionMode.values())
1365     for (Integer v1 : new Integer[] { 1, null })
1366     {
1367     final CompletableFuture<Integer> f = new CompletableFuture<>();
1368 jsr166 1.90 final FailingRunnable[] rs = new FailingRunnable[6];
1369     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
1370    
1371     final CompletableFuture<Void> h0 = m.thenRun(f, rs[0]);
1372     final CompletableFuture<Void> h1 = m.runAfterBoth(f, f, rs[1]);
1373     final CompletableFuture<Void> h2 = m.runAfterEither(f, f, rs[2]);
1374     assertTrue(f.complete(v1));
1375     final CompletableFuture<Void> h3 = m.thenRun(f, rs[3]);
1376     final CompletableFuture<Void> h4 = m.runAfterBoth(f, f, rs[4]);
1377     final CompletableFuture<Void> h5 = m.runAfterEither(f, f, rs[5]);
1378 jsr166 1.23
1379 jsr166 1.90 checkCompletedWithWrappedCFException(h0);
1380     checkCompletedWithWrappedCFException(h1);
1381     checkCompletedWithWrappedCFException(h2);
1382     checkCompletedWithWrappedCFException(h3);
1383     checkCompletedWithWrappedCFException(h4);
1384     checkCompletedWithWrappedCFException(h5);
1385 jsr166 1.48 checkCompletedNormally(f, v1);
1386     }}
1387 dl 1.5
1388     /**
1389     * thenApply result completes normally after normal completion of source
1390     */
1391 jsr166 1.49 public void testThenApply_normalCompletion() {
1392     for (ExecutionMode m : ExecutionMode.values())
1393     for (Integer v1 : new Integer[] { 1, null })
1394     {
1395     final CompletableFuture<Integer> f = new CompletableFuture<>();
1396 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1397     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1398    
1399     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1400     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1401     checkIncomplete(h0);
1402     checkIncomplete(h1);
1403     assertTrue(f.complete(v1));
1404     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1405     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1406 jsr166 1.49
1407 jsr166 1.91 checkCompletedNormally(h0, inc(v1));
1408     checkCompletedNormally(h1, inc(v1));
1409     checkCompletedNormally(h2, inc(v1));
1410     checkCompletedNormally(h3, inc(v1));
1411 jsr166 1.49 checkCompletedNormally(f, v1);
1412 jsr166 1.91 for (IncFunction r : rs) r.assertValue(inc(v1));
1413 jsr166 1.49 }}
1414 dl 1.5
1415     /**
1416     * thenApply result completes exceptionally after exceptional
1417     * completion of source
1418     */
1419 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1420     for (ExecutionMode m : ExecutionMode.values())
1421     {
1422     final CFException ex = new CFException();
1423     final CompletableFuture<Integer> f = new CompletableFuture<>();
1424 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1425     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1426    
1427     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1428     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1429     assertTrue(f.completeExceptionally(ex));
1430     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1431     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1432 jsr166 1.49
1433 jsr166 1.91 checkCompletedWithWrappedException(h0, ex);
1434     checkCompletedWithWrappedException(h1, ex);
1435     checkCompletedWithWrappedException(h2, ex);
1436     checkCompletedWithWrappedException(h3, ex);
1437 jsr166 1.72 checkCompletedExceptionally(f, ex);
1438 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1439 jsr166 1.49 }}
1440 dl 1.5
1441     /**
1442 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1443 dl 1.5 */
1444 jsr166 1.49 public void testThenApply_sourceCancelled() {
1445     for (ExecutionMode m : ExecutionMode.values())
1446     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1447     {
1448     final CompletableFuture<Integer> f = new CompletableFuture<>();
1449 jsr166 1.91 final IncFunction[] rs = new IncFunction[4];
1450     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1451    
1452     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1453     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1454     assertTrue(f.cancel(mayInterruptIfRunning));
1455     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1456     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1457 jsr166 1.49
1458 jsr166 1.91 checkCompletedWithWrappedCancellationException(h0);
1459     checkCompletedWithWrappedCancellationException(h1);
1460     checkCompletedWithWrappedCancellationException(h2);
1461     checkCompletedWithWrappedCancellationException(h3);
1462 jsr166 1.49 checkCancelled(f);
1463 jsr166 1.91 for (IncFunction r : rs) r.assertNotInvoked();
1464 jsr166 1.49 }}
1465 dl 1.5
1466     /**
1467 jsr166 1.49 * thenApply result completes exceptionally if action does
1468 dl 1.5 */
1469 jsr166 1.49 public void testThenApply_actionFailed() {
1470     for (ExecutionMode m : ExecutionMode.values())
1471     for (Integer v1 : new Integer[] { 1, null })
1472     {
1473     final CompletableFuture<Integer> f = new CompletableFuture<>();
1474 jsr166 1.91 final FailingFunction[] rs = new FailingFunction[4];
1475     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
1476    
1477     final CompletableFuture<Integer> h0 = m.thenApply(f, rs[0]);
1478     final CompletableFuture<Integer> h1 = m.applyToEither(f, f, rs[1]);
1479     assertTrue(f.complete(v1));
1480     final CompletableFuture<Integer> h2 = m.thenApply(f, rs[2]);
1481     final CompletableFuture<Integer> h3 = m.applyToEither(f, f, rs[3]);
1482 jsr166 1.49
1483 jsr166 1.91 checkCompletedWithWrappedCFException(h0);
1484     checkCompletedWithWrappedCFException(h1);
1485     checkCompletedWithWrappedCFException(h2);
1486     checkCompletedWithWrappedCFException(h3);
1487 jsr166 1.49 checkCompletedNormally(f, v1);
1488     }}
1489 dl 1.5
1490     /**
1491     * thenAccept result completes normally after normal completion of source
1492     */
1493 jsr166 1.50 public void testThenAccept_normalCompletion() {
1494     for (ExecutionMode m : ExecutionMode.values())
1495     for (Integer v1 : new Integer[] { 1, null })
1496     {
1497     final CompletableFuture<Integer> f = new CompletableFuture<>();
1498 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1499     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1500    
1501     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1502     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1503     checkIncomplete(h0);
1504     checkIncomplete(h1);
1505     assertTrue(f.complete(v1));
1506     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1507     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1508 jsr166 1.50
1509 jsr166 1.92 checkCompletedNormally(h0, null);
1510     checkCompletedNormally(h1, null);
1511     checkCompletedNormally(h2, null);
1512     checkCompletedNormally(h3, null);
1513 jsr166 1.50 checkCompletedNormally(f, v1);
1514 jsr166 1.92 for (NoopConsumer r : rs) r.assertValue(v1);
1515 jsr166 1.50 }}
1516 dl 1.5
1517     /**
1518     * thenAccept result completes exceptionally after exceptional
1519     * completion of source
1520     */
1521 jsr166 1.50 public void testThenAccept_exceptionalCompletion() {
1522     for (ExecutionMode m : ExecutionMode.values())
1523     {
1524     final CFException ex = new CFException();
1525     final CompletableFuture<Integer> f = new CompletableFuture<>();
1526 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1527     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1528    
1529     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1530     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1531     assertTrue(f.completeExceptionally(ex));
1532     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1533     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1534 jsr166 1.50
1535 jsr166 1.92 checkCompletedWithWrappedException(h0, ex);
1536     checkCompletedWithWrappedException(h1, ex);
1537     checkCompletedWithWrappedException(h2, ex);
1538     checkCompletedWithWrappedException(h3, ex);
1539 jsr166 1.72 checkCompletedExceptionally(f, ex);
1540 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1541 jsr166 1.50 }}
1542 dl 1.5
1543     /**
1544 jsr166 1.61 * thenAccept result completes exceptionally if source cancelled
1545 dl 1.5 */
1546 jsr166 1.61 public void testThenAccept_sourceCancelled() {
1547 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1548 jsr166 1.61 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1549 jsr166 1.50 {
1550     final CompletableFuture<Integer> f = new CompletableFuture<>();
1551 jsr166 1.92 final NoopConsumer[] rs = new NoopConsumer[4];
1552     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
1553    
1554     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1555     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1556     assertTrue(f.cancel(mayInterruptIfRunning));
1557     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1558     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1559 jsr166 1.50
1560 jsr166 1.92 checkCompletedWithWrappedCancellationException(h0);
1561     checkCompletedWithWrappedCancellationException(h1);
1562     checkCompletedWithWrappedCancellationException(h2);
1563     checkCompletedWithWrappedCancellationException(h3);
1564 jsr166 1.61 checkCancelled(f);
1565 jsr166 1.92 for (NoopConsumer r : rs) r.assertNotInvoked();
1566 jsr166 1.50 }}
1567 dl 1.5
1568     /**
1569 jsr166 1.61 * thenAccept result completes exceptionally if action does
1570 dl 1.5 */
1571 jsr166 1.61 public void testThenAccept_actionFailed() {
1572 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1573 jsr166 1.61 for (Integer v1 : new Integer[] { 1, null })
1574 jsr166 1.50 {
1575     final CompletableFuture<Integer> f = new CompletableFuture<>();
1576 jsr166 1.92 final FailingConsumer[] rs = new FailingConsumer[4];
1577     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
1578    
1579     final CompletableFuture<Void> h0 = m.thenAccept(f, rs[0]);
1580     final CompletableFuture<Void> h1 = m.acceptEither(f, f, rs[1]);
1581     assertTrue(f.complete(v1));
1582     final CompletableFuture<Void> h2 = m.thenAccept(f, rs[2]);
1583     final CompletableFuture<Void> h3 = m.acceptEither(f, f, rs[3]);
1584 jsr166 1.50
1585 jsr166 1.92 checkCompletedWithWrappedCFException(h0);
1586     checkCompletedWithWrappedCFException(h1);
1587     checkCompletedWithWrappedCFException(h2);
1588     checkCompletedWithWrappedCFException(h3);
1589 jsr166 1.61 checkCompletedNormally(f, v1);
1590 jsr166 1.50 }}
1591 dl 1.5
1592     /**
1593 jsr166 1.18 * thenCombine result completes normally after normal completion
1594     * of sources
1595 dl 1.5 */
1596 jsr166 1.51 public void testThenCombine_normalCompletion() {
1597     for (ExecutionMode m : ExecutionMode.values())
1598 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1599 jsr166 1.36 for (Integer v1 : new Integer[] { 1, null })
1600 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1601     {
1602 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1603     final CompletableFuture<Integer> g = new CompletableFuture<>();
1604 jsr166 1.93 final SubtractFunction[] rs = new SubtractFunction[6];
1605     for (int i = 0; i < rs.length; i++) rs[i] = new SubtractFunction(m);
1606 jsr166 1.79
1607     final CompletableFuture<Integer> fst = fFirst ? f : g;
1608     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1609     final Integer w1 = fFirst ? v1 : v2;
1610     final Integer w2 = !fFirst ? v1 : v2;
1611    
1612 jsr166 1.93 final CompletableFuture<Integer> h0 = m.thenCombine(f, g, rs[0]);
1613     final CompletableFuture<Integer> h1 = m.thenCombine(fst, fst, rs[1]);
1614 jsr166 1.79 assertTrue(fst.complete(w1));
1615 jsr166 1.93 final CompletableFuture<Integer> h2 = m.thenCombine(f, g, rs[2]);
1616     final CompletableFuture<Integer> h3 = m.thenCombine(fst, fst, rs[3]);
1617     checkIncomplete(h0); rs[0].assertNotInvoked();
1618     checkIncomplete(h2); rs[2].assertNotInvoked();
1619     checkCompletedNormally(h1, subtract(w1, w1));
1620     checkCompletedNormally(h3, subtract(w1, w1));
1621     rs[1].assertValue(subtract(w1, w1));
1622     rs[3].assertValue(subtract(w1, w1));
1623 jsr166 1.79 assertTrue(snd.complete(w2));
1624 jsr166 1.93 final CompletableFuture<Integer> h4 = m.thenCombine(f, g, rs[4]);
1625 jsr166 1.79
1626 jsr166 1.93 checkCompletedNormally(h0, subtract(v1, v2));
1627 jsr166 1.79 checkCompletedNormally(h2, subtract(v1, v2));
1628 jsr166 1.93 checkCompletedNormally(h4, subtract(v1, v2));
1629     rs[0].assertValue(subtract(v1, v2));
1630     rs[2].assertValue(subtract(v1, v2));
1631     rs[4].assertValue(subtract(v1, v2));
1632 jsr166 1.94
1633 jsr166 1.36 checkCompletedNormally(f, v1);
1634     checkCompletedNormally(g, v2);
1635 jsr166 1.47 }}
1636 dl 1.5
1637     /**
1638     * thenCombine result completes exceptionally after exceptional
1639     * completion of either source
1640     */
1641 jsr166 1.79 public void testThenCombine_exceptionalCompletion() throws Throwable {
1642 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1643 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1644 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1645 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1646     {
1647 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1648     final CompletableFuture<Integer> g = new CompletableFuture<>();
1649     final CFException ex = new CFException();
1650 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1651     final SubtractFunction r2 = new SubtractFunction(m);
1652     final SubtractFunction r3 = new SubtractFunction(m);
1653    
1654     final CompletableFuture<Integer> fst = fFirst ? f : g;
1655     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1656     final Callable<Boolean> complete1 = failFirst ?
1657     () -> fst.completeExceptionally(ex) :
1658     () -> fst.complete(v1);
1659     final Callable<Boolean> complete2 = failFirst ?
1660     () -> snd.complete(v1) :
1661     () -> snd.completeExceptionally(ex);
1662    
1663     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1664     assertTrue(complete1.call());
1665     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1666     checkIncomplete(h1);
1667     checkIncomplete(h2);
1668     assertTrue(complete2.call());
1669     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1670 jsr166 1.18
1671 jsr166 1.79 checkCompletedWithWrappedException(h1, ex);
1672     checkCompletedWithWrappedException(h2, ex);
1673     checkCompletedWithWrappedException(h3, ex);
1674     r1.assertNotInvoked();
1675     r2.assertNotInvoked();
1676     r3.assertNotInvoked();
1677     checkCompletedNormally(failFirst ? snd : fst, v1);
1678     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1679 jsr166 1.47 }}
1680 dl 1.5
1681     /**
1682     * thenCombine result completes exceptionally if either source cancelled
1683     */
1684 jsr166 1.79 public void testThenCombine_sourceCancelled() throws Throwable {
1685 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1686     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1687 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1688 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1689 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1690     {
1691 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1692     final CompletableFuture<Integer> g = new CompletableFuture<>();
1693 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1694     final SubtractFunction r2 = new SubtractFunction(m);
1695     final SubtractFunction r3 = new SubtractFunction(m);
1696 jsr166 1.18
1697 jsr166 1.79 final CompletableFuture<Integer> fst = fFirst ? f : g;
1698     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1699     final Callable<Boolean> complete1 = failFirst ?
1700     () -> fst.cancel(mayInterruptIfRunning) :
1701     () -> fst.complete(v1);
1702     final Callable<Boolean> complete2 = failFirst ?
1703     () -> snd.complete(v1) :
1704     () -> snd.cancel(mayInterruptIfRunning);
1705    
1706     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1707     assertTrue(complete1.call());
1708     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1709     checkIncomplete(h1);
1710     checkIncomplete(h2);
1711     assertTrue(complete2.call());
1712     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1713 jsr166 1.36
1714 jsr166 1.79 checkCompletedWithWrappedCancellationException(h1);
1715     checkCompletedWithWrappedCancellationException(h2);
1716     checkCompletedWithWrappedCancellationException(h3);
1717     r1.assertNotInvoked();
1718     r2.assertNotInvoked();
1719     r3.assertNotInvoked();
1720     checkCompletedNormally(failFirst ? snd : fst, v1);
1721     checkCancelled(failFirst ? fst : snd);
1722 jsr166 1.47 }}
1723 dl 1.5
1724     /**
1725 jsr166 1.61 * thenCombine result completes exceptionally if action does
1726     */
1727     public void testThenCombine_actionFailed() {
1728     for (ExecutionMode m : ExecutionMode.values())
1729     for (boolean fFirst : new boolean[] { true, false })
1730     for (Integer v1 : new Integer[] { 1, null })
1731     for (Integer v2 : new Integer[] { 2, null })
1732     {
1733     final CompletableFuture<Integer> f = new CompletableFuture<>();
1734     final CompletableFuture<Integer> g = new CompletableFuture<>();
1735 jsr166 1.79 final FailingBiFunction r1 = new FailingBiFunction(m);
1736     final FailingBiFunction r2 = new FailingBiFunction(m);
1737     final FailingBiFunction r3 = new FailingBiFunction(m);
1738    
1739     final CompletableFuture<Integer> fst = fFirst ? f : g;
1740     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1741     final Integer w1 = fFirst ? v1 : v2;
1742     final Integer w2 = !fFirst ? v1 : v2;
1743    
1744     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1745     assertTrue(fst.complete(w1));
1746     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1747     assertTrue(snd.complete(w2));
1748     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1749 jsr166 1.61
1750 jsr166 1.79 checkCompletedWithWrappedCFException(h1);
1751     checkCompletedWithWrappedCFException(h2);
1752     checkCompletedWithWrappedCFException(h3);
1753 jsr166 1.81 r1.assertInvoked();
1754     r2.assertInvoked();
1755     r3.assertInvoked();
1756 jsr166 1.61 checkCompletedNormally(f, v1);
1757     checkCompletedNormally(g, v2);
1758     }}
1759    
1760     /**
1761 dl 1.5 * thenAcceptBoth result completes normally after normal
1762     * completion of sources
1763     */
1764 jsr166 1.53 public void testThenAcceptBoth_normalCompletion() {
1765 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1766 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1767 jsr166 1.35 for (Integer v1 : new Integer[] { 1, null })
1768 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1769     {
1770 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1771     final CompletableFuture<Integer> g = new CompletableFuture<>();
1772 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1773     final SubtractAction r2 = new SubtractAction(m);
1774     final SubtractAction r3 = new SubtractAction(m);
1775    
1776     final CompletableFuture<Integer> fst = fFirst ? f : g;
1777     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1778     final Integer w1 = fFirst ? v1 : v2;
1779     final Integer w2 = !fFirst ? v1 : v2;
1780    
1781     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1782     assertTrue(fst.complete(w1));
1783     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1784     checkIncomplete(h1);
1785     checkIncomplete(h2);
1786     r1.assertNotInvoked();
1787     r2.assertNotInvoked();
1788     assertTrue(snd.complete(w2));
1789     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1790 jsr166 1.35
1791 jsr166 1.80 checkCompletedNormally(h1, null);
1792     checkCompletedNormally(h2, null);
1793     checkCompletedNormally(h3, null);
1794     r1.assertValue(subtract(v1, v2));
1795     r2.assertValue(subtract(v1, v2));
1796     r3.assertValue(subtract(v1, v2));
1797 jsr166 1.35 checkCompletedNormally(f, v1);
1798     checkCompletedNormally(g, v2);
1799 jsr166 1.47 }}
1800 dl 1.5
1801     /**
1802     * thenAcceptBoth result completes exceptionally after exceptional
1803     * completion of either source
1804     */
1805 jsr166 1.80 public void testThenAcceptBoth_exceptionalCompletion() throws Throwable {
1806 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1807 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1808 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1809 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1810     {
1811 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1812     final CompletableFuture<Integer> g = new CompletableFuture<>();
1813     final CFException ex = new CFException();
1814 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1815     final SubtractAction r2 = new SubtractAction(m);
1816     final SubtractAction r3 = new SubtractAction(m);
1817    
1818     final CompletableFuture<Integer> fst = fFirst ? f : g;
1819     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1820     final Callable<Boolean> complete1 = failFirst ?
1821     () -> fst.completeExceptionally(ex) :
1822     () -> fst.complete(v1);
1823     final Callable<Boolean> complete2 = failFirst ?
1824     () -> snd.complete(v1) :
1825     () -> snd.completeExceptionally(ex);
1826    
1827     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1828     assertTrue(complete1.call());
1829     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1830     checkIncomplete(h1);
1831     checkIncomplete(h2);
1832     assertTrue(complete2.call());
1833     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1834 jsr166 1.35
1835 jsr166 1.80 checkCompletedWithWrappedException(h1, ex);
1836     checkCompletedWithWrappedException(h2, ex);
1837     checkCompletedWithWrappedException(h3, ex);
1838     r1.assertNotInvoked();
1839     r2.assertNotInvoked();
1840     r3.assertNotInvoked();
1841     checkCompletedNormally(failFirst ? snd : fst, v1);
1842     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1843 jsr166 1.47 }}
1844 dl 1.5
1845     /**
1846     * thenAcceptBoth result completes exceptionally if either source cancelled
1847     */
1848 jsr166 1.80 public void testThenAcceptBoth_sourceCancelled() throws Throwable {
1849 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1850     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1851 jsr166 1.53 for (boolean fFirst : new boolean[] { true, false })
1852 jsr166 1.80 for (boolean failFirst : new boolean[] { true, false })
1853 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1854     {
1855 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1856     final CompletableFuture<Integer> g = new CompletableFuture<>();
1857 jsr166 1.80 final SubtractAction r1 = new SubtractAction(m);
1858     final SubtractAction r2 = new SubtractAction(m);
1859     final SubtractAction r3 = new SubtractAction(m);
1860    
1861     final CompletableFuture<Integer> fst = fFirst ? f : g;
1862     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1863     final Callable<Boolean> complete1 = failFirst ?
1864     () -> fst.cancel(mayInterruptIfRunning) :
1865     () -> fst.complete(v1);
1866     final Callable<Boolean> complete2 = failFirst ?
1867     () -> snd.complete(v1) :
1868     () -> snd.cancel(mayInterruptIfRunning);
1869 jsr166 1.35
1870 jsr166 1.80 final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1871     assertTrue(complete1.call());
1872     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1873     checkIncomplete(h1);
1874     checkIncomplete(h2);
1875     assertTrue(complete2.call());
1876     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1877 jsr166 1.22
1878 jsr166 1.80 checkCompletedWithWrappedCancellationException(h1);
1879     checkCompletedWithWrappedCancellationException(h2);
1880     checkCompletedWithWrappedCancellationException(h3);
1881     r1.assertNotInvoked();
1882     r2.assertNotInvoked();
1883     r3.assertNotInvoked();
1884     checkCompletedNormally(failFirst ? snd : fst, v1);
1885     checkCancelled(failFirst ? fst : snd);
1886 jsr166 1.47 }}
1887 jsr166 1.34
1888     /**
1889 jsr166 1.61 * thenAcceptBoth result completes exceptionally if action does
1890     */
1891     public void testThenAcceptBoth_actionFailed() {
1892     for (ExecutionMode m : ExecutionMode.values())
1893     for (boolean fFirst : new boolean[] { true, false })
1894     for (Integer v1 : new Integer[] { 1, null })
1895     for (Integer v2 : new Integer[] { 2, null })
1896     {
1897     final CompletableFuture<Integer> f = new CompletableFuture<>();
1898     final CompletableFuture<Integer> g = new CompletableFuture<>();
1899 jsr166 1.80 final FailingBiConsumer r1 = new FailingBiConsumer(m);
1900     final FailingBiConsumer r2 = new FailingBiConsumer(m);
1901     final FailingBiConsumer r3 = new FailingBiConsumer(m);
1902    
1903     final CompletableFuture<Integer> fst = fFirst ? f : g;
1904     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1905     final Integer w1 = fFirst ? v1 : v2;
1906     final Integer w2 = !fFirst ? v1 : v2;
1907    
1908     final CompletableFuture<Void> h1 = m.thenAcceptBoth(f, g, r1);
1909     assertTrue(fst.complete(w1));
1910     final CompletableFuture<Void> h2 = m.thenAcceptBoth(f, g, r2);
1911     assertTrue(snd.complete(w2));
1912     final CompletableFuture<Void> h3 = m.thenAcceptBoth(f, g, r3);
1913 jsr166 1.61
1914 jsr166 1.80 checkCompletedWithWrappedCFException(h1);
1915     checkCompletedWithWrappedCFException(h2);
1916     checkCompletedWithWrappedCFException(h3);
1917 jsr166 1.81 r1.assertInvoked();
1918     r2.assertInvoked();
1919     r3.assertInvoked();
1920 jsr166 1.61 checkCompletedNormally(f, v1);
1921     checkCompletedNormally(g, v2);
1922     }}
1923    
1924     /**
1925 dl 1.5 * runAfterBoth result completes normally after normal
1926     * completion of sources
1927     */
1928 jsr166 1.54 public void testRunAfterBoth_normalCompletion() {
1929 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1930 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
1931 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1932 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1933     {
1934 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1935     final CompletableFuture<Integer> g = new CompletableFuture<>();
1936 jsr166 1.81 final Noop r1 = new Noop(m);
1937     final Noop r2 = new Noop(m);
1938     final Noop r3 = new Noop(m);
1939    
1940     final CompletableFuture<Integer> fst = fFirst ? f : g;
1941     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1942     final Integer w1 = fFirst ? v1 : v2;
1943     final Integer w2 = !fFirst ? v1 : v2;
1944 jsr166 1.33
1945 jsr166 1.81 final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1946     assertTrue(fst.complete(w1));
1947     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1948     checkIncomplete(h1);
1949     checkIncomplete(h2);
1950     r1.assertNotInvoked();
1951     r2.assertNotInvoked();
1952     assertTrue(snd.complete(w2));
1953     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1954 dl 1.5
1955 jsr166 1.81 checkCompletedNormally(h1, null);
1956     checkCompletedNormally(h2, null);
1957     checkCompletedNormally(h3, null);
1958     r1.assertInvoked();
1959     r2.assertInvoked();
1960     r3.assertInvoked();
1961 jsr166 1.33 checkCompletedNormally(f, v1);
1962     checkCompletedNormally(g, v2);
1963 jsr166 1.47 }}
1964 dl 1.5
1965     /**
1966     * runAfterBoth result completes exceptionally after exceptional
1967     * completion of either source
1968     */
1969 jsr166 1.81 public void testRunAfterBoth_exceptionalCompletion() throws Throwable {
1970 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1971 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
1972 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
1973 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1974     {
1975 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1976     final CompletableFuture<Integer> g = new CompletableFuture<>();
1977     final CFException ex = new CFException();
1978 jsr166 1.81 final Noop r1 = new Noop(m);
1979     final Noop r2 = new Noop(m);
1980     final Noop r3 = new Noop(m);
1981 jsr166 1.33
1982 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
1983     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1984     final Callable<Boolean> complete1 = failFirst ?
1985     () -> fst.completeExceptionally(ex) :
1986     () -> fst.complete(v1);
1987     final Callable<Boolean> complete2 = failFirst ?
1988     () -> snd.complete(v1) :
1989     () -> snd.completeExceptionally(ex);
1990    
1991     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1992     assertTrue(complete1.call());
1993     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1994     checkIncomplete(h1);
1995     checkIncomplete(h2);
1996     assertTrue(complete2.call());
1997     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
1998 dl 1.5
1999 jsr166 1.81 checkCompletedWithWrappedException(h1, ex);
2000     checkCompletedWithWrappedException(h2, ex);
2001     checkCompletedWithWrappedException(h3, ex);
2002     r1.assertNotInvoked();
2003     r2.assertNotInvoked();
2004     r3.assertNotInvoked();
2005     checkCompletedNormally(failFirst ? snd : fst, v1);
2006     checkCompletedExceptionally(failFirst ? fst : snd, ex);
2007 jsr166 1.47 }}
2008 dl 1.5
2009 jsr166 1.4 /**
2010 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
2011 jsr166 1.4 */
2012 jsr166 1.81 public void testRunAfterBoth_sourceCancelled() throws Throwable {
2013 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2014 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2015 jsr166 1.54 for (boolean fFirst : new boolean[] { true, false })
2016 jsr166 1.81 for (boolean failFirst : new boolean[] { true, false })
2017 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2018     {
2019 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2020     final CompletableFuture<Integer> g = new CompletableFuture<>();
2021 jsr166 1.81 final Noop r1 = new Noop(m);
2022     final Noop r2 = new Noop(m);
2023     final Noop r3 = new Noop(m);
2024 jsr166 1.33
2025 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2026     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2027     final Callable<Boolean> complete1 = failFirst ?
2028     () -> fst.cancel(mayInterruptIfRunning) :
2029     () -> fst.complete(v1);
2030     final Callable<Boolean> complete2 = failFirst ?
2031     () -> snd.complete(v1) :
2032     () -> snd.cancel(mayInterruptIfRunning);
2033    
2034     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2035     assertTrue(complete1.call());
2036     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2037     checkIncomplete(h1);
2038     checkIncomplete(h2);
2039     assertTrue(complete2.call());
2040     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2041 jsr166 1.33
2042 jsr166 1.81 checkCompletedWithWrappedCancellationException(h1);
2043     checkCompletedWithWrappedCancellationException(h2);
2044     checkCompletedWithWrappedCancellationException(h3);
2045     r1.assertNotInvoked();
2046     r2.assertNotInvoked();
2047     r3.assertNotInvoked();
2048     checkCompletedNormally(failFirst ? snd : fst, v1);
2049     checkCancelled(failFirst ? fst : snd);
2050 jsr166 1.47 }}
2051 dl 1.5
2052     /**
2053 jsr166 1.61 * runAfterBoth result completes exceptionally if action does
2054     */
2055     public void testRunAfterBoth_actionFailed() {
2056     for (ExecutionMode m : ExecutionMode.values())
2057     for (boolean fFirst : new boolean[] { true, false })
2058     for (Integer v1 : new Integer[] { 1, null })
2059     for (Integer v2 : new Integer[] { 2, null })
2060     {
2061     final CompletableFuture<Integer> f = new CompletableFuture<>();
2062     final CompletableFuture<Integer> g = new CompletableFuture<>();
2063 jsr166 1.62 final FailingRunnable r1 = new FailingRunnable(m);
2064     final FailingRunnable r2 = new FailingRunnable(m);
2065 jsr166 1.81 final FailingRunnable r3 = new FailingRunnable(m);
2066 jsr166 1.61
2067 jsr166 1.81 final CompletableFuture<Integer> fst = fFirst ? f : g;
2068     final CompletableFuture<Integer> snd = !fFirst ? f : g;
2069     final Integer w1 = fFirst ? v1 : v2;
2070     final Integer w2 = !fFirst ? v1 : v2;
2071    
2072     final CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
2073     assertTrue(fst.complete(w1));
2074     final CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
2075     assertTrue(snd.complete(w2));
2076     final CompletableFuture<Void> h3 = m.runAfterBoth(f, g, r3);
2077 jsr166 1.61
2078     checkCompletedWithWrappedCFException(h1);
2079     checkCompletedWithWrappedCFException(h2);
2080 jsr166 1.81 checkCompletedWithWrappedCFException(h3);
2081     r1.assertInvoked();
2082     r2.assertInvoked();
2083     r3.assertInvoked();
2084 jsr166 1.61 checkCompletedNormally(f, v1);
2085     checkCompletedNormally(g, v2);
2086     }}
2087    
2088     /**
2089 dl 1.5 * applyToEither result completes normally after normal completion
2090     * of either source
2091     */
2092 jsr166 1.54 public void testApplyToEither_normalCompletion() {
2093 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2094     for (Integer v1 : new Integer[] { 1, null })
2095 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2096     {
2097 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2098     final CompletableFuture<Integer> g = new CompletableFuture<>();
2099 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2100     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2101 jsr166 1.54
2102 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2103     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2104     checkIncomplete(h0);
2105     checkIncomplete(h1);
2106     rs[0].assertNotInvoked();
2107     rs[1].assertNotInvoked();
2108     f.complete(v1);
2109     checkCompletedNormally(h0, inc(v1));
2110     checkCompletedNormally(h1, inc(v1));
2111     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2112     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2113     checkCompletedNormally(h2, inc(v1));
2114     checkCompletedNormally(h3, inc(v1));
2115     g.complete(v2);
2116 jsr166 1.39
2117 jsr166 1.62 // unspecified behavior - both source completions available
2118     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2119     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2120     rs[4].assertValue(h4.join());
2121     rs[5].assertValue(h5.join());
2122     assertTrue(Objects.equals(inc(v1), h4.join()) ||
2123     Objects.equals(inc(v2), h4.join()));
2124     assertTrue(Objects.equals(inc(v1), h5.join()) ||
2125     Objects.equals(inc(v2), h5.join()));
2126 jsr166 1.39
2127     checkCompletedNormally(f, v1);
2128     checkCompletedNormally(g, v2);
2129 jsr166 1.62 checkCompletedNormally(h0, inc(v1));
2130     checkCompletedNormally(h1, inc(v1));
2131     checkCompletedNormally(h2, inc(v1));
2132     checkCompletedNormally(h3, inc(v1));
2133     for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
2134 jsr166 1.47 }}
2135 dl 1.5
2136     /**
2137     * applyToEither result completes exceptionally after exceptional
2138     * completion of either source
2139     */
2140 jsr166 1.62 public void testApplyToEither_exceptionalCompletion() {
2141 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2142 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2143     {
2144 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2145     final CompletableFuture<Integer> g = new CompletableFuture<>();
2146 jsr166 1.54 final CFException ex = new CFException();
2147 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2148     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2149    
2150     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2151     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2152     checkIncomplete(h0);
2153     checkIncomplete(h1);
2154     rs[0].assertNotInvoked();
2155     rs[1].assertNotInvoked();
2156     f.completeExceptionally(ex);
2157 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2158     checkCompletedWithWrappedException(h1, ex);
2159 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2160     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2161 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2162     checkCompletedWithWrappedException(h3, ex);
2163 jsr166 1.62 g.complete(v1);
2164 jsr166 1.54
2165 jsr166 1.62 // unspecified behavior - both source completions available
2166     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2167     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2168     try {
2169     assertEquals(inc(v1), h4.join());
2170 jsr166 1.66 rs[4].assertValue(inc(v1));
2171 jsr166 1.62 } catch (CompletionException ok) {
2172 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2173 jsr166 1.62 rs[4].assertNotInvoked();
2174     }
2175     try {
2176     assertEquals(inc(v1), h5.join());
2177 jsr166 1.66 rs[5].assertValue(inc(v1));
2178 jsr166 1.62 } catch (CompletionException ok) {
2179 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2180 jsr166 1.62 rs[5].assertNotInvoked();
2181 jsr166 1.54 }
2182 jsr166 1.39
2183 jsr166 1.72 checkCompletedExceptionally(f, ex);
2184 jsr166 1.62 checkCompletedNormally(g, v1);
2185 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2186     checkCompletedWithWrappedException(h1, ex);
2187     checkCompletedWithWrappedException(h2, ex);
2188     checkCompletedWithWrappedException(h3, ex);
2189     checkCompletedWithWrappedException(h4, ex);
2190 jsr166 1.62 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2191 jsr166 1.47 }}
2192 jsr166 1.39
2193 jsr166 1.66 public void testApplyToEither_exceptionalCompletion2() {
2194     for (ExecutionMode m : ExecutionMode.values())
2195     for (boolean fFirst : new boolean[] { true, false })
2196     for (Integer v1 : new Integer[] { 1, null })
2197     {
2198     final CompletableFuture<Integer> f = new CompletableFuture<>();
2199     final CompletableFuture<Integer> g = new CompletableFuture<>();
2200     final CFException ex = new CFException();
2201     final IncFunction[] rs = new IncFunction[6];
2202     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2203    
2204     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2205     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2206 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2207     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2208 jsr166 1.66 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2209     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2210    
2211     // unspecified behavior - both source completions available
2212     try {
2213     assertEquals(inc(v1), h0.join());
2214     rs[0].assertValue(inc(v1));
2215     } catch (CompletionException ok) {
2216 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2217 jsr166 1.66 rs[0].assertNotInvoked();
2218     }
2219     try {
2220     assertEquals(inc(v1), h1.join());
2221     rs[1].assertValue(inc(v1));
2222     } catch (CompletionException ok) {
2223 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2224 jsr166 1.66 rs[1].assertNotInvoked();
2225     }
2226     try {
2227     assertEquals(inc(v1), h2.join());
2228     rs[2].assertValue(inc(v1));
2229     } catch (CompletionException ok) {
2230 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2231 jsr166 1.66 rs[2].assertNotInvoked();
2232     }
2233     try {
2234     assertEquals(inc(v1), h3.join());
2235     rs[3].assertValue(inc(v1));
2236     } catch (CompletionException ok) {
2237 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2238 jsr166 1.66 rs[3].assertNotInvoked();
2239     }
2240    
2241     checkCompletedNormally(f, v1);
2242 jsr166 1.72 checkCompletedExceptionally(g, ex);
2243 jsr166 1.66 }}
2244    
2245 jsr166 1.62 /**
2246     * applyToEither result completes exceptionally if either source cancelled
2247     */
2248     public void testApplyToEither_sourceCancelled() {
2249 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2250 jsr166 1.62 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2251 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2252     {
2253 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2254     final CompletableFuture<Integer> g = new CompletableFuture<>();
2255 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2256     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2257    
2258     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2259     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2260     checkIncomplete(h0);
2261     checkIncomplete(h1);
2262     rs[0].assertNotInvoked();
2263     rs[1].assertNotInvoked();
2264     f.cancel(mayInterruptIfRunning);
2265     checkCompletedWithWrappedCancellationException(h0);
2266     checkCompletedWithWrappedCancellationException(h1);
2267     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2268     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2269     checkCompletedWithWrappedCancellationException(h2);
2270     checkCompletedWithWrappedCancellationException(h3);
2271     g.complete(v1);
2272 jsr166 1.39
2273 jsr166 1.62 // unspecified behavior - both source completions available
2274     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2275     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2276 jsr166 1.39 try {
2277 jsr166 1.62 assertEquals(inc(v1), h4.join());
2278 jsr166 1.66 rs[4].assertValue(inc(v1));
2279 jsr166 1.39 } catch (CompletionException ok) {
2280 jsr166 1.62 checkCompletedWithWrappedCancellationException(h4);
2281     rs[4].assertNotInvoked();
2282 jsr166 1.39 }
2283     try {
2284 jsr166 1.62 assertEquals(inc(v1), h5.join());
2285 jsr166 1.66 rs[5].assertValue(inc(v1));
2286 jsr166 1.39 } catch (CompletionException ok) {
2287 jsr166 1.62 checkCompletedWithWrappedCancellationException(h5);
2288     rs[5].assertNotInvoked();
2289 jsr166 1.39 }
2290 dl 1.5
2291 jsr166 1.62 checkCancelled(f);
2292     checkCompletedNormally(g, v1);
2293     checkCompletedWithWrappedCancellationException(h0);
2294     checkCompletedWithWrappedCancellationException(h1);
2295     checkCompletedWithWrappedCancellationException(h2);
2296     checkCompletedWithWrappedCancellationException(h3);
2297     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2298 jsr166 1.47 }}
2299 dl 1.5
2300 jsr166 1.67 public void testApplyToEither_sourceCancelled2() {
2301     for (ExecutionMode m : ExecutionMode.values())
2302     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2303     for (boolean fFirst : new boolean[] { true, false })
2304     for (Integer v1 : new Integer[] { 1, null })
2305     {
2306     final CompletableFuture<Integer> f = new CompletableFuture<>();
2307     final CompletableFuture<Integer> g = new CompletableFuture<>();
2308     final IncFunction[] rs = new IncFunction[6];
2309     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2310    
2311     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2312     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2313 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2314     assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2315 jsr166 1.67 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2316     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2317    
2318     // unspecified behavior - both source completions available
2319     try {
2320     assertEquals(inc(v1), h0.join());
2321     rs[0].assertValue(inc(v1));
2322     } catch (CompletionException ok) {
2323     checkCompletedWithWrappedCancellationException(h0);
2324     rs[0].assertNotInvoked();
2325     }
2326     try {
2327     assertEquals(inc(v1), h1.join());
2328     rs[1].assertValue(inc(v1));
2329     } catch (CompletionException ok) {
2330     checkCompletedWithWrappedCancellationException(h1);
2331     rs[1].assertNotInvoked();
2332     }
2333     try {
2334     assertEquals(inc(v1), h2.join());
2335     rs[2].assertValue(inc(v1));
2336     } catch (CompletionException ok) {
2337     checkCompletedWithWrappedCancellationException(h2);
2338     rs[2].assertNotInvoked();
2339     }
2340     try {
2341     assertEquals(inc(v1), h3.join());
2342     rs[3].assertValue(inc(v1));
2343     } catch (CompletionException ok) {
2344     checkCompletedWithWrappedCancellationException(h3);
2345     rs[3].assertNotInvoked();
2346     }
2347    
2348     checkCompletedNormally(f, v1);
2349     checkCancelled(g);
2350     }}
2351    
2352 dl 1.5 /**
2353     * applyToEither result completes exceptionally if action does
2354     */
2355 jsr166 1.62 public void testApplyToEither_actionFailed() {
2356 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2357     for (Integer v1 : new Integer[] { 1, null })
2358 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2359     {
2360 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2361     final CompletableFuture<Integer> g = new CompletableFuture<>();
2362 jsr166 1.62 final FailingFunction[] rs = new FailingFunction[6];
2363     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2364 jsr166 1.39
2365 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2366     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2367 jsr166 1.39 f.complete(v1);
2368 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2369     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2370     checkCompletedWithWrappedCFException(h0);
2371     checkCompletedWithWrappedCFException(h1);
2372     checkCompletedWithWrappedCFException(h2);
2373     checkCompletedWithWrappedCFException(h3);
2374 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2375    
2376     g.complete(v2);
2377    
2378     // unspecified behavior - both source completions available
2379     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2380     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2381    
2382 jsr166 1.62 checkCompletedWithWrappedCFException(h4);
2383 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2384     Objects.equals(v2, rs[4].value));
2385 jsr166 1.62 checkCompletedWithWrappedCFException(h5);
2386 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2387     Objects.equals(v2, rs[5].value));
2388    
2389     checkCompletedNormally(f, v1);
2390     checkCompletedNormally(g, v2);
2391 jsr166 1.47 }}
2392 dl 1.5
2393     /**
2394     * acceptEither result completes normally after normal completion
2395     * of either source
2396     */
2397 jsr166 1.63 public void testAcceptEither_normalCompletion() {
2398 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2399     for (Integer v1 : new Integer[] { 1, null })
2400 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2401     {
2402 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2403     final CompletableFuture<Integer> g = new CompletableFuture<>();
2404 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2405     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2406 jsr166 1.40
2407 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2408     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2409     checkIncomplete(h0);
2410     checkIncomplete(h1);
2411     rs[0].assertNotInvoked();
2412     rs[1].assertNotInvoked();
2413 jsr166 1.40 f.complete(v1);
2414 jsr166 1.63 checkCompletedNormally(h0, null);
2415     checkCompletedNormally(h1, null);
2416 jsr166 1.64 rs[0].assertValue(v1);
2417     rs[1].assertValue(v1);
2418 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2419     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2420     checkCompletedNormally(h2, null);
2421     checkCompletedNormally(h3, null);
2422 jsr166 1.64 rs[2].assertValue(v1);
2423     rs[3].assertValue(v1);
2424 jsr166 1.40 g.complete(v2);
2425    
2426 jsr166 1.63 // unspecified behavior - both source completions available
2427     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2428     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2429     checkCompletedNormally(h4, null);
2430     checkCompletedNormally(h5, null);
2431 jsr166 1.64 assertTrue(Objects.equals(v1, rs[4].value) ||
2432     Objects.equals(v2, rs[4].value));
2433     assertTrue(Objects.equals(v1, rs[5].value) ||
2434     Objects.equals(v2, rs[5].value));
2435 jsr166 1.40
2436     checkCompletedNormally(f, v1);
2437     checkCompletedNormally(g, v2);
2438 jsr166 1.63 checkCompletedNormally(h0, null);
2439     checkCompletedNormally(h1, null);
2440     checkCompletedNormally(h2, null);
2441     checkCompletedNormally(h3, null);
2442 jsr166 1.64 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2443 jsr166 1.47 }}
2444 dl 1.5
2445     /**
2446     * acceptEither result completes exceptionally after exceptional
2447     * completion of either source
2448     */
2449 jsr166 1.63 public void testAcceptEither_exceptionalCompletion() {
2450 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2451 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2452     {
2453 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2454     final CompletableFuture<Integer> g = new CompletableFuture<>();
2455     final CFException ex = new CFException();
2456 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2457     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2458 jsr166 1.40
2459 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2460     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2461     checkIncomplete(h0);
2462     checkIncomplete(h1);
2463     rs[0].assertNotInvoked();
2464     rs[1].assertNotInvoked();
2465 jsr166 1.40 f.completeExceptionally(ex);
2466 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2467     checkCompletedWithWrappedException(h1, ex);
2468 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2469     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2470 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2471     checkCompletedWithWrappedException(h3, ex);
2472 jsr166 1.63
2473 jsr166 1.40 g.complete(v1);
2474    
2475 jsr166 1.63 // unspecified behavior - both source completions available
2476     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2477     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2478 jsr166 1.40 try {
2479 jsr166 1.63 assertNull(h4.join());
2480 jsr166 1.64 rs[4].assertValue(v1);
2481 jsr166 1.40 } catch (CompletionException ok) {
2482 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2483 jsr166 1.63 rs[4].assertNotInvoked();
2484 jsr166 1.40 }
2485     try {
2486 jsr166 1.63 assertNull(h5.join());
2487 jsr166 1.64 rs[5].assertValue(v1);
2488 jsr166 1.40 } catch (CompletionException ok) {
2489 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2490 jsr166 1.63 rs[5].assertNotInvoked();
2491 jsr166 1.40 }
2492 dl 1.5
2493 jsr166 1.72 checkCompletedExceptionally(f, ex);
2494 jsr166 1.40 checkCompletedNormally(g, v1);
2495 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2496     checkCompletedWithWrappedException(h1, ex);
2497     checkCompletedWithWrappedException(h2, ex);
2498     checkCompletedWithWrappedException(h3, ex);
2499     checkCompletedWithWrappedException(h4, ex);
2500 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2501 jsr166 1.47 }}
2502 dl 1.5
2503 jsr166 1.68 public void testAcceptEither_exceptionalCompletion2() {
2504     for (ExecutionMode m : ExecutionMode.values())
2505     for (boolean fFirst : new boolean[] { true, false })
2506     for (Integer v1 : new Integer[] { 1, null })
2507     {
2508     final CompletableFuture<Integer> f = new CompletableFuture<>();
2509     final CompletableFuture<Integer> g = new CompletableFuture<>();
2510     final CFException ex = new CFException();
2511     final NoopConsumer[] rs = new NoopConsumer[6];
2512     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2513    
2514     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2515     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2516 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2517     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2518 jsr166 1.68 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2519     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2520    
2521     // unspecified behavior - both source completions available
2522     try {
2523     assertEquals(null, h0.join());
2524     rs[0].assertValue(v1);
2525     } catch (CompletionException ok) {
2526 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2527 jsr166 1.68 rs[0].assertNotInvoked();
2528     }
2529     try {
2530     assertEquals(null, h1.join());
2531     rs[1].assertValue(v1);
2532     } catch (CompletionException ok) {
2533 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2534 jsr166 1.68 rs[1].assertNotInvoked();
2535     }
2536     try {
2537     assertEquals(null, h2.join());
2538     rs[2].assertValue(v1);
2539     } catch (CompletionException ok) {
2540 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2541 jsr166 1.68 rs[2].assertNotInvoked();
2542     }
2543     try {
2544     assertEquals(null, h3.join());
2545     rs[3].assertValue(v1);
2546     } catch (CompletionException ok) {
2547 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2548 jsr166 1.68 rs[3].assertNotInvoked();
2549     }
2550    
2551     checkCompletedNormally(f, v1);
2552 jsr166 1.72 checkCompletedExceptionally(g, ex);
2553 jsr166 1.68 }}
2554    
2555 dl 1.5 /**
2556     * acceptEither result completes exceptionally if either source cancelled
2557     */
2558 jsr166 1.63 public void testAcceptEither_sourceCancelled() {
2559 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2560     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2561 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2562     {
2563 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2564     final CompletableFuture<Integer> g = new CompletableFuture<>();
2565 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2566     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2567 jsr166 1.63
2568     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2569     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2570     checkIncomplete(h0);
2571     checkIncomplete(h1);
2572     rs[0].assertNotInvoked();
2573     rs[1].assertNotInvoked();
2574     f.cancel(mayInterruptIfRunning);
2575     checkCompletedWithWrappedCancellationException(h0);
2576     checkCompletedWithWrappedCancellationException(h1);
2577     final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2578     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2579     checkCompletedWithWrappedCancellationException(h2);
2580     checkCompletedWithWrappedCancellationException(h3);
2581 jsr166 1.40
2582     g.complete(v1);
2583    
2584 jsr166 1.63 // unspecified behavior - both source completions available
2585     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2586     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2587     try {
2588     assertNull(h4.join());
2589 jsr166 1.64 rs[4].assertValue(v1);
2590 jsr166 1.63 } catch (CompletionException ok) {
2591     checkCompletedWithWrappedCancellationException(h4);
2592     rs[4].assertNotInvoked();
2593     }
2594     try {
2595     assertNull(h5.join());
2596 jsr166 1.64 rs[5].assertValue(v1);
2597 jsr166 1.63 } catch (CompletionException ok) {
2598     checkCompletedWithWrappedCancellationException(h5);
2599     rs[5].assertNotInvoked();
2600     }
2601    
2602 jsr166 1.40 checkCancelled(f);
2603     checkCompletedNormally(g, v1);
2604 jsr166 1.63 checkCompletedWithWrappedCancellationException(h0);
2605     checkCompletedWithWrappedCancellationException(h1);
2606     checkCompletedWithWrappedCancellationException(h2);
2607     checkCompletedWithWrappedCancellationException(h3);
2608     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2609 jsr166 1.47 }}
2610 jsr166 1.40
2611 jsr166 1.63 /**
2612     * acceptEither result completes exceptionally if action does
2613     */
2614     public void testAcceptEither_actionFailed() {
2615 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2616 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2617 jsr166 1.63 for (Integer v2 : new Integer[] { 2, null })
2618 jsr166 1.47 {
2619 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2620     final CompletableFuture<Integer> g = new CompletableFuture<>();
2621 jsr166 1.63 final FailingConsumer[] rs = new FailingConsumer[6];
2622     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2623 jsr166 1.40
2624 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2625     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2626 jsr166 1.40 f.complete(v1);
2627 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2628     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2629     checkCompletedWithWrappedCFException(h0);
2630     checkCompletedWithWrappedCFException(h1);
2631     checkCompletedWithWrappedCFException(h2);
2632     checkCompletedWithWrappedCFException(h3);
2633     for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2634 jsr166 1.40
2635 jsr166 1.63 g.complete(v2);
2636 jsr166 1.40
2637 jsr166 1.63 // unspecified behavior - both source completions available
2638     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2639     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2640 jsr166 1.40
2641 jsr166 1.63 checkCompletedWithWrappedCFException(h4);
2642     assertTrue(Objects.equals(v1, rs[4].value) ||
2643     Objects.equals(v2, rs[4].value));
2644     checkCompletedWithWrappedCFException(h5);
2645     assertTrue(Objects.equals(v1, rs[5].value) ||
2646     Objects.equals(v2, rs[5].value));
2647 jsr166 1.40
2648     checkCompletedNormally(f, v1);
2649 jsr166 1.63 checkCompletedNormally(g, v2);
2650 jsr166 1.47 }}
2651 dl 1.5
2652     /**
2653     * runAfterEither result completes normally after normal completion
2654     * of either source
2655     */
2656 jsr166 1.65 public void testRunAfterEither_normalCompletion() {
2657 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2658     for (Integer v1 : new Integer[] { 1, null })
2659 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2660     {
2661 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2662     final CompletableFuture<Integer> g = new CompletableFuture<>();
2663 jsr166 1.65 final Noop[] rs = new Noop[6];
2664     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2665 jsr166 1.41
2666 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2667     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2668     checkIncomplete(h0);
2669     checkIncomplete(h1);
2670     rs[0].assertNotInvoked();
2671     rs[1].assertNotInvoked();
2672 jsr166 1.41 f.complete(v1);
2673 jsr166 1.65 checkCompletedNormally(h0, null);
2674     checkCompletedNormally(h1, null);
2675     rs[0].assertInvoked();
2676     rs[1].assertInvoked();
2677     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2678     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2679     checkCompletedNormally(h2, null);
2680     checkCompletedNormally(h3, null);
2681     rs[2].assertInvoked();
2682     rs[3].assertInvoked();
2683 jsr166 1.41
2684     g.complete(v2);
2685    
2686 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2687     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2688 jsr166 1.47
2689 jsr166 1.41 checkCompletedNormally(f, v1);
2690     checkCompletedNormally(g, v2);
2691 jsr166 1.65 checkCompletedNormally(h0, null);
2692     checkCompletedNormally(h1, null);
2693     checkCompletedNormally(h2, null);
2694     checkCompletedNormally(h3, null);
2695     checkCompletedNormally(h4, null);
2696     checkCompletedNormally(h5, null);
2697     for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2698 jsr166 1.47 }}
2699 dl 1.5
2700     /**
2701     * runAfterEither result completes exceptionally after exceptional
2702     * completion of either source
2703     */
2704 jsr166 1.65 public void testRunAfterEither_exceptionalCompletion() {
2705 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2706 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2707     {
2708 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2709     final CompletableFuture<Integer> g = new CompletableFuture<>();
2710     final CFException ex = new CFException();
2711 jsr166 1.65 final Noop[] rs = new Noop[6];
2712     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2713 jsr166 1.41
2714 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2715     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2716     checkIncomplete(h0);
2717     checkIncomplete(h1);
2718     rs[0].assertNotInvoked();
2719     rs[1].assertNotInvoked();
2720 jsr166 1.78 assertTrue(f.completeExceptionally(ex));
2721 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2722     checkCompletedWithWrappedException(h1, ex);
2723 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2724     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2725 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2726     checkCompletedWithWrappedException(h3, ex);
2727 jsr166 1.65
2728 jsr166 1.78 assertTrue(g.complete(v1));
2729 jsr166 1.41
2730 jsr166 1.65 // unspecified behavior - both source completions available
2731     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2732     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2733     try {
2734     assertNull(h4.join());
2735     rs[4].assertInvoked();
2736     } catch (CompletionException ok) {
2737 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2738 jsr166 1.65 rs[4].assertNotInvoked();
2739     }
2740     try {
2741     assertNull(h5.join());
2742     rs[5].assertInvoked();
2743     } catch (CompletionException ok) {
2744 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2745 jsr166 1.65 rs[5].assertNotInvoked();
2746     }
2747    
2748 jsr166 1.72 checkCompletedExceptionally(f, ex);
2749 jsr166 1.41 checkCompletedNormally(g, v1);
2750 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2751     checkCompletedWithWrappedException(h1, ex);
2752     checkCompletedWithWrappedException(h2, ex);
2753     checkCompletedWithWrappedException(h3, ex);
2754     checkCompletedWithWrappedException(h4, ex);
2755 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2756 jsr166 1.47 }}
2757 jsr166 1.41
2758 jsr166 1.69 public void testRunAfterEither_exceptionalCompletion2() {
2759     for (ExecutionMode m : ExecutionMode.values())
2760     for (boolean fFirst : new boolean[] { true, false })
2761     for (Integer v1 : new Integer[] { 1, null })
2762     {
2763     final CompletableFuture<Integer> f = new CompletableFuture<>();
2764     final CompletableFuture<Integer> g = new CompletableFuture<>();
2765     final CFException ex = new CFException();
2766     final Noop[] rs = new Noop[6];
2767     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2768    
2769     final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2770     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2771 jsr166 1.78 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2772     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2773 jsr166 1.69 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2774     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2775    
2776     // unspecified behavior - both source completions available
2777     try {
2778     assertEquals(null, h0.join());
2779     rs[0].assertInvoked();
2780     } catch (CompletionException ok) {
2781 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2782 jsr166 1.69 rs[0].assertNotInvoked();
2783     }
2784     try {
2785     assertEquals(null, h1.join());
2786     rs[1].assertInvoked();
2787     } catch (CompletionException ok) {
2788 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2789 jsr166 1.69 rs[1].assertNotInvoked();
2790     }
2791     try {
2792     assertEquals(null, h2.join());
2793     rs[2].assertInvoked();
2794     } catch (CompletionException ok) {
2795 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2796 jsr166 1.69 rs[2].assertNotInvoked();
2797     }
2798     try {
2799     assertEquals(null, h3.join());
2800     rs[3].assertInvoked();
2801     } catch (CompletionException ok) {
2802 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2803 jsr166 1.69 rs[3].assertNotInvoked();
2804     }
2805    
2806     checkCompletedNormally(f, v1);
2807 jsr166 1.72 checkCompletedExceptionally(g, ex);
2808 jsr166 1.69 }}
2809    
2810 jsr166 1.65 /**
2811     * runAfterEither result completes exceptionally if either source cancelled
2812     */
2813     public void testRunAfterEither_sourceCancelled() {
2814 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2815 jsr166 1.65 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2816 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2817     {
2818 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2819     final CompletableFuture<Integer> g = new CompletableFuture<>();
2820 jsr166 1.65 final Noop[] rs = new Noop[6];
2821     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2822 jsr166 1.41
2823 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2824     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2825     checkIncomplete(h0);
2826     checkIncomplete(h1);
2827     rs[0].assertNotInvoked();
2828     rs[1].assertNotInvoked();
2829     f.cancel(mayInterruptIfRunning);
2830     checkCompletedWithWrappedCancellationException(h0);
2831     checkCompletedWithWrappedCancellationException(h1);
2832     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2833     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2834     checkCompletedWithWrappedCancellationException(h2);
2835     checkCompletedWithWrappedCancellationException(h3);
2836 jsr166 1.41
2837 jsr166 1.78 assertTrue(g.complete(v1));
2838 jsr166 1.41
2839 jsr166 1.65 // unspecified behavior - both source completions available
2840     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2841     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2842 jsr166 1.41 try {
2843 jsr166 1.65 assertNull(h4.join());
2844     rs[4].assertInvoked();
2845 jsr166 1.41 } catch (CompletionException ok) {
2846 jsr166 1.65 checkCompletedWithWrappedCancellationException(h4);
2847     rs[4].assertNotInvoked();
2848 jsr166 1.41 }
2849     try {
2850 jsr166 1.65 assertNull(h5.join());
2851     rs[5].assertInvoked();
2852 jsr166 1.41 } catch (CompletionException ok) {
2853 jsr166 1.65 checkCompletedWithWrappedCancellationException(h5);
2854     rs[5].assertNotInvoked();
2855 jsr166 1.41 }
2856 dl 1.5
2857 jsr166 1.65 checkCancelled(f);
2858 jsr166 1.41 checkCompletedNormally(g, v1);
2859 jsr166 1.65 checkCompletedWithWrappedCancellationException(h0);
2860     checkCompletedWithWrappedCancellationException(h1);
2861     checkCompletedWithWrappedCancellationException(h2);
2862     checkCompletedWithWrappedCancellationException(h3);
2863     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2864 jsr166 1.47 }}
2865 dl 1.5
2866     /**
2867     * runAfterEither result completes exceptionally if action does
2868     */
2869 jsr166 1.65 public void testRunAfterEither_actionFailed() {
2870 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2871     for (Integer v1 : new Integer[] { 1, null })
2872 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2873     {
2874 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2875     final CompletableFuture<Integer> g = new CompletableFuture<>();
2876 jsr166 1.65 final FailingRunnable[] rs = new FailingRunnable[6];
2877     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2878 jsr166 1.41
2879 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2880     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2881 jsr166 1.78 assertTrue(f.complete(v1));
2882 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2883     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2884     checkCompletedWithWrappedCFException(h0);
2885     checkCompletedWithWrappedCFException(h1);
2886     checkCompletedWithWrappedCFException(h2);
2887     checkCompletedWithWrappedCFException(h3);
2888     for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2889 jsr166 1.78 assertTrue(g.complete(v2));
2890 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2891     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2892     checkCompletedWithWrappedCFException(h4);
2893     checkCompletedWithWrappedCFException(h5);
2894 jsr166 1.41
2895     checkCompletedNormally(f, v1);
2896     checkCompletedNormally(g, v2);
2897 jsr166 1.65 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2898 jsr166 1.47 }}
2899 dl 1.5
2900     /**
2901     * thenCompose result completes normally after normal completion of source
2902     */
2903 jsr166 1.48 public void testThenCompose_normalCompletion() {
2904 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2905 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2906 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2907     {
2908 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2909 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2910 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2911 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2912 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2913 jsr166 1.21
2914 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2915     checkCompletedNormally(f, v1);
2916 jsr166 1.70 r.assertValue(v1);
2917 jsr166 1.47 }}
2918 dl 1.5
2919     /**
2920     * thenCompose result completes exceptionally after exceptional
2921     * completion of source
2922     */
2923 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2924 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2925 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2926 jsr166 1.47 {
2927 jsr166 1.44 final CFException ex = new CFException();
2928 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2929 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2930 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2931 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2932 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2933 jsr166 1.21
2934 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
2935     checkCompletedExceptionally(f, ex);
2936 jsr166 1.62 r.assertNotInvoked();
2937 jsr166 1.47 }}
2938 dl 1.5
2939     /**
2940     * thenCompose result completes exceptionally if action does
2941     */
2942 jsr166 1.48 public void testThenCompose_actionFailed() {
2943 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2944 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2945 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2946     {
2947 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2948     final FailingCompletableFutureFunction r
2949 jsr166 1.56 = new FailingCompletableFutureFunction(m);
2950 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2951 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2952 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2953 jsr166 1.44
2954 dl 1.5 checkCompletedWithWrappedCFException(g);
2955 jsr166 1.44 checkCompletedNormally(f, v1);
2956 jsr166 1.47 }}
2957 dl 1.5
2958     /**
2959     * thenCompose result completes exceptionally if source cancelled
2960     */
2961 jsr166 1.48 public void testThenCompose_sourceCancelled() {
2962 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2963 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2964 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2965     {
2966 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2967 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2968 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2969 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2970 jsr166 1.50 if (createIncomplete) {
2971     checkIncomplete(g);
2972     assertTrue(f.cancel(mayInterruptIfRunning));
2973     }
2974 jsr166 1.44
2975 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2976 jsr166 1.44 checkCancelled(f);
2977 jsr166 1.47 }}
2978 dl 1.5
2979 jsr166 1.99 /**
2980     * thenCompose result completes exceptionally if the result of the action does
2981     */
2982     public void testThenCompose_actionReturnsFailingFuture() {
2983     for (ExecutionMode m : ExecutionMode.values())
2984     for (int order = 0; order < 6; order++)
2985     for (Integer v1 : new Integer[] { 1, null })
2986     {
2987     final CFException ex = new CFException();
2988     final CompletableFuture<Integer> f = new CompletableFuture<>();
2989     final CompletableFuture<Integer> g = new CompletableFuture<>();
2990     final CompletableFuture<Integer> h;
2991     // Test all permutations of orders
2992     switch (order) {
2993     case 0:
2994     assertTrue(f.complete(v1));
2995     assertTrue(g.completeExceptionally(ex));
2996     h = m.thenCompose(f, (x -> g));
2997     break;
2998     case 1:
2999     assertTrue(f.complete(v1));
3000     h = m.thenCompose(f, (x -> g));
3001     assertTrue(g.completeExceptionally(ex));
3002     break;
3003     case 2:
3004     assertTrue(g.completeExceptionally(ex));
3005     assertTrue(f.complete(v1));
3006     h = m.thenCompose(f, (x -> g));
3007     break;
3008     case 3:
3009     assertTrue(g.completeExceptionally(ex));
3010     h = m.thenCompose(f, (x -> g));
3011     assertTrue(f.complete(v1));
3012     break;
3013     case 4:
3014     h = m.thenCompose(f, (x -> g));
3015     assertTrue(f.complete(v1));
3016     assertTrue(g.completeExceptionally(ex));
3017     break;
3018     case 5:
3019     h = m.thenCompose(f, (x -> g));
3020     assertTrue(f.complete(v1));
3021     assertTrue(g.completeExceptionally(ex));
3022     break;
3023     default: throw new AssertionError();
3024     }
3025    
3026     checkCompletedExceptionally(g, ex);
3027     checkCompletedWithWrappedException(h, ex);
3028     checkCompletedNormally(f, v1);
3029     }}
3030    
3031 jsr166 1.6 // other static methods
3032 dl 1.5
3033     /**
3034     * allOf(no component futures) returns a future completed normally
3035     * with the value null
3036     */
3037     public void testAllOf_empty() throws Exception {
3038 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
3039 dl 1.5 checkCompletedNormally(f, null);
3040     }
3041    
3042     /**
3043 jsr166 1.25 * allOf returns a future completed normally with the value null
3044     * when all components complete normally
3045 dl 1.5 */
3046 jsr166 1.25 public void testAllOf_normal() throws Exception {
3047 jsr166 1.88 for (int k = 1; k < 10; k++) {
3048 jsr166 1.59 CompletableFuture<Integer>[] fs
3049     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3050 jsr166 1.86 for (int i = 0; i < k; i++)
3051 jsr166 1.22 fs[i] = new CompletableFuture<>();
3052 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3053 jsr166 1.86 for (int i = 0; i < k; i++) {
3054 dl 1.5 checkIncomplete(f);
3055 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
3056 dl 1.5 fs[i].complete(one);
3057     }
3058 dl 1.9 checkCompletedNormally(f, null);
3059 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3060 dl 1.5 }
3061     }
3062    
3063 jsr166 1.59 public void testAllOf_backwards() throws Exception {
3064 jsr166 1.88 for (int k = 1; k < 10; k++) {
3065 jsr166 1.59 CompletableFuture<Integer>[] fs
3066     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3067 jsr166 1.86 for (int i = 0; i < k; i++)
3068 jsr166 1.59 fs[i] = new CompletableFuture<>();
3069     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3070     for (int i = k - 1; i >= 0; i--) {
3071     checkIncomplete(f);
3072     checkIncomplete(CompletableFuture.allOf(fs));
3073     fs[i].complete(one);
3074     }
3075     checkCompletedNormally(f, null);
3076     checkCompletedNormally(CompletableFuture.allOf(fs), null);
3077     }
3078     }
3079    
3080 jsr166 1.88 public void testAllOf_exceptional() throws Exception {
3081     for (int k = 1; k < 10; k++) {
3082     CompletableFuture<Integer>[] fs
3083     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3084     CFException ex = new CFException();
3085     for (int i = 0; i < k; i++)
3086     fs[i] = new CompletableFuture<>();
3087     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3088     for (int i = 0; i < k; i++) {
3089     checkIncomplete(f);
3090     checkIncomplete(CompletableFuture.allOf(fs));
3091 jsr166 1.121 if (i != k / 2) {
3092 jsr166 1.88 fs[i].complete(i);
3093     checkCompletedNormally(fs[i], i);
3094     } else {
3095     fs[i].completeExceptionally(ex);
3096     checkCompletedExceptionally(fs[i], ex);
3097     }
3098     }
3099     checkCompletedWithWrappedException(f, ex);
3100     checkCompletedWithWrappedException(CompletableFuture.allOf(fs), ex);
3101     }
3102     }
3103    
3104 dl 1.5 /**
3105     * anyOf(no component futures) returns an incomplete future
3106     */
3107     public void testAnyOf_empty() throws Exception {
3108 jsr166 1.86 for (Integer v1 : new Integer[] { 1, null })
3109     {
3110 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
3111 dl 1.5 checkIncomplete(f);
3112 jsr166 1.86
3113     f.complete(v1);
3114     checkCompletedNormally(f, v1);
3115     }}
3116 dl 1.5
3117     /**
3118 jsr166 1.25 * anyOf returns a future completed normally with a value when
3119     * a component future does
3120 dl 1.5 */
3121 jsr166 1.24 public void testAnyOf_normal() throws Exception {
3122 jsr166 1.86 for (int k = 0; k < 10; k++) {
3123 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
3124 jsr166 1.86 for (int i = 0; i < k; i++)
3125 jsr166 1.22 fs[i] = new CompletableFuture<>();
3126 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3127 dl 1.5 checkIncomplete(f);
3128 jsr166 1.86 for (int i = 0; i < k; i++) {
3129     fs[i].complete(i);
3130     checkCompletedNormally(f, 0);
3131     int x = (int) CompletableFuture.anyOf(fs).join();
3132     assertTrue(0 <= x && x <= i);
3133     }
3134     }
3135     }
3136     public void testAnyOf_normal_backwards() throws Exception {
3137     for (int k = 0; k < 10; k++) {
3138     CompletableFuture[] fs = new CompletableFuture[k];
3139     for (int i = 0; i < k; i++)
3140     fs[i] = new CompletableFuture<>();
3141     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3142     checkIncomplete(f);
3143     for (int i = k - 1; i >= 0; i--) {
3144     fs[i].complete(i);
3145     checkCompletedNormally(f, k - 1);
3146     int x = (int) CompletableFuture.anyOf(fs).join();
3147     assertTrue(i <= x && x <= k - 1);
3148 jsr166 1.24 }
3149     }
3150     }
3151    
3152     /**
3153     * anyOf result completes exceptionally when any component does.
3154     */
3155     public void testAnyOf_exceptional() throws Exception {
3156 jsr166 1.86 for (int k = 0; k < 10; k++) {
3157 jsr166 1.24 CompletableFuture[] fs = new CompletableFuture[k];
3158 jsr166 1.87 CFException[] exs = new CFException[k];
3159     for (int i = 0; i < k; i++) {
3160 jsr166 1.24 fs[i] = new CompletableFuture<>();
3161 jsr166 1.87 exs[i] = new CFException();
3162     }
3163 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3164     checkIncomplete(f);
3165 jsr166 1.86 for (int i = 0; i < k; i++) {
3166 jsr166 1.87 fs[i].completeExceptionally(exs[i]);
3167     checkCompletedWithWrappedException(f, exs[0]);
3168     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3169     }
3170     }
3171     }
3172    
3173     public void testAnyOf_exceptional_backwards() throws Exception {
3174     for (int k = 0; k < 10; k++) {
3175     CompletableFuture[] fs = new CompletableFuture[k];
3176     CFException[] exs = new CFException[k];
3177     for (int i = 0; i < k; i++) {
3178     fs[i] = new CompletableFuture<>();
3179     exs[i] = new CFException();
3180     }
3181     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3182     checkIncomplete(f);
3183     for (int i = k - 1; i >= 0; i--) {
3184     fs[i].completeExceptionally(exs[i]);
3185     checkCompletedWithWrappedException(f, exs[k - 1]);
3186 jsr166 1.24 checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3187 dl 1.5 }
3188     }
3189     }
3190    
3191     /**
3192     * Completion methods throw NullPointerException with null arguments
3193     */
3194     public void testNPE() {
3195 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3196     CompletableFuture<Integer> g = new CompletableFuture<>();
3197 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3198 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
3199 jsr166 1.14
3200     Runnable[] throwingActions = {
3201 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
3202     () -> CompletableFuture.supplyAsync(null, exec),
3203 jsr166 1.95 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.SYNC, 42), null),
3204 jsr166 1.31
3205     () -> CompletableFuture.runAsync(null),
3206     () -> CompletableFuture.runAsync(null, exec),
3207     () -> CompletableFuture.runAsync(() -> {}, null),
3208    
3209     () -> f.completeExceptionally(null),
3210    
3211     () -> f.thenApply(null),
3212     () -> f.thenApplyAsync(null),
3213     () -> f.thenApplyAsync((x) -> x, null),
3214     () -> f.thenApplyAsync(null, exec),
3215    
3216     () -> f.thenAccept(null),
3217     () -> f.thenAcceptAsync(null),
3218     () -> f.thenAcceptAsync((x) -> {} , null),
3219     () -> f.thenAcceptAsync(null, exec),
3220    
3221     () -> f.thenRun(null),
3222     () -> f.thenRunAsync(null),
3223     () -> f.thenRunAsync(() -> {} , null),
3224     () -> f.thenRunAsync(null, exec),
3225    
3226     () -> f.thenCombine(g, null),
3227     () -> f.thenCombineAsync(g, null),
3228     () -> f.thenCombineAsync(g, null, exec),
3229     () -> f.thenCombine(nullFuture, (x, y) -> x),
3230     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3231     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3232     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3233    
3234     () -> f.thenAcceptBoth(g, null),
3235     () -> f.thenAcceptBothAsync(g, null),
3236     () -> f.thenAcceptBothAsync(g, null, exec),
3237     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3238     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3239     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3240     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3241    
3242     () -> f.runAfterBoth(g, null),
3243     () -> f.runAfterBothAsync(g, null),
3244     () -> f.runAfterBothAsync(g, null, exec),
3245     () -> f.runAfterBoth(nullFuture, () -> {}),
3246     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3247     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3248     () -> f.runAfterBothAsync(g, () -> {}, null),
3249    
3250     () -> f.applyToEither(g, null),
3251     () -> f.applyToEitherAsync(g, null),
3252     () -> f.applyToEitherAsync(g, null, exec),
3253     () -> f.applyToEither(nullFuture, (x) -> x),
3254     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3255     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3256     () -> f.applyToEitherAsync(g, (x) -> x, null),
3257    
3258     () -> f.acceptEither(g, null),
3259     () -> f.acceptEitherAsync(g, null),
3260     () -> f.acceptEitherAsync(g, null, exec),
3261     () -> f.acceptEither(nullFuture, (x) -> {}),
3262     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3263     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3264     () -> f.acceptEitherAsync(g, (x) -> {}, null),
3265    
3266     () -> f.runAfterEither(g, null),
3267     () -> f.runAfterEitherAsync(g, null),
3268     () -> f.runAfterEitherAsync(g, null, exec),
3269     () -> f.runAfterEither(nullFuture, () -> {}),
3270     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3271     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3272     () -> f.runAfterEitherAsync(g, () -> {}, null),
3273    
3274     () -> f.thenCompose(null),
3275     () -> f.thenComposeAsync(null),
3276 jsr166 1.56 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
3277 jsr166 1.31 () -> f.thenComposeAsync(null, exec),
3278    
3279     () -> f.exceptionally(null),
3280    
3281     () -> f.handle(null),
3282 jsr166 1.107
3283 jsr166 1.31 () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3284     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3285     () -> CompletableFuture.allOf(f, null),
3286     () -> CompletableFuture.allOf(null, f),
3287    
3288     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3289     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3290     () -> CompletableFuture.anyOf(f, null),
3291     () -> CompletableFuture.anyOf(null, f),
3292 jsr166 1.32
3293     () -> f.obtrudeException(null),
3294 jsr166 1.115
3295     () -> CompletableFuture.delayedExecutor(1L, SECONDS, null),
3296     () -> CompletableFuture.delayedExecutor(1L, null, new ThreadExecutor()),
3297     () -> CompletableFuture.delayedExecutor(1L, null),
3298 jsr166 1.116
3299     () -> f.orTimeout(1L, null),
3300     () -> f.completeOnTimeout(42, 1L, null),
3301 jsr166 1.121
3302     () -> CompletableFuture.failedFuture(null),
3303     () -> CompletableFuture.failedStage(null),
3304 jsr166 1.14 };
3305 dl 1.5
3306 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3307 jsr166 1.17 assertEquals(0, exec.count.get());
3308 dl 1.5 }
3309    
3310 dl 1.26 /**
3311     * toCompletableFuture returns this CompletableFuture.
3312     */
3313     public void testToCompletableFuture() {
3314     CompletableFuture<Integer> f = new CompletableFuture<>();
3315     assertSame(f, f.toCompletableFuture());
3316     }
3317    
3318 dl 1.103 // jdk9
3319 jsr166 1.104
3320 dl 1.103 /**
3321     * newIncompleteFuture returns an incomplete CompletableFuture
3322     */
3323     public void testNewIncompleteFuture() {
3324 jsr166 1.117 for (Integer v1 : new Integer[] { 1, null })
3325     {
3326 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3327     CompletableFuture<Integer> g = f.newIncompleteFuture();
3328     checkIncomplete(f);
3329     checkIncomplete(g);
3330 jsr166 1.117 f.complete(v1);
3331     checkCompletedNormally(f, v1);
3332     checkIncomplete(g);
3333     g.complete(v1);
3334     checkCompletedNormally(g, v1);
3335     assertSame(g.getClass(), CompletableFuture.class);
3336     }}
3337 dl 1.103
3338     /**
3339     * completedStage returns a completed CompletionStage
3340     */
3341     public void testCompletedStage() {
3342 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3343 dl 1.103 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3344     CompletionStage<Integer> f = CompletableFuture.completedStage(1);
3345     f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3346     assertEquals(x.get(), 1);
3347     assertNull(r.get());
3348     }
3349    
3350     /**
3351     * defaultExecutor by default returns the commonPool if
3352 dl 1.110 * it supports more than one thread.
3353 dl 1.103 */
3354     public void testDefaultExecutor() {
3355     CompletableFuture<Integer> f = new CompletableFuture<>();
3356     Executor e = f.defaultExecutor();
3357 jsr166 1.108 Executor c = ForkJoinPool.commonPool();
3358 dl 1.105 if (ForkJoinPool.getCommonPoolParallelism() > 1)
3359 dl 1.103 assertSame(e, c);
3360 jsr166 1.111 else
3361     assertNotSame(e, c);
3362 dl 1.103 }
3363    
3364     /**
3365     * failedFuture returns a CompletableFuture completed
3366     * exceptionally with the given Exception
3367     */
3368     public void testFailedFuture() {
3369     CFException ex = new CFException();
3370     CompletableFuture<Integer> f = CompletableFuture.failedFuture(ex);
3371 jsr166 1.119 checkCompletedExceptionally(f, ex);
3372 dl 1.103 }
3373    
3374     /**
3375     * failedFuture(null) throws NPE
3376     */
3377 jsr166 1.118 public void testFailedFuture_null() {
3378 dl 1.103 try {
3379     CompletableFuture<Integer> f = CompletableFuture.failedFuture(null);
3380 jsr166 1.104 shouldThrow();
3381     } catch (NullPointerException success) {}
3382 dl 1.103 }
3383    
3384     /**
3385     * copy returns a CompletableFuture that is completed normally,
3386     * with the same value, when source is.
3387     */
3388     public void testCopy() {
3389     CompletableFuture<Integer> f = new CompletableFuture<>();
3390     CompletableFuture<Integer> g = f.copy();
3391     checkIncomplete(f);
3392     checkIncomplete(g);
3393     f.complete(1);
3394     checkCompletedNormally(f, 1);
3395     checkCompletedNormally(g, 1);
3396     }
3397    
3398     /**
3399     * copy returns a CompletableFuture that is completed exceptionally
3400     * when source is.
3401     */
3402     public void testCopy2() {
3403     CompletableFuture<Integer> f = new CompletableFuture<>();
3404     CompletableFuture<Integer> g = f.copy();
3405     checkIncomplete(f);
3406     checkIncomplete(g);
3407     CFException ex = new CFException();
3408     f.completeExceptionally(ex);
3409     checkCompletedExceptionally(f, ex);
3410 jsr166 1.121 checkCompletedWithWrappedException(g, ex);
3411 dl 1.103 }
3412    
3413     /**
3414     * minimalCompletionStage returns a CompletableFuture that is
3415     * completed normally, with the same value, when source is.
3416     */
3417     public void testMinimalCompletionStage() {
3418     CompletableFuture<Integer> f = new CompletableFuture<>();
3419     CompletionStage<Integer> g = f.minimalCompletionStage();
3420 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3421 dl 1.103 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3422     checkIncomplete(f);
3423     g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3424     f.complete(1);
3425     checkCompletedNormally(f, 1);
3426     assertEquals(x.get(), 1);
3427     assertNull(r.get());
3428     }
3429    
3430     /**
3431     * minimalCompletionStage returns a CompletableFuture that is
3432     * completed exceptionally when source is.
3433     */
3434     public void testMinimalCompletionStage2() {
3435     CompletableFuture<Integer> f = new CompletableFuture<>();
3436     CompletionStage<Integer> g = f.minimalCompletionStage();
3437 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3438 dl 1.103 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3439     g.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3440     checkIncomplete(f);
3441     CFException ex = new CFException();
3442     f.completeExceptionally(ex);
3443     checkCompletedExceptionally(f, ex);
3444     assertEquals(x.get(), 0);
3445     assertEquals(r.get().getCause(), ex);
3446     }
3447    
3448     /**
3449 jsr166 1.109 * failedStage returns a CompletionStage completed
3450 dl 1.103 * exceptionally with the given Exception
3451     */
3452     public void testFailedStage() {
3453     CFException ex = new CFException();
3454     CompletionStage<Integer> f = CompletableFuture.failedStage(ex);
3455 jsr166 1.120 AtomicInteger x = new AtomicInteger(0);
3456 dl 1.103 AtomicReference<Throwable> r = new AtomicReference<Throwable>();
3457     f.whenComplete((v, e) -> {if (e != null) r.set(e); else x.set(v);});
3458     assertEquals(x.get(), 0);
3459 jsr166 1.119 assertEquals(r.get(), ex);
3460 dl 1.103 }
3461    
3462     /**
3463     * completeAsync completes with value of given supplier
3464     */
3465     public void testCompleteAsync() {
3466 jsr166 1.121 for (Integer v1 : new Integer[] { 1, null })
3467     {
3468 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3469 jsr166 1.121 f.completeAsync(() -> v1);
3470 dl 1.103 f.join();
3471 jsr166 1.121 checkCompletedNormally(f, v1);
3472     }}
3473 dl 1.103
3474     /**
3475     * completeAsync completes exceptionally if given supplier throws
3476     */
3477     public void testCompleteAsync2() {
3478     CompletableFuture<Integer> f = new CompletableFuture<>();
3479     CFException ex = new CFException();
3480     f.completeAsync(() -> {if (true) throw ex; return 1;});
3481     try {
3482     f.join();
3483     shouldThrow();
3484 jsr166 1.121 } catch (CompletionException success) {}
3485     checkCompletedWithWrappedException(f, ex);
3486 dl 1.103 }
3487    
3488     /**
3489     * completeAsync with given executor completes with value of given supplier
3490     */
3491     public void testCompleteAsync3() {
3492 jsr166 1.121 for (Integer v1 : new Integer[] { 1, null })
3493     {
3494 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3495 jsr166 1.121 ThreadExecutor executor = new ThreadExecutor();
3496     f.completeAsync(() -> v1, executor);
3497     assertSame(v1, f.join());
3498     checkCompletedNormally(f, v1);
3499     assertEquals(1, executor.count.get());
3500     }}
3501 dl 1.103
3502     /**
3503     * completeAsync with given executor completes exceptionally if
3504     * given supplier throws
3505     */
3506     public void testCompleteAsync4() {
3507     CompletableFuture<Integer> f = new CompletableFuture<>();
3508     CFException ex = new CFException();
3509 jsr166 1.121 ThreadExecutor executor = new ThreadExecutor();
3510     f.completeAsync(() -> {if (true) throw ex; return 1;}, executor);
3511 dl 1.103 try {
3512     f.join();
3513     shouldThrow();
3514 jsr166 1.121 } catch (CompletionException success) {}
3515     checkCompletedWithWrappedException(f, ex);
3516     assertEquals(1, executor.count.get());
3517 dl 1.103 }
3518    
3519     /**
3520 jsr166 1.106 * orTimeout completes with TimeoutException if not complete
3521 dl 1.103 */
3522 jsr166 1.121 public void testOrTimeout_timesOut() {
3523     long timeoutMillis = timeoutMillis();
3524 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3525 jsr166 1.121 long startTime = System.nanoTime();
3526     f.orTimeout(timeoutMillis, MILLISECONDS);
3527     checkCompletedWithTimeoutException(f);
3528     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3529 dl 1.103 }
3530    
3531     /**
3532 jsr166 1.106 * orTimeout completes normally if completed before timeout
3533 dl 1.103 */
3534 jsr166 1.121 public void testOrTimeout_completed() {
3535     for (Integer v1 : new Integer[] { 1, null })
3536     {
3537 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3538 jsr166 1.121 CompletableFuture<Integer> g = new CompletableFuture<>();
3539     long startTime = System.nanoTime();
3540     f.complete(v1);
3541     f.orTimeout(LONG_DELAY_MS, MILLISECONDS);
3542     g.orTimeout(LONG_DELAY_MS, MILLISECONDS);
3543     g.complete(v1);
3544     checkCompletedNormally(f, v1);
3545     checkCompletedNormally(g, v1);
3546     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3547     }}
3548 dl 1.103
3549     /**
3550 jsr166 1.106 * completeOnTimeout completes with given value if not complete
3551 dl 1.103 */
3552 jsr166 1.121 public void testCompleteOnTimeout_timesOut() {
3553     testInParallel(() -> testCompleteOnTimeout_timesOut(42),
3554     () -> testCompleteOnTimeout_timesOut(null));
3555     }
3556    
3557     public void testCompleteOnTimeout_timesOut(Integer v) {
3558     long timeoutMillis = timeoutMillis();
3559 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3560 jsr166 1.121 long startTime = System.nanoTime();
3561     f.completeOnTimeout(v, timeoutMillis, MILLISECONDS);
3562     assertSame(v, f.join());
3563     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
3564     f.complete(99); // should have no effect
3565     checkCompletedNormally(f, v);
3566 dl 1.103 }
3567    
3568     /**
3569 jsr166 1.106 * completeOnTimeout has no effect if completed within timeout
3570 dl 1.103 */
3571 jsr166 1.121 public void testCompleteOnTimeout_completed() {
3572     for (Integer v1 : new Integer[] { 1, null })
3573     {
3574 dl 1.103 CompletableFuture<Integer> f = new CompletableFuture<>();
3575 jsr166 1.121 CompletableFuture<Integer> g = new CompletableFuture<>();
3576     long startTime = System.nanoTime();
3577     f.complete(v1);
3578     f.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS);
3579     g.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS);
3580     g.complete(v1);
3581     checkCompletedNormally(f, v1);
3582     checkCompletedNormally(g, v1);
3583     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS / 2);
3584     }}
3585 dl 1.103
3586     /**
3587     * delayedExecutor returns an executor that delays submission
3588     */
3589 jsr166 1.121 public void testDelayedExecutor() {
3590     testInParallel(() -> testDelayedExecutor(null, null),
3591     () -> testDelayedExecutor(null, 1),
3592     () -> testDelayedExecutor(new ThreadExecutor(), 1),
3593     () -> testDelayedExecutor(new ThreadExecutor(), 1));
3594 dl 1.103 }
3595    
3596 jsr166 1.121 public void testDelayedExecutor(Executor executor, Integer v) throws Exception {
3597     long timeoutMillis = timeoutMillis();
3598     // Use an "unreasonably long" long timeout to catch lingering threads
3599     long longTimeoutMillis = 1000 * 60 * 60 * 24;
3600     final Executor delayer, longDelayer;
3601     if (executor == null) {
3602     delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS);
3603     longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS);
3604     } else {
3605     delayer = CompletableFuture.delayedExecutor(timeoutMillis, MILLISECONDS, executor);
3606     longDelayer = CompletableFuture.delayedExecutor(longTimeoutMillis, MILLISECONDS, executor);
3607     }
3608 dl 1.103 long startTime = System.nanoTime();
3609 jsr166 1.121 CompletableFuture<Integer> f =
3610     CompletableFuture.supplyAsync(() -> v, delayer);
3611     CompletableFuture<Integer> g =
3612     CompletableFuture.supplyAsync(() -> v, longDelayer);
3613    
3614     assertNull(g.getNow(null));
3615    
3616     assertSame(v, f.get(LONG_DELAY_MS, MILLISECONDS));
3617     long millisElapsed = millisElapsedSince(startTime);
3618     assertTrue(millisElapsed >= timeoutMillis);
3619     assertTrue(millisElapsed < LONG_DELAY_MS / 2);
3620    
3621     checkCompletedNormally(f, v);
3622    
3623     checkIncomplete(g);
3624     assertTrue(g.cancel(true));
3625 dl 1.103 }
3626    
3627 jsr166 1.82 //--- tests of implementation details; not part of official tck ---
3628    
3629     Object resultOf(CompletableFuture<?> f) {
3630     try {
3631     java.lang.reflect.Field resultField
3632     = CompletableFuture.class.getDeclaredField("result");
3633     resultField.setAccessible(true);
3634     return resultField.get(f);
3635     } catch (Throwable t) { throw new AssertionError(t); }
3636     }
3637    
3638     public void testExceptionPropagationReusesResultObject() {
3639     if (!testImplementationDetails) return;
3640     for (ExecutionMode m : ExecutionMode.values())
3641     {
3642 jsr166 1.83 final CFException ex = new CFException();
3643     final CompletableFuture<Integer> v42 = CompletableFuture.completedFuture(42);
3644     final CompletableFuture<Integer> incomplete = new CompletableFuture<>();
3645    
3646 jsr166 1.89 List<Function<CompletableFuture<Integer>, CompletableFuture<?>>> funs
3647 jsr166 1.83 = new ArrayList<>();
3648    
3649 jsr166 1.89 funs.add((y) -> m.thenRun(y, new Noop(m)));
3650     funs.add((y) -> m.thenAccept(y, new NoopConsumer(m)));
3651     funs.add((y) -> m.thenApply(y, new IncFunction(m)));
3652 jsr166 1.83
3653 jsr166 1.89 funs.add((y) -> m.runAfterEither(y, incomplete, new Noop(m)));
3654     funs.add((y) -> m.acceptEither(y, incomplete, new NoopConsumer(m)));
3655     funs.add((y) -> m.applyToEither(y, incomplete, new IncFunction(m)));
3656 jsr166 1.83
3657 jsr166 1.89 funs.add((y) -> m.runAfterBoth(y, v42, new Noop(m)));
3658     funs.add((y) -> m.thenAcceptBoth(y, v42, new SubtractAction(m)));
3659     funs.add((y) -> m.thenCombine(y, v42, new SubtractFunction(m)));
3660 jsr166 1.83
3661 jsr166 1.135 funs.add((y) -> m.whenComplete(y, (Integer r, Throwable t) -> {}));
3662 jsr166 1.83
3663 jsr166 1.89 funs.add((y) -> m.thenCompose(y, new CompletableFutureInc(m)));
3664 jsr166 1.83
3665 jsr166 1.89 funs.add((y) -> CompletableFuture.allOf(new CompletableFuture<?>[] {y, v42}));
3666     funs.add((y) -> CompletableFuture.anyOf(new CompletableFuture<?>[] {y, incomplete}));
3667 jsr166 1.85
3668 jsr166 1.83 for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3669 jsr166 1.89 fun : funs) {
3670 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3671     f.completeExceptionally(ex);
3672     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3673     checkCompletedWithWrappedException(src, ex);
3674 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3675 jsr166 1.83 checkCompletedWithWrappedException(dep, ex);
3676     assertSame(resultOf(src), resultOf(dep));
3677     }
3678    
3679     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3680 jsr166 1.89 fun : funs) {
3681 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3682     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3683 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3684 jsr166 1.83 f.completeExceptionally(ex);
3685     checkCompletedWithWrappedException(src, ex);
3686     checkCompletedWithWrappedException(dep, ex);
3687     assertSame(resultOf(src), resultOf(dep));
3688     }
3689    
3690     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3691     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3692 jsr166 1.89 fun : funs) {
3693 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3694     f.cancel(mayInterruptIfRunning);
3695     checkCancelled(f);
3696     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3697     checkCompletedWithWrappedCancellationException(src);
3698 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3699 jsr166 1.83 checkCompletedWithWrappedCancellationException(dep);
3700     assertSame(resultOf(src), resultOf(dep));
3701     }
3702    
3703     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3704     for (Function<CompletableFuture<Integer>, CompletableFuture<?>>
3705 jsr166 1.89 fun : funs) {
3706 jsr166 1.83 CompletableFuture<Integer> f = new CompletableFuture<>();
3707     CompletableFuture<Integer> src = m.thenApply(f, new IncFunction(m));
3708 jsr166 1.89 CompletableFuture<?> dep = fun.apply(src);
3709 jsr166 1.83 f.cancel(mayInterruptIfRunning);
3710     checkCancelled(f);
3711     checkCompletedWithWrappedCancellationException(src);
3712     checkCompletedWithWrappedCancellationException(dep);
3713     assertSame(resultOf(src), resultOf(dep));
3714     }
3715 jsr166 1.82 }}
3716    
3717 jsr166 1.123 /**
3718     * Minimal completion stages throw UOE for all non-CompletionStage methods
3719     */
3720     public void testMinimalCompletionStage_minimality() {
3721     if (!testImplementationDetails) return;
3722     Function<Method, String> toSignature =
3723     (method) -> method.getName() + Arrays.toString(method.getParameterTypes());
3724 jsr166 1.124 Predicate<Method> isNotStatic =
3725     (method) -> (method.getModifiers() & Modifier.STATIC) == 0;
3726 jsr166 1.123 List<Method> minimalMethods =
3727     Stream.of(Object.class, CompletionStage.class)
3728 jsr166 1.125 .flatMap((klazz) -> Stream.of(klazz.getMethods()))
3729 jsr166 1.124 .filter(isNotStatic)
3730 jsr166 1.123 .collect(Collectors.toList());
3731     // Methods from CompletableFuture permitted NOT to throw UOE
3732     String[] signatureWhitelist = {
3733     "newIncompleteFuture[]",
3734     "defaultExecutor[]",
3735     "minimalCompletionStage[]",
3736     "copy[]",
3737     };
3738     Set<String> permittedMethodSignatures =
3739     Stream.concat(minimalMethods.stream().map(toSignature),
3740     Stream.of(signatureWhitelist))
3741     .collect(Collectors.toSet());
3742     List<Method> allMethods = Stream.of(CompletableFuture.class.getMethods())
3743 jsr166 1.124 .filter(isNotStatic)
3744 jsr166 1.123 .filter((method) -> !permittedMethodSignatures.contains(toSignature.apply(method)))
3745     .collect(Collectors.toList());
3746    
3747     CompletionStage<Integer> minimalStage =
3748     new CompletableFuture<Integer>().minimalCompletionStage();
3749    
3750     List<Method> bugs = new ArrayList<>();
3751     for (Method method : allMethods) {
3752     Class<?>[] parameterTypes = method.getParameterTypes();
3753     Object[] args = new Object[parameterTypes.length];
3754     // Manufacture boxed primitives for primitive params
3755     for (int i = 0; i < args.length; i++) {
3756     Class<?> type = parameterTypes[i];
3757     if (parameterTypes[i] == boolean.class)
3758     args[i] = false;
3759     else if (parameterTypes[i] == int.class)
3760     args[i] = 0;
3761     else if (parameterTypes[i] == long.class)
3762     args[i] = 0L;
3763     }
3764     try {
3765     method.invoke(minimalStage, args);
3766     bugs.add(method);
3767     }
3768     catch (java.lang.reflect.InvocationTargetException expected) {
3769     if (! (expected.getCause() instanceof UnsupportedOperationException)) {
3770     bugs.add(method);
3771     // expected.getCause().printStackTrace();
3772     }
3773     }
3774     catch (ReflectiveOperationException bad) { throw new Error(bad); }
3775     }
3776     if (!bugs.isEmpty())
3777     throw new Error("Methods did not throw UOE: " + bugs.toString());
3778     }
3779    
3780 jsr166 1.128 static class Monad {
3781 jsr166 1.131 static class ZeroException extends RuntimeException {
3782     public ZeroException() { super("monadic zero"); }
3783 jsr166 1.128 }
3784     // "return", "unit"
3785     static <T> CompletableFuture<T> unit(T value) {
3786     return completedFuture(value);
3787     }
3788     // monadic zero ?
3789 jsr166 1.129 static <T> CompletableFuture<T> zero() {
3790 jsr166 1.131 return failedFuture(new ZeroException());
3791 jsr166 1.128 }
3792     // >=>
3793     static <T,U,V> Function<T, CompletableFuture<V>> compose
3794     (Function<T, CompletableFuture<U>> f,
3795     Function<U, CompletableFuture<V>> g) {
3796     return (x) -> f.apply(x).thenCompose(g);
3797     }
3798    
3799     static void assertZero(CompletableFuture<?> f) {
3800     try {
3801     f.getNow(null);
3802     throw new AssertionFailedError("should throw");
3803     } catch (CompletionException success) {
3804 jsr166 1.131 assertTrue(success.getCause() instanceof ZeroException);
3805 jsr166 1.128 }
3806     }
3807    
3808     static <T> void assertFutureEquals(CompletableFuture<T> f,
3809     CompletableFuture<T> g) {
3810     T fval = null, gval = null;
3811     Throwable fex = null, gex = null;
3812    
3813     try { fval = f.get(); }
3814     catch (ExecutionException ex) { fex = ex.getCause(); }
3815     catch (Throwable ex) { fex = ex; }
3816    
3817     try { gval = g.get(); }
3818     catch (ExecutionException ex) { gex = ex.getCause(); }
3819     catch (Throwable ex) { gex = ex; }
3820    
3821     if (fex != null || gex != null)
3822     assertSame(fex.getClass(), gex.getClass());
3823     else
3824     assertEquals(fval, gval);
3825     }
3826    
3827     static class PlusFuture<T> extends CompletableFuture<T> {
3828     AtomicReference<Throwable> firstFailure = new AtomicReference<>(null);
3829     }
3830    
3831 jsr166 1.137 /** Implements "monadic plus". */
3832 jsr166 1.128 static <T> CompletableFuture<T> plus(CompletableFuture<? extends T> f,
3833     CompletableFuture<? extends T> g) {
3834     PlusFuture<T> plus = new PlusFuture<T>();
3835 jsr166 1.129 BiConsumer<T, Throwable> action = (T result, Throwable ex) -> {
3836 jsr166 1.137 try {
3837     if (ex == null) {
3838     if (plus.complete(result))
3839     if (plus.firstFailure.get() != null)
3840     plus.firstFailure.set(null);
3841     }
3842     else if (plus.firstFailure.compareAndSet(null, ex)) {
3843     if (plus.isDone())
3844 jsr166 1.128 plus.firstFailure.set(null);
3845 jsr166 1.137 }
3846     else {
3847     // first failure has precedence
3848     Throwable first = plus.firstFailure.getAndSet(null);
3849    
3850     // may fail with "Self-suppression not permitted"
3851     try { first.addSuppressed(ex); }
3852     catch (Exception ignored) {}
3853    
3854     plus.completeExceptionally(first);
3855     }
3856     } catch (Throwable unexpected) {
3857     plus.completeExceptionally(unexpected);
3858 jsr166 1.128 }
3859     };
3860     f.whenComplete(action);
3861     g.whenComplete(action);
3862     return plus;
3863     }
3864     }
3865    
3866     /**
3867     * CompletableFuture is an additive monad - sort of.
3868     * https://en.wikipedia.org/wiki/Monad_(functional_programming)#Additive_monads
3869     */
3870     public void testAdditiveMonad() throws Throwable {
3871 jsr166 1.129 Function<Long, CompletableFuture<Long>> unit = Monad::unit;
3872     CompletableFuture<Long> zero = Monad.zero();
3873    
3874 jsr166 1.128 // Some mutually non-commutative functions
3875     Function<Long, CompletableFuture<Long>> triple
3876 jsr166 1.129 = (x) -> Monad.unit(3 * x);
3877 jsr166 1.128 Function<Long, CompletableFuture<Long>> inc
3878 jsr166 1.129 = (x) -> Monad.unit(x + 1);
3879 jsr166 1.128
3880     // unit is a right identity: m >>= unit === m
3881 jsr166 1.129 Monad.assertFutureEquals(inc.apply(5L).thenCompose(unit),
3882     inc.apply(5L));
3883 jsr166 1.128 // unit is a left identity: (unit x) >>= f === f x
3884 jsr166 1.129 Monad.assertFutureEquals(unit.apply(5L).thenCompose(inc),
3885     inc.apply(5L));
3886    
3887 jsr166 1.128 // associativity: (m >>= f) >>= g === m >>= ( \x -> (f x >>= g) )
3888     Monad.assertFutureEquals(
3889     unit.apply(5L).thenCompose(inc).thenCompose(triple),
3890     unit.apply(5L).thenCompose((x) -> inc.apply(x).thenCompose(triple)));
3891    
3892 jsr166 1.129 // The case for CompletableFuture as an additive monad is weaker...
3893    
3894 jsr166 1.128 // zero is a monadic zero
3895 jsr166 1.129 Monad.assertZero(zero);
3896    
3897 jsr166 1.128 // left zero: zero >>= f === zero
3898 jsr166 1.129 Monad.assertZero(zero.thenCompose(inc));
3899     // right zero: f >>= (\x -> zero) === zero
3900     Monad.assertZero(inc.apply(5L).thenCompose((x) -> zero));
3901    
3902     // f plus zero === f
3903     Monad.assertFutureEquals(Monad.unit(5L),
3904     Monad.plus(Monad.unit(5L), zero));
3905     // zero plus f === f
3906     Monad.assertFutureEquals(Monad.unit(5L),
3907     Monad.plus(zero, Monad.unit(5L)));
3908 jsr166 1.128 // zero plus zero === zero
3909 jsr166 1.129 Monad.assertZero(Monad.plus(zero, zero));
3910 jsr166 1.128 {
3911 jsr166 1.129 CompletableFuture<Long> f = Monad.plus(Monad.unit(5L),
3912     Monad.unit(8L));
3913     // non-determinism
3914     assertTrue(f.get() == 5L || f.get() == 8L);
3915 jsr166 1.128 }
3916    
3917     CompletableFuture<Long> godot = new CompletableFuture<>();
3918 jsr166 1.129 // f plus godot === f (doesn't wait for godot)
3919     Monad.assertFutureEquals(Monad.unit(5L),
3920     Monad.plus(Monad.unit(5L), godot));
3921     // godot plus f === f (doesn't wait for godot)
3922     Monad.assertFutureEquals(Monad.unit(5L),
3923     Monad.plus(godot, Monad.unit(5L)));
3924 jsr166 1.128 }
3925    
3926 jsr166 1.123 // static <U> U join(CompletionStage<U> stage) {
3927     // CompletableFuture<U> f = new CompletableFuture<>();
3928     // stage.whenComplete((v, ex) -> {
3929     // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
3930     // });
3931     // return f.join();
3932     // }
3933    
3934     // static <U> boolean isDone(CompletionStage<U> stage) {
3935     // CompletableFuture<U> f = new CompletableFuture<>();
3936     // stage.whenComplete((v, ex) -> {
3937     // if (ex != null) f.completeExceptionally(ex); else f.complete(v);
3938     // });
3939     // return f.isDone();
3940     // }
3941    
3942     // static <U> U join2(CompletionStage<U> stage) {
3943     // return stage.toCompletableFuture().copy().join();
3944     // }
3945    
3946     // static <U> boolean isDone2(CompletionStage<U> stage) {
3947     // return stage.toCompletableFuture().copy().isDone();
3948     // }
3949    
3950 jsr166 1.1 }