ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
Revision: 1.39
Committed: Mon Jun 2 00:46:52 2014 UTC (9 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.38: +284 -174 lines
Log Message:
improve tests for applyToEither

File Contents

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