ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.50
Committed: Mon Jun 2 19:32:57 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.49: +71 -133 lines
Log Message:
improve tests for thenAccept

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     if (createIncomplete) f.complete(v1);
987 jsr166 1.23
988 dl 1.5 checkCompletedNormally(g, null);
989 jsr166 1.48 checkCompletedNormally(f, v1);
990 jsr166 1.44 assertEquals(1, r.invocationCount);
991 jsr166 1.48 }}
992 dl 1.5
993     /**
994     * thenRun result completes exceptionally after exceptional
995     * completion of source
996     */
997 jsr166 1.48 public void testThenRun_exceptionalCompletion() {
998     for (ExecutionMode m : ExecutionMode.values())
999     for (boolean createIncomplete : new boolean[] { true, false })
1000     {
1001     final CFException ex = new CFException();
1002     final CompletableFuture<Integer> f = new CompletableFuture<>();
1003     final Noop r = new Noop();
1004     if (!createIncomplete) f.completeExceptionally(ex);
1005     final CompletableFuture<Void> g = m.thenRun(f, r);
1006     if (createIncomplete) f.completeExceptionally(ex);
1007 jsr166 1.23
1008 jsr166 1.48 checkCompletedWithWrappedCFException(g, ex);
1009     checkCompletedWithWrappedCFException(f, ex);
1010 jsr166 1.44 assertEquals(0, r.invocationCount);
1011 jsr166 1.48 }}
1012    
1013     /**
1014     * thenRun result completes exceptionally if source cancelled
1015     */
1016     public void testThenRun_sourceCancelled() {
1017     for (ExecutionMode m : ExecutionMode.values())
1018     for (boolean createIncomplete : new boolean[] { true, false })
1019     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1020     {
1021     final CompletableFuture<Integer> f = new CompletableFuture<>();
1022     final Noop r = new Noop();
1023     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1024     final CompletableFuture<Void> g = f.thenRun(r);
1025     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1026 jsr166 1.23
1027 jsr166 1.48 checkCompletedWithWrappedCancellationException(g);
1028     checkCancelled(f);
1029 jsr166 1.44 assertEquals(0, r.invocationCount);
1030 jsr166 1.48 }}
1031 dl 1.5
1032     /**
1033     * thenRun result completes exceptionally if action does
1034     */
1035 jsr166 1.48 public void testThenRun_actionFailed() {
1036     for (ExecutionMode m : ExecutionMode.values())
1037     for (boolean createIncomplete : new boolean[] { true, false })
1038     for (Integer v1 : new Integer[] { 1, null })
1039     {
1040     final CompletableFuture<Integer> f = new CompletableFuture<>();
1041 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
1042 jsr166 1.48 if (!createIncomplete) f.complete(v1);
1043     final CompletableFuture<Void> g = f.thenRun(r);
1044     if (createIncomplete) f.complete(v1);
1045 jsr166 1.23
1046     checkCompletedWithWrappedCFException(g);
1047 jsr166 1.48 checkCompletedNormally(f, v1);
1048     }}
1049 dl 1.5
1050     /**
1051     * thenApply result completes normally after normal completion of source
1052     */
1053 jsr166 1.49 public void testThenApply_normalCompletion() {
1054     for (ExecutionMode m : ExecutionMode.values())
1055     for (boolean createIncomplete : new boolean[] { true, false })
1056     for (Integer v1 : new Integer[] { 1, null })
1057     {
1058     final CompletableFuture<Integer> f = new CompletableFuture<>();
1059     final IncFunction r = new IncFunction();
1060     if (!createIncomplete) f.complete(v1);
1061     final CompletableFuture<Integer> g = m.thenApply(f, r);
1062     if (createIncomplete) {
1063     checkIncomplete(g);
1064     f.complete(v1);
1065     }
1066    
1067     checkCompletedNormally(g, inc(v1));
1068     checkCompletedNormally(f, v1);
1069     assertEquals(1, r.invocationCount);
1070     }}
1071 dl 1.5
1072     /**
1073     * thenApply result completes exceptionally after exceptional
1074     * completion of source
1075     */
1076 jsr166 1.49 public void testThenApply_exceptionalCompletion() {
1077     for (ExecutionMode m : ExecutionMode.values())
1078     for (boolean createIncomplete : new boolean[] { true, false })
1079     {
1080     final CFException ex = new CFException();
1081     final CompletableFuture<Integer> f = new CompletableFuture<>();
1082     final IncFunction r = new IncFunction();
1083     if (!createIncomplete) f.completeExceptionally(ex);
1084     final CompletableFuture<Integer> g = m.thenApply(f, r);
1085     if (createIncomplete) f.completeExceptionally(ex);
1086    
1087     checkCompletedWithWrappedCFException(g, ex);
1088     checkCompletedWithWrappedCFException(f, ex);
1089     assertEquals(0, r.invocationCount);
1090     }}
1091 dl 1.5
1092     /**
1093 jsr166 1.49 * thenApply result completes exceptionally if source cancelled
1094 dl 1.5 */
1095 jsr166 1.49 public void testThenApply_sourceCancelled() {
1096     for (ExecutionMode m : ExecutionMode.values())
1097     for (boolean createIncomplete : new boolean[] { true, false })
1098     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1099     {
1100     final CompletableFuture<Integer> f = new CompletableFuture<>();
1101     final IncFunction r = new IncFunction();
1102     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1103     final CompletableFuture<Integer> g = f.thenApply(r);
1104     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1105    
1106     checkCompletedWithWrappedCancellationException(g);
1107     checkCancelled(f);
1108     assertEquals(0, r.invocationCount);
1109     }}
1110 dl 1.5
1111     /**
1112 jsr166 1.49 * thenApply result completes exceptionally if action does
1113 dl 1.5 */
1114 jsr166 1.49 public void testThenApply_actionFailed() {
1115     for (ExecutionMode m : ExecutionMode.values())
1116     for (boolean createIncomplete : new boolean[] { true, false })
1117     for (Integer v1 : new Integer[] { 1, null })
1118     {
1119     final CompletableFuture<Integer> f = new CompletableFuture<>();
1120     final FailingFunction r = new FailingFunction();
1121     if (!createIncomplete) f.complete(v1);
1122     final CompletableFuture<Integer> g = f.thenApply(r);
1123     if (createIncomplete) f.complete(v1);
1124    
1125     checkCompletedWithWrappedCFException(g);
1126     checkCompletedNormally(f, v1);
1127     }}
1128 dl 1.5
1129     /**
1130     * thenAccept result completes normally after normal completion of source
1131     */
1132 jsr166 1.50 public void testThenAccept_normalCompletion() {
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 IncAction r = new IncAction();
1139     if (!createIncomplete) f.complete(v1);
1140     final CompletableFuture<Void> g = m.thenAccept(f, r);
1141     if (createIncomplete) f.complete(v1);
1142    
1143 dl 1.5 checkCompletedNormally(g, null);
1144 jsr166 1.50 checkCompletedNormally(f, v1);
1145     assertEquals(1, r.invocationCount);
1146     assertEquals(inc(v1), r.value);
1147     }}
1148 dl 1.5
1149     /**
1150     * thenAccept result completes exceptionally after exceptional
1151     * completion of source
1152     */
1153 jsr166 1.50 public void testThenAccept_exceptionalCompletion() {
1154     for (ExecutionMode m : ExecutionMode.values())
1155     for (boolean createIncomplete : new boolean[] { true, false })
1156     {
1157     final CFException ex = new CFException();
1158     final CompletableFuture<Integer> f = new CompletableFuture<>();
1159     final IncAction r = new IncAction();
1160     if (!createIncomplete) f.completeExceptionally(ex);
1161     final CompletableFuture<Void> g = m.thenAccept(f, r);
1162     if (createIncomplete) f.completeExceptionally(ex);
1163    
1164     checkCompletedWithWrappedCFException(g, ex);
1165     checkCompletedWithWrappedCFException(f, ex);
1166     assertEquals(0, r.invocationCount);
1167     }}
1168 dl 1.5
1169     /**
1170     * thenAccept result completes exceptionally if action does
1171     */
1172 jsr166 1.50 public void testThenAccept_actionFailed() {
1173     for (ExecutionMode m : ExecutionMode.values())
1174     for (boolean createIncomplete : new boolean[] { true, false })
1175     for (Integer v1 : new Integer[] { 1, null })
1176     {
1177     final CompletableFuture<Integer> f = new CompletableFuture<>();
1178     final FailingConsumer r = new FailingConsumer();
1179     if (!createIncomplete) f.complete(v1);
1180     final CompletableFuture<Void> g = f.thenAccept(r);
1181     if (createIncomplete) f.complete(v1);
1182    
1183 dl 1.5 checkCompletedWithWrappedCFException(g);
1184 jsr166 1.50 checkCompletedNormally(f, v1);
1185     }}
1186 dl 1.5
1187     /**
1188     * thenAccept result completes exceptionally if source cancelled
1189     */
1190 jsr166 1.50 public void testThenAccept_sourceCancelled() {
1191     for (ExecutionMode m : ExecutionMode.values())
1192     for (boolean createIncomplete : new boolean[] { true, false })
1193     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1194     {
1195     final CompletableFuture<Integer> f = new CompletableFuture<>();
1196     final IncAction r = new IncAction();
1197     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1198     final CompletableFuture<Void> g = f.thenAccept(r);
1199     if (createIncomplete) {
1200     checkIncomplete(g);
1201     assertTrue(f.cancel(mayInterruptIfRunning));
1202     }
1203    
1204 dl 1.5 checkCompletedWithWrappedCancellationException(g);
1205 jsr166 1.50 checkCancelled(f);
1206     assertEquals(0, r.invocationCount);
1207     }}
1208 dl 1.5
1209     /**
1210 jsr166 1.18 * thenCombine result completes normally after normal completion
1211     * of sources
1212 dl 1.5 */
1213 jsr166 1.36 public void testThenCombine_normalCompletion1() {
1214 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
1215 jsr166 1.43 for (boolean fFirst : new boolean[] { true, false })
1216 jsr166 1.36 for (ExecutionMode m : ExecutionMode.values())
1217     for (Integer v1 : new Integer[] { 1, null })
1218 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1219     {
1220 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1221     final CompletableFuture<Integer> g = new CompletableFuture<>();
1222     final SubtractFunction r = new SubtractFunction();
1223 jsr166 1.43 CompletableFuture<Integer> h = null;
1224 jsr166 1.44 if (createIncomplete) h = m.thenCombine(f, g, r);
1225 jsr166 1.36
1226 jsr166 1.43 if (fFirst)
1227     f.complete(v1);
1228     else
1229     g.complete(v2);
1230 jsr166 1.44 if (createIncomplete) checkIncomplete(h);
1231     assertEquals(0, r.invocationCount);
1232 jsr166 1.43 if (!fFirst)
1233     f.complete(v1);
1234     else
1235     g.complete(v2);
1236 jsr166 1.44 if (!createIncomplete) h = m.thenCombine(f, g, r);
1237 jsr166 1.36
1238     checkCompletedNormally(h, subtract(v1, v2));
1239     checkCompletedNormally(f, v1);
1240     checkCompletedNormally(g, v2);
1241 jsr166 1.44 assertEquals(1, r.invocationCount);
1242 jsr166 1.47 }}
1243 dl 1.5
1244     /**
1245     * thenCombine result completes exceptionally after exceptional
1246     * completion of either source
1247     */
1248 jsr166 1.36 public void testThenCombine_exceptionalCompletion1() {
1249     for (ExecutionMode m : ExecutionMode.values())
1250 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1251     {
1252 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1253     final CompletableFuture<Integer> g = new CompletableFuture<>();
1254     final SubtractFunction r = new SubtractFunction();
1255     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1256     final CFException ex = new CFException();
1257 jsr166 1.18
1258 jsr166 1.36 f.completeExceptionally(ex);
1259 jsr166 1.18 checkIncomplete(h);
1260 jsr166 1.36 g.complete(v1);
1261    
1262     checkCompletedWithWrappedCFException(h, ex);
1263     checkCompletedWithWrappedCFException(f, ex);
1264 jsr166 1.44 assertEquals(0, r.invocationCount);
1265 jsr166 1.36 checkCompletedNormally(g, v1);
1266 jsr166 1.47 }}
1267 jsr166 1.36
1268     public void testThenCombine_exceptionalCompletion2() {
1269     for (ExecutionMode m : ExecutionMode.values())
1270 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1271     {
1272 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1273     final CompletableFuture<Integer> g = new CompletableFuture<>();
1274     final SubtractFunction r = new SubtractFunction();
1275 jsr166 1.37 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1276 jsr166 1.36 final CFException ex = new CFException();
1277 jsr166 1.18
1278 jsr166 1.36 g.completeExceptionally(ex);
1279 jsr166 1.18 checkIncomplete(h);
1280 jsr166 1.36 f.complete(v1);
1281    
1282     checkCompletedWithWrappedCFException(h, ex);
1283     checkCompletedWithWrappedCFException(g, ex);
1284 jsr166 1.44 assertEquals(0, r.invocationCount);
1285 jsr166 1.36 checkCompletedNormally(f, v1);
1286 jsr166 1.47 }}
1287 jsr166 1.36
1288     public void testThenCombine_exceptionalCompletion3() {
1289     for (ExecutionMode m : ExecutionMode.values())
1290 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1291     {
1292 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1293     final CompletableFuture<Integer> g = new CompletableFuture<>();
1294     final SubtractFunction r = new SubtractFunction();
1295     final CFException ex = new CFException();
1296    
1297     g.completeExceptionally(ex);
1298     f.complete(v1);
1299     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1300    
1301     checkCompletedWithWrappedCFException(h, ex);
1302     checkCompletedWithWrappedCFException(g, ex);
1303 jsr166 1.44 assertEquals(0, r.invocationCount);
1304 jsr166 1.36 checkCompletedNormally(f, v1);
1305 jsr166 1.47 }}
1306 jsr166 1.36
1307     public void testThenCombine_exceptionalCompletion4() {
1308     for (ExecutionMode m : ExecutionMode.values())
1309 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1310     {
1311 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1312     final CompletableFuture<Integer> g = new CompletableFuture<>();
1313     final SubtractFunction r = new SubtractFunction();
1314     final CFException ex = new CFException();
1315 jsr166 1.18
1316 jsr166 1.36 f.completeExceptionally(ex);
1317     g.complete(v1);
1318 jsr166 1.37 final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1319 dl 1.5
1320 jsr166 1.36 checkCompletedWithWrappedCFException(h, ex);
1321     checkCompletedWithWrappedCFException(f, ex);
1322 jsr166 1.44 assertEquals(0, r.invocationCount);
1323 jsr166 1.36 checkCompletedNormally(g, v1);
1324 jsr166 1.47 }}
1325 dl 1.5
1326     /**
1327     * thenCombine result completes exceptionally if action does
1328     */
1329 jsr166 1.36 public void testThenCombine_actionFailed1() {
1330     for (ExecutionMode m : ExecutionMode.values())
1331     for (Integer v1 : new Integer[] { 1, null })
1332 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1333     {
1334 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1335     final CompletableFuture<Integer> g = new CompletableFuture<>();
1336     final FailingBiFunction r = new FailingBiFunction();
1337     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1338    
1339     f.complete(v1);
1340     checkIncomplete(h);
1341     g.complete(v2);
1342    
1343     checkCompletedWithWrappedCFException(h);
1344     checkCompletedNormally(f, v1);
1345     checkCompletedNormally(g, v2);
1346 jsr166 1.47 }}
1347 jsr166 1.36
1348     public void testThenCombine_actionFailed2() {
1349     for (ExecutionMode m : ExecutionMode.values())
1350     for (Integer v1 : new Integer[] { 1, null })
1351 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1352     {
1353 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1354     final CompletableFuture<Integer> g = new CompletableFuture<>();
1355     final FailingBiFunction r = new FailingBiFunction();
1356     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1357    
1358     g.complete(v2);
1359     checkIncomplete(h);
1360     f.complete(v1);
1361    
1362     checkCompletedWithWrappedCFException(h);
1363     checkCompletedNormally(f, v1);
1364     checkCompletedNormally(g, v2);
1365 jsr166 1.47 }}
1366 dl 1.5
1367     /**
1368     * thenCombine result completes exceptionally if either source cancelled
1369     */
1370 jsr166 1.36 public void testThenCombine_sourceCancelled1() {
1371     for (ExecutionMode m : ExecutionMode.values())
1372     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1373 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1374     {
1375 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1376     final CompletableFuture<Integer> g = new CompletableFuture<>();
1377     final SubtractFunction r = new SubtractFunction();
1378     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1379 jsr166 1.18
1380 jsr166 1.36 assertTrue(f.cancel(mayInterruptIfRunning));
1381 jsr166 1.18 checkIncomplete(h);
1382 jsr166 1.36 g.complete(v1);
1383    
1384 jsr166 1.18 checkCompletedWithWrappedCancellationException(h);
1385 jsr166 1.36 checkCancelled(f);
1386 jsr166 1.44 assertEquals(0, r.invocationCount);
1387 jsr166 1.36 checkCompletedNormally(g, v1);
1388 jsr166 1.47 }}
1389 jsr166 1.36
1390     public void testThenCombine_sourceCancelled2() {
1391     for (ExecutionMode m : ExecutionMode.values())
1392     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1393 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1394     {
1395 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1396     final CompletableFuture<Integer> g = new CompletableFuture<>();
1397     final SubtractFunction r = new SubtractFunction();
1398     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1399    
1400     assertTrue(g.cancel(mayInterruptIfRunning));
1401 jsr166 1.18 checkIncomplete(h);
1402 jsr166 1.36 f.complete(v1);
1403    
1404     checkCompletedWithWrappedCancellationException(h);
1405     checkCancelled(g);
1406 jsr166 1.44 assertEquals(0, r.invocationCount);
1407 jsr166 1.36 checkCompletedNormally(f, v1);
1408 jsr166 1.47 }}
1409 jsr166 1.36
1410     public void testThenCombine_sourceCancelled3() {
1411     for (ExecutionMode m : ExecutionMode.values())
1412     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1413 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1414     {
1415 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1416     final CompletableFuture<Integer> g = new CompletableFuture<>();
1417     final SubtractFunction r = new SubtractFunction();
1418    
1419     assertTrue(g.cancel(mayInterruptIfRunning));
1420     f.complete(v1);
1421     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1422    
1423 jsr166 1.18 checkCompletedWithWrappedCancellationException(h);
1424 jsr166 1.36 checkCancelled(g);
1425 jsr166 1.44 assertEquals(0, r.invocationCount);
1426 jsr166 1.36 checkCompletedNormally(f, v1);
1427 jsr166 1.47 }}
1428 jsr166 1.36
1429     public void testThenCombine_sourceCancelled4() {
1430     for (ExecutionMode m : ExecutionMode.values())
1431     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1432 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1433     {
1434 jsr166 1.36 final CompletableFuture<Integer> f = new CompletableFuture<>();
1435     final CompletableFuture<Integer> g = new CompletableFuture<>();
1436     final SubtractFunction r = new SubtractFunction();
1437    
1438     assertTrue(f.cancel(mayInterruptIfRunning));
1439     g.complete(v1);
1440     final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1441 jsr166 1.18
1442     checkCompletedWithWrappedCancellationException(h);
1443 jsr166 1.36 checkCancelled(f);
1444 jsr166 1.44 assertEquals(0, r.invocationCount);
1445 jsr166 1.36 checkCompletedNormally(g, v1);
1446 jsr166 1.47 }}
1447 dl 1.5
1448     /**
1449     * thenAcceptBoth result completes normally after normal
1450     * completion of sources
1451     */
1452 jsr166 1.35 public void testThenAcceptBoth_normalCompletion1() {
1453     for (ExecutionMode m : ExecutionMode.values())
1454     for (Integer v1 : new Integer[] { 1, null })
1455 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1456     {
1457 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1458     final CompletableFuture<Integer> g = new CompletableFuture<>();
1459     final SubtractAction r = new SubtractAction();
1460     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1461 jsr166 1.22
1462 jsr166 1.35 f.complete(v1);
1463 jsr166 1.22 checkIncomplete(h);
1464 jsr166 1.44 assertEquals(0, r.invocationCount);
1465 jsr166 1.35 g.complete(v2);
1466    
1467 jsr166 1.22 checkCompletedNormally(h, null);
1468 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1469 jsr166 1.35 checkCompletedNormally(f, v1);
1470     checkCompletedNormally(g, v2);
1471 jsr166 1.47 }}
1472 jsr166 1.35
1473     public void testThenAcceptBoth_normalCompletion2() {
1474     for (ExecutionMode m : ExecutionMode.values())
1475     for (Integer v1 : new Integer[] { 1, null })
1476 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1477     {
1478 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1479     final CompletableFuture<Integer> g = new CompletableFuture<>();
1480     final SubtractAction r = new SubtractAction();
1481     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1482 jsr166 1.22
1483 jsr166 1.35 g.complete(v2);
1484 jsr166 1.22 checkIncomplete(h);
1485 jsr166 1.44 assertEquals(0, r.invocationCount);
1486 jsr166 1.35 f.complete(v1);
1487    
1488     checkCompletedNormally(h, null);
1489 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1490 jsr166 1.35 checkCompletedNormally(f, v1);
1491     checkCompletedNormally(g, v2);
1492 jsr166 1.47 }}
1493 jsr166 1.35
1494     public void testThenAcceptBoth_normalCompletion3() {
1495     for (ExecutionMode m : ExecutionMode.values())
1496     for (Integer v1 : new Integer[] { 1, null })
1497 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1498     {
1499 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1500     final CompletableFuture<Integer> g = new CompletableFuture<>();
1501     final SubtractAction r = new SubtractAction();
1502    
1503     g.complete(v2);
1504     f.complete(v1);
1505     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1506    
1507 jsr166 1.22 checkCompletedNormally(h, null);
1508 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1509 jsr166 1.35 checkCompletedNormally(f, v1);
1510     checkCompletedNormally(g, v2);
1511 jsr166 1.47 }}
1512 jsr166 1.35
1513     public void testThenAcceptBoth_normalCompletion4() {
1514     for (ExecutionMode m : ExecutionMode.values())
1515     for (Integer v1 : new Integer[] { 1, null })
1516 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1517     {
1518 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1519     final CompletableFuture<Integer> g = new CompletableFuture<>();
1520     final SubtractAction r = new SubtractAction();
1521    
1522     f.complete(v1);
1523     g.complete(v2);
1524     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1525 dl 1.5
1526 jsr166 1.22 checkCompletedNormally(h, null);
1527 jsr166 1.46 assertEquals(subtract(v1, v2), r.value);
1528 jsr166 1.35 checkCompletedNormally(f, v1);
1529     checkCompletedNormally(g, v2);
1530 jsr166 1.47 }}
1531 dl 1.5
1532     /**
1533     * thenAcceptBoth result completes exceptionally after exceptional
1534     * completion of either source
1535     */
1536 jsr166 1.35 public void testThenAcceptBoth_exceptionalCompletion1() {
1537     for (ExecutionMode m : ExecutionMode.values())
1538 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1539     {
1540 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1541     final CompletableFuture<Integer> g = new CompletableFuture<>();
1542     final SubtractAction r = new SubtractAction();
1543     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1544     final CFException ex = new CFException();
1545 jsr166 1.22
1546 jsr166 1.35 f.completeExceptionally(ex);
1547 jsr166 1.22 checkIncomplete(h);
1548 jsr166 1.35 g.complete(v1);
1549    
1550     checkCompletedWithWrappedCFException(h, ex);
1551     checkCompletedWithWrappedCFException(f, ex);
1552 jsr166 1.44 assertEquals(0, r.invocationCount);
1553 jsr166 1.35 checkCompletedNormally(g, v1);
1554 jsr166 1.47 }}
1555 jsr166 1.35
1556     public void testThenAcceptBoth_exceptionalCompletion2() {
1557     for (ExecutionMode m : ExecutionMode.values())
1558 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1559     {
1560 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1561     final CompletableFuture<Integer> g = new CompletableFuture<>();
1562     final SubtractAction r = new SubtractAction();
1563     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1564     final CFException ex = new CFException();
1565 jsr166 1.22
1566 jsr166 1.35 g.completeExceptionally(ex);
1567 jsr166 1.22 checkIncomplete(h);
1568 jsr166 1.35 f.complete(v1);
1569    
1570     checkCompletedWithWrappedCFException(h, ex);
1571     checkCompletedWithWrappedCFException(g, ex);
1572 jsr166 1.44 assertEquals(0, r.invocationCount);
1573 jsr166 1.35 checkCompletedNormally(f, v1);
1574 jsr166 1.47 }}
1575 jsr166 1.35
1576     public void testThenAcceptBoth_exceptionalCompletion3() {
1577     for (ExecutionMode m : ExecutionMode.values())
1578 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1579     {
1580 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1581     final CompletableFuture<Integer> g = new CompletableFuture<>();
1582     final SubtractAction r = new SubtractAction();
1583     final CFException ex = new CFException();
1584    
1585     g.completeExceptionally(ex);
1586     f.complete(v1);
1587     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1588    
1589     checkCompletedWithWrappedCFException(h, ex);
1590     checkCompletedWithWrappedCFException(g, ex);
1591 jsr166 1.44 assertEquals(0, r.invocationCount);
1592 jsr166 1.35 checkCompletedNormally(f, v1);
1593 jsr166 1.47 }}
1594 jsr166 1.35
1595     public void testThenAcceptBoth_exceptionalCompletion4() {
1596     for (ExecutionMode m : ExecutionMode.values())
1597 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1598     {
1599 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1600     final CompletableFuture<Integer> g = new CompletableFuture<>();
1601     final SubtractAction r = new SubtractAction();
1602     final CFException ex = new CFException();
1603 jsr166 1.22
1604 jsr166 1.35 f.completeExceptionally(ex);
1605     g.complete(v1);
1606     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1607 dl 1.5
1608 jsr166 1.35 checkCompletedWithWrappedCFException(h, ex);
1609     checkCompletedWithWrappedCFException(f, ex);
1610 jsr166 1.44 assertEquals(0, r.invocationCount);
1611 jsr166 1.35 checkCompletedNormally(g, v1);
1612 jsr166 1.47 }}
1613 dl 1.5
1614     /**
1615     * thenAcceptBoth result completes exceptionally if action does
1616     */
1617 jsr166 1.35 public void testThenAcceptBoth_actionFailed1() {
1618     for (ExecutionMode m : ExecutionMode.values())
1619     for (Integer v1 : new Integer[] { 1, null })
1620 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1621     {
1622 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1623     final CompletableFuture<Integer> g = new CompletableFuture<>();
1624     final FailingBiConsumer r = new FailingBiConsumer();
1625     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1626 jsr166 1.22
1627 jsr166 1.35 f.complete(v1);
1628 jsr166 1.22 checkIncomplete(h);
1629 jsr166 1.35 g.complete(v2);
1630    
1631 jsr166 1.22 checkCompletedWithWrappedCFException(h);
1632 jsr166 1.35 checkCompletedNormally(f, v1);
1633     checkCompletedNormally(g, v2);
1634 jsr166 1.47 }}
1635 jsr166 1.35
1636     public void testThenAcceptBoth_actionFailed2() {
1637     for (ExecutionMode m : ExecutionMode.values())
1638     for (Integer v1 : new Integer[] { 1, null })
1639 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1640     {
1641 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1642     final CompletableFuture<Integer> g = new CompletableFuture<>();
1643     final FailingBiConsumer r = new FailingBiConsumer();
1644     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1645    
1646     g.complete(v2);
1647     checkIncomplete(h);
1648     f.complete(v1);
1649 jsr166 1.22
1650     checkCompletedWithWrappedCFException(h);
1651 jsr166 1.35 checkCompletedNormally(f, v1);
1652     checkCompletedNormally(g, v2);
1653 jsr166 1.47 }}
1654 dl 1.5
1655     /**
1656     * thenAcceptBoth result completes exceptionally if either source cancelled
1657     */
1658 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled1() {
1659     for (ExecutionMode m : ExecutionMode.values())
1660     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1661 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1662     {
1663 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1664     final CompletableFuture<Integer> g = new CompletableFuture<>();
1665     final SubtractAction r = new SubtractAction();
1666     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1667 jsr166 1.22
1668 jsr166 1.35 assertTrue(f.cancel(mayInterruptIfRunning));
1669 jsr166 1.22 checkIncomplete(h);
1670 jsr166 1.35 g.complete(v1);
1671    
1672 jsr166 1.22 checkCompletedWithWrappedCancellationException(h);
1673 jsr166 1.35 checkCancelled(f);
1674 jsr166 1.44 assertEquals(0, r.invocationCount);
1675 jsr166 1.35 checkCompletedNormally(g, v1);
1676 jsr166 1.47 }}
1677 jsr166 1.22
1678 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled2() {
1679     for (ExecutionMode m : ExecutionMode.values())
1680     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1681 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1682     {
1683 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1684     final CompletableFuture<Integer> g = new CompletableFuture<>();
1685     final SubtractAction r = new SubtractAction();
1686     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1687    
1688     assertTrue(g.cancel(mayInterruptIfRunning));
1689 jsr166 1.22 checkIncomplete(h);
1690 jsr166 1.35 f.complete(v1);
1691    
1692 jsr166 1.22 checkCompletedWithWrappedCancellationException(h);
1693 jsr166 1.35 checkCancelled(g);
1694 jsr166 1.44 assertEquals(0, r.invocationCount);
1695 jsr166 1.35 checkCompletedNormally(f, v1);
1696 jsr166 1.47 }}
1697 jsr166 1.35
1698     public void testThenAcceptBoth_sourceCancelled3() {
1699     for (ExecutionMode m : ExecutionMode.values())
1700     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1701 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1702     {
1703 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1704     final CompletableFuture<Integer> g = new CompletableFuture<>();
1705     final SubtractAction r = new SubtractAction();
1706 jsr166 1.22
1707 jsr166 1.35 assertTrue(g.cancel(mayInterruptIfRunning));
1708     f.complete(v1);
1709     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1710 jsr166 1.22
1711     checkCompletedWithWrappedCancellationException(h);
1712 jsr166 1.35 checkCancelled(g);
1713 jsr166 1.44 assertEquals(0, r.invocationCount);
1714 jsr166 1.35 checkCompletedNormally(f, v1);
1715 jsr166 1.47 }}
1716 dl 1.5
1717 jsr166 1.35 public void testThenAcceptBoth_sourceCancelled4() {
1718     for (ExecutionMode m : ExecutionMode.values())
1719     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1720 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1721     {
1722 jsr166 1.35 final CompletableFuture<Integer> f = new CompletableFuture<>();
1723     final CompletableFuture<Integer> g = new CompletableFuture<>();
1724     final SubtractAction r = new SubtractAction();
1725 jsr166 1.34
1726 jsr166 1.35 assertTrue(f.cancel(mayInterruptIfRunning));
1727     g.complete(v1);
1728     final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1729 jsr166 1.34
1730 jsr166 1.35 checkCompletedWithWrappedCancellationException(h);
1731     checkCancelled(f);
1732 jsr166 1.44 assertEquals(0, r.invocationCount);
1733 jsr166 1.35 checkCompletedNormally(g, v1);
1734 jsr166 1.47 }}
1735 jsr166 1.34
1736     /**
1737 dl 1.5 * runAfterBoth result completes normally after normal
1738     * completion of sources
1739     */
1740 jsr166 1.33 public void testRunAfterBoth_normalCompletion1() {
1741 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1742 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1743 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1744     {
1745 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1746     final CompletableFuture<Integer> g = new CompletableFuture<>();
1747     final Noop r = new Noop();
1748 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1749 jsr166 1.22
1750 jsr166 1.33 f.complete(v1);
1751 jsr166 1.22 checkIncomplete(h);
1752 jsr166 1.44 assertEquals(0, r.invocationCount);
1753 jsr166 1.33 g.complete(v2);
1754    
1755 jsr166 1.22 checkCompletedNormally(h, null);
1756 jsr166 1.44 assertEquals(1, r.invocationCount);
1757 jsr166 1.33 checkCompletedNormally(f, v1);
1758     checkCompletedNormally(g, v2);
1759 jsr166 1.47 }}
1760 jsr166 1.33
1761     public void testRunAfterBoth_normalCompletion2() {
1762 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1763 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1764 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1765     {
1766 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1767     final CompletableFuture<Integer> g = new CompletableFuture<>();
1768     final Noop r = new Noop();
1769 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1770 jsr166 1.22
1771 jsr166 1.33 g.complete(v2);
1772 jsr166 1.22 checkIncomplete(h);
1773 jsr166 1.44 assertEquals(0, r.invocationCount);
1774 jsr166 1.33 f.complete(v1);
1775    
1776     checkCompletedNormally(h, null);
1777 jsr166 1.44 assertEquals(1, r.invocationCount);
1778 jsr166 1.33 checkCompletedNormally(f, v1);
1779     checkCompletedNormally(g, v2);
1780 jsr166 1.47 }}
1781 jsr166 1.33
1782     public void testRunAfterBoth_normalCompletion3() {
1783 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1784 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1785 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1786     {
1787 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1788     final CompletableFuture<Integer> g = new CompletableFuture<>();
1789     final Noop r = new Noop();
1790    
1791     g.complete(v2);
1792     f.complete(v1);
1793 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1794 jsr166 1.33
1795 jsr166 1.22 checkCompletedNormally(h, null);
1796 jsr166 1.44 assertEquals(1, r.invocationCount);
1797 jsr166 1.33 checkCompletedNormally(f, v1);
1798     checkCompletedNormally(g, v2);
1799 jsr166 1.47 }}
1800 jsr166 1.33
1801     public void testRunAfterBoth_normalCompletion4() {
1802 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1803 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1804 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1805     {
1806 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1807     final CompletableFuture<Integer> g = new CompletableFuture<>();
1808     final Noop r = new Noop();
1809    
1810     f.complete(v1);
1811     g.complete(v2);
1812 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1813 dl 1.5
1814 jsr166 1.22 checkCompletedNormally(h, null);
1815 jsr166 1.44 assertEquals(1, r.invocationCount);
1816 jsr166 1.33 checkCompletedNormally(f, v1);
1817     checkCompletedNormally(g, v2);
1818 jsr166 1.47 }}
1819 dl 1.5
1820     /**
1821     * runAfterBoth result completes exceptionally after exceptional
1822     * completion of either source
1823     */
1824 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion1() {
1825 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1826 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1827     {
1828 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1829     final CompletableFuture<Integer> g = new CompletableFuture<>();
1830     final Noop r = new Noop();
1831 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1832 jsr166 1.33 final CFException ex = new CFException();
1833 jsr166 1.22
1834 jsr166 1.33 f.completeExceptionally(ex);
1835 jsr166 1.22 checkIncomplete(h);
1836 jsr166 1.33 g.complete(v1);
1837    
1838     checkCompletedWithWrappedCFException(h, ex);
1839     checkCompletedWithWrappedCFException(f, ex);
1840 jsr166 1.44 assertEquals(0, r.invocationCount);
1841 jsr166 1.33 checkCompletedNormally(g, v1);
1842 jsr166 1.47 }}
1843 jsr166 1.22
1844 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion2() {
1845 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1846 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1847     {
1848 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1849     final CompletableFuture<Integer> g = new CompletableFuture<>();
1850     final Noop r = new Noop();
1851 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1852 jsr166 1.33 final CFException ex = new CFException();
1853    
1854     g.completeExceptionally(ex);
1855 jsr166 1.22 checkIncomplete(h);
1856 jsr166 1.33 f.complete(v1);
1857    
1858     checkCompletedWithWrappedCFException(h, ex);
1859     checkCompletedWithWrappedCFException(g, ex);
1860 jsr166 1.44 assertEquals(0, r.invocationCount);
1861 jsr166 1.33 checkCompletedNormally(f, v1);
1862 jsr166 1.47 }}
1863 jsr166 1.22
1864 jsr166 1.33 public void testRunAfterBoth_exceptionalCompletion3() {
1865 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1866 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1867     {
1868 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1869     final CompletableFuture<Integer> g = new CompletableFuture<>();
1870     final Noop r = new Noop();
1871     final CFException ex = new CFException();
1872    
1873     g.completeExceptionally(ex);
1874     f.complete(v1);
1875 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1876 jsr166 1.33
1877     checkCompletedWithWrappedCFException(h, ex);
1878     checkCompletedWithWrappedCFException(g, ex);
1879 jsr166 1.44 assertEquals(0, r.invocationCount);
1880 jsr166 1.33 checkCompletedNormally(f, v1);
1881 jsr166 1.47 }}
1882 jsr166 1.33
1883     public void testRunAfterBoth_exceptionalCompletion4() {
1884 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1885 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1886     {
1887 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1888     final CompletableFuture<Integer> g = new CompletableFuture<>();
1889     final Noop r = new Noop();
1890     final CFException ex = new CFException();
1891    
1892     f.completeExceptionally(ex);
1893     g.complete(v1);
1894 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1895 dl 1.5
1896 jsr166 1.33 checkCompletedWithWrappedCFException(h, ex);
1897     checkCompletedWithWrappedCFException(f, ex);
1898 jsr166 1.44 assertEquals(0, r.invocationCount);
1899 jsr166 1.33 checkCompletedNormally(g, v1);
1900 jsr166 1.47 }}
1901 dl 1.5
1902 jsr166 1.4 /**
1903 dl 1.5 * runAfterBoth result completes exceptionally if action does
1904 jsr166 1.4 */
1905 jsr166 1.33 public void testRunAfterBoth_actionFailed1() {
1906 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1907 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1908 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1909     {
1910 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1911     final CompletableFuture<Integer> g = new CompletableFuture<>();
1912 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
1913 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1914 jsr166 1.33
1915     f.complete(v1);
1916     checkIncomplete(h);
1917     g.complete(v2);
1918    
1919     checkCompletedWithWrappedCFException(h);
1920     checkCompletedNormally(f, v1);
1921     checkCompletedNormally(g, v2);
1922 jsr166 1.47 }}
1923 jsr166 1.33
1924     public void testRunAfterBoth_actionFailed2() {
1925 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1926 jsr166 1.33 for (Integer v1 : new Integer[] { 1, null })
1927 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
1928     {
1929 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1930     final CompletableFuture<Integer> g = new CompletableFuture<>();
1931 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
1932 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1933 jsr166 1.33
1934     g.complete(v2);
1935     checkIncomplete(h);
1936     f.complete(v1);
1937    
1938     checkCompletedWithWrappedCFException(h);
1939     checkCompletedNormally(f, v1);
1940     checkCompletedNormally(g, v2);
1941 jsr166 1.47 }}
1942 jsr166 1.4
1943     /**
1944 dl 1.5 * runAfterBoth result completes exceptionally if either source cancelled
1945 jsr166 1.4 */
1946 jsr166 1.33 public void testRunAfterBoth_sourceCancelled1() {
1947 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1948 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1949 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1950     {
1951 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1952     final CompletableFuture<Integer> g = new CompletableFuture<>();
1953     final Noop r = new Noop();
1954 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1955 jsr166 1.33
1956     assertTrue(f.cancel(mayInterruptIfRunning));
1957     checkIncomplete(h);
1958     g.complete(v1);
1959    
1960     checkCompletedWithWrappedCancellationException(h);
1961     checkCancelled(f);
1962 jsr166 1.44 assertEquals(0, r.invocationCount);
1963 jsr166 1.33 checkCompletedNormally(g, v1);
1964 jsr166 1.47 }}
1965 jsr166 1.33
1966     public void testRunAfterBoth_sourceCancelled2() {
1967 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1968 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1969 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1970     {
1971 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1972     final CompletableFuture<Integer> g = new CompletableFuture<>();
1973     final Noop r = new Noop();
1974 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1975 jsr166 1.33
1976     assertTrue(g.cancel(mayInterruptIfRunning));
1977     checkIncomplete(h);
1978     f.complete(v1);
1979    
1980     checkCompletedWithWrappedCancellationException(h);
1981     checkCancelled(g);
1982 jsr166 1.44 assertEquals(0, r.invocationCount);
1983 jsr166 1.33 checkCompletedNormally(f, v1);
1984 jsr166 1.47 }}
1985 jsr166 1.33
1986     public void testRunAfterBoth_sourceCancelled3() {
1987 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
1988 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1989 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
1990     {
1991 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
1992     final CompletableFuture<Integer> g = new CompletableFuture<>();
1993     final Noop r = new Noop();
1994    
1995     assertTrue(g.cancel(mayInterruptIfRunning));
1996     f.complete(v1);
1997 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1998 jsr166 1.33
1999     checkCompletedWithWrappedCancellationException(h);
2000     checkCancelled(g);
2001 jsr166 1.44 assertEquals(0, r.invocationCount);
2002 jsr166 1.33 checkCompletedNormally(f, v1);
2003 jsr166 1.47 }}
2004 jsr166 1.33
2005     public void testRunAfterBoth_sourceCancelled4() {
2006 jsr166 1.34 for (ExecutionMode m : ExecutionMode.values())
2007 jsr166 1.33 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2008 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2009     {
2010 jsr166 1.33 final CompletableFuture<Integer> f = new CompletableFuture<>();
2011     final CompletableFuture<Integer> g = new CompletableFuture<>();
2012     final Noop r = new Noop();
2013    
2014     assertTrue(f.cancel(mayInterruptIfRunning));
2015     g.complete(v1);
2016 jsr166 1.34 final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
2017 jsr166 1.33
2018     checkCompletedWithWrappedCancellationException(h);
2019     checkCancelled(f);
2020 jsr166 1.44 assertEquals(0, r.invocationCount);
2021 jsr166 1.33 checkCompletedNormally(g, v1);
2022 jsr166 1.47 }}
2023 dl 1.5
2024     /**
2025     * applyToEither result completes normally after normal completion
2026     * of either source
2027     */
2028 jsr166 1.39 public void testApplyToEither_normalCompletion1() {
2029     for (ExecutionMode m : ExecutionMode.values())
2030     for (Integer v1 : new Integer[] { 1, null })
2031 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2032     {
2033 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2034     final CompletableFuture<Integer> g = new CompletableFuture<>();
2035     final IncFunction r = new IncFunction();
2036     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2037    
2038     f.complete(v1);
2039     checkCompletedNormally(h, inc(v1));
2040     g.complete(v2);
2041    
2042     checkCompletedNormally(f, v1);
2043     checkCompletedNormally(g, v2);
2044     checkCompletedNormally(h, inc(v1));
2045 jsr166 1.47 }}
2046 dl 1.5
2047 jsr166 1.39 public void testApplyToEither_normalCompletion2() {
2048     for (ExecutionMode m : ExecutionMode.values())
2049     for (Integer v1 : new Integer[] { 1, null })
2050 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2051     {
2052 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2053     final CompletableFuture<Integer> g = new CompletableFuture<>();
2054     final IncFunction r = new IncFunction();
2055     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2056    
2057     g.complete(v2);
2058     checkCompletedNormally(h, inc(v2));
2059     f.complete(v1);
2060    
2061     checkCompletedNormally(f, v1);
2062     checkCompletedNormally(g, v2);
2063     checkCompletedNormally(h, inc(v2));
2064 jsr166 1.47 }}
2065    
2066 jsr166 1.39 public void testApplyToEither_normalCompletion3() {
2067     for (ExecutionMode m : ExecutionMode.values())
2068     for (Integer v1 : new Integer[] { 1, null })
2069 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2070     {
2071 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2072     final CompletableFuture<Integer> g = new CompletableFuture<>();
2073     final IncFunction r = new IncFunction();
2074    
2075     f.complete(v1);
2076     g.complete(v2);
2077     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2078    
2079     checkCompletedNormally(f, v1);
2080     checkCompletedNormally(g, v2);
2081    
2082     // unspecified behavior
2083     assertTrue(Objects.equals(h.join(), inc(v1)) ||
2084     Objects.equals(h.join(), inc(v2)));
2085 jsr166 1.44 assertEquals(1, r.invocationCount);
2086 jsr166 1.47 }}
2087 dl 1.5
2088     /**
2089     * applyToEither result completes exceptionally after exceptional
2090     * completion of either source
2091     */
2092 jsr166 1.39 public void testApplyToEither_exceptionalCompletion1() {
2093     for (ExecutionMode m : ExecutionMode.values())
2094 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2095     {
2096 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2097     final CompletableFuture<Integer> g = new CompletableFuture<>();
2098     final IncFunction r = new IncFunction();
2099     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2100     final CFException ex = new CFException();
2101    
2102     f.completeExceptionally(ex);
2103     checkCompletedWithWrappedCFException(h, ex);
2104     g.complete(v1);
2105    
2106 jsr166 1.44 assertEquals(0, r.invocationCount);
2107 jsr166 1.39 checkCompletedNormally(g, v1);
2108     checkCompletedWithWrappedCFException(f, ex);
2109     checkCompletedWithWrappedCFException(h, ex);
2110 jsr166 1.47 }}
2111 jsr166 1.39
2112     public void testApplyToEither_exceptionalCompletion2() {
2113     for (ExecutionMode m : ExecutionMode.values())
2114 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2115     {
2116 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2117     final CompletableFuture<Integer> g = new CompletableFuture<>();
2118     final IncFunction r = new IncFunction();
2119     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2120     final CFException ex = new CFException();
2121    
2122     g.completeExceptionally(ex);
2123     checkCompletedWithWrappedCFException(h, ex);
2124     f.complete(v1);
2125    
2126 jsr166 1.44 assertEquals(0, r.invocationCount);
2127 jsr166 1.39 checkCompletedNormally(f, v1);
2128     checkCompletedWithWrappedCFException(g, ex);
2129     checkCompletedWithWrappedCFException(h, ex);
2130 jsr166 1.47 }}
2131 jsr166 1.39
2132     public void testApplyToEither_exceptionalCompletion3() {
2133     for (ExecutionMode m : ExecutionMode.values())
2134 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2135     {
2136 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2137     final CompletableFuture<Integer> g = new CompletableFuture<>();
2138     final IncFunction r = new IncFunction();
2139     final CFException ex = new CFException();
2140    
2141     g.completeExceptionally(ex);
2142     f.complete(v1);
2143     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2144    
2145     // unspecified behavior
2146     Integer v;
2147     try {
2148 jsr166 1.46 assertEquals(inc(v1), h.join());
2149 jsr166 1.44 assertEquals(1, r.invocationCount);
2150 jsr166 1.39 } catch (CompletionException ok) {
2151     checkCompletedWithWrappedCFException(h, ex);
2152 jsr166 1.44 assertEquals(0, r.invocationCount);
2153 jsr166 1.39 }
2154    
2155     checkCompletedWithWrappedCFException(g, ex);
2156     checkCompletedNormally(f, v1);
2157 jsr166 1.47 }}
2158 jsr166 1.39
2159     public void testApplyToEither_exceptionalCompletion4() {
2160     for (ExecutionMode m : ExecutionMode.values())
2161 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2162     {
2163 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2164     final CompletableFuture<Integer> g = new CompletableFuture<>();
2165     final IncFunction r = new IncFunction();
2166     final CFException ex = new CFException();
2167    
2168     f.completeExceptionally(ex);
2169     g.complete(v1);
2170     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2171    
2172     // unspecified behavior
2173     Integer v;
2174     try {
2175 jsr166 1.46 assertEquals(inc(v1), h.join());
2176 jsr166 1.44 assertEquals(1, r.invocationCount);
2177 jsr166 1.39 } catch (CompletionException ok) {
2178     checkCompletedWithWrappedCFException(h, ex);
2179 jsr166 1.44 assertEquals(0, r.invocationCount);
2180 jsr166 1.39 }
2181 dl 1.5
2182 jsr166 1.39 checkCompletedWithWrappedCFException(f, ex);
2183     checkCompletedNormally(g, v1);
2184 jsr166 1.47 }}
2185 dl 1.5
2186     /**
2187     * applyToEither result completes exceptionally if action does
2188     */
2189 jsr166 1.39 public void testApplyToEither_actionFailed1() {
2190     for (ExecutionMode m : ExecutionMode.values())
2191     for (Integer v1 : new Integer[] { 1, null })
2192 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2193     {
2194 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2195     final CompletableFuture<Integer> g = new CompletableFuture<>();
2196     final FailingFunction r = new FailingFunction();
2197     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2198    
2199     f.complete(v1);
2200     checkCompletedWithWrappedCFException(h);
2201     g.complete(v2);
2202     checkCompletedNormally(f, v1);
2203     checkCompletedNormally(g, v2);
2204 jsr166 1.47 }}
2205 jsr166 1.39
2206     public void testApplyToEither_actionFailed2() {
2207     for (ExecutionMode m : ExecutionMode.values())
2208     for (Integer v1 : new Integer[] { 1, null })
2209 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2210     {
2211 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2212     final CompletableFuture<Integer> g = new CompletableFuture<>();
2213     final FailingFunction r = new FailingFunction();
2214     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2215    
2216     g.complete(v2);
2217     checkCompletedWithWrappedCFException(h);
2218     f.complete(v1);
2219     checkCompletedNormally(f, v1);
2220     checkCompletedNormally(g, v2);
2221 jsr166 1.47 }}
2222 dl 1.5
2223     /**
2224     * applyToEither result completes exceptionally if either source cancelled
2225     */
2226 jsr166 1.39 public void testApplyToEither_sourceCancelled1() {
2227     for (ExecutionMode m : ExecutionMode.values())
2228     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2229 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2230     {
2231 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2232     final CompletableFuture<Integer> g = new CompletableFuture<>();
2233     final IncFunction r = new IncFunction();
2234     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2235    
2236     assertTrue(f.cancel(mayInterruptIfRunning));
2237     checkCompletedWithWrappedCancellationException(h);
2238     g.complete(v1);
2239    
2240     checkCancelled(f);
2241 jsr166 1.44 assertEquals(0, r.invocationCount);
2242 jsr166 1.39 checkCompletedNormally(g, v1);
2243     checkCompletedWithWrappedCancellationException(h);
2244 jsr166 1.47 }}
2245 jsr166 1.39
2246     public void testApplyToEither_sourceCancelled2() {
2247     for (ExecutionMode m : ExecutionMode.values())
2248     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2249 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2250     {
2251 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2252     final CompletableFuture<Integer> g = new CompletableFuture<>();
2253     final IncFunction r = new IncFunction();
2254     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2255    
2256     assertTrue(g.cancel(mayInterruptIfRunning));
2257     checkCompletedWithWrappedCancellationException(h);
2258     f.complete(v1);
2259    
2260     checkCancelled(g);
2261 jsr166 1.44 assertEquals(0, r.invocationCount);
2262 jsr166 1.39 checkCompletedNormally(f, v1);
2263     checkCompletedWithWrappedCancellationException(h);
2264 jsr166 1.47 }}
2265 jsr166 1.39
2266     public void testApplyToEither_sourceCancelled3() {
2267     for (ExecutionMode m : ExecutionMode.values())
2268     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2269 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2270     {
2271 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2272     final CompletableFuture<Integer> g = new CompletableFuture<>();
2273     final IncFunction r = new IncFunction();
2274    
2275     assertTrue(g.cancel(mayInterruptIfRunning));
2276     f.complete(v1);
2277     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2278    
2279     // unspecified behavior
2280     Integer v;
2281     try {
2282 jsr166 1.46 assertEquals(inc(v1), h.join());
2283 jsr166 1.44 assertEquals(1, r.invocationCount);
2284 jsr166 1.39 } catch (CompletionException ok) {
2285     checkCompletedWithWrappedCancellationException(h);
2286 jsr166 1.44 assertEquals(0, r.invocationCount);
2287 jsr166 1.39 }
2288    
2289     checkCancelled(g);
2290     checkCompletedNormally(f, v1);
2291 jsr166 1.47 }}
2292 jsr166 1.39
2293     public void testApplyToEither_sourceCancelled4() {
2294     for (ExecutionMode m : ExecutionMode.values())
2295     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2296 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2297     {
2298 jsr166 1.39 final CompletableFuture<Integer> f = new CompletableFuture<>();
2299     final CompletableFuture<Integer> g = new CompletableFuture<>();
2300     final IncFunction r = new IncFunction();
2301    
2302     assertTrue(f.cancel(mayInterruptIfRunning));
2303     g.complete(v1);
2304     final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2305    
2306     // unspecified behavior
2307     Integer v;
2308     try {
2309 jsr166 1.46 assertEquals(inc(v1), h.join());
2310 jsr166 1.44 assertEquals(1, r.invocationCount);
2311 jsr166 1.39 } catch (CompletionException ok) {
2312     checkCompletedWithWrappedCancellationException(h);
2313 jsr166 1.44 assertEquals(0, r.invocationCount);
2314 jsr166 1.39 }
2315    
2316     checkCancelled(f);
2317     checkCompletedNormally(g, v1);
2318 jsr166 1.47 }}
2319 dl 1.5
2320     /**
2321     * acceptEither result completes normally after normal completion
2322     * of either source
2323     */
2324 jsr166 1.40 public void testAcceptEither_normalCompletion1() {
2325     for (ExecutionMode m : ExecutionMode.values())
2326     for (Integer v1 : new Integer[] { 1, null })
2327 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2328     {
2329 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2330     final CompletableFuture<Integer> g = new CompletableFuture<>();
2331     final IncAction r = new IncAction();
2332     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2333    
2334     f.complete(v1);
2335     checkCompletedNormally(h, null);
2336 jsr166 1.46 assertEquals(inc(v1), r.value);
2337 jsr166 1.40 g.complete(v2);
2338    
2339     checkCompletedNormally(f, v1);
2340     checkCompletedNormally(g, v2);
2341     checkCompletedNormally(h, null);
2342 jsr166 1.47 }}
2343 dl 1.5
2344 jsr166 1.40 public void testAcceptEither_normalCompletion2() {
2345     for (ExecutionMode m : ExecutionMode.values())
2346     for (Integer v1 : new Integer[] { 1, null })
2347 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2348     {
2349 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2350     final CompletableFuture<Integer> g = new CompletableFuture<>();
2351     final IncAction r = new IncAction();
2352     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2353    
2354     g.complete(v2);
2355     checkCompletedNormally(h, null);
2356 jsr166 1.46 assertEquals(inc(v2), r.value);
2357 jsr166 1.40 f.complete(v1);
2358    
2359     checkCompletedNormally(f, v1);
2360     checkCompletedNormally(g, v2);
2361     checkCompletedNormally(h, null);
2362 jsr166 1.47 }}
2363    
2364 jsr166 1.40 public void testAcceptEither_normalCompletion3() {
2365     for (ExecutionMode m : ExecutionMode.values())
2366     for (Integer v1 : new Integer[] { 1, null })
2367 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2368     {
2369 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2370     final CompletableFuture<Integer> g = new CompletableFuture<>();
2371     final IncAction r = new IncAction();
2372    
2373     f.complete(v1);
2374     g.complete(v2);
2375     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2376    
2377     checkCompletedNormally(h, null);
2378     checkCompletedNormally(f, v1);
2379     checkCompletedNormally(g, v2);
2380    
2381     // unspecified behavior
2382     assertTrue(Objects.equals(r.value, inc(v1)) ||
2383     Objects.equals(r.value, inc(v2)));
2384 jsr166 1.47 }}
2385 dl 1.5
2386     /**
2387     * acceptEither result completes exceptionally after exceptional
2388     * completion of either source
2389     */
2390 jsr166 1.40 public void testAcceptEither_exceptionalCompletion1() {
2391     for (ExecutionMode m : ExecutionMode.values())
2392 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2393     {
2394 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2395     final CompletableFuture<Integer> g = new CompletableFuture<>();
2396     final IncAction r = new IncAction();
2397     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2398     final CFException ex = new CFException();
2399    
2400     f.completeExceptionally(ex);
2401     checkCompletedWithWrappedCFException(h, ex);
2402     g.complete(v1);
2403    
2404 jsr166 1.44 assertEquals(0, r.invocationCount);
2405 jsr166 1.40 checkCompletedNormally(g, v1);
2406     checkCompletedWithWrappedCFException(f, ex);
2407     checkCompletedWithWrappedCFException(h, ex);
2408 jsr166 1.47 }}
2409 jsr166 1.40
2410     public void testAcceptEither_exceptionalCompletion2() {
2411     for (ExecutionMode m : ExecutionMode.values())
2412 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2413     {
2414 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2415     final CompletableFuture<Integer> g = new CompletableFuture<>();
2416     final IncAction r = new IncAction();
2417     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2418     final CFException ex = new CFException();
2419    
2420     g.completeExceptionally(ex);
2421     checkCompletedWithWrappedCFException(h, ex);
2422     f.complete(v1);
2423    
2424 jsr166 1.44 assertEquals(0, r.invocationCount);
2425 jsr166 1.40 checkCompletedNormally(f, v1);
2426     checkCompletedWithWrappedCFException(g, ex);
2427     checkCompletedWithWrappedCFException(h, ex);
2428 jsr166 1.47 }}
2429 jsr166 1.40
2430     public void testAcceptEither_exceptionalCompletion3() {
2431     for (ExecutionMode m : ExecutionMode.values())
2432 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2433     {
2434 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2435     final CompletableFuture<Integer> g = new CompletableFuture<>();
2436     final IncAction r = new IncAction();
2437     final CFException ex = new CFException();
2438    
2439     g.completeExceptionally(ex);
2440     f.complete(v1);
2441     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2442    
2443     // unspecified behavior
2444     Integer v;
2445     try {
2446 jsr166 1.46 assertNull(h.join());
2447 jsr166 1.44 assertEquals(1, r.invocationCount);
2448 jsr166 1.40 assertEquals(inc(v1), r.value);
2449     } catch (CompletionException ok) {
2450     checkCompletedWithWrappedCFException(h, ex);
2451 jsr166 1.44 assertEquals(0, r.invocationCount);
2452 jsr166 1.40 }
2453    
2454     checkCompletedWithWrappedCFException(g, ex);
2455     checkCompletedNormally(f, v1);
2456 jsr166 1.47 }}
2457 jsr166 1.40
2458     public void testAcceptEither_exceptionalCompletion4() {
2459     for (ExecutionMode m : ExecutionMode.values())
2460 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2461     {
2462 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2463     final CompletableFuture<Integer> g = new CompletableFuture<>();
2464     final IncAction r = new IncAction();
2465     final CFException ex = new CFException();
2466    
2467     f.completeExceptionally(ex);
2468     g.complete(v1);
2469     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2470    
2471     // unspecified behavior
2472     Integer v;
2473     try {
2474 jsr166 1.46 assertNull(h.join());
2475 jsr166 1.44 assertEquals(1, r.invocationCount);
2476 jsr166 1.40 assertEquals(inc(v1), r.value);
2477     } catch (CompletionException ok) {
2478     checkCompletedWithWrappedCFException(h, ex);
2479 jsr166 1.44 assertEquals(0, r.invocationCount);
2480 jsr166 1.40 }
2481 dl 1.5
2482 jsr166 1.40 checkCompletedWithWrappedCFException(f, ex);
2483     checkCompletedNormally(g, v1);
2484 jsr166 1.47 }}
2485 dl 1.5
2486     /**
2487     * acceptEither result completes exceptionally if action does
2488     */
2489 jsr166 1.40 public void testAcceptEither_actionFailed1() {
2490     for (ExecutionMode m : ExecutionMode.values())
2491     for (Integer v1 : new Integer[] { 1, null })
2492 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2493     {
2494 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2495     final CompletableFuture<Integer> g = new CompletableFuture<>();
2496     final FailingConsumer r = new FailingConsumer();
2497     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2498    
2499     f.complete(v1);
2500     checkCompletedWithWrappedCFException(h);
2501     g.complete(v2);
2502     checkCompletedNormally(f, v1);
2503     checkCompletedNormally(g, v2);
2504 jsr166 1.47 }}
2505 jsr166 1.40
2506     public void testAcceptEither_actionFailed2() {
2507     for (ExecutionMode m : ExecutionMode.values())
2508     for (Integer v1 : new Integer[] { 1, null })
2509 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2510     {
2511 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2512     final CompletableFuture<Integer> g = new CompletableFuture<>();
2513     final FailingConsumer r = new FailingConsumer();
2514     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2515    
2516     g.complete(v2);
2517     checkCompletedWithWrappedCFException(h);
2518     f.complete(v1);
2519     checkCompletedNormally(f, v1);
2520     checkCompletedNormally(g, v2);
2521 jsr166 1.47 }}
2522 dl 1.5
2523     /**
2524     * acceptEither result completes exceptionally if either source cancelled
2525     */
2526 jsr166 1.40 public void testAcceptEither_sourceCancelled1() {
2527     for (ExecutionMode m : ExecutionMode.values())
2528     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2529 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2530     {
2531 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2532     final CompletableFuture<Integer> g = new CompletableFuture<>();
2533     final IncAction r = new IncAction();
2534     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2535    
2536     assertTrue(f.cancel(mayInterruptIfRunning));
2537     checkCompletedWithWrappedCancellationException(h);
2538     g.complete(v1);
2539    
2540     checkCancelled(f);
2541 jsr166 1.44 assertEquals(0, r.invocationCount);
2542 jsr166 1.40 checkCompletedNormally(g, v1);
2543     checkCompletedWithWrappedCancellationException(h);
2544 jsr166 1.47 }}
2545 jsr166 1.40
2546     public void testAcceptEither_sourceCancelled2() {
2547     for (ExecutionMode m : ExecutionMode.values())
2548     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2549 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2550     {
2551 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2552     final CompletableFuture<Integer> g = new CompletableFuture<>();
2553     final IncAction r = new IncAction();
2554     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2555    
2556     assertTrue(g.cancel(mayInterruptIfRunning));
2557     checkCompletedWithWrappedCancellationException(h);
2558     f.complete(v1);
2559    
2560     checkCancelled(g);
2561 jsr166 1.44 assertEquals(0, r.invocationCount);
2562 jsr166 1.40 checkCompletedNormally(f, v1);
2563     checkCompletedWithWrappedCancellationException(h);
2564 jsr166 1.47 }}
2565 jsr166 1.40
2566     public void testAcceptEither_sourceCancelled3() {
2567     for (ExecutionMode m : ExecutionMode.values())
2568     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2569 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2570     {
2571 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2572     final CompletableFuture<Integer> g = new CompletableFuture<>();
2573     final IncAction r = new IncAction();
2574    
2575     assertTrue(g.cancel(mayInterruptIfRunning));
2576     f.complete(v1);
2577     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2578    
2579     // unspecified behavior
2580     Integer v;
2581     try {
2582 jsr166 1.46 assertNull(h.join());
2583 jsr166 1.44 assertEquals(1, r.invocationCount);
2584 jsr166 1.40 assertEquals(inc(v1), r.value);
2585     } catch (CompletionException ok) {
2586     checkCompletedWithWrappedCancellationException(h);
2587 jsr166 1.44 assertEquals(0, r.invocationCount);
2588 jsr166 1.40 }
2589    
2590     checkCancelled(g);
2591     checkCompletedNormally(f, v1);
2592 jsr166 1.47 }}
2593 jsr166 1.40
2594     public void testAcceptEither_sourceCancelled4() {
2595     for (ExecutionMode m : ExecutionMode.values())
2596     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2597 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2598     {
2599 jsr166 1.40 final CompletableFuture<Integer> f = new CompletableFuture<>();
2600     final CompletableFuture<Integer> g = new CompletableFuture<>();
2601     final IncAction r = new IncAction();
2602    
2603     assertTrue(f.cancel(mayInterruptIfRunning));
2604     g.complete(v1);
2605     final CompletableFuture<Void> h = m.acceptEither(f, g, r);
2606    
2607     // unspecified behavior
2608     Integer v;
2609     try {
2610 jsr166 1.46 assertNull(h.join());
2611 jsr166 1.44 assertEquals(1, r.invocationCount);
2612 jsr166 1.40 assertEquals(inc(v1), r.value);
2613     } catch (CompletionException ok) {
2614     checkCompletedWithWrappedCancellationException(h);
2615 jsr166 1.44 assertEquals(0, r.invocationCount);
2616 jsr166 1.40 }
2617    
2618     checkCancelled(f);
2619     checkCompletedNormally(g, v1);
2620 jsr166 1.47 }}
2621 dl 1.5
2622     /**
2623     * runAfterEither result completes normally after normal completion
2624     * of either source
2625     */
2626 jsr166 1.41 public void testRunAfterEither_normalCompletion1() {
2627     for (ExecutionMode m : ExecutionMode.values())
2628     for (Integer v1 : new Integer[] { 1, null })
2629 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2630     {
2631 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2632     final CompletableFuture<Integer> g = new CompletableFuture<>();
2633     final Noop r = new Noop();
2634     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2635    
2636     f.complete(v1);
2637     checkCompletedNormally(h, null);
2638 jsr166 1.44 assertEquals(1, r.invocationCount);
2639 jsr166 1.41 g.complete(v2);
2640    
2641     checkCompletedNormally(f, v1);
2642     checkCompletedNormally(g, v2);
2643     checkCompletedNormally(h, null);
2644 jsr166 1.44 assertEquals(1, r.invocationCount);
2645 jsr166 1.47 }}
2646 jsr166 1.41
2647     public void testRunAfterEither_normalCompletion2() {
2648     for (ExecutionMode m : ExecutionMode.values())
2649     for (Integer v1 : new Integer[] { 1, null })
2650 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2651     {
2652 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2653     final CompletableFuture<Integer> g = new CompletableFuture<>();
2654     final Noop r = new Noop();
2655     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2656    
2657     g.complete(v2);
2658     checkCompletedNormally(h, null);
2659 jsr166 1.44 assertEquals(1, r.invocationCount);
2660 jsr166 1.41 f.complete(v1);
2661    
2662     checkCompletedNormally(f, v1);
2663     checkCompletedNormally(g, v2);
2664     checkCompletedNormally(h, null);
2665 jsr166 1.44 assertEquals(1, r.invocationCount);
2666 jsr166 1.47 }}
2667    
2668 jsr166 1.41 public void testRunAfterEither_normalCompletion3() {
2669     for (ExecutionMode m : ExecutionMode.values())
2670     for (Integer v1 : new Integer[] { 1, null })
2671 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2672     {
2673 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2674     final CompletableFuture<Integer> g = new CompletableFuture<>();
2675     final Noop r = new Noop();
2676    
2677     f.complete(v1);
2678     g.complete(v2);
2679     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2680 dl 1.5
2681 jsr166 1.41 checkCompletedNormally(h, null);
2682     checkCompletedNormally(f, v1);
2683     checkCompletedNormally(g, v2);
2684 jsr166 1.44 assertEquals(1, r.invocationCount);
2685 jsr166 1.47 }}
2686 dl 1.5
2687     /**
2688     * runAfterEither result completes exceptionally after exceptional
2689     * completion of either source
2690     */
2691 jsr166 1.41 public void testRunAfterEither_exceptionalCompletion1() {
2692     for (ExecutionMode m : ExecutionMode.values())
2693 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2694     {
2695 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2696     final CompletableFuture<Integer> g = new CompletableFuture<>();
2697     final Noop r = new Noop();
2698     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2699     final CFException ex = new CFException();
2700    
2701     f.completeExceptionally(ex);
2702     checkCompletedWithWrappedCFException(h, ex);
2703     g.complete(v1);
2704    
2705 jsr166 1.44 assertEquals(0, r.invocationCount);
2706 jsr166 1.41 checkCompletedNormally(g, v1);
2707     checkCompletedWithWrappedCFException(f, ex);
2708     checkCompletedWithWrappedCFException(h, ex);
2709 jsr166 1.47 }}
2710 jsr166 1.41
2711     public void testRunAfterEither_exceptionalCompletion2() {
2712     for (ExecutionMode m : ExecutionMode.values())
2713 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2714     {
2715 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2716     final CompletableFuture<Integer> g = new CompletableFuture<>();
2717     final Noop r = new Noop();
2718     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2719     final CFException ex = new CFException();
2720    
2721     g.completeExceptionally(ex);
2722     checkCompletedWithWrappedCFException(h, ex);
2723     f.complete(v1);
2724    
2725 jsr166 1.44 assertEquals(0, r.invocationCount);
2726 jsr166 1.41 checkCompletedNormally(f, v1);
2727     checkCompletedWithWrappedCFException(g, ex);
2728     checkCompletedWithWrappedCFException(h, ex);
2729 jsr166 1.47 }}
2730 jsr166 1.41
2731     public void testRunAfterEither_exceptionalCompletion3() {
2732     for (ExecutionMode m : ExecutionMode.values())
2733 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2734     {
2735 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2736     final CompletableFuture<Integer> g = new CompletableFuture<>();
2737     final Noop r = new Noop();
2738     final CFException ex = new CFException();
2739    
2740     g.completeExceptionally(ex);
2741     f.complete(v1);
2742     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2743    
2744     // unspecified behavior
2745     Integer v;
2746     try {
2747 jsr166 1.46 assertNull(h.join());
2748 jsr166 1.44 assertEquals(1, r.invocationCount);
2749 jsr166 1.41 } catch (CompletionException ok) {
2750     checkCompletedWithWrappedCFException(h, ex);
2751 jsr166 1.44 assertEquals(0, r.invocationCount);
2752 jsr166 1.41 }
2753    
2754     checkCompletedWithWrappedCFException(g, ex);
2755     checkCompletedNormally(f, v1);
2756 jsr166 1.47 }}
2757 jsr166 1.41
2758     public void testRunAfterEither_exceptionalCompletion4() {
2759     for (ExecutionMode m : ExecutionMode.values())
2760 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2761     {
2762 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2763     final CompletableFuture<Integer> g = new CompletableFuture<>();
2764     final Noop r = new Noop();
2765     final CFException ex = new CFException();
2766    
2767     f.completeExceptionally(ex);
2768     g.complete(v1);
2769     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2770    
2771     // unspecified behavior
2772     Integer v;
2773     try {
2774 jsr166 1.46 assertNull(h.join());
2775 jsr166 1.44 assertEquals(1, r.invocationCount);
2776 jsr166 1.41 } catch (CompletionException ok) {
2777     checkCompletedWithWrappedCFException(h, ex);
2778 jsr166 1.44 assertEquals(0, r.invocationCount);
2779 jsr166 1.41 }
2780 dl 1.5
2781 jsr166 1.41 checkCompletedWithWrappedCFException(f, ex);
2782     checkCompletedNormally(g, v1);
2783 jsr166 1.47 }}
2784 dl 1.5
2785     /**
2786     * runAfterEither result completes exceptionally if action does
2787     */
2788 jsr166 1.41 public void testRunAfterEither_actionFailed1() {
2789     for (ExecutionMode m : ExecutionMode.values())
2790     for (Integer v1 : new Integer[] { 1, null })
2791 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2792     {
2793 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2794     final CompletableFuture<Integer> g = new CompletableFuture<>();
2795 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
2796 jsr166 1.41 final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2797    
2798     f.complete(v1);
2799     checkCompletedWithWrappedCFException(h);
2800     g.complete(v2);
2801     checkCompletedNormally(f, v1);
2802     checkCompletedNormally(g, v2);
2803 jsr166 1.47 }}
2804 jsr166 1.41
2805     public void testRunAfterEither_actionFailed2() {
2806     for (ExecutionMode m : ExecutionMode.values())
2807     for (Integer v1 : new Integer[] { 1, null })
2808 jsr166 1.47 for (Integer v2 : new Integer[] { 2, null })
2809     {
2810 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2811     final CompletableFuture<Integer> g = new CompletableFuture<>();
2812 jsr166 1.50 final FailingRunnable r = new FailingRunnable();
2813 jsr166 1.41 final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2814    
2815     g.complete(v2);
2816     checkCompletedWithWrappedCFException(h);
2817     f.complete(v1);
2818     checkCompletedNormally(f, v1);
2819     checkCompletedNormally(g, v2);
2820 jsr166 1.47 }}
2821 dl 1.5
2822     /**
2823     * runAfterEither result completes exceptionally if either source cancelled
2824     */
2825 jsr166 1.41 public void testRunAfterEither_sourceCancelled1() {
2826     for (ExecutionMode m : ExecutionMode.values())
2827     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2828 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2829     {
2830 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2831     final CompletableFuture<Integer> g = new CompletableFuture<>();
2832     final Noop r = new Noop();
2833     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2834    
2835     assertTrue(f.cancel(mayInterruptIfRunning));
2836     checkCompletedWithWrappedCancellationException(h);
2837     g.complete(v1);
2838    
2839     checkCancelled(f);
2840 jsr166 1.44 assertEquals(0, r.invocationCount);
2841 jsr166 1.41 checkCompletedNormally(g, v1);
2842     checkCompletedWithWrappedCancellationException(h);
2843 jsr166 1.47 }}
2844 jsr166 1.41
2845     public void testRunAfterEither_sourceCancelled2() {
2846     for (ExecutionMode m : ExecutionMode.values())
2847     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2848 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2849     {
2850 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2851     final CompletableFuture<Integer> g = new CompletableFuture<>();
2852     final Noop r = new Noop();
2853     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2854    
2855     assertTrue(g.cancel(mayInterruptIfRunning));
2856     checkCompletedWithWrappedCancellationException(h);
2857     f.complete(v1);
2858    
2859     checkCancelled(g);
2860 jsr166 1.44 assertEquals(0, r.invocationCount);
2861 jsr166 1.41 checkCompletedNormally(f, v1);
2862     checkCompletedWithWrappedCancellationException(h);
2863 jsr166 1.47 }}
2864 jsr166 1.41
2865     public void testRunAfterEither_sourceCancelled3() {
2866     for (ExecutionMode m : ExecutionMode.values())
2867     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2868 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2869     {
2870 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2871     final CompletableFuture<Integer> g = new CompletableFuture<>();
2872     final Noop r = new Noop();
2873    
2874     assertTrue(g.cancel(mayInterruptIfRunning));
2875     f.complete(v1);
2876     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2877    
2878     // unspecified behavior
2879     Integer v;
2880     try {
2881 jsr166 1.46 assertNull(h.join());
2882 jsr166 1.44 assertEquals(1, r.invocationCount);
2883 jsr166 1.41 } catch (CompletionException ok) {
2884     checkCompletedWithWrappedCancellationException(h);
2885 jsr166 1.44 assertEquals(0, r.invocationCount);
2886 jsr166 1.41 }
2887    
2888     checkCancelled(g);
2889     checkCompletedNormally(f, v1);
2890 jsr166 1.47 }}
2891 jsr166 1.41
2892     public void testRunAfterEither_sourceCancelled4() {
2893     for (ExecutionMode m : ExecutionMode.values())
2894     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2895 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2896     {
2897 jsr166 1.41 final CompletableFuture<Integer> f = new CompletableFuture<>();
2898     final CompletableFuture<Integer> g = new CompletableFuture<>();
2899     final Noop r = new Noop();
2900    
2901     assertTrue(f.cancel(mayInterruptIfRunning));
2902     g.complete(v1);
2903     final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2904    
2905     // unspecified behavior
2906     Integer v;
2907     try {
2908 jsr166 1.46 assertNull(h.join());
2909 jsr166 1.44 assertEquals(1, r.invocationCount);
2910 jsr166 1.41 } catch (CompletionException ok) {
2911     checkCompletedWithWrappedCancellationException(h);
2912 jsr166 1.44 assertEquals(0, r.invocationCount);
2913 jsr166 1.41 }
2914    
2915     checkCancelled(f);
2916     checkCompletedNormally(g, v1);
2917 jsr166 1.47 }}
2918 dl 1.5
2919     /**
2920     * thenCompose result completes normally after normal completion of source
2921     */
2922 jsr166 1.48 public void testThenCompose_normalCompletion() {
2923 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2924 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2925 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2926     {
2927 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2928     final CompletableFutureInc r = new CompletableFutureInc();
2929 jsr166 1.48 if (!createIncomplete) f.complete(v1);
2930 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2931 jsr166 1.48 if (createIncomplete) f.complete(v1);
2932 jsr166 1.21
2933 jsr166 1.44 checkCompletedNormally(g, inc(v1));
2934     checkCompletedNormally(f, v1);
2935     assertEquals(1, r.invocationCount);
2936 jsr166 1.47 }}
2937 dl 1.5
2938     /**
2939     * thenCompose result completes exceptionally after exceptional
2940     * completion of source
2941     */
2942 jsr166 1.48 public void testThenCompose_exceptionalCompletion() {
2943 jsr166 1.47 for (ExecutionMode m : ExecutionMode.values())
2944 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2945 jsr166 1.47 {
2946 jsr166 1.44 final CFException ex = new CFException();
2947     final CompletableFutureInc r = new CompletableFutureInc();
2948     final CompletableFuture<Integer> f = new CompletableFuture<>();
2949 jsr166 1.48 if (!createIncomplete) f.completeExceptionally(ex);
2950 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2951 jsr166 1.48 if (createIncomplete) f.completeExceptionally(ex);
2952 jsr166 1.21
2953 jsr166 1.44 checkCompletedWithWrappedCFException(g, ex);
2954     checkCompletedWithWrappedCFException(f, ex);
2955 jsr166 1.48 assertEquals(0, r.invocationCount);
2956 jsr166 1.47 }}
2957 dl 1.5
2958     /**
2959     * thenCompose result completes exceptionally if action does
2960     */
2961 jsr166 1.48 public void testThenCompose_actionFailed() {
2962 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2963 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2964 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
2965     {
2966 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2967     final FailingCompletableFutureFunction r
2968     = new FailingCompletableFutureFunction();
2969 jsr166 1.48 if (!createIncomplete) f.complete(v1);
2970 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2971 jsr166 1.48 if (createIncomplete) f.complete(v1);
2972 jsr166 1.44
2973 dl 1.5 checkCompletedWithWrappedCFException(g);
2974 jsr166 1.44 checkCompletedNormally(f, v1);
2975 jsr166 1.47 }}
2976 dl 1.5
2977     /**
2978     * thenCompose result completes exceptionally if source cancelled
2979     */
2980 jsr166 1.48 public void testThenCompose_sourceCancelled() {
2981 jsr166 1.44 for (ExecutionMode m : ExecutionMode.values())
2982 jsr166 1.48 for (boolean createIncomplete : new boolean[] { true, false })
2983 jsr166 1.47 for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2984     {
2985 jsr166 1.44 final CompletableFuture<Integer> f = new CompletableFuture<>();
2986     final CompletableFutureInc r = new CompletableFutureInc();
2987 jsr166 1.48 if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
2988 jsr166 1.44 final CompletableFuture<Integer> g = f.thenCompose(r);
2989 jsr166 1.50 if (createIncomplete) {
2990     checkIncomplete(g);
2991     assertTrue(f.cancel(mayInterruptIfRunning));
2992     }
2993 jsr166 1.44
2994 dl 1.5 checkCompletedWithWrappedCancellationException(g);
2995 jsr166 1.44 checkCancelled(f);
2996 jsr166 1.47 }}
2997 dl 1.5
2998 jsr166 1.6 // other static methods
2999 dl 1.5
3000     /**
3001     * allOf(no component futures) returns a future completed normally
3002     * with the value null
3003     */
3004     public void testAllOf_empty() throws Exception {
3005 jsr166 1.24 CompletableFuture<Void> f = CompletableFuture.allOf();
3006 dl 1.5 checkCompletedNormally(f, null);
3007     }
3008    
3009     /**
3010 jsr166 1.25 * allOf returns a future completed normally with the value null
3011     * when all components complete normally
3012 dl 1.5 */
3013 jsr166 1.25 public void testAllOf_normal() throws Exception {
3014 dl 1.5 for (int k = 1; k < 20; ++k) {
3015 jsr166 1.22 CompletableFuture<Integer>[] fs = (CompletableFuture<Integer>[]) new CompletableFuture[k];
3016 jsr166 1.6 for (int i = 0; i < k; ++i)
3017 jsr166 1.22 fs[i] = new CompletableFuture<>();
3018 dl 1.9 CompletableFuture<Void> f = CompletableFuture.allOf(fs);
3019 dl 1.5 for (int i = 0; i < k; ++i) {
3020     checkIncomplete(f);
3021 jsr166 1.24 checkIncomplete(CompletableFuture.allOf(fs));
3022 dl 1.5 fs[i].complete(one);
3023     }
3024 dl 1.9 checkCompletedNormally(f, null);
3025 jsr166 1.24 checkCompletedNormally(CompletableFuture.allOf(fs), null);
3026 dl 1.5 }
3027     }
3028    
3029     /**
3030     * anyOf(no component futures) returns an incomplete future
3031     */
3032     public void testAnyOf_empty() throws Exception {
3033 jsr166 1.24 CompletableFuture<Object> f = CompletableFuture.anyOf();
3034 dl 1.5 checkIncomplete(f);
3035     }
3036    
3037     /**
3038 jsr166 1.25 * anyOf returns a future completed normally with a value when
3039     * a component future does
3040 dl 1.5 */
3041 jsr166 1.24 public void testAnyOf_normal() throws Exception {
3042     for (int k = 0; k < 10; ++k) {
3043 dl 1.5 CompletableFuture[] fs = new CompletableFuture[k];
3044 jsr166 1.6 for (int i = 0; i < k; ++i)
3045 jsr166 1.22 fs[i] = new CompletableFuture<>();
3046 dl 1.9 CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3047 dl 1.5 checkIncomplete(f);
3048     for (int i = 0; i < k; ++i) {
3049     fs[i].complete(one);
3050 dl 1.9 checkCompletedNormally(f, one);
3051 jsr166 1.24 checkCompletedNormally(CompletableFuture.anyOf(fs), one);
3052     }
3053     }
3054     }
3055    
3056     /**
3057     * anyOf result completes exceptionally when any component does.
3058     */
3059     public void testAnyOf_exceptional() throws Exception {
3060     for (int k = 0; k < 10; ++k) {
3061     CompletableFuture[] fs = new CompletableFuture[k];
3062     for (int i = 0; i < k; ++i)
3063     fs[i] = new CompletableFuture<>();
3064     CompletableFuture<Object> f = CompletableFuture.anyOf(fs);
3065     checkIncomplete(f);
3066     for (int i = 0; i < k; ++i) {
3067     fs[i].completeExceptionally(new CFException());
3068     checkCompletedWithWrappedCFException(f);
3069     checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs));
3070 dl 1.5 }
3071     }
3072     }
3073    
3074     /**
3075     * Completion methods throw NullPointerException with null arguments
3076     */
3077     public void testNPE() {
3078 jsr166 1.22 CompletableFuture<Integer> f = new CompletableFuture<>();
3079     CompletableFuture<Integer> g = new CompletableFuture<>();
3080 jsr166 1.14 CompletableFuture<Integer> nullFuture = (CompletableFuture<Integer>)null;
3081     CompletableFuture<?> h;
3082 jsr166 1.17 ThreadExecutor exec = new ThreadExecutor();
3083 jsr166 1.14
3084     Runnable[] throwingActions = {
3085 jsr166 1.31 () -> CompletableFuture.supplyAsync(null),
3086     () -> CompletableFuture.supplyAsync(null, exec),
3087     () -> CompletableFuture.supplyAsync(supplyOne, null),
3088    
3089     () -> CompletableFuture.runAsync(null),
3090     () -> CompletableFuture.runAsync(null, exec),
3091     () -> CompletableFuture.runAsync(() -> {}, null),
3092    
3093     () -> f.completeExceptionally(null),
3094    
3095     () -> f.thenApply(null),
3096     () -> f.thenApplyAsync(null),
3097     () -> f.thenApplyAsync((x) -> x, null),
3098     () -> f.thenApplyAsync(null, exec),
3099    
3100     () -> f.thenAccept(null),
3101     () -> f.thenAcceptAsync(null),
3102     () -> f.thenAcceptAsync((x) -> {} , null),
3103     () -> f.thenAcceptAsync(null, exec),
3104    
3105     () -> f.thenRun(null),
3106     () -> f.thenRunAsync(null),
3107     () -> f.thenRunAsync(() -> {} , null),
3108     () -> f.thenRunAsync(null, exec),
3109    
3110     () -> f.thenCombine(g, null),
3111     () -> f.thenCombineAsync(g, null),
3112     () -> f.thenCombineAsync(g, null, exec),
3113     () -> f.thenCombine(nullFuture, (x, y) -> x),
3114     () -> f.thenCombineAsync(nullFuture, (x, y) -> x),
3115     () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec),
3116     () -> f.thenCombineAsync(g, (x, y) -> x, null),
3117    
3118     () -> f.thenAcceptBoth(g, null),
3119     () -> f.thenAcceptBothAsync(g, null),
3120     () -> f.thenAcceptBothAsync(g, null, exec),
3121     () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}),
3122     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}),
3123     () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec),
3124     () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null),
3125    
3126     () -> f.runAfterBoth(g, null),
3127     () -> f.runAfterBothAsync(g, null),
3128     () -> f.runAfterBothAsync(g, null, exec),
3129     () -> f.runAfterBoth(nullFuture, () -> {}),
3130     () -> f.runAfterBothAsync(nullFuture, () -> {}),
3131     () -> f.runAfterBothAsync(nullFuture, () -> {}, exec),
3132     () -> f.runAfterBothAsync(g, () -> {}, null),
3133    
3134     () -> f.applyToEither(g, null),
3135     () -> f.applyToEitherAsync(g, null),
3136     () -> f.applyToEitherAsync(g, null, exec),
3137     () -> f.applyToEither(nullFuture, (x) -> x),
3138     () -> f.applyToEitherAsync(nullFuture, (x) -> x),
3139     () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec),
3140     () -> f.applyToEitherAsync(g, (x) -> x, null),
3141    
3142     () -> f.acceptEither(g, null),
3143     () -> f.acceptEitherAsync(g, null),
3144     () -> f.acceptEitherAsync(g, null, exec),
3145     () -> f.acceptEither(nullFuture, (x) -> {}),
3146     () -> f.acceptEitherAsync(nullFuture, (x) -> {}),
3147     () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec),
3148     () -> f.acceptEitherAsync(g, (x) -> {}, null),
3149    
3150     () -> f.runAfterEither(g, null),
3151     () -> f.runAfterEitherAsync(g, null),
3152     () -> f.runAfterEitherAsync(g, null, exec),
3153     () -> f.runAfterEither(nullFuture, () -> {}),
3154     () -> f.runAfterEitherAsync(nullFuture, () -> {}),
3155     () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec),
3156     () -> f.runAfterEitherAsync(g, () -> {}, null),
3157    
3158     () -> f.thenCompose(null),
3159     () -> f.thenComposeAsync(null),
3160     () -> f.thenComposeAsync(new CompletableFutureInc(), null),
3161     () -> f.thenComposeAsync(null, exec),
3162    
3163     () -> f.exceptionally(null),
3164    
3165     () -> f.handle(null),
3166    
3167     () -> CompletableFuture.allOf((CompletableFuture<?>)null),
3168     () -> CompletableFuture.allOf((CompletableFuture<?>[])null),
3169     () -> CompletableFuture.allOf(f, null),
3170     () -> CompletableFuture.allOf(null, f),
3171    
3172     () -> CompletableFuture.anyOf((CompletableFuture<?>)null),
3173     () -> CompletableFuture.anyOf((CompletableFuture<?>[])null),
3174     () -> CompletableFuture.anyOf(f, null),
3175     () -> CompletableFuture.anyOf(null, f),
3176 jsr166 1.32
3177     () -> f.obtrudeException(null),
3178 jsr166 1.14 };
3179 dl 1.5
3180 jsr166 1.14 assertThrows(NullPointerException.class, throwingActions);
3181 jsr166 1.17 assertEquals(0, exec.count.get());
3182 dl 1.5 }
3183    
3184 dl 1.26 /**
3185     * toCompletableFuture returns this CompletableFuture.
3186     */
3187     public void testToCompletableFuture() {
3188     CompletableFuture<Integer> f = new CompletableFuture<>();
3189     assertSame(f, f.toCompletableFuture());
3190     }
3191    
3192     /**
3193     * whenComplete action executes on normal completion, propagating
3194     * source result.
3195     */
3196 jsr166 1.42 public void testWhenComplete_normalCompletion1() {
3197 jsr166 1.46 for (ExecutionMode m : ExecutionMode.values())
3198 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3199 jsr166 1.46 for (Integer v1 : new Integer[] { 1, null })
3200     {
3201     final AtomicInteger a = new AtomicInteger(0);
3202 jsr166 1.42 final CompletableFuture<Integer> f = new CompletableFuture<>();
3203 jsr166 1.44 if (!createIncomplete) f.complete(v1);
3204 jsr166 1.46 final CompletableFuture<Integer> g = m.whenComplete
3205     (f,
3206     (Integer x, Throwable t) -> {
3207     threadAssertSame(x, v1);
3208     threadAssertNull(t);
3209     a.getAndIncrement();
3210     });
3211 jsr166 1.44 if (createIncomplete) f.complete(v1);
3212 jsr166 1.46
3213     checkCompletedNormally(g, v1);
3214 jsr166 1.42 checkCompletedNormally(f, v1);
3215 jsr166 1.46 assertEquals(1, a.get());
3216     }}
3217 dl 1.26
3218     /**
3219     * whenComplete action executes on exceptional completion, propagating
3220     * source result.
3221     */
3222 jsr166 1.42 public void testWhenComplete_exceptionalCompletion() {
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 CFException ex = new CFException();
3229     final CompletableFuture<Integer> f = new CompletableFuture<>();
3230 jsr166 1.44 if (!createIncomplete) f.completeExceptionally(ex);
3231 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3232     (f,
3233     (Integer x, Throwable t) -> {
3234     threadAssertNull(x);
3235     threadAssertSame(t, ex);
3236     a.getAndIncrement();
3237     });
3238 jsr166 1.44 if (createIncomplete) f.completeExceptionally(ex);
3239 jsr166 1.42 checkCompletedWithWrappedCFException(f, ex);
3240     checkCompletedWithWrappedCFException(g, ex);
3241 jsr166 1.46 assertEquals(1, a.get());
3242     }}
3243    
3244     /**
3245     * whenComplete action executes on cancelled source, propagating
3246     * CancellationException.
3247     */
3248     public void testWhenComplete_sourceCancelled() {
3249     for (ExecutionMode m : ExecutionMode.values())
3250     for (boolean mayInterruptIfRunning : new boolean[] { true, false })
3251     for (boolean createIncomplete : new boolean[] { true, false })
3252     {
3253     final AtomicInteger a = new AtomicInteger(0);
3254     final CompletableFuture<Integer> f = new CompletableFuture<>();
3255     if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3256     final CompletableFuture<Integer> g = m.whenComplete
3257     (f,
3258     (Integer x, Throwable t) -> {
3259     threadAssertNull(x);
3260     threadAssertTrue(t instanceof CancellationException);
3261     a.getAndIncrement();
3262     });
3263     if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
3264    
3265     //try { g.join(); } catch (Throwable t) { throw new Error(t); }
3266     checkCompletedWithWrappedCancellationException(g);
3267     checkCancelled(f);
3268     assertEquals(1, a.get());
3269     }}
3270 dl 1.26
3271     /**
3272     * If a whenComplete action throws an exception when triggered by
3273     * a normal completion, it completes exceptionally
3274     */
3275 jsr166 1.42 public void testWhenComplete_actionFailed() {
3276 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3277 jsr166 1.42 for (ExecutionMode m : ExecutionMode.values())
3278 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3279     {
3280 jsr166 1.46 final AtomicInteger a = new AtomicInteger(0);
3281 jsr166 1.42 final CFException ex = new CFException();
3282     final CompletableFuture<Integer> f = new CompletableFuture<>();
3283 jsr166 1.44 if (!createIncomplete) f.complete(v1);
3284 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3285     (f,
3286     (Integer x, Throwable t) -> {
3287     threadAssertSame(x, v1);
3288     threadAssertNull(t);
3289 jsr166 1.46 a.getAndIncrement();
3290 jsr166 1.42 throw ex;
3291     });
3292 jsr166 1.44 if (createIncomplete) f.complete(v1);
3293 jsr166 1.42 checkCompletedNormally(f, v1);
3294     checkCompletedWithWrappedCFException(g, ex);
3295 jsr166 1.46 assertEquals(1, a.get());
3296 jsr166 1.47 }}
3297 dl 1.26
3298     /**
3299 jsr166 1.42 * If a whenComplete action throws an exception when triggered by
3300     * a source completion that also throws an exception, the source
3301     * exception takes precedence.
3302 dl 1.26 */
3303 jsr166 1.42 public void testWhenComplete_actionFailedSourceFailed() {
3304 jsr166 1.44 for (boolean createIncomplete : new boolean[] { true, false })
3305 jsr166 1.42 for (ExecutionMode m : ExecutionMode.values())
3306 jsr166 1.47 for (Integer v1 : new Integer[] { 1, null })
3307     {
3308 jsr166 1.46 final AtomicInteger a = new AtomicInteger(0);
3309 jsr166 1.42 final CFException ex1 = new CFException();
3310     final CFException ex2 = new CFException();
3311     final CompletableFuture<Integer> f = new CompletableFuture<>();
3312 jsr166 1.44
3313     if (!createIncomplete) f.completeExceptionally(ex1);
3314 jsr166 1.42 final CompletableFuture<Integer> g = m.whenComplete
3315     (f,
3316     (Integer x, Throwable t) -> {
3317     threadAssertSame(t, ex1);
3318     threadAssertNull(x);
3319 jsr166 1.46 a.getAndIncrement();
3320 jsr166 1.42 throw ex2;
3321     });
3322 jsr166 1.44 if (createIncomplete) f.completeExceptionally(ex1);
3323    
3324 jsr166 1.42 checkCompletedWithWrappedCFException(f, ex1);
3325     checkCompletedWithWrappedCFException(g, ex1);
3326 jsr166 1.46 assertEquals(1, a.get());
3327 jsr166 1.47 }}
3328 dl 1.26
3329 jsr166 1.1 }