ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.100
Committed: Thu Jan 15 18:34:19 2015 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.99: +0 -1 lines
Log Message:
delete extraneous blank lines

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