ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.79
Committed: Mon Jun 16 17:08:15 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.78: +101 -52 lines
Log Message:
improve tests for thenCombine

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 (boolean createIncomplete : new boolean[] { true, false })
1268     for (Integer v1 : new Integer[] { 1, null })
1269     {
1270     final CompletableFuture<Integer> f = new CompletableFuture<>();
1271 jsr166 1.55 final Noop r = new Noop(m);
1272 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1273 jsr166 1.48 final CompletableFuture<Void> g = m.thenRun(f, r);
1274 jsr166 1.51 if (createIncomplete) {
1275     checkIncomplete(g);
1276 jsr166 1.78 assertTrue(f.complete(v1));
1277 jsr166 1.51 }
1278 jsr166 1.23
1279 dl 1.5 checkCompletedNormally(g, null);
1280 jsr166 1.48 checkCompletedNormally(f, v1);
1281 jsr166 1.62 r.assertInvoked();
1282 jsr166 1.48 }}
1283 dl 1.5
1284     /**
1285     * thenRun result completes exceptionally after exceptional
1286     * completion of source
1287     */
1288 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
1289     for (ExecutionMode m : ExecutionMode.values())
1290     for (boolean createIncomplete : new boolean[] { true, false })
1291     {
1292     final CFException ex = new CFException();
1293     final CompletableFuture<Integer> f = new CompletableFuture<>();
1294 jsr166 1.55 final Noop r = new Noop(m);
1295 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
1296     final CompletableFuture<Void> g = m.thenRun(f, r);
1297 jsr166 1.51 if (createIncomplete) {
1298     checkIncomplete(g);
1299     f.completeExceptionally(ex);
1300     }
1301 jsr166 1.23
1302 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
1303     checkCompletedExceptionally(f, ex);
1304 jsr166 1.62 r.assertNotInvoked();
1305 jsr166 1.48 }}
1306    
1307     /**
1308     * thenRun result completes exceptionally if source cancelled
1309     */
1310     public void testThenRun_sourceCancelled() {
1311     for (ExecutionMode m : ExecutionMode.values())
1312     for (boolean createIncomplete : new boolean[] { true, false })
1313     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1314     {
1315     final CompletableFuture<Integer> f = new CompletableFuture<>();
1316 jsr166 1.55 final Noop r = new Noop(m);
1317 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1318 jsr166 1.56 final CompletableFuture<Void> g = m.thenRun(f, r);
1319 jsr166 1.51 if (createIncomplete) {
1320     checkIncomplete(g);
1321     assertTrue(f.cancel(mayInterruptIfRunning));
1322     }
1323 jsr166 1.23
1324 jsr166 1.48 checkCompletedWithWrappedCancellationException(g);
1325     checkCancelled(f);
1326 jsr166 1.62 r.assertNotInvoked();
1327 jsr166 1.48 }}
1328 dl 1.5
1329     /**
1330     * thenRun result completes exceptionally if action does
1331     */
1332 jsr166 1.48 public void testThenRun_actionFailed() {
1333     for (ExecutionMode m : ExecutionMode.values())
1334     for (boolean createIncomplete : new boolean[] { true, false })
1335     for (Integer v1 : new Integer[] { 1, null })
1336     {
1337     final CompletableFuture<Integer> f = new CompletableFuture<>();
1338 jsr166 1.56 final FailingRunnable r = new FailingRunnable(m);
1339 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1340 jsr166 1.56 final CompletableFuture<Void> g = m.thenRun(f, r);
1341 jsr166 1.51 if (createIncomplete) {
1342     checkIncomplete(g);
1343 jsr166 1.78 assertTrue(f.complete(v1));
1344 jsr166 1.51 }
1345 jsr166 1.23
1346     checkCompletedWithWrappedCFException(g);
1347 jsr166 1.48 checkCompletedNormally(f, v1);
1348     }}
1349 dl 1.5
1350     /**
1351     * thenApply result completes normally after normal completion of source
1352     */
1353 jsr166 1.49 public void testThenApply_normalCompletion() {
1354     for (ExecutionMode m : ExecutionMode.values())
1355     for (boolean createIncomplete : new boolean[] { true, false })
1356     for (Integer v1 : new Integer[] { 1, null })
1357     {
1358     final CompletableFuture<Integer> f = new CompletableFuture<>();
1359 jsr166 1.56 final IncFunction r = new IncFunction(m);
1360 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1361 jsr166 1.49 final CompletableFuture<Integer> g = m.thenApply(f, r);
1362     if (createIncomplete) {
1363     checkIncomplete(g);
1364 jsr166 1.78 assertTrue(f.complete(v1));
1365 jsr166 1.49 }
1366    
1367     checkCompletedNormally(g, inc(v1));
1368     checkCompletedNormally(f, v1);
1369 jsr166 1.70 r.assertValue(inc(v1));
1370 jsr166 1.49 }}
1371 dl 1.5
1372     /**
1373     * thenApply result completes exceptionally after exceptional
1374     * completion of source
1375     */
1376 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1377     for (ExecutionMode m : ExecutionMode.values())
1378     for (boolean createIncomplete : new boolean[] { true, false })
1379     {
1380     final CFException ex = new CFException();
1381     final CompletableFuture<Integer> f = new CompletableFuture<>();
1382 jsr166 1.56 final IncFunction r = new IncFunction(m);
1383 jsr166 1.49 if (!createIncomplete) f.completeExceptionally(ex);
1384     final CompletableFuture<Integer> g = m.thenApply(f, r);
1385 jsr166 1.51 if (createIncomplete) {
1386     checkIncomplete(g);
1387     f.completeExceptionally(ex);
1388     }
1389 jsr166 1.49
1390 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
1391     checkCompletedExceptionally(f, ex);
1392 jsr166 1.62 r.assertNotInvoked();
1393 jsr166 1.49 }}
1394 dl 1.5
1395     /**
1396 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1397 dl 1.5 */
1398 jsr166 1.49 public void testThenApply_sourceCancelled() {
1399     for (ExecutionMode m : ExecutionMode.values())
1400     for (boolean createIncomplete : new boolean[] { true, false })
1401     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1402     {
1403     final CompletableFuture<Integer> f = new CompletableFuture<>();
1404 jsr166 1.56 final IncFunction r = new IncFunction(m);
1405 jsr166 1.49 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1406 jsr166 1.56 final CompletableFuture<Integer> g = m.thenApply(f, r);
1407 jsr166 1.51 if (createIncomplete) {
1408     checkIncomplete(g);
1409     assertTrue(f.cancel(mayInterruptIfRunning));
1410     }
1411 jsr166 1.49
1412     checkCompletedWithWrappedCancellationException(g);
1413     checkCancelled(f);
1414 jsr166 1.62 r.assertNotInvoked();
1415 jsr166 1.49 }}
1416 dl 1.5
1417     /**
1418 jsr166 1.49 * thenApply result completes exceptionally if action does
1419 dl 1.5 */
1420 jsr166 1.49 public void testThenApply_actionFailed() {
1421     for (ExecutionMode m : ExecutionMode.values())
1422     for (boolean createIncomplete : new boolean[] { true, false })
1423     for (Integer v1 : new Integer[] { 1, null })
1424     {
1425     final CompletableFuture<Integer> f = new CompletableFuture<>();
1426 jsr166 1.56 final FailingFunction r = new FailingFunction(m);
1427 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1428 jsr166 1.56 final CompletableFuture<Integer> g = m.thenApply(f, r);
1429 jsr166 1.51 if (createIncomplete) {
1430     checkIncomplete(g);
1431 jsr166 1.78 assertTrue(f.complete(v1));
1432 jsr166 1.51 }
1433 jsr166 1.49
1434     checkCompletedWithWrappedCFException(g);
1435     checkCompletedNormally(f, v1);
1436     }}
1437 dl 1.5
1438     /**
1439     * thenAccept result completes normally after normal completion of source
1440     */
1441 jsr166 1.50 public void testThenAccept_normalCompletion() {
1442     for (ExecutionMode m : ExecutionMode.values())
1443     for (boolean createIncomplete : new boolean[] { true, false })
1444     for (Integer v1 : new Integer[] { 1, null })
1445     {
1446     final CompletableFuture<Integer> f = new CompletableFuture<>();
1447 jsr166 1.64 final NoopConsumer r = new NoopConsumer(m);
1448 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
1449 jsr166 1.50 final CompletableFuture<Void> g = m.thenAccept(f, r);
1450 jsr166 1.51 if (createIncomplete) {
1451     checkIncomplete(g);
1452 jsr166 1.78 assertTrue(f.complete(v1));
1453 jsr166 1.51 }
1454 jsr166 1.50
1455 dl 1.5 checkCompletedNormally(g, null);
1456 jsr166 1.64 r.assertValue(v1);
1457 jsr166 1.50 checkCompletedNormally(f, v1);
1458     }}
1459 dl 1.5
1460     /**
1461     * thenAccept result completes exceptionally after exceptional
1462     * completion of source
1463     */
1464 jsr166 1.50 public void testThenAccept_exceptionalCompletion() {
1465     for (ExecutionMode m : ExecutionMode.values())
1466     for (boolean createIncomplete : new boolean[] { true, false })
1467     {
1468     final CFException ex = new CFException();
1469     final CompletableFuture<Integer> f = new CompletableFuture<>();
1470 jsr166 1.64 final NoopConsumer r = new NoopConsumer(m);
1471 jsr166 1.50 if (!createIncomplete) f.completeExceptionally(ex);
1472     final CompletableFuture<Void> g = m.thenAccept(f, r);
1473 jsr166 1.51 if (createIncomplete) {
1474     checkIncomplete(g);
1475     f.completeExceptionally(ex);
1476     }
1477 jsr166 1.50
1478 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
1479     checkCompletedExceptionally(f, ex);
1480 jsr166 1.62 r.assertNotInvoked();
1481 jsr166 1.50 }}
1482 dl 1.5
1483     /**
1484 jsr166 1.61 * thenAccept result completes exceptionally if source cancelled
1485 dl 1.5 */
1486 jsr166 1.61 public void testThenAccept_sourceCancelled() {
1487 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1488     for (boolean createIncomplete : new boolean[] { true, false })
1489 jsr166 1.61 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1490 jsr166 1.50 {
1491     final CompletableFuture<Integer> f = new CompletableFuture<>();
1492 jsr166 1.64 final NoopConsumer r = new NoopConsumer(m);
1493 jsr166 1.61 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1494 jsr166 1.56 final CompletableFuture<Void> g = m.thenAccept(f, r);
1495 jsr166 1.51 if (createIncomplete) {
1496     checkIncomplete(g);
1497 jsr166 1.61 assertTrue(f.cancel(mayInterruptIfRunning));
1498 jsr166 1.51 }
1499 jsr166 1.50
1500 jsr166 1.61 checkCompletedWithWrappedCancellationException(g);
1501     checkCancelled(f);
1502 jsr166 1.62 r.assertNotInvoked();
1503 jsr166 1.50 }}
1504 dl 1.5
1505     /**
1506 jsr166 1.61 * thenAccept result completes exceptionally if action does
1507 dl 1.5 */
1508 jsr166 1.61 public void testThenAccept_actionFailed() {
1509 jsr166 1.50 for (ExecutionMode m : ExecutionMode.values())
1510     for (boolean createIncomplete : new boolean[] { true, false })
1511 jsr166 1.61 for (Integer v1 : new Integer[] { 1, null })
1512 jsr166 1.50 {
1513     final CompletableFuture<Integer> f = new CompletableFuture<>();
1514 jsr166 1.61 final FailingConsumer r = new FailingConsumer(m);
1515     if (!createIncomplete) f.complete(v1);
1516 jsr166 1.56 final CompletableFuture<Void> g = m.thenAccept(f, r);
1517 jsr166 1.50 if (createIncomplete) {
1518     checkIncomplete(g);
1519 jsr166 1.61 f.complete(v1);
1520 jsr166 1.50 }
1521    
1522 jsr166 1.61 checkCompletedWithWrappedCFException(g);
1523     checkCompletedNormally(f, v1);
1524 jsr166 1.50 }}
1525 dl 1.5
1526     /**
1527 jsr166 1.18 * thenCombine result completes normally after normal completion
1528     * of sources
1529 dl 1.5 */
1530 jsr166 1.51 public void testThenCombine_normalCompletion() {
1531     for (ExecutionMode m : ExecutionMode.values())
1532 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1533 jsr166 1.36 for (Integer v1 : new Integer[] { 1, null })
1534 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1535     {
1536 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1537     final CompletableFuture<Integer> g = new CompletableFuture<>();
1538 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1539     final SubtractFunction r2 = new SubtractFunction(m);
1540     final SubtractFunction r3 = new SubtractFunction(m);
1541    
1542     final CompletableFuture<Integer> fst = fFirst ? f : g;
1543     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1544     final Integer w1 = fFirst ? v1 : v2;
1545     final Integer w2 = !fFirst ? v1 : v2;
1546    
1547     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1548     assertTrue(fst.complete(w1));
1549     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1550     checkIncomplete(h1);
1551     checkIncomplete(h2);
1552     r1.assertNotInvoked();
1553     r2.assertNotInvoked();
1554     assertTrue(snd.complete(w2));
1555     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1556    
1557     checkCompletedNormally(h1, subtract(v1, v2));
1558     checkCompletedNormally(h2, subtract(v1, v2));
1559     checkCompletedNormally(h3, subtract(v1, v2));
1560     r1.assertValue(subtract(v1, v2));
1561     r2.assertValue(subtract(v1, v2));
1562     r3.assertValue(subtract(v1, v2));
1563 jsr166 1.36 checkCompletedNormally(f, v1);
1564     checkCompletedNormally(g, v2);
1565 jsr166 1.47 }}
1566 dl 1.5
1567     /**
1568     * thenCombine result completes exceptionally after exceptional
1569     * completion of either source
1570     */
1571 jsr166 1.79 public void testThenCombine_exceptionalCompletion() throws Throwable {
1572 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1573 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1574 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1575 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1576     {
1577 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1578     final CompletableFuture<Integer> g = new CompletableFuture<>();
1579     final CFException ex = new CFException();
1580 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1581     final SubtractFunction r2 = new SubtractFunction(m);
1582     final SubtractFunction r3 = new SubtractFunction(m);
1583    
1584     final CompletableFuture<Integer> fst = fFirst ? f : g;
1585     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1586     final Callable<Boolean> complete1 = failFirst ?
1587     () -> fst.completeExceptionally(ex) :
1588     () -> fst.complete(v1);
1589     final Callable<Boolean> complete2 = failFirst ?
1590     () -> snd.complete(v1) :
1591     () -> snd.completeExceptionally(ex);
1592    
1593     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1594     assertTrue(complete1.call());
1595     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1596     checkIncomplete(h1);
1597     checkIncomplete(h2);
1598     assertTrue(complete2.call());
1599     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1600 jsr166 1.18
1601 jsr166 1.79 checkCompletedWithWrappedException(h1, ex);
1602     checkCompletedWithWrappedException(h2, ex);
1603     checkCompletedWithWrappedException(h3, ex);
1604     r1.assertNotInvoked();
1605     r2.assertNotInvoked();
1606     r3.assertNotInvoked();
1607     checkCompletedNormally(failFirst ? snd : fst, v1);
1608     checkCompletedExceptionally(failFirst ? fst : snd, ex);
1609 jsr166 1.47 }}
1610 dl 1.5
1611     /**
1612     * thenCombine result completes exceptionally if either source cancelled
1613     */
1614 jsr166 1.79 public void testThenCombine_sourceCancelled() throws Throwable {
1615 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1616     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1617 jsr166 1.52 for (boolean fFirst : new boolean[] { true, false })
1618 jsr166 1.79 for (boolean failFirst : new boolean[] { true, false })
1619 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1620     {
1621 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1622     final CompletableFuture<Integer> g = new CompletableFuture<>();
1623 jsr166 1.79 final SubtractFunction r1 = new SubtractFunction(m);
1624     final SubtractFunction r2 = new SubtractFunction(m);
1625     final SubtractFunction r3 = new SubtractFunction(m);
1626 jsr166 1.18
1627 jsr166 1.79 final CompletableFuture<Integer> fst = fFirst ? f : g;
1628     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1629     final Callable<Boolean> complete1 = failFirst ?
1630     () -> fst.cancel(mayInterruptIfRunning) :
1631     () -> fst.complete(v1);
1632     final Callable<Boolean> complete2 = failFirst ?
1633     () -> snd.complete(v1) :
1634     () -> snd.cancel(mayInterruptIfRunning);
1635    
1636     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1637     assertTrue(complete1.call());
1638     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1639     checkIncomplete(h1);
1640     checkIncomplete(h2);
1641     assertTrue(complete2.call());
1642     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1643 jsr166 1.36
1644 jsr166 1.79 checkCompletedWithWrappedCancellationException(h1);
1645     checkCompletedWithWrappedCancellationException(h2);
1646     checkCompletedWithWrappedCancellationException(h3);
1647     r1.assertNotInvoked();
1648     r2.assertNotInvoked();
1649     r3.assertNotInvoked();
1650     checkCompletedNormally(failFirst ? snd : fst, v1);
1651     checkCancelled(failFirst ? fst : snd);
1652 jsr166 1.47 }}
1653 dl 1.5
1654     /**
1655 jsr166 1.61 * thenCombine result completes exceptionally if action does
1656     */
1657     public void testThenCombine_actionFailed() {
1658     for (ExecutionMode m : ExecutionMode.values())
1659     for (boolean fFirst : new boolean[] { true, false })
1660     for (Integer v1 : new Integer[] { 1, null })
1661     for (Integer v2 : new Integer[] { 2, null })
1662     {
1663     final CompletableFuture<Integer> f = new CompletableFuture<>();
1664     final CompletableFuture<Integer> g = new CompletableFuture<>();
1665 jsr166 1.79 final FailingBiFunction r1 = new FailingBiFunction(m);
1666     final FailingBiFunction r2 = new FailingBiFunction(m);
1667     final FailingBiFunction r3 = new FailingBiFunction(m);
1668    
1669     final CompletableFuture<Integer> fst = fFirst ? f : g;
1670     final CompletableFuture<Integer> snd = !fFirst ? f : g;
1671     final Integer w1 = fFirst ? v1 : v2;
1672     final Integer w2 = !fFirst ? v1 : v2;
1673    
1674     final CompletableFuture<Integer> h1 = m.thenCombine(f, g, r1);
1675     assertTrue(fst.complete(w1));
1676     final CompletableFuture<Integer> h2 = m.thenCombine(f, g, r2);
1677     assertTrue(snd.complete(w2));
1678     final CompletableFuture<Integer> h3 = m.thenCombine(f, g, r3);
1679 jsr166 1.61
1680 jsr166 1.79 checkCompletedWithWrappedCFException(h1);
1681     checkCompletedWithWrappedCFException(h2);
1682     checkCompletedWithWrappedCFException(h3);
1683 jsr166 1.61 checkCompletedNormally(f, v1);
1684     checkCompletedNormally(g, v2);
1685     }}
1686    
1687     /**
1688 dl 1.5 * thenAcceptBoth result completes normally after normal
1689     * completion of sources
1690     */
1691 jsr166 1.53 public void testThenAcceptBoth_normalCompletion() {
1692 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1693 jsr166 1.53 for (boolean createIncomplete : new boolean[] { true, false })
1694     for (boolean fFirst : new boolean[] { true, false })
1695 jsr166 1.35 for (Integer v1 : new Integer[] { 1, null })
1696 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1697     {
1698 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1699     final CompletableFuture<Integer> g = new CompletableFuture<>();
1700 jsr166 1.56 final SubtractAction r = new SubtractAction(m);
1701 jsr166 1.35
1702 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.complete(v2));
1703 jsr166 1.53 if (!createIncomplete)
1704 jsr166 1.78 assertTrue(!fFirst ? f.complete(v1) : g.complete(v2));
1705 jsr166 1.35 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1706 jsr166 1.53 if (createIncomplete) {
1707     checkIncomplete(h);
1708 jsr166 1.62 r.assertNotInvoked();
1709 jsr166 1.78 assertTrue(!fFirst ? f.complete(v1) : g.complete(v2));
1710 jsr166 1.53 }
1711 dl 1.5
1712 jsr166 1.22 checkCompletedNormally(h, null);
1713 jsr166 1.62 r.assertValue(subtract(v1, v2));
1714 jsr166 1.35 checkCompletedNormally(f, v1);
1715     checkCompletedNormally(g, v2);
1716 jsr166 1.47 }}
1717 dl 1.5
1718     /**
1719     * thenAcceptBoth result completes exceptionally after exceptional
1720     * completion of either source
1721     */
1722 jsr166 1.53 public void testThenAcceptBoth_exceptionalCompletion() {
1723 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1724 jsr166 1.53 for (boolean createIncomplete : new boolean[] { true, false })
1725     for (boolean fFirst : new boolean[] { true, false })
1726 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1727     {
1728 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1729     final CompletableFuture<Integer> g = new CompletableFuture<>();
1730     final CFException ex = new CFException();
1731 jsr166 1.56 final SubtractAction r = new SubtractAction(m);
1732 jsr166 1.35
1733 jsr166 1.78 assertTrue((fFirst ? f : g).complete(v1));
1734 jsr166 1.53 if (!createIncomplete)
1735 jsr166 1.78 assertTrue((!fFirst ? f : g).completeExceptionally(ex));
1736 jsr166 1.35 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1737 jsr166 1.53 if (createIncomplete) {
1738     checkIncomplete(h);
1739 jsr166 1.78 assertTrue((!fFirst ? f : g).completeExceptionally(ex));
1740 jsr166 1.53 }
1741 jsr166 1.35
1742 jsr166 1.72 checkCompletedWithWrappedException(h, ex);
1743 jsr166 1.62 r.assertNotInvoked();
1744 jsr166 1.53 checkCompletedNormally(fFirst ? f : g, v1);
1745 jsr166 1.72 checkCompletedExceptionally(!fFirst ? f : g, ex);
1746 jsr166 1.47 }}
1747 dl 1.5
1748     /**
1749     * thenAcceptBoth result completes exceptionally if either source cancelled
1750     */
1751 jsr166 1.53 public void testThenAcceptBoth_sourceCancelled() {
1752 jsr166 1.35 for (ExecutionMode m : ExecutionMode.values())
1753     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1754 jsr166 1.53 for (boolean createIncomplete : new boolean[] { true, false })
1755     for (boolean fFirst : new boolean[] { true, false })
1756 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1757     {
1758 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1759     final CompletableFuture<Integer> g = new CompletableFuture<>();
1760 jsr166 1.56 final SubtractAction r = new SubtractAction(m);
1761 jsr166 1.35
1762 jsr166 1.78 assertTrue((fFirst ? f : g).complete(v1));
1763 jsr166 1.53 if (!createIncomplete)
1764     assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1765 jsr166 1.35 final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1766 jsr166 1.53 if (createIncomplete) {
1767     checkIncomplete(h);
1768     assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1769     }
1770 jsr166 1.22
1771     checkCompletedWithWrappedCancellationException(h);
1772 jsr166 1.53 checkCancelled(!fFirst ? f : g);
1773 jsr166 1.62 r.assertNotInvoked();
1774 jsr166 1.53 checkCompletedNormally(fFirst ? f : g, v1);
1775 jsr166 1.47 }}
1776 jsr166 1.34
1777     /**
1778 jsr166 1.61 * thenAcceptBoth result completes exceptionally if action does
1779     */
1780     public void testThenAcceptBoth_actionFailed() {
1781     for (ExecutionMode m : ExecutionMode.values())
1782     for (boolean fFirst : new boolean[] { true, false })
1783     for (Integer v1 : new Integer[] { 1, null })
1784     for (Integer v2 : new Integer[] { 2, null })
1785     {
1786     final CompletableFuture<Integer> f = new CompletableFuture<>();
1787     final CompletableFuture<Integer> g = new CompletableFuture<>();
1788     final FailingBiConsumer r = new FailingBiConsumer(m);
1789     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1790    
1791 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.complete(v2));
1792     assertTrue(!fFirst ? f.complete(v1) : g.complete(v2));
1793 jsr166 1.61
1794     checkCompletedWithWrappedCFException(h);
1795     checkCompletedNormally(f, v1);
1796     checkCompletedNormally(g, v2);
1797     }}
1798    
1799     /**
1800 dl 1.5 * runAfterBoth result completes normally after normal
1801     * completion of sources
1802     */
1803 jsr166 1.54 public void testRunAfterBoth_normalCompletion() {
1804 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1805 jsr166 1.54 for (boolean createIncomplete : new boolean[] { true, false })
1806     for (boolean fFirst : new boolean[] { true, false })
1807 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1808 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1809     {
1810 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1811     final CompletableFuture<Integer> g = new CompletableFuture<>();
1812 jsr166 1.55 final Noop r = new Noop(m);
1813 jsr166 1.33
1814 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.complete(v2));
1815 jsr166 1.54 if (!createIncomplete)
1816 jsr166 1.78 assertTrue(!fFirst ? f.complete(v1) : g.complete(v2));
1817 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1818 jsr166 1.54 if (createIncomplete) {
1819     checkIncomplete(h);
1820 jsr166 1.62 r.assertNotInvoked();
1821 jsr166 1.78 assertTrue(!fFirst ? f.complete(v1) : g.complete(v2));
1822 jsr166 1.54 }
1823 dl 1.5
1824 jsr166 1.22 checkCompletedNormally(h, null);
1825 jsr166 1.62 r.assertInvoked();
1826 jsr166 1.33 checkCompletedNormally(f, v1);
1827     checkCompletedNormally(g, v2);
1828 jsr166 1.47 }}
1829 dl 1.5
1830     /**
1831     * runAfterBoth result completes exceptionally after exceptional
1832     * completion of either source
1833     */
1834 jsr166 1.54 public void testRunAfterBoth_exceptionalCompletion() {
1835 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1836 jsr166 1.54 for (boolean createIncomplete : new boolean[] { true, false })
1837     for (boolean fFirst : new boolean[] { true, false })
1838 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1839     {
1840 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1841     final CompletableFuture<Integer> g = new CompletableFuture<>();
1842     final CFException ex = new CFException();
1843 jsr166 1.55 final Noop r = new Noop(m);
1844 jsr166 1.33
1845 jsr166 1.78 assertTrue((fFirst ? f : g).complete(v1));
1846 jsr166 1.54 if (!createIncomplete)
1847 jsr166 1.78 assertTrue((!fFirst ? f : g).completeExceptionally(ex));
1848 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1849 jsr166 1.54 if (createIncomplete) {
1850     checkIncomplete(h);
1851 jsr166 1.78 assertTrue((!fFirst ? f : g).completeExceptionally(ex));
1852 jsr166 1.54 }
1853 dl 1.5
1854 jsr166 1.72 checkCompletedWithWrappedException(h, ex);
1855 jsr166 1.62 r.assertNotInvoked();
1856 jsr166 1.54 checkCompletedNormally(fFirst ? f : g, v1);
1857 jsr166 1.72 checkCompletedExceptionally(!fFirst ? f : g, ex);
1858 jsr166 1.47 }}
1859 dl 1.5
1860 jsr166 1.4 /**
1861 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
1862 jsr166 1.4 */
1863 jsr166 1.54 public void testRunAfterBoth_sourceCancelled() {
1864 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1865 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1866 jsr166 1.54 for (boolean createIncomplete : new boolean[] { true, false })
1867     for (boolean fFirst : new boolean[] { true, false })
1868 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1869     {
1870 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1871     final CompletableFuture<Integer> g = new CompletableFuture<>();
1872 jsr166 1.55 final Noop r = new Noop(m);
1873 jsr166 1.33
1874 jsr166 1.78 assertTrue((fFirst ? f : g).complete(v1));
1875 jsr166 1.54 if (!createIncomplete)
1876     assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1877 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1878 jsr166 1.54 if (createIncomplete) {
1879     checkIncomplete(h);
1880     assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1881     }
1882 jsr166 1.33
1883     checkCompletedWithWrappedCancellationException(h);
1884 jsr166 1.54 checkCancelled(!fFirst ? f : g);
1885 jsr166 1.62 r.assertNotInvoked();
1886 jsr166 1.54 checkCompletedNormally(fFirst ? f : g, v1);
1887 jsr166 1.47 }}
1888 dl 1.5
1889     /**
1890 jsr166 1.61 * runAfterBoth result completes exceptionally if action does
1891     */
1892     public void testRunAfterBoth_actionFailed() {
1893     for (ExecutionMode m : ExecutionMode.values())
1894     for (boolean fFirst : new boolean[] { true, false })
1895     for (Integer v1 : new Integer[] { 1, null })
1896     for (Integer v2 : new Integer[] { 2, null })
1897     {
1898     final CompletableFuture<Integer> f = new CompletableFuture<>();
1899     final CompletableFuture<Integer> g = new CompletableFuture<>();
1900 jsr166 1.62 final FailingRunnable r1 = new FailingRunnable(m);
1901     final FailingRunnable r2 = new FailingRunnable(m);
1902 jsr166 1.61
1903 jsr166 1.62 CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r1);
1904 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.complete(v2));
1905     assertTrue(!fFirst ? f.complete(v1) : g.complete(v2));
1906 jsr166 1.62 CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r2);
1907 jsr166 1.61
1908     checkCompletedWithWrappedCFException(h1);
1909     checkCompletedWithWrappedCFException(h2);
1910     checkCompletedNormally(f, v1);
1911     checkCompletedNormally(g, v2);
1912     }}
1913    
1914     /**
1915 dl 1.5 * applyToEither result completes normally after normal completion
1916     * of either source
1917     */
1918 jsr166 1.54 public void testApplyToEither_normalCompletion() {
1919 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
1920     for (Integer v1 : new Integer[] { 1, null })
1921 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1922     {
1923 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
1924     final CompletableFuture<Integer> g = new CompletableFuture<>();
1925 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
1926     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1927 jsr166 1.54
1928 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1929     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1930     checkIncomplete(h0);
1931     checkIncomplete(h1);
1932     rs[0].assertNotInvoked();
1933     rs[1].assertNotInvoked();
1934     f.complete(v1);
1935     checkCompletedNormally(h0, inc(v1));
1936     checkCompletedNormally(h1, inc(v1));
1937     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1938     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1939     checkCompletedNormally(h2, inc(v1));
1940     checkCompletedNormally(h3, inc(v1));
1941     g.complete(v2);
1942 jsr166 1.39
1943 jsr166 1.62 // unspecified behavior - both source completions available
1944     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
1945     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
1946     rs[4].assertValue(h4.join());
1947     rs[5].assertValue(h5.join());
1948     assertTrue(Objects.equals(inc(v1), h4.join()) ||
1949     Objects.equals(inc(v2), h4.join()));
1950     assertTrue(Objects.equals(inc(v1), h5.join()) ||
1951     Objects.equals(inc(v2), h5.join()));
1952 jsr166 1.39
1953     checkCompletedNormally(f, v1);
1954     checkCompletedNormally(g, v2);
1955 jsr166 1.62 checkCompletedNormally(h0, inc(v1));
1956     checkCompletedNormally(h1, inc(v1));
1957     checkCompletedNormally(h2, inc(v1));
1958     checkCompletedNormally(h3, inc(v1));
1959     for (int i = 0; i < 4; i++) rs[i].assertValue(inc(v1));
1960 jsr166 1.47 }}
1961 dl 1.5
1962     /**
1963     * applyToEither result completes exceptionally after exceptional
1964     * completion of either source
1965     */
1966 jsr166 1.62 public void testApplyToEither_exceptionalCompletion() {
1967 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
1968 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1969     {
1970 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
1971     final CompletableFuture<Integer> g = new CompletableFuture<>();
1972 jsr166 1.54 final CFException ex = new CFException();
1973 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
1974     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
1975    
1976     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
1977     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
1978     checkIncomplete(h0);
1979     checkIncomplete(h1);
1980     rs[0].assertNotInvoked();
1981     rs[1].assertNotInvoked();
1982     f.completeExceptionally(ex);
1983 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
1984     checkCompletedWithWrappedException(h1, ex);
1985 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
1986     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
1987 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
1988     checkCompletedWithWrappedException(h3, ex);
1989 jsr166 1.62 g.complete(v1);
1990 jsr166 1.54
1991 jsr166 1.62 // unspecified behavior - both source completions available
1992     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
1993     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
1994     try {
1995     assertEquals(inc(v1), h4.join());
1996 jsr166 1.66 rs[4].assertValue(inc(v1));
1997 jsr166 1.62 } catch (CompletionException ok) {
1998 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
1999 jsr166 1.62 rs[4].assertNotInvoked();
2000     }
2001     try {
2002     assertEquals(inc(v1), h5.join());
2003 jsr166 1.66 rs[5].assertValue(inc(v1));
2004 jsr166 1.62 } catch (CompletionException ok) {
2005 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2006 jsr166 1.62 rs[5].assertNotInvoked();
2007 jsr166 1.54 }
2008 jsr166 1.39
2009 jsr166 1.72 checkCompletedExceptionally(f, ex);
2010 jsr166 1.62 checkCompletedNormally(g, v1);
2011 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2012     checkCompletedWithWrappedException(h1, ex);
2013     checkCompletedWithWrappedException(h2, ex);
2014     checkCompletedWithWrappedException(h3, ex);
2015     checkCompletedWithWrappedException(h4, ex);
2016 jsr166 1.62 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2017 jsr166 1.47 }}
2018 jsr166 1.39
2019 jsr166 1.66 public void testApplyToEither_exceptionalCompletion2() {
2020     for (ExecutionMode m : ExecutionMode.values())
2021     for (boolean fFirst : new boolean[] { true, false })
2022     for (Integer v1 : new Integer[] { 1, null })
2023     {
2024     final CompletableFuture<Integer> f = new CompletableFuture<>();
2025     final CompletableFuture<Integer> g = new CompletableFuture<>();
2026     final CFException ex = new CFException();
2027     final IncFunction[] rs = new IncFunction[6];
2028     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2029    
2030     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2031     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2032 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2033     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2034 jsr166 1.66 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2035     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2036    
2037     // unspecified behavior - both source completions available
2038     try {
2039     assertEquals(inc(v1), h0.join());
2040     rs[0].assertValue(inc(v1));
2041     } catch (CompletionException ok) {
2042 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2043 jsr166 1.66 rs[0].assertNotInvoked();
2044     }
2045     try {
2046     assertEquals(inc(v1), h1.join());
2047     rs[1].assertValue(inc(v1));
2048     } catch (CompletionException ok) {
2049 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2050 jsr166 1.66 rs[1].assertNotInvoked();
2051     }
2052     try {
2053     assertEquals(inc(v1), h2.join());
2054     rs[2].assertValue(inc(v1));
2055     } catch (CompletionException ok) {
2056 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2057 jsr166 1.66 rs[2].assertNotInvoked();
2058     }
2059     try {
2060     assertEquals(inc(v1), h3.join());
2061     rs[3].assertValue(inc(v1));
2062     } catch (CompletionException ok) {
2063 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2064 jsr166 1.66 rs[3].assertNotInvoked();
2065     }
2066    
2067     checkCompletedNormally(f, v1);
2068 jsr166 1.72 checkCompletedExceptionally(g, ex);
2069 jsr166 1.66 }}
2070    
2071 jsr166 1.62 /**
2072     * applyToEither result completes exceptionally if either source cancelled
2073     */
2074     public void testApplyToEither_sourceCancelled() {
2075 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2076 jsr166 1.62 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2077 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2078     {
2079 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2080     final CompletableFuture<Integer> g = new CompletableFuture<>();
2081 jsr166 1.62 final IncFunction[] rs = new IncFunction[6];
2082     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2083    
2084     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2085     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2086     checkIncomplete(h0);
2087     checkIncomplete(h1);
2088     rs[0].assertNotInvoked();
2089     rs[1].assertNotInvoked();
2090     f.cancel(mayInterruptIfRunning);
2091     checkCompletedWithWrappedCancellationException(h0);
2092     checkCompletedWithWrappedCancellationException(h1);
2093     final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2094     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2095     checkCompletedWithWrappedCancellationException(h2);
2096     checkCompletedWithWrappedCancellationException(h3);
2097     g.complete(v1);
2098 jsr166 1.39
2099 jsr166 1.62 // unspecified behavior - both source completions available
2100     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2101     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2102 jsr166 1.39 try {
2103 jsr166 1.62 assertEquals(inc(v1), h4.join());
2104 jsr166 1.66 rs[4].assertValue(inc(v1));
2105 jsr166 1.39 } catch (CompletionException ok) {
2106 jsr166 1.62 checkCompletedWithWrappedCancellationException(h4);
2107     rs[4].assertNotInvoked();
2108 jsr166 1.39 }
2109     try {
2110 jsr166 1.62 assertEquals(inc(v1), h5.join());
2111 jsr166 1.66 rs[5].assertValue(inc(v1));
2112 jsr166 1.39 } catch (CompletionException ok) {
2113 jsr166 1.62 checkCompletedWithWrappedCancellationException(h5);
2114     rs[5].assertNotInvoked();
2115 jsr166 1.39 }
2116 dl 1.5
2117 jsr166 1.62 checkCancelled(f);
2118     checkCompletedNormally(g, v1);
2119     checkCompletedWithWrappedCancellationException(h0);
2120     checkCompletedWithWrappedCancellationException(h1);
2121     checkCompletedWithWrappedCancellationException(h2);
2122     checkCompletedWithWrappedCancellationException(h3);
2123     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2124 jsr166 1.47 }}
2125 dl 1.5
2126 jsr166 1.67 public void testApplyToEither_sourceCancelled2() {
2127     for (ExecutionMode m : ExecutionMode.values())
2128     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2129     for (boolean fFirst : new boolean[] { true, false })
2130     for (Integer v1 : new Integer[] { 1, null })
2131     {
2132     final CompletableFuture<Integer> f = new CompletableFuture<>();
2133     final CompletableFuture<Integer> g = new CompletableFuture<>();
2134     final IncFunction[] rs = new IncFunction[6];
2135     for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m);
2136    
2137     final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2138     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2139 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2140     assertTrue(!fFirst ? f.complete(v1) : g.cancel(mayInterruptIfRunning));
2141 jsr166 1.67 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2142     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2143    
2144     // unspecified behavior - both source completions available
2145     try {
2146     assertEquals(inc(v1), h0.join());
2147     rs[0].assertValue(inc(v1));
2148     } catch (CompletionException ok) {
2149     checkCompletedWithWrappedCancellationException(h0);
2150     rs[0].assertNotInvoked();
2151     }
2152     try {
2153     assertEquals(inc(v1), h1.join());
2154     rs[1].assertValue(inc(v1));
2155     } catch (CompletionException ok) {
2156     checkCompletedWithWrappedCancellationException(h1);
2157     rs[1].assertNotInvoked();
2158     }
2159     try {
2160     assertEquals(inc(v1), h2.join());
2161     rs[2].assertValue(inc(v1));
2162     } catch (CompletionException ok) {
2163     checkCompletedWithWrappedCancellationException(h2);
2164     rs[2].assertNotInvoked();
2165     }
2166     try {
2167     assertEquals(inc(v1), h3.join());
2168     rs[3].assertValue(inc(v1));
2169     } catch (CompletionException ok) {
2170     checkCompletedWithWrappedCancellationException(h3);
2171     rs[3].assertNotInvoked();
2172     }
2173    
2174     checkCompletedNormally(f, v1);
2175     checkCancelled(g);
2176     }}
2177    
2178 dl 1.5 /**
2179     * applyToEither result completes exceptionally if action does
2180     */
2181 jsr166 1.62 public void testApplyToEither_actionFailed() {
2182 jsr166 1.39 for (ExecutionMode m : ExecutionMode.values())
2183     for (Integer v1 : new Integer[] { 1, null })
2184 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2185     {
2186 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2187     final CompletableFuture<Integer> g = new CompletableFuture<>();
2188 jsr166 1.62 final FailingFunction[] rs = new FailingFunction[6];
2189     for (int i = 0; i < rs.length; i++) rs[i] = new FailingFunction(m);
2190 jsr166 1.39
2191 jsr166 1.62 final CompletableFuture<Integer> h0 = m.applyToEither(f, g, rs[0]);
2192     final CompletableFuture<Integer> h1 = m.applyToEither(g, f, rs[1]);
2193 jsr166 1.39 f.complete(v1);
2194 jsr166 1.62 final CompletableFuture<Integer> h2 = m.applyToEither(f, g, rs[2]);
2195     final CompletableFuture<Integer> h3 = m.applyToEither(g, f, rs[3]);
2196     checkCompletedWithWrappedCFException(h0);
2197     checkCompletedWithWrappedCFException(h1);
2198     checkCompletedWithWrappedCFException(h2);
2199     checkCompletedWithWrappedCFException(h3);
2200 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2201    
2202     g.complete(v2);
2203    
2204     // unspecified behavior - both source completions available
2205     final CompletableFuture<Integer> h4 = m.applyToEither(f, g, rs[4]);
2206     final CompletableFuture<Integer> h5 = m.applyToEither(g, f, rs[5]);
2207    
2208 jsr166 1.62 checkCompletedWithWrappedCFException(h4);
2209 jsr166 1.63 assertTrue(Objects.equals(v1, rs[4].value) ||
2210     Objects.equals(v2, rs[4].value));
2211 jsr166 1.62 checkCompletedWithWrappedCFException(h5);
2212 jsr166 1.63 assertTrue(Objects.equals(v1, rs[5].value) ||
2213     Objects.equals(v2, rs[5].value));
2214    
2215     checkCompletedNormally(f, v1);
2216     checkCompletedNormally(g, v2);
2217 jsr166 1.47 }}
2218 dl 1.5
2219     /**
2220     * acceptEither result completes normally after normal completion
2221     * of either source
2222     */
2223 jsr166 1.63 public void testAcceptEither_normalCompletion() {
2224 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2225     for (Integer v1 : new Integer[] { 1, null })
2226 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2227     {
2228 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2229     final CompletableFuture<Integer> g = new CompletableFuture<>();
2230 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2231     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2232 jsr166 1.40
2233 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2234     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2235     checkIncomplete(h0);
2236     checkIncomplete(h1);
2237     rs[0].assertNotInvoked();
2238     rs[1].assertNotInvoked();
2239 jsr166 1.40 f.complete(v1);
2240 jsr166 1.63 checkCompletedNormally(h0, null);
2241     checkCompletedNormally(h1, null);
2242 jsr166 1.64 rs[0].assertValue(v1);
2243     rs[1].assertValue(v1);
2244 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2245     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2246     checkCompletedNormally(h2, null);
2247     checkCompletedNormally(h3, null);
2248 jsr166 1.64 rs[2].assertValue(v1);
2249     rs[3].assertValue(v1);
2250 jsr166 1.40 g.complete(v2);
2251    
2252 jsr166 1.63 // unspecified behavior - both source completions available
2253     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2254     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2255     checkCompletedNormally(h4, null);
2256     checkCompletedNormally(h5, null);
2257 jsr166 1.64 assertTrue(Objects.equals(v1, rs[4].value) ||
2258     Objects.equals(v2, rs[4].value));
2259     assertTrue(Objects.equals(v1, rs[5].value) ||
2260     Objects.equals(v2, rs[5].value));
2261 jsr166 1.40
2262     checkCompletedNormally(f, v1);
2263     checkCompletedNormally(g, v2);
2264 jsr166 1.63 checkCompletedNormally(h0, null);
2265     checkCompletedNormally(h1, null);
2266     checkCompletedNormally(h2, null);
2267     checkCompletedNormally(h3, null);
2268 jsr166 1.64 for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2269 jsr166 1.47 }}
2270 dl 1.5
2271     /**
2272     * acceptEither result completes exceptionally after exceptional
2273     * completion of either source
2274     */
2275 jsr166 1.63 public void testAcceptEither_exceptionalCompletion() {
2276 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2277 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2278     {
2279 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2280     final CompletableFuture<Integer> g = new CompletableFuture<>();
2281     final CFException ex = new CFException();
2282 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2283     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2284 jsr166 1.40
2285 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2286     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2287     checkIncomplete(h0);
2288     checkIncomplete(h1);
2289     rs[0].assertNotInvoked();
2290     rs[1].assertNotInvoked();
2291 jsr166 1.40 f.completeExceptionally(ex);
2292 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2293     checkCompletedWithWrappedException(h1, ex);
2294 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2295     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2296 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2297     checkCompletedWithWrappedException(h3, ex);
2298 jsr166 1.63
2299 jsr166 1.40 g.complete(v1);
2300    
2301 jsr166 1.63 // unspecified behavior - both source completions available
2302     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2303     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2304 jsr166 1.40 try {
2305 jsr166 1.63 assertNull(h4.join());
2306 jsr166 1.64 rs[4].assertValue(v1);
2307 jsr166 1.40 } catch (CompletionException ok) {
2308 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2309 jsr166 1.63 rs[4].assertNotInvoked();
2310 jsr166 1.40 }
2311     try {
2312 jsr166 1.63 assertNull(h5.join());
2313 jsr166 1.64 rs[5].assertValue(v1);
2314 jsr166 1.40 } catch (CompletionException ok) {
2315 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2316 jsr166 1.63 rs[5].assertNotInvoked();
2317 jsr166 1.40 }
2318 dl 1.5
2319 jsr166 1.72 checkCompletedExceptionally(f, ex);
2320 jsr166 1.40 checkCompletedNormally(g, v1);
2321 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2322     checkCompletedWithWrappedException(h1, ex);
2323     checkCompletedWithWrappedException(h2, ex);
2324     checkCompletedWithWrappedException(h3, ex);
2325     checkCompletedWithWrappedException(h4, ex);
2326 jsr166 1.63 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2327 jsr166 1.47 }}
2328 dl 1.5
2329 jsr166 1.68 public void testAcceptEither_exceptionalCompletion2() {
2330     for (ExecutionMode m : ExecutionMode.values())
2331     for (boolean fFirst : new boolean[] { true, false })
2332     for (Integer v1 : new Integer[] { 1, null })
2333     {
2334     final CompletableFuture<Integer> f = new CompletableFuture<>();
2335     final CompletableFuture<Integer> g = new CompletableFuture<>();
2336     final CFException ex = new CFException();
2337     final NoopConsumer[] rs = new NoopConsumer[6];
2338     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2339    
2340     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2341     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2342 jsr166 1.78 assertTrue(fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2343     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2344 jsr166 1.68 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2345     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2346    
2347     // unspecified behavior - both source completions available
2348     try {
2349     assertEquals(null, h0.join());
2350     rs[0].assertValue(v1);
2351     } catch (CompletionException ok) {
2352 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2353 jsr166 1.68 rs[0].assertNotInvoked();
2354     }
2355     try {
2356     assertEquals(null, h1.join());
2357     rs[1].assertValue(v1);
2358     } catch (CompletionException ok) {
2359 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2360 jsr166 1.68 rs[1].assertNotInvoked();
2361     }
2362     try {
2363     assertEquals(null, h2.join());
2364     rs[2].assertValue(v1);
2365     } catch (CompletionException ok) {
2366 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2367 jsr166 1.68 rs[2].assertNotInvoked();
2368     }
2369     try {
2370     assertEquals(null, h3.join());
2371     rs[3].assertValue(v1);
2372     } catch (CompletionException ok) {
2373 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2374 jsr166 1.68 rs[3].assertNotInvoked();
2375     }
2376    
2377     checkCompletedNormally(f, v1);
2378 jsr166 1.72 checkCompletedExceptionally(g, ex);
2379 jsr166 1.68 }}
2380    
2381 dl 1.5 /**
2382     * acceptEither result completes exceptionally if either source cancelled
2383     */
2384 jsr166 1.63 public void testAcceptEither_sourceCancelled() {
2385 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2386     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2387 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2388     {
2389 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2390     final CompletableFuture<Integer> g = new CompletableFuture<>();
2391 jsr166 1.64 final NoopConsumer[] rs = new NoopConsumer[6];
2392     for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m);
2393 jsr166 1.63
2394     final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2395     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2396     checkIncomplete(h0);
2397     checkIncomplete(h1);
2398     rs[0].assertNotInvoked();
2399     rs[1].assertNotInvoked();
2400     f.cancel(mayInterruptIfRunning);
2401     checkCompletedWithWrappedCancellationException(h0);
2402     checkCompletedWithWrappedCancellationException(h1);
2403     final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2404     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2405     checkCompletedWithWrappedCancellationException(h2);
2406     checkCompletedWithWrappedCancellationException(h3);
2407 jsr166 1.40
2408     g.complete(v1);
2409    
2410 jsr166 1.63 // unspecified behavior - both source completions available
2411     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2412     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2413     try {
2414     assertNull(h4.join());
2415 jsr166 1.64 rs[4].assertValue(v1);
2416 jsr166 1.63 } catch (CompletionException ok) {
2417     checkCompletedWithWrappedCancellationException(h4);
2418     rs[4].assertNotInvoked();
2419     }
2420     try {
2421     assertNull(h5.join());
2422 jsr166 1.64 rs[5].assertValue(v1);
2423 jsr166 1.63 } catch (CompletionException ok) {
2424     checkCompletedWithWrappedCancellationException(h5);
2425     rs[5].assertNotInvoked();
2426     }
2427    
2428 jsr166 1.40 checkCancelled(f);
2429     checkCompletedNormally(g, v1);
2430 jsr166 1.63 checkCompletedWithWrappedCancellationException(h0);
2431     checkCompletedWithWrappedCancellationException(h1);
2432     checkCompletedWithWrappedCancellationException(h2);
2433     checkCompletedWithWrappedCancellationException(h3);
2434     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2435 jsr166 1.47 }}
2436 jsr166 1.40
2437 jsr166 1.63 /**
2438     * acceptEither result completes exceptionally if action does
2439     */
2440     public void testAcceptEither_actionFailed() {
2441 jsr166 1.40 for (ExecutionMode m : ExecutionMode.values())
2442 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2443 jsr166 1.63 for (Integer v2 : new Integer[] { 2, null })
2444 jsr166 1.47 {
2445 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2446     final CompletableFuture<Integer> g = new CompletableFuture<>();
2447 jsr166 1.63 final FailingConsumer[] rs = new FailingConsumer[6];
2448     for (int i = 0; i < rs.length; i++) rs[i] = new FailingConsumer(m);
2449 jsr166 1.40
2450 jsr166 1.63 final CompletableFuture<Void> h0 = m.acceptEither(f, g, rs[0]);
2451     final CompletableFuture<Void> h1 = m.acceptEither(g, f, rs[1]);
2452 jsr166 1.40 f.complete(v1);
2453 jsr166 1.63 final CompletableFuture<Void> h2 = m.acceptEither(f, g, rs[2]);
2454     final CompletableFuture<Void> h3 = m.acceptEither(g, f, rs[3]);
2455     checkCompletedWithWrappedCFException(h0);
2456     checkCompletedWithWrappedCFException(h1);
2457     checkCompletedWithWrappedCFException(h2);
2458     checkCompletedWithWrappedCFException(h3);
2459     for (int i = 0; i < 4; i++) rs[i].assertValue(v1);
2460 jsr166 1.40
2461 jsr166 1.63 g.complete(v2);
2462 jsr166 1.40
2463 jsr166 1.63 // unspecified behavior - both source completions available
2464     final CompletableFuture<Void> h4 = m.acceptEither(f, g, rs[4]);
2465     final CompletableFuture<Void> h5 = m.acceptEither(g, f, rs[5]);
2466 jsr166 1.40
2467 jsr166 1.63 checkCompletedWithWrappedCFException(h4);
2468     assertTrue(Objects.equals(v1, rs[4].value) ||
2469     Objects.equals(v2, rs[4].value));
2470     checkCompletedWithWrappedCFException(h5);
2471     assertTrue(Objects.equals(v1, rs[5].value) ||
2472     Objects.equals(v2, rs[5].value));
2473 jsr166 1.40
2474     checkCompletedNormally(f, v1);
2475 jsr166 1.63 checkCompletedNormally(g, v2);
2476 jsr166 1.47 }}
2477 dl 1.5
2478     /**
2479     * runAfterEither result completes normally after normal completion
2480     * of either source
2481     */
2482 jsr166 1.65 public void testRunAfterEither_normalCompletion() {
2483 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2484     for (Integer v1 : new Integer[] { 1, null })
2485 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2486     {
2487 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2488     final CompletableFuture<Integer> g = new CompletableFuture<>();
2489 jsr166 1.65 final Noop[] rs = new Noop[6];
2490     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2491 jsr166 1.41
2492 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2493     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2494     checkIncomplete(h0);
2495     checkIncomplete(h1);
2496     rs[0].assertNotInvoked();
2497     rs[1].assertNotInvoked();
2498 jsr166 1.41 f.complete(v1);
2499 jsr166 1.65 checkCompletedNormally(h0, null);
2500     checkCompletedNormally(h1, null);
2501     rs[0].assertInvoked();
2502     rs[1].assertInvoked();
2503     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2504     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2505     checkCompletedNormally(h2, null);
2506     checkCompletedNormally(h3, null);
2507     rs[2].assertInvoked();
2508     rs[3].assertInvoked();
2509 jsr166 1.41
2510     g.complete(v2);
2511    
2512 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2513     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2514 jsr166 1.47
2515 jsr166 1.41 checkCompletedNormally(f, v1);
2516     checkCompletedNormally(g, v2);
2517 jsr166 1.65 checkCompletedNormally(h0, null);
2518     checkCompletedNormally(h1, null);
2519     checkCompletedNormally(h2, null);
2520     checkCompletedNormally(h3, null);
2521     checkCompletedNormally(h4, null);
2522     checkCompletedNormally(h5, null);
2523     for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2524 jsr166 1.47 }}
2525 dl 1.5
2526     /**
2527     * runAfterEither result completes exceptionally after exceptional
2528     * completion of either source
2529     */
2530 jsr166 1.65 public void testRunAfterEither_exceptionalCompletion() {
2531 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2532 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2533     {
2534 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2535     final CompletableFuture<Integer> g = new CompletableFuture<>();
2536     final CFException ex = new CFException();
2537 jsr166 1.65 final Noop[] rs = new Noop[6];
2538     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2539 jsr166 1.41
2540 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2541     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2542     checkIncomplete(h0);
2543     checkIncomplete(h1);
2544     rs[0].assertNotInvoked();
2545     rs[1].assertNotInvoked();
2546 jsr166 1.78 assertTrue(f.completeExceptionally(ex));
2547 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2548     checkCompletedWithWrappedException(h1, ex);
2549 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2550     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2551 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2552     checkCompletedWithWrappedException(h3, ex);
2553 jsr166 1.65
2554 jsr166 1.78 assertTrue(g.complete(v1));
2555 jsr166 1.41
2556 jsr166 1.65 // unspecified behavior - both source completions available
2557     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2558     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2559     try {
2560     assertNull(h4.join());
2561     rs[4].assertInvoked();
2562     } catch (CompletionException ok) {
2563 jsr166 1.72 checkCompletedWithWrappedException(h4, ex);
2564 jsr166 1.65 rs[4].assertNotInvoked();
2565     }
2566     try {
2567     assertNull(h5.join());
2568     rs[5].assertInvoked();
2569     } catch (CompletionException ok) {
2570 jsr166 1.72 checkCompletedWithWrappedException(h5, ex);
2571 jsr166 1.65 rs[5].assertNotInvoked();
2572     }
2573    
2574 jsr166 1.72 checkCompletedExceptionally(f, ex);
2575 jsr166 1.41 checkCompletedNormally(g, v1);
2576 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2577     checkCompletedWithWrappedException(h1, ex);
2578     checkCompletedWithWrappedException(h2, ex);
2579     checkCompletedWithWrappedException(h3, ex);
2580     checkCompletedWithWrappedException(h4, ex);
2581 jsr166 1.65 for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2582 jsr166 1.47 }}
2583 jsr166 1.41
2584 jsr166 1.69 public void testRunAfterEither_exceptionalCompletion2() {
2585     for (ExecutionMode m : ExecutionMode.values())
2586     for (boolean fFirst : new boolean[] { true, false })
2587     for (Integer v1 : new Integer[] { 1, null })
2588     {
2589     final CompletableFuture<Integer> f = new CompletableFuture<>();
2590     final CompletableFuture<Integer> g = new CompletableFuture<>();
2591     final CFException ex = new CFException();
2592     final Noop[] rs = new Noop[6];
2593     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2594    
2595     final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2596     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2597 jsr166 1.78 assertTrue( fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2598     assertTrue(!fFirst ? f.complete(v1) : g.completeExceptionally(ex));
2599 jsr166 1.69 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2600     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2601    
2602     // unspecified behavior - both source completions available
2603     try {
2604     assertEquals(null, h0.join());
2605     rs[0].assertInvoked();
2606     } catch (CompletionException ok) {
2607 jsr166 1.72 checkCompletedWithWrappedException(h0, ex);
2608 jsr166 1.69 rs[0].assertNotInvoked();
2609     }
2610     try {
2611     assertEquals(null, h1.join());
2612     rs[1].assertInvoked();
2613     } catch (CompletionException ok) {
2614 jsr166 1.72 checkCompletedWithWrappedException(h1, ex);
2615 jsr166 1.69 rs[1].assertNotInvoked();
2616     }
2617     try {
2618     assertEquals(null, h2.join());
2619     rs[2].assertInvoked();
2620     } catch (CompletionException ok) {
2621 jsr166 1.72 checkCompletedWithWrappedException(h2, ex);
2622 jsr166 1.69 rs[2].assertNotInvoked();
2623     }
2624     try {
2625     assertEquals(null, h3.join());
2626     rs[3].assertInvoked();
2627     } catch (CompletionException ok) {
2628 jsr166 1.72 checkCompletedWithWrappedException(h3, ex);
2629 jsr166 1.69 rs[3].assertNotInvoked();
2630     }
2631    
2632     checkCompletedNormally(f, v1);
2633 jsr166 1.72 checkCompletedExceptionally(g, ex);
2634 jsr166 1.69 }}
2635    
2636 jsr166 1.65 /**
2637     * runAfterEither result completes exceptionally if either source cancelled
2638     */
2639     public void testRunAfterEither_sourceCancelled() {
2640 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2641 jsr166 1.65 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2642 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2643     {
2644 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2645     final CompletableFuture<Integer> g = new CompletableFuture<>();
2646 jsr166 1.65 final Noop[] rs = new Noop[6];
2647     for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
2648 jsr166 1.41
2649 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2650     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2651     checkIncomplete(h0);
2652     checkIncomplete(h1);
2653     rs[0].assertNotInvoked();
2654     rs[1].assertNotInvoked();
2655     f.cancel(mayInterruptIfRunning);
2656     checkCompletedWithWrappedCancellationException(h0);
2657     checkCompletedWithWrappedCancellationException(h1);
2658     final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2659     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2660     checkCompletedWithWrappedCancellationException(h2);
2661     checkCompletedWithWrappedCancellationException(h3);
2662 jsr166 1.41
2663 jsr166 1.78 assertTrue(g.complete(v1));
2664 jsr166 1.41
2665 jsr166 1.65 // unspecified behavior - both source completions available
2666     final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2667     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2668 jsr166 1.41 try {
2669 jsr166 1.65 assertNull(h4.join());
2670     rs[4].assertInvoked();
2671 jsr166 1.41 } catch (CompletionException ok) {
2672 jsr166 1.65 checkCompletedWithWrappedCancellationException(h4);
2673     rs[4].assertNotInvoked();
2674 jsr166 1.41 }
2675     try {
2676 jsr166 1.65 assertNull(h5.join());
2677     rs[5].assertInvoked();
2678 jsr166 1.41 } catch (CompletionException ok) {
2679 jsr166 1.65 checkCompletedWithWrappedCancellationException(h5);
2680     rs[5].assertNotInvoked();
2681 jsr166 1.41 }
2682 dl 1.5
2683 jsr166 1.65 checkCancelled(f);
2684 jsr166 1.41 checkCompletedNormally(g, v1);
2685 jsr166 1.65 checkCompletedWithWrappedCancellationException(h0);
2686     checkCompletedWithWrappedCancellationException(h1);
2687     checkCompletedWithWrappedCancellationException(h2);
2688     checkCompletedWithWrappedCancellationException(h3);
2689     for (int i = 0; i < 4; i++) rs[i].assertNotInvoked();
2690 jsr166 1.47 }}
2691 dl 1.5
2692     /**
2693     * runAfterEither result completes exceptionally if action does
2694     */
2695 jsr166 1.65 public void testRunAfterEither_actionFailed() {
2696 jsr166 1.41 for (ExecutionMode m : ExecutionMode.values())
2697     for (Integer v1 : new Integer[] { 1, null })
2698 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2699     {
2700 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2701     final CompletableFuture<Integer> g = new CompletableFuture<>();
2702 jsr166 1.65 final FailingRunnable[] rs = new FailingRunnable[6];
2703     for (int i = 0; i < rs.length; i++) rs[i] = new FailingRunnable(m);
2704 jsr166 1.41
2705 jsr166 1.65 final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
2706     final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
2707 jsr166 1.78 assertTrue(f.complete(v1));
2708 jsr166 1.65 final CompletableFuture<Void> h2 = m.runAfterEither(f, g, rs[2]);
2709     final CompletableFuture<Void> h3 = m.runAfterEither(g, f, rs[3]);
2710     checkCompletedWithWrappedCFException(h0);
2711     checkCompletedWithWrappedCFException(h1);
2712     checkCompletedWithWrappedCFException(h2);
2713     checkCompletedWithWrappedCFException(h3);
2714     for (int i = 0; i < 4; i++) rs[i].assertInvoked();
2715 jsr166 1.78 assertTrue(g.complete(v2));
2716 jsr166 1.65 final CompletableFuture<Void> h4 = m.runAfterEither(f, g, rs[4]);
2717     final CompletableFuture<Void> h5 = m.runAfterEither(g, f, rs[5]);
2718     checkCompletedWithWrappedCFException(h4);
2719     checkCompletedWithWrappedCFException(h5);
2720 jsr166 1.41
2721     checkCompletedNormally(f, v1);
2722     checkCompletedNormally(g, v2);
2723 jsr166 1.65 for (int i = 0; i < 6; i++) rs[i].assertInvoked();
2724 jsr166 1.47 }}
2725 dl 1.5
2726     /**
2727     * thenCompose result completes normally after normal completion of source
2728     */
2729 jsr166 1.48 public void testThenCompose_normalCompletion() {
2730 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2731 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2732 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2733     {
2734 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2735 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2736 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2737 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2738 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2739 jsr166 1.21
2740 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2741     checkCompletedNormally(f, v1);
2742 jsr166 1.70 r.assertValue(v1);
2743 jsr166 1.47 }}
2744 dl 1.5
2745     /**
2746     * thenCompose result completes exceptionally after exceptional
2747     * completion of source
2748     */
2749 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2750 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2751 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2752 jsr166 1.47 {
2753 jsr166 1.44 final CFException ex = new CFException();
2754 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2755 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2756 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2757 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2758 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2759 jsr166 1.21
2760 jsr166 1.72 checkCompletedWithWrappedException(g, ex);
2761     checkCompletedExceptionally(f, ex);
2762 jsr166 1.62 r.assertNotInvoked();
2763 jsr166 1.47 }}
2764 dl 1.5
2765     /**
2766     * thenCompose result completes exceptionally if action does
2767     */
2768 jsr166 1.48 public void testThenCompose_actionFailed() {
2769 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2770 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2771 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2772     {
2773 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2774     final FailingCompletableFutureFunction r
2775 jsr166 1.56 = new FailingCompletableFutureFunction(m);
2776 jsr166 1.78 if (!createIncomplete) assertTrue(f.complete(v1));
2777 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2778 jsr166 1.78 if (createIncomplete) assertTrue(f.complete(v1));
2779 jsr166 1.44
2780 dl 1.5 checkCompletedWithWrappedCFException(g);
2781 jsr166 1.44 checkCompletedNormally(f, v1);
2782 jsr166 1.47 }}
2783 dl 1.5
2784     /**
2785     * thenCompose result completes exceptionally if source cancelled
2786     */
2787 jsr166 1.48 public void testThenCompose_sourceCancelled() {
2788 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2789 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2790 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2791     {
2792 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2793 jsr166 1.56 final CompletableFutureInc r = new CompletableFutureInc(m);
2794 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2795 jsr166 1.56 final CompletableFuture<Integer> g = m.thenCompose(f, r);
2796 jsr166 1.50 if (createIncomplete) {
2797     checkIncomplete(g);
2798     assertTrue(f.cancel(mayInterruptIfRunning));
2799     }
2800 jsr166 1.44
2801 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2802 jsr166 1.44 checkCancelled(f);
2803 jsr166 1.47 }}
2804 dl 1.5
2805 jsr166 1.6 // other static methods
2806 dl 1.5
2807     /**
2808     * allOf(no component futures) returns a future completed normally
2809     * with the value null
2810     */
2811     public void testAllOf_empty() throws Exception {
2812 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
2813 dl 1.5 checkCompletedNormally(f, null);
2814     }
2815    
2816     /**
2817 jsr166 1.25 * allOf returns a future completed normally with the value null
2818     * when all components complete normally
2819 dl 1.5 */
2820 jsr166 1.25 public void testAllOf_normal() throws Exception {
2821 dl 1.5 for (int k = 1; k < 20; ++k) {
2822 jsr166 1.59 CompletableFuture<Integer>[] fs
2823     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2824 jsr166 1.6 for (int i = 0; i < k; ++i)
2825 jsr166 1.22 fs[i] = new CompletableFuture<>();
2826 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2827 dl 1.5 for (int i = 0; i < k; ++i) {
2828     checkIncomplete(f);
2829 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
2830 dl 1.5 fs[i].complete(one);
2831     }
2832 dl 1.9 checkCompletedNormally(f, null);
2833 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
2834 dl 1.5 }
2835     }
2836    
2837 jsr166 1.59 public void testAllOf_backwards() throws Exception {
2838     for (int k = 1; k < 20; ++k) {
2839     CompletableFuture<Integer>[] fs
2840     = (CompletableFuture<Integer>[]) new CompletableFuture[k];
2841     for (int i = 0; i < k; ++i)
2842     fs[i] = new CompletableFuture<>();
2843     CompletableFuture<Void> f = CompletableFuture.allOf(fs);
2844     for (int i = k - 1; i >= 0; i--) {
2845     checkIncomplete(f);
2846     checkIncomplete(CompletableFuture.allOf(fs));
2847     fs[i].complete(one);
2848     }
2849     checkCompletedNormally(f, null);
2850     checkCompletedNormally(CompletableFuture.allOf(fs), null);
2851     }
2852     }
2853    
2854 dl 1.5 /**
2855     * anyOf(no component futures) returns an incomplete future
2856     */
2857     public void testAnyOf_empty() throws Exception {
2858 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
2859 dl 1.5 checkIncomplete(f);
2860     }
2861    
2862     /**
2863 jsr166 1.25 * anyOf returns a future completed normally with a value when
2864     * a component future does
2865 dl 1.5 */
2866 jsr166 1.24 public void testAnyOf_normal() throws Exception {
2867     for (int k = 0; k < 10; ++k) {
2868 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
2869 jsr166 1.6 for (int i = 0; i < k; ++i)
2870 jsr166 1.22 fs[i] = new CompletableFuture<>();
2871 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2872 dl 1.5 checkIncomplete(f);
2873     for (int i = 0; i < k; ++i) {
2874     fs[i].complete(one);
2875 dl 1.9 checkCompletedNormally(f, one);
2876 jsr166 1.24 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
2877     }
2878     }
2879     }
2880    
2881     /**
2882     * anyOf result completes exceptionally when any component does.
2883     */
2884     public void testAnyOf_exceptional() throws Exception {
2885     for (int k = 0; k < 10; ++k) {
2886     CompletableFuture[] fs = new CompletableFuture[k];
2887     for (int i = 0; i < k; ++i)
2888     fs[i] = new CompletableFuture<>();
2889     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
2890     checkIncomplete(f);
2891     for (int i = 0; i < k; ++i) {
2892     fs[i].completeExceptionally(new CFException());
2893     checkCompletedWithWrappedCFException(f);
2894     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
2895 dl 1.5 }
2896     }
2897     }
2898    
2899     /**
2900     * Completion methods throw NullPointerException with null arguments
2901     */
2902     public void testNPE() {
2903 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
2904     CompletableFuture<Integer> g = new CompletableFuture<>();
2905 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
2906     CompletableFuture<?> h;
2907 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
2908 jsr166 1.14
2909     Runnable[] throwingActions = {
2910 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
2911     () -> CompletableFuture.supplyAsync(null, exec),
2912 jsr166 1.58 () -> CompletableFuture.supplyAsync(new IntegerSupplier(ExecutionMode.DEFAULT, 42), null),
2913 jsr166 1.31
2914     () -> CompletableFuture.runAsync(null),
2915     () -> CompletableFuture.runAsync(null, exec),
2916     () -> CompletableFuture.runAsync(() -> {}, null),
2917    
2918     () -> f.completeExceptionally(null),
2919    
2920     () -> f.thenApply(null),
2921     () -> f.thenApplyAsync(null),
2922     () -> f.thenApplyAsync((x) -> x, null),
2923     () -> f.thenApplyAsync(null, exec),
2924    
2925     () -> f.thenAccept(null),
2926     () -> f.thenAcceptAsync(null),
2927     () -> f.thenAcceptAsync((x) -> {} , null),
2928     () -> f.thenAcceptAsync(null, exec),
2929    
2930     () -> f.thenRun(null),
2931     () -> f.thenRunAsync(null),
2932     () -> f.thenRunAsync(() -> {} , null),
2933     () -> f.thenRunAsync(null, exec),
2934    
2935     () -> f.thenCombine(g, null),
2936     () -> f.thenCombineAsync(g, null),
2937     () -> f.thenCombineAsync(g, null, exec),
2938     () -> f.thenCombine(nullFuture, (x, y) -> x),
2939     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
2940     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
2941     () -> f.thenCombineAsync(g, (x, y) -> x, null),
2942    
2943     () -> f.thenAcceptBoth(g, null),
2944     () -> f.thenAcceptBothAsync(g, null),
2945     () -> f.thenAcceptBothAsync(g, null, exec),
2946     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
2947     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
2948     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
2949     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
2950    
2951     () -> f.runAfterBoth(g, null),
2952     () -> f.runAfterBothAsync(g, null),
2953     () -> f.runAfterBothAsync(g, null, exec),
2954     () -> f.runAfterBoth(nullFuture, () -> {}),
2955     () -> f.runAfterBothAsync(nullFuture, () -> {}),
2956     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
2957     () -> f.runAfterBothAsync(g, () -> {}, null),
2958    
2959     () -> f.applyToEither(g, null),
2960     () -> f.applyToEitherAsync(g, null),
2961     () -> f.applyToEitherAsync(g, null, exec),
2962     () -> f.applyToEither(nullFuture, (x) -> x),
2963     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
2964     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
2965     () -> f.applyToEitherAsync(g, (x) -> x, null),
2966    
2967     () -> f.acceptEither(g, null),
2968     () -> f.acceptEitherAsync(g, null),
2969     () -> f.acceptEitherAsync(g, null, exec),
2970     () -> f.acceptEither(nullFuture, (x) -> {}),
2971     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
2972     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
2973     () -> f.acceptEitherAsync(g, (x) -> {}, null),
2974    
2975     () -> f.runAfterEither(g, null),
2976     () -> f.runAfterEitherAsync(g, null),
2977     () -> f.runAfterEitherAsync(g, null, exec),
2978     () -> f.runAfterEither(nullFuture, () -> {}),
2979     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
2980     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
2981     () -> f.runAfterEitherAsync(g, () -> {}, null),
2982    
2983     () -> f.thenCompose(null),
2984     () -> f.thenComposeAsync(null),
2985 jsr166 1.56 () -> f.thenComposeAsync(new CompletableFutureInc(ExecutionMode.EXECUTOR), null),
2986 jsr166 1.31 () -> f.thenComposeAsync(null, exec),
2987    
2988     () -> f.exceptionally(null),
2989    
2990     () -> f.handle(null),
2991    
2992     () -> CompletableFuture.allOf((CompletableFuture<?>)null),
2993     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
2994     () -> CompletableFuture.allOf(f, null),
2995     () -> CompletableFuture.allOf(null, f),
2996    
2997     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
2998     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
2999     () -> CompletableFuture.anyOf(f, null),
3000     () -> CompletableFuture.anyOf(null, f),
3001 jsr166 1.32
3002     () -> f.obtrudeException(null),
3003 jsr166 1.14 };
3004 dl 1.5
3005 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3006 jsr166 1.17 assertEquals(0, exec.count.get());
3007 dl 1.5 }
3008    
3009 dl 1.26 /**
3010     * toCompletableFuture returns this CompletableFuture.
3011     */
3012     public void testToCompletableFuture() {
3013     CompletableFuture<Integer> f = new CompletableFuture<>();
3014     assertSame(f, f.toCompletableFuture());
3015     }
3016    
3017 jsr166 1.78 // public void testRunAfterEither_resultDeterminedAtTimeOfCreation() {
3018     // for (ExecutionMode m : ExecutionMode.values())
3019     // for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3020     // for (Integer v1 : new Integer[] { 1, null })
3021     // {
3022     // final CompletableFuture<Integer> f = new CompletableFuture<>();
3023     // final CompletableFuture<Integer> g = new CompletableFuture<>();
3024     // final Noop[] rs = new Noop[2];
3025     // for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m);
3026     // f.complete(v1);
3027     // final CompletableFuture<Void> h0 = m.runAfterEither(f, g, rs[0]);
3028     // final CompletableFuture<Void> h1 = m.runAfterEither(g, f, rs[1]);
3029     // assertTrue(g.cancel(mayInterruptIfRunning));
3030     // checkCompletedNormally(h0, null);
3031     // checkCompletedNormally(h1, null);
3032     // for (Noop r : rs) r.assertInvoked();
3033     // }}
3034    
3035 jsr166 1.1 }