ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.48
Committed: Mon Jun 2 19:07:14 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.47: +85 -226 lines
Log Message:
improve tests for thenRun etc

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