--- jsr166/src/test/tck/CompletableFutureTest.java 2014/06/02 06:06:30 1.44 +++ jsr166/src/test/tck/CompletableFutureTest.java 2014/06/02 20:10:04 1.52 @@ -17,6 +17,8 @@ import java.util.concurrent.Future; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -247,6 +249,8 @@ public class CompletableFutureTest exten f = new CompletableFuture<>(); f.obtrudeValue(three); checkCompletedNormally(f, three); + f.obtrudeValue(null); + checkCompletedNormally(f, null); f = new CompletableFuture<>(); f.completeExceptionally(new CFException()); f.obtrudeValue(four); @@ -279,16 +283,16 @@ public class CompletableFutureTest exten */ public void testGetNumberOfDependents() { CompletableFuture f = new CompletableFuture<>(); - assertEquals(f.getNumberOfDependents(), 0); + assertEquals(0, f.getNumberOfDependents()); CompletableFuture g = f.thenRun(new Noop()); - assertEquals(f.getNumberOfDependents(), 1); - assertEquals(g.getNumberOfDependents(), 0); + assertEquals(1, f.getNumberOfDependents()); + assertEquals(0, g.getNumberOfDependents()); CompletableFuture h = f.thenRun(new Noop()); - assertEquals(f.getNumberOfDependents(), 2); + assertEquals(2, f.getNumberOfDependents()); f.complete(1); checkCompletedNormally(g, null); - assertEquals(f.getNumberOfDependents(), 0); - assertEquals(g.getNumberOfDependents(), 0); + assertEquals(0, f.getNumberOfDependents()); + assertEquals(0, g.getNumberOfDependents()); } /** @@ -412,7 +416,7 @@ public class CompletableFutureTest exten throw new CFException(); } } - static final class FailingNoop implements Runnable { + static final class FailingRunnable implements Runnable { int invocationCount = 0; public void run() { invocationCount++; @@ -450,24 +454,42 @@ public class CompletableFutureTest exten } } - static final class ExceptionToInteger implements Function { - public Integer apply(Throwable x) { return Integer.valueOf(3); } - } - - static final class IntegerHandler implements BiFunction { - int invocationCount = 0; - public Integer apply(Integer x, Throwable t) { - invocationCount++; - return (t == null) ? two : three; - } - } - /** * Permits the testing of parallel code for the 3 different * execution modes without repeating all the testing code. */ enum ExecutionMode { DEFAULT { + public void checkExecutionMode() { + assertNull(ForkJoinTask.getPool()); + } + public CompletableFuture thenRun + (CompletableFuture f, Runnable a) { + return f.thenRun(a); + } + public CompletableFuture thenAccept + (CompletableFuture f, Consumer a) { + return f.thenAccept(a); + } + public CompletableFuture thenApply + (CompletableFuture f, Function a) { + return f.thenApply(a); + } + public CompletableFuture thenCompose + (CompletableFuture f, + Function> a) { + return f.thenCompose(a); + } + public CompletableFuture handle + (CompletableFuture f, + BiFunction a) { + return f.handle(a); + } + public CompletableFuture whenComplete + (CompletableFuture f, + BiConsumer a) { + return f.whenComplete(a); + } public CompletableFuture runAfterBoth (CompletableFuture f, CompletableFuture g, Runnable a) { return f.runAfterBoth(g, a); @@ -484,11 +506,11 @@ public class CompletableFutureTest exten BiFunction a) { return f.thenCombine(g, a); } - public CompletableFuture applyToEither + public CompletableFuture runAfterEither (CompletableFuture f, - CompletionStage g, - Function a) { - return f.applyToEither(g, a); + CompletionStage g, + java.lang.Runnable a) { + return f.runAfterEither(g, a); } public CompletableFuture acceptEither (CompletableFuture f, @@ -496,39 +518,46 @@ public class CompletableFutureTest exten Consumer a) { return f.acceptEither(g, a); } - public CompletableFuture runAfterEither + public CompletableFuture applyToEither (CompletableFuture f, - CompletionStage g, - java.lang.Runnable a) { - return f.runAfterEither(g, a); + CompletionStage g, + Function a) { + return f.applyToEither(g, a); + } + }, + + ASYNC { + public void checkExecutionMode() { + assertSame(ForkJoinPool.commonPool(), + ForkJoinTask.getPool()); + } + public CompletableFuture thenRun + (CompletableFuture f, Runnable a) { + return f.thenRunAsync(a); + } + public CompletableFuture thenAccept + (CompletableFuture f, Consumer a) { + return f.thenAcceptAsync(a); + } + public CompletableFuture thenApply + (CompletableFuture f, Function a) { + return f.thenApplyAsync(a); } public CompletableFuture thenCompose (CompletableFuture f, Function> a) { - return f.thenCompose(a); + return f.thenComposeAsync(a); + } + public CompletableFuture handle + (CompletableFuture f, + BiFunction a) { + return f.handleAsync(a); } public CompletableFuture whenComplete (CompletableFuture f, BiConsumer a) { - return f.whenComplete(a); + return f.whenCompleteAsync(a); } - }, - -// /** Experimental way to do more testing */ -// REVERSE_DEFAULT { -// public CompletableFuture runAfterBoth -// (CompletableFuture f, CompletableFuture g, Runnable a) { -// return g.runAfterBoth(f, a); -// } -// public CompletableFuture thenAcceptBoth -// (CompletableFuture f, -// CompletionStage g, -// BiConsumer a) { -// return DEFAULT.thenAcceptBoth(f, g, a); -// } -// }, - - DEFAULT_ASYNC { public CompletableFuture runAfterBoth (CompletableFuture f, CompletableFuture g, Runnable a) { return f.runAfterBothAsync(g, a); @@ -545,11 +574,11 @@ public class CompletableFutureTest exten BiFunction a) { return f.thenCombineAsync(g, a); } - public CompletableFuture applyToEither + public CompletableFuture runAfterEither (CompletableFuture f, - CompletionStage g, - Function a) { - return f.applyToEitherAsync(g, a); + CompletionStage g, + java.lang.Runnable a) { + return f.runAfterEitherAsync(g, a); } public CompletableFuture acceptEither (CompletableFuture f, @@ -557,38 +586,45 @@ public class CompletableFutureTest exten Consumer a) { return f.acceptEitherAsync(g, a); } - public CompletableFuture runAfterEither + public CompletableFuture applyToEither (CompletableFuture f, - CompletionStage g, - java.lang.Runnable a) { - return f.runAfterEitherAsync(g, a); + CompletionStage g, + Function a) { + return f.applyToEitherAsync(g, a); + } + }, + + EXECUTOR { + public void checkExecutionMode() { + //TODO + } + public CompletableFuture thenRun + (CompletableFuture f, Runnable a) { + return f.thenRunAsync(a, new ThreadExecutor()); + } + public CompletableFuture thenAccept + (CompletableFuture f, Consumer a) { + return f.thenAcceptAsync(a, new ThreadExecutor()); + } + public CompletableFuture thenApply + (CompletableFuture f, Function a) { + return f.thenApplyAsync(a, new ThreadExecutor()); } public CompletableFuture thenCompose (CompletableFuture f, Function> a) { - return f.thenComposeAsync(a); + return f.thenComposeAsync(a, new ThreadExecutor()); + } + public CompletableFuture handle + (CompletableFuture f, + BiFunction a) { + return f.handleAsync(a, new ThreadExecutor()); } public CompletableFuture whenComplete (CompletableFuture f, BiConsumer a) { - return f.whenCompleteAsync(a); + return f.whenCompleteAsync(a, new ThreadExecutor()); } - }, - -// REVERSE_DEFAULT_ASYNC { -// public CompletableFuture runAfterBoth -// (CompletableFuture f, CompletableFuture g, Runnable a) { -// return f.runAfterBothAsync(g, a); -// } -// public CompletableFuture thenAcceptBoth -// (CompletableFuture f, -// CompletionStage g, -// BiConsumer a) { -// return DEFAULT_ASYNC.thenAcceptBoth(f, g, a); -// } -// }, - - EXECUTOR { public CompletableFuture runAfterBoth (CompletableFuture f, CompletableFuture g, Runnable a) { return f.runAfterBothAsync(g, a, new ThreadExecutor()); @@ -605,36 +641,42 @@ public class CompletableFutureTest exten BiFunction a) { return f.thenCombineAsync(g, a, new ThreadExecutor()); } - public CompletableFuture applyToEither - (CompletableFuture f, - CompletionStage g, - Function a) { - return f.applyToEitherAsync(g, a, new ThreadExecutor()); - } - public CompletableFuture acceptEither - (CompletableFuture f, - CompletionStage g, - Consumer a) { - return f.acceptEitherAsync(g, a, new ThreadExecutor()); - } public CompletableFuture runAfterEither (CompletableFuture f, CompletionStage g, java.lang.Runnable a) { return f.runAfterEitherAsync(g, a, new ThreadExecutor()); } - public CompletableFuture thenCompose + public CompletableFuture acceptEither (CompletableFuture f, - Function> a) { - return f.thenComposeAsync(a, new ThreadExecutor()); + CompletionStage g, + Consumer a) { + return f.acceptEitherAsync(g, a, new ThreadExecutor()); } - public CompletableFuture whenComplete + public CompletableFuture applyToEither (CompletableFuture f, - BiConsumer a) { - return f.whenCompleteAsync(a, new ThreadExecutor()); + CompletionStage g, + Function a) { + return f.applyToEitherAsync(g, a, new ThreadExecutor()); } }; + public abstract void checkExecutionMode(); + public abstract CompletableFuture thenRun + (CompletableFuture f, Runnable a); + public abstract CompletableFuture thenAccept + (CompletableFuture f, Consumer a); + public abstract CompletableFuture thenApply + (CompletableFuture f, Function a); + public abstract CompletableFuture thenCompose + (CompletableFuture f, + Function> a); + public abstract CompletableFuture handle + (CompletableFuture f, + BiFunction a); + public abstract CompletableFuture whenComplete + (CompletableFuture f, + BiConsumer a); public abstract CompletableFuture runAfterBoth (CompletableFuture f, CompletableFuture g, Runnable a); public abstract CompletableFuture thenAcceptBoth @@ -645,81 +687,223 @@ public class CompletableFutureTest exten (CompletableFuture f, CompletionStage g, BiFunction a); - public abstract CompletableFuture applyToEither - (CompletableFuture f, - CompletionStage g, - Function a); - public abstract CompletableFuture acceptEither - (CompletableFuture f, - CompletionStage g, - Consumer a); public abstract CompletableFuture runAfterEither (CompletableFuture f, CompletionStage g, java.lang.Runnable a); - public abstract CompletableFuture thenCompose + public abstract CompletableFuture acceptEither (CompletableFuture f, - Function> a); - public abstract CompletableFuture whenComplete + CompletionStage g, + Consumer a); + public abstract CompletableFuture applyToEither (CompletableFuture f, - BiConsumer a); + CompletionStage g, + Function a); + } + + /** + * exceptionally action is not invoked when source completes + * normally, and source result is propagated + */ + public void testExceptionally_normalCompletion() { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); + final CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = f.exceptionally + ((Throwable t) -> { + // Should not be called + a.getAndIncrement(); + throw new AssertionError(); + }); + if (createIncomplete) f.complete(v1); + checkCompletedNormally(g, v1); + checkCompletedNormally(f, v1); + assertEquals(0, a.get()); + }} - } /** * exceptionally action completes with function value on source - * exception; otherwise with source value + * exception */ - public void testExceptionally() { - CompletableFuture f = new CompletableFuture<>(); - ExceptionToInteger r = new ExceptionToInteger(); - CompletableFuture g = f.exceptionally(r); - f.completeExceptionally(new CFException()); - checkCompletedNormally(g, three); + public void testExceptionally_exceptionalCompletion() { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); + final CFException ex = new CFException(); + final CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) f.completeExceptionally(ex); + final CompletableFuture g = f.exceptionally + ((Throwable t) -> { + threadAssertSame(t, ex); + a.getAndIncrement(); + return v1; + }); + if (createIncomplete) f.completeExceptionally(ex); - f = new CompletableFuture<>(); - r = new ExceptionToInteger(); - g = f.exceptionally(r); - f.complete(one); - checkCompletedNormally(g, one); - } + checkCompletedNormally(g, v1); + assertEquals(1, a.get()); + }} + + public void testExceptionally_exceptionalCompletionActionFailed() { + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); + final CFException ex1 = new CFException(); + final CFException ex2 = new CFException(); + final CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) f.completeExceptionally(ex1); + final CompletableFuture g = f.exceptionally + ((Throwable t) -> { + threadAssertSame(t, ex1); + a.getAndIncrement(); + throw ex2; + }); + if (createIncomplete) f.completeExceptionally(ex1); + + checkCompletedWithWrappedCFException(g, ex2); + assertEquals(1, a.get()); + }} /** - * handle action completes normally with function value on either - * normal or exceptional completion of source + * handle action completes normally with function value on normal + * completion of source */ - public void testHandle() { - CompletableFuture f, g; - IntegerHandler r; + public void testHandle_normalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final AtomicInteger a = new AtomicInteger(0); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = m.handle + (f, + (Integer x, Throwable t) -> { + threadAssertSame(x, v1); + threadAssertNull(t); + a.getAndIncrement(); + return inc(v1); + }); + if (createIncomplete) f.complete(v1); - f = new CompletableFuture<>(); - f.completeExceptionally(new CFException()); - g = f.handle(r = new IntegerHandler()); - assertEquals(1, r.invocationCount); - assertEquals(1, r.invocationCount); - checkCompletedNormally(g, three); + checkCompletedNormally(g, inc(v1)); + checkCompletedNormally(f, v1); + assertEquals(1, a.get()); + }} - f = new CompletableFuture<>(); - g = f.handle(r = new IntegerHandler()); - assertEquals(0, r.invocationCount); - f.completeExceptionally(new CFException()); - checkCompletedNormally(g, three); - assertEquals(1, r.invocationCount); + /** + * handle action completes normally with function value on + * exceptional completion of source + */ + public void testHandle_exceptionalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final AtomicInteger a = new AtomicInteger(0); + final CFException ex = new CFException(); + if (!createIncomplete) f.completeExceptionally(ex); + final CompletableFuture g = m.handle + (f, + (Integer x, Throwable t) -> { + threadAssertNull(x); + threadAssertSame(t, ex); + a.getAndIncrement(); + return v1; + }); + if (createIncomplete) f.completeExceptionally(ex); - f = new CompletableFuture<>(); - f.complete(one); - g = f.handle(r = new IntegerHandler()); - assertEquals(1, r.invocationCount); - checkCompletedNormally(g, two); + checkCompletedNormally(g, v1); + checkCompletedWithWrappedCFException(f, ex); + assertEquals(1, a.get()); + }} - f = new CompletableFuture<>(); - g = f.handle(r = new IntegerHandler()); - assertEquals(0, r.invocationCount); - f.complete(one); - assertEquals(1, r.invocationCount); - checkCompletedNormally(g, two); - } + /** + * handle action completes normally with function value on + * cancelled source + */ + public void testHandle_sourceCancelled() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final AtomicInteger a = new AtomicInteger(0); + if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + final CompletableFuture g = m.handle + (f, + (Integer x, Throwable t) -> { + threadAssertNull(x); + threadAssertTrue(t instanceof CancellationException); + a.getAndIncrement(); + return v1; + }); + if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + + checkCompletedNormally(g, v1); + checkCancelled(f); + assertEquals(1, a.get()); + }} + + /** + * handle result completes exceptionally if action does + */ + public void testHandle_sourceFailedActionFailed() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + { + final CompletableFuture f = new CompletableFuture<>(); + final AtomicInteger a = new AtomicInteger(0); + final CFException ex1 = new CFException(); + final CFException ex2 = new CFException(); + if (!createIncomplete) f.completeExceptionally(ex1); + final CompletableFuture g = m.handle + (f, + (Integer x, Throwable t) -> { + threadAssertNull(x); + threadAssertSame(ex1, t); + a.getAndIncrement(); + throw ex2; + }); + if (createIncomplete) f.completeExceptionally(ex1); + + checkCompletedWithWrappedCFException(g, ex2); + checkCompletedWithWrappedCFException(f, ex1); + assertEquals(1, a.get()); + }} + + public void testHandle_sourceCompletedNormallyActionFailed() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final AtomicInteger a = new AtomicInteger(0); + final CFException ex = new CFException(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = m.handle + (f, + (Integer x, Throwable t) -> { + threadAssertSame(x, v1); + threadAssertNull(t); + a.getAndIncrement(); + throw ex; + }); + if (createIncomplete) f.complete(v1); + + checkCompletedWithWrappedCFException(g, ex); + checkCompletedNormally(f, v1); + assertEquals(1, a.get()); + }} /** * runAsync completes after running Runnable @@ -749,7 +933,7 @@ public class CompletableFutureTest exten * failing runAsync completes exceptionally after running Runnable */ public void testRunAsync3() { - FailingNoop r = new FailingNoop(); + FailingRunnable r = new FailingRunnable(); CompletableFuture f = CompletableFuture.runAsync(r); checkCompletedWithWrappedCFException(f); assertEquals(1, r.invocationCount); @@ -790,421 +974,384 @@ public class CompletableFutureTest exten /** * thenRun result completes normally after normal completion of source */ - public void testThenRun() { - CompletableFuture f; - CompletableFuture g; - Noop r; - - f = new CompletableFuture<>(); - g = f.thenRun(r = new Noop()); - f.complete(null); - checkCompletedNormally(g, null); - assertEquals(1, r.invocationCount); + public void testThenRun_normalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final Noop r = new Noop(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = m.thenRun(f, r); + if (createIncomplete) { + checkIncomplete(g); + f.complete(v1); + } - f = new CompletableFuture<>(); - f.complete(null); - g = f.thenRun(r = new Noop()); checkCompletedNormally(g, null); + checkCompletedNormally(f, v1); assertEquals(1, r.invocationCount); - } + }} /** * thenRun result completes exceptionally after exceptional * completion of source */ - public void testThenRun2() { - CompletableFuture f; - CompletableFuture g; - Noop r; - - f = new CompletableFuture<>(); - g = f.thenRun(r = new Noop()); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - assertEquals(0, r.invocationCount); + public void testThenRun_exceptionalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + { + final CFException ex = new CFException(); + final CompletableFuture f = new CompletableFuture<>(); + final Noop r = new Noop(); + if (!createIncomplete) f.completeExceptionally(ex); + final CompletableFuture g = m.thenRun(f, r); + if (createIncomplete) { + checkIncomplete(g); + f.completeExceptionally(ex); + } - f = new CompletableFuture<>(); - f.completeExceptionally(new CFException()); - g = f.thenRun(r = new Noop()); - checkCompletedWithWrappedCFException(g); + checkCompletedWithWrappedCFException(g, ex); + checkCompletedWithWrappedCFException(f, ex); assertEquals(0, r.invocationCount); - } + }} /** - * thenRun result completes exceptionally if action does + * thenRun result completes exceptionally if source cancelled */ - public void testThenRun3() { - CompletableFuture f; - CompletableFuture g; - FailingNoop r; - - f = new CompletableFuture<>(); - g = f.thenRun(r = new FailingNoop()); - f.complete(null); - checkCompletedWithWrappedCFException(g); + public void testThenRun_sourceCancelled() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + { + final CompletableFuture f = new CompletableFuture<>(); + final Noop r = new Noop(); + if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + final CompletableFuture g = f.thenRun(r); + if (createIncomplete) { + checkIncomplete(g); + assertTrue(f.cancel(mayInterruptIfRunning)); + } - f = new CompletableFuture<>(); - f.complete(null); - g = f.thenRun(r = new FailingNoop()); - checkCompletedWithWrappedCFException(g); - } + checkCompletedWithWrappedCancellationException(g); + checkCancelled(f); + assertEquals(0, r.invocationCount); + }} /** - * thenRun result completes exceptionally if source cancelled + * thenRun result completes exceptionally if action does */ - public void testThenRun4() { - CompletableFuture f; - CompletableFuture g; - Noop r; - - f = new CompletableFuture<>(); - g = f.thenRun(r = new Noop()); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + public void testThenRun_actionFailed() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final FailingRunnable r = new FailingRunnable(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = f.thenRun(r); + if (createIncomplete) { + checkIncomplete(g); + f.complete(v1); + } - f = new CompletableFuture<>(); - assertTrue(f.cancel(true)); - g = f.thenRun(r = new Noop()); - checkCompletedWithWrappedCancellationException(g); - } + checkCompletedWithWrappedCFException(g); + checkCompletedNormally(f, v1); + }} /** * thenApply result completes normally after normal completion of source */ - public void testThenApply() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApply(inc); - f.complete(one); - checkCompletedNormally(g, two); - } + public void testThenApply_normalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final IncFunction r = new IncFunction(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = m.thenApply(f, r); + if (createIncomplete) { + checkIncomplete(g); + f.complete(v1); + } + + checkCompletedNormally(g, inc(v1)); + checkCompletedNormally(f, v1); + assertEquals(1, r.invocationCount); + }} /** * thenApply result completes exceptionally after exceptional * completion of source */ - public void testThenApply2() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApply(inc); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } + public void testThenApply_exceptionalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + { + final CFException ex = new CFException(); + final CompletableFuture f = new CompletableFuture<>(); + final IncFunction r = new IncFunction(); + if (!createIncomplete) f.completeExceptionally(ex); + final CompletableFuture g = m.thenApply(f, r); + if (createIncomplete) { + checkIncomplete(g); + f.completeExceptionally(ex); + } - /** - * thenApply result completes exceptionally if action does - */ - public void testThenApply3() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApply(new FailingFunction()); - f.complete(one); - checkCompletedWithWrappedCFException(g); - } + checkCompletedWithWrappedCFException(g, ex); + checkCompletedWithWrappedCFException(f, ex); + assertEquals(0, r.invocationCount); + }} /** * thenApply result completes exceptionally if source cancelled */ - public void testThenApply4() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApply(inc); - assertTrue(f.cancel(true)); + public void testThenApply_sourceCancelled() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + { + final CompletableFuture f = new CompletableFuture<>(); + final IncFunction r = new IncFunction(); + if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + final CompletableFuture g = f.thenApply(r); + if (createIncomplete) { + checkIncomplete(g); + assertTrue(f.cancel(mayInterruptIfRunning)); + } + checkCompletedWithWrappedCancellationException(g); - } + checkCancelled(f); + assertEquals(0, r.invocationCount); + }} + + /** + * thenApply result completes exceptionally if action does + */ + public void testThenApply_actionFailed() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final FailingFunction r = new FailingFunction(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = f.thenApply(r); + if (createIncomplete) { + checkIncomplete(g); + f.complete(v1); + } + + checkCompletedWithWrappedCFException(g); + checkCompletedNormally(f, v1); + }} /** * thenAccept result completes normally after normal completion of source */ - public void testThenAccept() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAccept(r); - f.complete(one); + public void testThenAccept_normalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final IncAction r = new IncAction(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = m.thenAccept(f, r); + if (createIncomplete) { + checkIncomplete(g); + f.complete(v1); + } + checkCompletedNormally(g, null); - assertEquals(r.value, (Integer) 2); - } + checkCompletedNormally(f, v1); + assertEquals(1, r.invocationCount); + assertEquals(inc(v1), r.value); + }} /** * thenAccept result completes exceptionally after exceptional * completion of source */ - public void testThenAccept2() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAccept(r); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } + public void testThenAccept_exceptionalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + { + final CFException ex = new CFException(); + final CompletableFuture f = new CompletableFuture<>(); + final IncAction r = new IncAction(); + if (!createIncomplete) f.completeExceptionally(ex); + final CompletableFuture g = m.thenAccept(f, r); + if (createIncomplete) { + checkIncomplete(g); + f.completeExceptionally(ex); + } + + checkCompletedWithWrappedCFException(g, ex); + checkCompletedWithWrappedCFException(f, ex); + assertEquals(0, r.invocationCount); + }} /** * thenAccept result completes exceptionally if action does */ - public void testThenAccept3() { - CompletableFuture f = new CompletableFuture<>(); - FailingConsumer r = new FailingConsumer(); - CompletableFuture g = f.thenAccept(r); - f.complete(one); + public void testThenAccept_actionFailed() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final FailingConsumer r = new FailingConsumer(); + if (!createIncomplete) f.complete(v1); + final CompletableFuture g = f.thenAccept(r); + if (createIncomplete) { + checkIncomplete(g); + f.complete(v1); + } + checkCompletedWithWrappedCFException(g); - assertEquals(1, r.invocationCount); - } + checkCompletedNormally(f, v1); + }} /** * thenAccept result completes exceptionally if source cancelled */ - public void testThenAccept4() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAccept(r); - assertTrue(f.cancel(true)); + public void testThenAccept_sourceCancelled() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + { + final CompletableFuture f = new CompletableFuture<>(); + final IncAction r = new IncAction(); + if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + final CompletableFuture g = f.thenAccept(r); + if (createIncomplete) { + checkIncomplete(g); + assertTrue(f.cancel(mayInterruptIfRunning)); + } + checkCompletedWithWrappedCancellationException(g); - } + checkCancelled(f); + assertEquals(0, r.invocationCount); + }} /** * thenCombine result completes normally after normal completion * of sources */ - public void testThenCombine_normalCompletion1() { + public void testThenCombine_normalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) for (boolean createIncomplete : new boolean[] { true, false }) for (boolean fFirst : new boolean[] { true, false }) - for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractFunction r = new SubtractFunction(); - CompletableFuture h = null; - if (createIncomplete) h = m.thenCombine(f, g, r); - if (fFirst) - f.complete(v1); - else - g.complete(v2); - if (createIncomplete) checkIncomplete(h); - assertEquals(0, r.invocationCount); - if (!fFirst) - f.complete(v1); - else - g.complete(v2); - if (!createIncomplete) h = m.thenCombine(f, g, r); + if (fFirst) f.complete(v1); else g.complete(v2); + if (!createIncomplete) + if (!fFirst) f.complete(v1); else g.complete(v2); + final CompletableFuture h = m.thenCombine(f, g, r); + if (createIncomplete) { + checkIncomplete(h); + assertEquals(0, r.invocationCount); + if (!fFirst) f.complete(v1); else g.complete(v2); + } checkCompletedNormally(h, subtract(v1, v2)); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); assertEquals(1, r.invocationCount); - } - } + }} /** * thenCombine result completes exceptionally after exceptional * completion of either source */ - public void testThenCombine_exceptionalCompletion1() { + public void testThenCombine_exceptionalCompletion() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); - final SubtractFunction r = new SubtractFunction(); - final CompletableFuture h = m.thenCombine(f, g, r); - final CFException ex = new CFException(); - - f.completeExceptionally(ex); - checkIncomplete(h); - g.complete(v1); - - checkCompletedWithWrappedCFException(h, ex); - checkCompletedWithWrappedCFException(f, ex); - assertEquals(0, r.invocationCount); - checkCompletedNormally(g, v1); - } - } - - public void testThenCombine_exceptionalCompletion2() { - for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (boolean createIncomplete : new boolean[] { true, false }) + for (boolean fFirst : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); - final SubtractFunction r = new SubtractFunction(); - final CompletableFuture h = m.thenCombine(f, g, r); final CFException ex = new CFException(); - - g.completeExceptionally(ex); - checkIncomplete(h); - f.complete(v1); - - checkCompletedWithWrappedCFException(h, ex); - checkCompletedWithWrappedCFException(g, ex); - assertEquals(0, r.invocationCount); - checkCompletedNormally(f, v1); - } - } - - public void testThenCombine_exceptionalCompletion3() { - for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); final SubtractFunction r = new SubtractFunction(); - final CFException ex = new CFException(); - g.completeExceptionally(ex); - f.complete(v1); + (fFirst ? f : g).complete(v1); + if (!createIncomplete) + (!fFirst ? f : g).completeExceptionally(ex); final CompletableFuture h = m.thenCombine(f, g, r); - - checkCompletedWithWrappedCFException(h, ex); - checkCompletedWithWrappedCFException(g, ex); - assertEquals(0, r.invocationCount); - checkCompletedNormally(f, v1); + if (createIncomplete) { + checkIncomplete(h); + (!fFirst ? f : g).completeExceptionally(ex); } - } - - public void testThenCombine_exceptionalCompletion4() { - for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); - final SubtractFunction r = new SubtractFunction(); - final CFException ex = new CFException(); - - f.completeExceptionally(ex); - g.complete(v1); - final CompletableFuture h = m.thenCombine(f, g, r); checkCompletedWithWrappedCFException(h, ex); - checkCompletedWithWrappedCFException(f, ex); assertEquals(0, r.invocationCount); - checkCompletedNormally(g, v1); - } - } + checkCompletedNormally(fFirst ? f : g, v1); + checkCompletedWithWrappedCFException(!fFirst ? f : g, ex); + }} /** * thenCombine result completes exceptionally if action does */ - public void testThenCombine_actionFailed1() { + public void testThenCombine_actionFailed() { for (ExecutionMode m : ExecutionMode.values()) + for (boolean fFirst : new boolean[] { true, false }) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingBiFunction r = new FailingBiFunction(); final CompletableFuture h = m.thenCombine(f, g, r); - f.complete(v1); - checkIncomplete(h); - g.complete(v2); - - checkCompletedWithWrappedCFException(h); - checkCompletedNormally(f, v1); - checkCompletedNormally(g, v2); + if (fFirst) { + f.complete(v1); + g.complete(v2); + } else { + g.complete(v2); + f.complete(v1); } - } - - public void testThenCombine_actionFailed2() { - for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); - final FailingBiFunction r = new FailingBiFunction(); - final CompletableFuture h = m.thenCombine(f, g, r); - - g.complete(v2); - checkIncomplete(h); - f.complete(v1); checkCompletedWithWrappedCFException(h); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * thenCombine result completes exceptionally if either source cancelled */ - public void testThenCombine_sourceCancelled1() { + public void testThenCombine_sourceCancelled() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); - final SubtractFunction r = new SubtractFunction(); - final CompletableFuture h = m.thenCombine(f, g, r); - - assertTrue(f.cancel(mayInterruptIfRunning)); - checkIncomplete(h); - g.complete(v1); - - checkCompletedWithWrappedCancellationException(h); - checkCancelled(f); - assertEquals(0, r.invocationCount); - checkCompletedNormally(g, v1); - } - } - - public void testThenCombine_sourceCancelled2() { - for (ExecutionMode m : ExecutionMode.values()) - for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); - final SubtractFunction r = new SubtractFunction(); - final CompletableFuture h = m.thenCombine(f, g, r); - - assertTrue(g.cancel(mayInterruptIfRunning)); - checkIncomplete(h); - f.complete(v1); - - checkCompletedWithWrappedCancellationException(h); - checkCancelled(g); - assertEquals(0, r.invocationCount); - checkCompletedNormally(f, v1); - } - } - - public void testThenCombine_sourceCancelled3() { - for (ExecutionMode m : ExecutionMode.values()) - for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (boolean createIncomplete : new boolean[] { true, false }) + for (boolean fFirst : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractFunction r = new SubtractFunction(); - assertTrue(g.cancel(mayInterruptIfRunning)); - f.complete(v1); + (fFirst ? f : g).complete(v1); + if (!createIncomplete) + assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning)); final CompletableFuture h = m.thenCombine(f, g, r); - - checkCompletedWithWrappedCancellationException(h); - checkCancelled(g); - assertEquals(0, r.invocationCount); - checkCompletedNormally(f, v1); + if (createIncomplete) { + checkIncomplete(h); + assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning)); } - } - - public void testThenCombine_sourceCancelled4() { - for (ExecutionMode m : ExecutionMode.values()) - for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFuture g = new CompletableFuture<>(); - final SubtractFunction r = new SubtractFunction(); - - assertTrue(f.cancel(mayInterruptIfRunning)); - g.complete(v1); - final CompletableFuture h = m.thenCombine(f, g, r); checkCompletedWithWrappedCancellationException(h); - checkCancelled(f); + checkCancelled(!fFirst ? f : g); assertEquals(0, r.invocationCount); - checkCompletedNormally(g, v1); - } - } + checkCompletedNormally(fFirst ? f : g, v1); + }} /** * thenAcceptBoth result completes normally after normal @@ -1213,8 +1360,8 @@ public class CompletableFutureTest exten public void testThenAcceptBoth_normalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1226,17 +1373,16 @@ public class CompletableFutureTest exten g.complete(v2); checkCompletedNormally(h, null); - assertEquals(r.value, subtract(v1, v2)); + assertEquals(subtract(v1, v2), r.value); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testThenAcceptBoth_normalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1248,17 +1394,16 @@ public class CompletableFutureTest exten f.complete(v1); checkCompletedNormally(h, null); - assertEquals(r.value, subtract(v1, v2)); + assertEquals(subtract(v1, v2), r.value); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testThenAcceptBoth_normalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1268,17 +1413,16 @@ public class CompletableFutureTest exten final CompletableFuture h = m.thenAcceptBoth(f, g, r); checkCompletedNormally(h, null); - assertEquals(r.value, subtract(v1, v2)); + assertEquals(subtract(v1, v2), r.value); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testThenAcceptBoth_normalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1288,11 +1432,10 @@ public class CompletableFutureTest exten final CompletableFuture h = m.thenAcceptBoth(f, g, r); checkCompletedNormally(h, null); - assertEquals(r.value, subtract(v1, v2)); + assertEquals(subtract(v1, v2), r.value); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * thenAcceptBoth result completes exceptionally after exceptional @@ -1300,8 +1443,8 @@ public class CompletableFutureTest exten */ public void testThenAcceptBoth_exceptionalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1316,13 +1459,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} public void testThenAcceptBoth_exceptionalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1337,13 +1479,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testThenAcceptBoth_exceptionalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1357,13 +1498,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testThenAcceptBoth_exceptionalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1377,8 +1517,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} /** * thenAcceptBoth result completes exceptionally if action does @@ -1386,8 +1525,8 @@ public class CompletableFutureTest exten public void testThenAcceptBoth_actionFailed1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingBiConsumer r = new FailingBiConsumer(); @@ -1400,14 +1539,13 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(h); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testThenAcceptBoth_actionFailed2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingBiConsumer r = new FailingBiConsumer(); @@ -1420,8 +1558,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(h); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * thenAcceptBoth result completes exceptionally if either source cancelled @@ -1429,8 +1566,8 @@ public class CompletableFutureTest exten public void testThenAcceptBoth_sourceCancelled1() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1444,14 +1581,13 @@ public class CompletableFutureTest exten checkCancelled(f); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} public void testThenAcceptBoth_sourceCancelled2() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1465,14 +1601,13 @@ public class CompletableFutureTest exten checkCancelled(g); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testThenAcceptBoth_sourceCancelled3() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1485,14 +1620,13 @@ public class CompletableFutureTest exten checkCancelled(g); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testThenAcceptBoth_sourceCancelled4() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final SubtractAction r = new SubtractAction(); @@ -1505,8 +1639,7 @@ public class CompletableFutureTest exten checkCancelled(f); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} /** * runAfterBoth result completes normally after normal @@ -1515,8 +1648,8 @@ public class CompletableFutureTest exten public void testRunAfterBoth_normalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1531,14 +1664,13 @@ public class CompletableFutureTest exten assertEquals(1, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testRunAfterBoth_normalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1553,14 +1685,13 @@ public class CompletableFutureTest exten assertEquals(1, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testRunAfterBoth_normalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1573,14 +1704,13 @@ public class CompletableFutureTest exten assertEquals(1, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testRunAfterBoth_normalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1593,8 +1723,7 @@ public class CompletableFutureTest exten assertEquals(1, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * runAfterBoth result completes exceptionally after exceptional @@ -1602,8 +1731,8 @@ public class CompletableFutureTest exten */ public void testRunAfterBoth_exceptionalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1618,13 +1747,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} public void testRunAfterBoth_exceptionalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1639,13 +1767,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testRunAfterBoth_exceptionalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1659,13 +1786,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testRunAfterBoth_exceptionalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1679,8 +1805,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} /** * runAfterBoth result completes exceptionally if action does @@ -1688,11 +1813,11 @@ public class CompletableFutureTest exten public void testRunAfterBoth_actionFailed1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); - final FailingNoop r = new FailingNoop(); + final FailingRunnable r = new FailingRunnable(); final CompletableFuture h = m.runAfterBoth(f, g, r); f.complete(v1); @@ -1702,17 +1827,16 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(h); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testRunAfterBoth_actionFailed2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); - final FailingNoop r = new FailingNoop(); + final FailingRunnable r = new FailingRunnable(); final CompletableFuture h = m.runAfterBoth(f, g, r); g.complete(v2); @@ -1722,8 +1846,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(h); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * runAfterBoth result completes exceptionally if either source cancelled @@ -1731,8 +1854,8 @@ public class CompletableFutureTest exten public void testRunAfterBoth_sourceCancelled1() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1746,14 +1869,13 @@ public class CompletableFutureTest exten checkCancelled(f); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} public void testRunAfterBoth_sourceCancelled2() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1767,14 +1889,13 @@ public class CompletableFutureTest exten checkCancelled(g); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testRunAfterBoth_sourceCancelled3() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1787,14 +1908,13 @@ public class CompletableFutureTest exten checkCancelled(g); assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); - } - } + }} public void testRunAfterBoth_sourceCancelled4() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -1807,8 +1927,7 @@ public class CompletableFutureTest exten checkCancelled(f); assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); - } - } + }} /** * applyToEither result completes normally after normal completion @@ -1817,8 +1936,8 @@ public class CompletableFutureTest exten public void testApplyToEither_normalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1831,14 +1950,13 @@ public class CompletableFutureTest exten checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); checkCompletedNormally(h, inc(v1)); - } - } + }} public void testApplyToEither_normalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1851,13 +1969,13 @@ public class CompletableFutureTest exten checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); checkCompletedNormally(h, inc(v2)); - } - } + }} + public void testApplyToEither_normalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1873,8 +1991,7 @@ public class CompletableFutureTest exten assertTrue(Objects.equals(h.join(), inc(v1)) || Objects.equals(h.join(), inc(v2))); assertEquals(1, r.invocationCount); - } - } + }} /** * applyToEither result completes exceptionally after exceptional @@ -1882,8 +1999,8 @@ public class CompletableFutureTest exten */ public void testApplyToEither_exceptionalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1898,13 +2015,12 @@ public class CompletableFutureTest exten checkCompletedNormally(g, v1); checkCompletedWithWrappedCFException(f, ex); checkCompletedWithWrappedCFException(h, ex); - } - } + }} public void testApplyToEither_exceptionalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1919,13 +2035,12 @@ public class CompletableFutureTest exten checkCompletedNormally(f, v1); checkCompletedWithWrappedCFException(g, ex); checkCompletedWithWrappedCFException(h, ex); - } - } + }} public void testApplyToEither_exceptionalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1938,7 +2053,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), inc(v1)); + assertEquals(inc(v1), h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCFException(h, ex); @@ -1947,13 +2062,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); checkCompletedNormally(f, v1); - } - } + }} public void testApplyToEither_exceptionalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -1966,7 +2080,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), inc(v1)); + assertEquals(inc(v1), h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCFException(h, ex); @@ -1975,8 +2089,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); checkCompletedNormally(g, v1); - } - } + }} /** * applyToEither result completes exceptionally if action does @@ -1984,8 +2097,8 @@ public class CompletableFutureTest exten public void testApplyToEither_actionFailed1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingFunction r = new FailingFunction(); @@ -1996,14 +2109,13 @@ public class CompletableFutureTest exten g.complete(v2); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testApplyToEither_actionFailed2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingFunction r = new FailingFunction(); @@ -2014,8 +2126,7 @@ public class CompletableFutureTest exten f.complete(v1); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * applyToEither result completes exceptionally if either source cancelled @@ -2023,8 +2134,8 @@ public class CompletableFutureTest exten public void testApplyToEither_sourceCancelled1() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -2038,14 +2149,13 @@ public class CompletableFutureTest exten assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); checkCompletedWithWrappedCancellationException(h); - } - } + }} public void testApplyToEither_sourceCancelled2() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -2059,14 +2169,13 @@ public class CompletableFutureTest exten assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedWithWrappedCancellationException(h); - } - } + }} public void testApplyToEither_sourceCancelled3() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -2078,7 +2187,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), inc(v1)); + assertEquals(inc(v1), h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCancellationException(h); @@ -2087,14 +2196,13 @@ public class CompletableFutureTest exten checkCancelled(g); checkCompletedNormally(f, v1); - } - } + }} public void testApplyToEither_sourceCancelled4() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncFunction r = new IncFunction(); @@ -2106,7 +2214,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), inc(v1)); + assertEquals(inc(v1), h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCancellationException(h); @@ -2115,8 +2223,7 @@ public class CompletableFutureTest exten checkCancelled(f); checkCompletedNormally(g, v1); - } - } + }} /** * acceptEither result completes normally after normal completion @@ -2125,8 +2232,8 @@ public class CompletableFutureTest exten public void testAcceptEither_normalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2134,20 +2241,19 @@ public class CompletableFutureTest exten f.complete(v1); checkCompletedNormally(h, null); - assertEquals(r.value, inc(v1)); + assertEquals(inc(v1), r.value); g.complete(v2); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); checkCompletedNormally(h, null); - } - } + }} public void testAcceptEither_normalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2155,19 +2261,19 @@ public class CompletableFutureTest exten g.complete(v2); checkCompletedNormally(h, null); - assertEquals(r.value, inc(v2)); + assertEquals(inc(v2), r.value); f.complete(v1); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); checkCompletedNormally(h, null); - } - } + }} + public void testAcceptEither_normalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2183,8 +2289,7 @@ public class CompletableFutureTest exten // unspecified behavior assertTrue(Objects.equals(r.value, inc(v1)) || Objects.equals(r.value, inc(v2))); - } - } + }} /** * acceptEither result completes exceptionally after exceptional @@ -2192,8 +2297,8 @@ public class CompletableFutureTest exten */ public void testAcceptEither_exceptionalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2208,13 +2313,12 @@ public class CompletableFutureTest exten checkCompletedNormally(g, v1); checkCompletedWithWrappedCFException(f, ex); checkCompletedWithWrappedCFException(h, ex); - } - } + }} public void testAcceptEither_exceptionalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2229,13 +2333,12 @@ public class CompletableFutureTest exten checkCompletedNormally(f, v1); checkCompletedWithWrappedCFException(g, ex); checkCompletedWithWrappedCFException(h, ex); - } - } + }} public void testAcceptEither_exceptionalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2248,7 +2351,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); assertEquals(inc(v1), r.value); } catch (CompletionException ok) { @@ -2258,13 +2361,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); checkCompletedNormally(f, v1); - } - } + }} public void testAcceptEither_exceptionalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2277,7 +2379,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); assertEquals(inc(v1), r.value); } catch (CompletionException ok) { @@ -2287,8 +2389,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); checkCompletedNormally(g, v1); - } - } + }} /** * acceptEither result completes exceptionally if action does @@ -2296,8 +2397,8 @@ public class CompletableFutureTest exten public void testAcceptEither_actionFailed1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingConsumer r = new FailingConsumer(); @@ -2308,14 +2409,13 @@ public class CompletableFutureTest exten g.complete(v2); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testAcceptEither_actionFailed2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final FailingConsumer r = new FailingConsumer(); @@ -2326,8 +2426,7 @@ public class CompletableFutureTest exten f.complete(v1); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * acceptEither result completes exceptionally if either source cancelled @@ -2335,8 +2434,8 @@ public class CompletableFutureTest exten public void testAcceptEither_sourceCancelled1() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2350,14 +2449,13 @@ public class CompletableFutureTest exten assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); checkCompletedWithWrappedCancellationException(h); - } - } + }} public void testAcceptEither_sourceCancelled2() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2371,14 +2469,13 @@ public class CompletableFutureTest exten assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedWithWrappedCancellationException(h); - } - } + }} public void testAcceptEither_sourceCancelled3() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2390,7 +2487,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); assertEquals(inc(v1), r.value); } catch (CompletionException ok) { @@ -2400,14 +2497,13 @@ public class CompletableFutureTest exten checkCancelled(g); checkCompletedNormally(f, v1); - } - } + }} public void testAcceptEither_sourceCancelled4() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final IncAction r = new IncAction(); @@ -2419,7 +2515,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); assertEquals(inc(v1), r.value); } catch (CompletionException ok) { @@ -2429,8 +2525,7 @@ public class CompletableFutureTest exten checkCancelled(f); checkCompletedNormally(g, v1); - } - } + }} /** * runAfterEither result completes normally after normal completion @@ -2439,8 +2534,8 @@ public class CompletableFutureTest exten public void testRunAfterEither_normalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2455,14 +2550,13 @@ public class CompletableFutureTest exten checkCompletedNormally(g, v2); checkCompletedNormally(h, null); assertEquals(1, r.invocationCount); - } - } + }} public void testRunAfterEither_normalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2477,13 +2571,13 @@ public class CompletableFutureTest exten checkCompletedNormally(g, v2); checkCompletedNormally(h, null); assertEquals(1, r.invocationCount); - } - } + }} + public void testRunAfterEither_normalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2496,8 +2590,7 @@ public class CompletableFutureTest exten checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); assertEquals(1, r.invocationCount); - } - } + }} /** * runAfterEither result completes exceptionally after exceptional @@ -2505,8 +2598,8 @@ public class CompletableFutureTest exten */ public void testRunAfterEither_exceptionalCompletion1() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2521,13 +2614,12 @@ public class CompletableFutureTest exten checkCompletedNormally(g, v1); checkCompletedWithWrappedCFException(f, ex); checkCompletedWithWrappedCFException(h, ex); - } - } + }} public void testRunAfterEither_exceptionalCompletion2() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2542,13 +2634,12 @@ public class CompletableFutureTest exten checkCompletedNormally(f, v1); checkCompletedWithWrappedCFException(g, ex); checkCompletedWithWrappedCFException(h, ex); - } - } + }} public void testRunAfterEither_exceptionalCompletion3() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2561,7 +2652,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCFException(h, ex); @@ -2570,13 +2661,12 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g, ex); checkCompletedNormally(f, v1); - } - } + }} public void testRunAfterEither_exceptionalCompletion4() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2589,7 +2679,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCFException(h, ex); @@ -2598,8 +2688,7 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(f, ex); checkCompletedNormally(g, v1); - } - } + }} /** * runAfterEither result completes exceptionally if action does @@ -2607,11 +2696,11 @@ public class CompletableFutureTest exten public void testRunAfterEither_actionFailed1() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); - final FailingNoop r = new FailingNoop(); + final FailingRunnable r = new FailingRunnable(); final CompletableFuture h = m.runAfterEither(f, g, r); f.complete(v1); @@ -2619,17 +2708,16 @@ public class CompletableFutureTest exten g.complete(v2); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} public void testRunAfterEither_actionFailed2() { for (ExecutionMode m : ExecutionMode.values()) for (Integer v1 : new Integer[] { 1, null }) - for (Integer v2 : new Integer[] { 2, null }) { - + for (Integer v2 : new Integer[] { 2, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); - final FailingNoop r = new FailingNoop(); + final FailingRunnable r = new FailingRunnable(); final CompletableFuture h = m.runAfterEither(f, g, r); g.complete(v2); @@ -2637,8 +2725,7 @@ public class CompletableFutureTest exten f.complete(v1); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - } - } + }} /** * runAfterEither result completes exceptionally if either source cancelled @@ -2646,8 +2733,8 @@ public class CompletableFutureTest exten public void testRunAfterEither_sourceCancelled1() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2661,14 +2748,13 @@ public class CompletableFutureTest exten assertEquals(0, r.invocationCount); checkCompletedNormally(g, v1); checkCompletedWithWrappedCancellationException(h); - } - } + }} public void testRunAfterEither_sourceCancelled2() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2682,14 +2768,13 @@ public class CompletableFutureTest exten assertEquals(0, r.invocationCount); checkCompletedNormally(f, v1); checkCompletedWithWrappedCancellationException(h); - } - } + }} public void testRunAfterEither_sourceCancelled3() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2701,7 +2786,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCancellationException(h); @@ -2710,14 +2795,13 @@ public class CompletableFutureTest exten checkCancelled(g); checkCompletedNormally(f, v1); - } - } + }} public void testRunAfterEither_sourceCancelled4() { for (ExecutionMode m : ExecutionMode.values()) for (boolean mayInterruptIfRunning : new boolean[] { true, false }) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFuture g = new CompletableFuture<>(); final Noop r = new Noop(); @@ -2729,7 +2813,7 @@ public class CompletableFutureTest exten // unspecified behavior Integer v; try { - assertEquals(h.join(), null); + assertNull(h.join()); assertEquals(1, r.invocationCount); } catch (CompletionException ok) { checkCompletedWithWrappedCancellationException(h); @@ -2738,423 +2822,86 @@ public class CompletableFutureTest exten checkCancelled(f); checkCompletedNormally(g, v1); - } - } + }} /** * thenCompose result completes normally after normal completion of source */ - public void testThenCompose_normalCompletion1() { + public void testThenCompose_normalCompletion() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFutureInc r = new CompletableFutureInc(); + if (!createIncomplete) f.complete(v1); final CompletableFuture g = f.thenCompose(r); - f.complete(v1); - checkCompletedNormally(g, inc(v1)); - checkCompletedNormally(f, v1); - assertEquals(1, r.invocationCount); - } - } - - public void testThenCompose_normalCompletion2() { - for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { + if (createIncomplete) f.complete(v1); - final CompletableFuture f = new CompletableFuture<>(); - final CompletableFutureInc r = new CompletableFutureInc(); - f.complete(v1); - final CompletableFuture g = f.thenCompose(r); checkCompletedNormally(g, inc(v1)); checkCompletedNormally(f, v1); assertEquals(1, r.invocationCount); - } - } + }} /** * thenCompose result completes exceptionally after exceptional * completion of source */ - public void testThenCompose_exceptionalCompletion1() { - for (ExecutionMode m : ExecutionMode.values()) { - + public void testThenCompose_exceptionalCompletion() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean createIncomplete : new boolean[] { true, false }) + { final CFException ex = new CFException(); final CompletableFutureInc r = new CompletableFutureInc(); final CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) f.completeExceptionally(ex); final CompletableFuture g = f.thenCompose(r); - f.completeExceptionally(ex); - checkCompletedWithWrappedCFException(g, ex); - checkCompletedWithWrappedCFException(f, ex); - } - } - - public void testThenCompose_exceptionalCompletion2() { - for (ExecutionMode m : ExecutionMode.values()) { + if (createIncomplete) f.completeExceptionally(ex); - final CFException ex = new CFException(); - final CompletableFuture f = new CompletableFuture<>(); - f.completeExceptionally(ex); - final CompletableFutureInc r = new CompletableFutureInc(); - final CompletableFuture g = f.thenCompose(r); checkCompletedWithWrappedCFException(g, ex); checkCompletedWithWrappedCFException(f, ex); - } - } + assertEquals(0, r.invocationCount); + }} /** * thenCompose result completes exceptionally if action does */ - public void testThenCompose_actionFailed1() { + public void testThenCompose_actionFailed() { for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { final CompletableFuture f = new CompletableFuture<>(); final FailingCompletableFutureFunction r = new FailingCompletableFutureFunction(); + if (!createIncomplete) f.complete(v1); final CompletableFuture g = f.thenCompose(r); - f.complete(v1); - checkCompletedWithWrappedCFException(g); - checkCompletedNormally(f, v1); - } - } - - public void testThenCompose_actionFailed2() { - for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { + if (createIncomplete) f.complete(v1); - final CompletableFuture f = new CompletableFuture<>(); - f.complete(v1); - final FailingCompletableFutureFunction r - = new FailingCompletableFutureFunction(); - final CompletableFuture g = f.thenCompose(r); checkCompletedWithWrappedCFException(g); checkCompletedNormally(f, v1); - } - } + }} /** * thenCompose result completes exceptionally if source cancelled */ - public void testThenCompose_sourceCancelled1() { + public void testThenCompose_sourceCancelled() { for (ExecutionMode m : ExecutionMode.values()) - for (boolean mayInterruptIfRunning : new boolean[] { true, false }) { - + for (boolean createIncomplete : new boolean[] { true, false }) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + { final CompletableFuture f = new CompletableFuture<>(); final CompletableFutureInc r = new CompletableFutureInc(); + if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); final CompletableFuture g = f.thenCompose(r); - assertTrue(f.cancel(mayInterruptIfRunning)); - checkCompletedWithWrappedCancellationException(g); - checkCancelled(f); + if (createIncomplete) { + checkIncomplete(g); + assertTrue(f.cancel(mayInterruptIfRunning)); } - } - - public void testThenCompose_sourceCancelled2() { - for (ExecutionMode m : ExecutionMode.values()) - for (boolean mayInterruptIfRunning : new boolean[] { true, false }) { - final CompletableFuture f = new CompletableFuture<>(); - assertTrue(f.cancel(mayInterruptIfRunning)); - final CompletableFutureInc r = new CompletableFutureInc(); - final CompletableFuture g = f.thenCompose(r); checkCompletedWithWrappedCancellationException(g); checkCancelled(f); - } - } - - // asyncs - - /** - * thenRunAsync result completes normally after normal completion of source - */ - public void testThenRunAsync() { - CompletableFuture f = new CompletableFuture<>(); - Noop r = new Noop(); - CompletableFuture g = f.thenRunAsync(r); - f.complete(null); - checkCompletedNormally(g, null); - - // reordered version - f = new CompletableFuture<>(); - f.complete(null); - r = new Noop(); - g = f.thenRunAsync(r); - checkCompletedNormally(g, null); - } - - /** - * thenRunAsync result completes exceptionally after exceptional - * completion of source - */ - public void testThenRunAsync2() { - CompletableFuture f = new CompletableFuture<>(); - Noop r = new Noop(); - CompletableFuture g = f.thenRunAsync(r); - f.completeExceptionally(new CFException()); - try { - g.join(); - shouldThrow(); - } catch (CompletionException success) {} - checkCompletedWithWrappedCFException(g); - } - - /** - * thenRunAsync result completes exceptionally if action does - */ - public void testThenRunAsync3() { - CompletableFuture f = new CompletableFuture<>(); - FailingNoop r = new FailingNoop(); - CompletableFuture g = f.thenRunAsync(r); - f.complete(null); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenRunAsync result completes exceptionally if source cancelled - */ - public void testThenRunAsync4() { - CompletableFuture f = new CompletableFuture<>(); - Noop r = new Noop(); - CompletableFuture g = f.thenRunAsync(r); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); - } - - /** - * thenApplyAsync result completes normally after normal completion of source - */ - public void testThenApplyAsync() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApplyAsync(inc); - f.complete(one); - checkCompletedNormally(g, two); - } - - /** - * thenApplyAsync result completes exceptionally after exceptional - * completion of source - */ - public void testThenApplyAsync2() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApplyAsync(inc); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenApplyAsync result completes exceptionally if action does - */ - public void testThenApplyAsync3() { - CompletableFuture f = new CompletableFuture<>(); - FailingFunction r = new FailingFunction(); - CompletableFuture g = f.thenApplyAsync(r); - f.complete(null); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenApplyAsync result completes exceptionally if source cancelled - */ - public void testThenApplyAsync4() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApplyAsync(inc); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); - } - - /** - * thenAcceptAsync result completes normally after normal - * completion of source - */ - public void testThenAcceptAsync() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAcceptAsync(r); - f.complete(one); - checkCompletedNormally(g, null); - assertEquals(r.value, (Integer) 2); - } - - /** - * thenAcceptAsync result completes exceptionally after exceptional - * completion of source - */ - public void testThenAcceptAsync2() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAcceptAsync(r); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenAcceptAsync result completes exceptionally if action does - */ - public void testThenAcceptAsync3() { - CompletableFuture f = new CompletableFuture<>(); - FailingConsumer r = new FailingConsumer(); - CompletableFuture g = f.thenAcceptAsync(r); - f.complete(null); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenAcceptAsync result completes exceptionally if source cancelled - */ - public void testThenAcceptAsync4() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAcceptAsync(r); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); - } - - // async with explicit executors - - /** - * thenRunAsync result completes normally after normal completion of source - */ - public void testThenRunAsyncE() { - CompletableFuture f = new CompletableFuture<>(); - Noop r = new Noop(); - CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); - f.complete(null); - checkCompletedNormally(g, null); - - // reordered version - f = new CompletableFuture<>(); - f.complete(null); - r = new Noop(); - g = f.thenRunAsync(r, new ThreadExecutor()); - checkCompletedNormally(g, null); - } - - /** - * thenRunAsync result completes exceptionally after exceptional - * completion of source - */ - public void testThenRunAsync2E() { - CompletableFuture f = new CompletableFuture<>(); - Noop r = new Noop(); - CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); - f.completeExceptionally(new CFException()); - try { - g.join(); - shouldThrow(); - } catch (CompletionException success) {} - checkCompletedWithWrappedCFException(g); - } - - /** - * thenRunAsync result completes exceptionally if action does - */ - public void testThenRunAsync3E() { - CompletableFuture f = new CompletableFuture<>(); - FailingNoop r = new FailingNoop(); - CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); - f.complete(null); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenRunAsync result completes exceptionally if source cancelled - */ - public void testThenRunAsync4E() { - CompletableFuture f = new CompletableFuture<>(); - Noop r = new Noop(); - CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); - } - - /** - * thenApplyAsync result completes normally after normal completion of source - */ - public void testThenApplyAsyncE() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApplyAsync(inc, new ThreadExecutor()); - f.complete(one); - checkCompletedNormally(g, two); - } - - /** - * thenApplyAsync result completes exceptionally after exceptional - * completion of source - */ - public void testThenApplyAsync2E() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApplyAsync(inc, new ThreadExecutor()); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenApplyAsync result completes exceptionally if action does - */ - public void testThenApplyAsync3E() { - CompletableFuture f = new CompletableFuture<>(); - FailingFunction r = new FailingFunction(); - CompletableFuture g = f.thenApplyAsync(r, new ThreadExecutor()); - f.complete(null); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenApplyAsync result completes exceptionally if source cancelled - */ - public void testThenApplyAsync4E() { - CompletableFuture f = new CompletableFuture<>(); - CompletableFuture g = f.thenApplyAsync(inc, new ThreadExecutor()); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); - } - - /** - * thenAcceptAsync result completes normally after normal - * completion of source - */ - public void testThenAcceptAsyncE() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); - f.complete(one); - checkCompletedNormally(g, null); - assertEquals(r.value, (Integer) 2); - } - - /** - * thenAcceptAsync result completes exceptionally after exceptional - * completion of source - */ - public void testThenAcceptAsync2E() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenAcceptAsync result completes exceptionally if action does - */ - public void testThenAcceptAsync3E() { - CompletableFuture f = new CompletableFuture<>(); - FailingConsumer r = new FailingConsumer(); - CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); - f.complete(null); - checkCompletedWithWrappedCFException(g); - } - - /** - * thenAcceptAsync result completes exceptionally if source cancelled - */ - public void testThenAcceptAsync4E() { - CompletableFuture f = new CompletableFuture<>(); - IncAction r = new IncAction(); - CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); - assertTrue(f.cancel(true)); - checkCompletedWithWrappedCancellationException(g); - } + }} // other static methods @@ -3355,37 +3102,37 @@ public class CompletableFutureTest exten * source result. */ public void testWhenComplete_normalCompletion1() { - for (boolean createIncomplete : new boolean[] { true, false }) for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - - final AtomicInteger a = new AtomicInteger(); + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); final CompletableFuture f = new CompletableFuture<>(); if (!createIncomplete) f.complete(v1); - final CompletableFuture g = - m.whenComplete(f, - (Integer x, Throwable t) -> { - threadAssertSame(x, v1); - threadAssertNull(t); - a.getAndIncrement(); - }); + final CompletableFuture g = m.whenComplete + (f, + (Integer x, Throwable t) -> { + threadAssertSame(x, v1); + threadAssertNull(t); + a.getAndIncrement(); + }); if (createIncomplete) f.complete(v1); - checkCompletedNormally(f, v1); + checkCompletedNormally(g, v1); - assertEquals(a.get(), 1); - } - } + checkCompletedNormally(f, v1); + assertEquals(1, a.get()); + }} /** * whenComplete action executes on exceptional completion, propagating * source result. */ public void testWhenComplete_exceptionalCompletion() { - for (boolean createIncomplete : new boolean[] { true, false }) for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - - final AtomicInteger a = new AtomicInteger(); + for (boolean createIncomplete : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); final CFException ex = new CFException(); final CompletableFuture f = new CompletableFuture<>(); if (!createIncomplete) f.completeExceptionally(ex); @@ -3399,9 +3146,35 @@ public class CompletableFutureTest exten if (createIncomplete) f.completeExceptionally(ex); checkCompletedWithWrappedCFException(f, ex); checkCompletedWithWrappedCFException(g, ex); - assertEquals(a.get(), 1); - } - } + assertEquals(1, a.get()); + }} + + /** + * whenComplete action executes on cancelled source, propagating + * CancellationException. + */ + public void testWhenComplete_sourceCancelled() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (boolean createIncomplete : new boolean[] { true, false }) + { + final AtomicInteger a = new AtomicInteger(0); + final CompletableFuture f = new CompletableFuture<>(); + if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + final CompletableFuture g = m.whenComplete + (f, + (Integer x, Throwable t) -> { + threadAssertNull(x); + threadAssertTrue(t instanceof CancellationException); + a.getAndIncrement(); + }); + if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); + + //try { g.join(); } catch (Throwable t) { throw new Error(t); } + checkCompletedWithWrappedCancellationException(g); + checkCancelled(f); + assertEquals(1, a.get()); + }} /** * If a whenComplete action throws an exception when triggered by @@ -3410,8 +3183,9 @@ public class CompletableFutureTest exten public void testWhenComplete_actionFailed() { for (boolean createIncomplete : new boolean[] { true, false }) for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); final CFException ex = new CFException(); final CompletableFuture f = new CompletableFuture<>(); if (!createIncomplete) f.complete(v1); @@ -3420,13 +3194,14 @@ public class CompletableFutureTest exten (Integer x, Throwable t) -> { threadAssertSame(x, v1); threadAssertNull(t); + a.getAndIncrement(); throw ex; }); if (createIncomplete) f.complete(v1); checkCompletedNormally(f, v1); checkCompletedWithWrappedCFException(g, ex); - } - } + assertEquals(1, a.get()); + }} /** * If a whenComplete action throws an exception when triggered by @@ -3436,8 +3211,9 @@ public class CompletableFutureTest exten public void testWhenComplete_actionFailedSourceFailed() { for (boolean createIncomplete : new boolean[] { true, false }) for (ExecutionMode m : ExecutionMode.values()) - for (Integer v1 : new Integer[] { 1, null }) { - + for (Integer v1 : new Integer[] { 1, null }) + { + final AtomicInteger a = new AtomicInteger(0); final CFException ex1 = new CFException(); final CFException ex2 = new CFException(); final CompletableFuture f = new CompletableFuture<>(); @@ -3448,97 +3224,14 @@ public class CompletableFutureTest exten (Integer x, Throwable t) -> { threadAssertSame(t, ex1); threadAssertNull(x); + a.getAndIncrement(); throw ex2; }); if (createIncomplete) f.completeExceptionally(ex1); checkCompletedWithWrappedCFException(f, ex1); checkCompletedWithWrappedCFException(g, ex1); - } - } - - /** - * handleAsync action completes normally with function value on - * either normal or exceptional completion of source - */ - public void testHandleAsync() { - CompletableFuture f, g; - IntegerHandler r; - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler()); - assertEquals(0, r.invocationCount); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(f); - checkCompletedNormally(g, three); - assertEquals(1, r.invocationCount); - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler()); - assertEquals(0, r.invocationCount); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(f); - checkCompletedNormally(g, three); - assertEquals(1, r.invocationCount); - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler()); - assertEquals(0, r.invocationCount); - f.complete(one); - checkCompletedNormally(f, one); - checkCompletedNormally(g, two); - assertEquals(1, r.invocationCount); - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler()); - assertEquals(0, r.invocationCount); - f.complete(one); - checkCompletedNormally(f, one); - checkCompletedNormally(g, two); - assertEquals(1, r.invocationCount); - } - - /** - * handleAsync action with Executor completes normally with - * function value on either normal or exceptional completion of - * source - */ - public void testHandleAsync2() { - CompletableFuture f, g; - ThreadExecutor exec = new ThreadExecutor(); - IntegerHandler r; - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler(), exec); - assertEquals(0, r.invocationCount); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(f); - checkCompletedNormally(g, three); - assertEquals(1, r.invocationCount); - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler(), exec); - assertEquals(0, r.invocationCount); - f.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(f); - checkCompletedNormally(g, three); - assertEquals(1, r.invocationCount); - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler(), exec); - assertEquals(0, r.invocationCount); - f.complete(one); - checkCompletedNormally(f, one); - checkCompletedNormally(g, two); - assertEquals(1, r.invocationCount); - - f = new CompletableFuture<>(); - g = f.handleAsync(r = new IntegerHandler(), exec); - assertEquals(0, r.invocationCount); - f.complete(one); - checkCompletedNormally(f, one); - checkCompletedNormally(g, two); - assertEquals(1, r.invocationCount); - } + assertEquals(1, a.get()); + }} }