ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.51
Committed: Mon Jun 2 19:49:28 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.50: +51 -25 lines
Log Message:
more createIncomplete testing

File Contents

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