ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.121
Committed: Sun Sep 6 21:14:12 2015 UTC (8 years, 8 months ago) by jsr166
Branch: MAIN
Changes since 1.120: +154 -183 lines
Log Message:
improve jdk9 CompletableFuture tests

File Contents

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