ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.143
Committed: Sun Apr 3 17:09:46 2016 UTC (8 years, 1 month ago) by jsr166
Branch: MAIN
Changes since 1.142: +1 -1 lines
Log Message:
testNPE: very small simplification

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