ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.93
Committed: Tue Jun 17 21:09:56 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.92: +19 -15 lines
Log Message:
add tests with 2 identical sources

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