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