ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.55
Committed: Mon Jun 2 21:41:37 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.54: +24 -21 lines
Log Message:
improve tests for execution environment

File Contents

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