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