ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.68
Committed: Fri Jun 6 19:35:54 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.67: +57 -0 lines
Log Message:
improve tests for acceptEither

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