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

File Contents

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