ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.62
Committed: Fri Jun 6 01:19:22 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.61: +295 -348 lines
Log Message:
improve tests for applyToEither

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