ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.46
Committed: Mon Jun 2 17:41:22 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.45: +387 -241 lines
Log Message:
pervasive test improvements

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