--- jsr166/src/test/tck/CompletableFutureTest.java 2013/04/01 20:06:25 1.14 +++ jsr166/src/test/tck/CompletableFutureTest.java 2013/04/09 07:50:55 1.23 @@ -55,6 +55,9 @@ public class CompletableFutureTest exten void checkCompletedNormally(CompletableFuture f, T value) { try { + assertEquals(value, f.get(LONG_DELAY_MS, MILLISECONDS)); + } catch (Throwable fail) { threadUnexpectedException(fail); } + try { assertEquals(value, f.join()); } catch (Throwable fail) { threadUnexpectedException(fail); } try { @@ -63,9 +66,6 @@ public class CompletableFutureTest exten try { assertEquals(value, f.get()); } catch (Throwable fail) { threadUnexpectedException(fail); } - try { - assertEquals(value, f.get(0L, SECONDS)); - } catch (Throwable fail) { threadUnexpectedException(fail); } assertTrue(f.isDone()); assertFalse(f.isCancelled()); assertTrue(f.toString().contains("[Completed normally]")); @@ -73,6 +73,12 @@ public class CompletableFutureTest exten void checkCompletedWithWrappedCFException(CompletableFuture f) { try { + f.get(LONG_DELAY_MS, MILLISECONDS); + shouldThrow(); + } catch (ExecutionException success) { + assertTrue(success.getCause() instanceof CFException); + } catch (Throwable fail) { threadUnexpectedException(fail); } + try { f.join(); shouldThrow(); } catch (CompletionException success) { @@ -90,12 +96,6 @@ public class CompletableFutureTest exten } catch (ExecutionException success) { assertTrue(success.getCause() instanceof CFException); } catch (Throwable fail) { threadUnexpectedException(fail); } - try { - f.get(0L, SECONDS); - shouldThrow(); - } catch (ExecutionException success) { - assertTrue(success.getCause() instanceof CFException); - } catch (Throwable fail) { threadUnexpectedException(fail); } assertTrue(f.isDone()); assertFalse(f.isCancelled()); assertTrue(f.toString().contains("[Completed exceptionally]")); @@ -103,6 +103,11 @@ public class CompletableFutureTest exten void checkCancelled(CompletableFuture f) { try { + f.get(LONG_DELAY_MS, MILLISECONDS); + shouldThrow(); + } catch (CancellationException success) { + } catch (Throwable fail) { threadUnexpectedException(fail); } + try { f.join(); shouldThrow(); } catch (CancellationException success) {} @@ -115,11 +120,6 @@ public class CompletableFutureTest exten shouldThrow(); } catch (CancellationException success) { } catch (Throwable fail) { threadUnexpectedException(fail); } - try { - f.get(0L, SECONDS); - shouldThrow(); - } catch (CancellationException success) { - } catch (Throwable fail) { threadUnexpectedException(fail); } assertTrue(f.isDone()); assertTrue(f.isCancelled()); assertTrue(f.toString().contains("[Completed exceptionally]")); @@ -127,6 +127,12 @@ public class CompletableFutureTest exten void checkCompletedWithWrappedCancellationException(CompletableFuture f) { try { + f.get(LONG_DELAY_MS, MILLISECONDS); + shouldThrow(); + } catch (ExecutionException success) { + assertTrue(success.getCause() instanceof CancellationException); + } catch (Throwable fail) { threadUnexpectedException(fail); } + try { f.join(); shouldThrow(); } catch (CompletionException success) { @@ -144,12 +150,6 @@ public class CompletableFutureTest exten } catch (ExecutionException success) { assertTrue(success.getCause() instanceof CancellationException); } catch (Throwable fail) { threadUnexpectedException(fail); } - try { - f.get(0L, SECONDS); - shouldThrow(); - } catch (ExecutionException success) { - assertTrue(success.getCause() instanceof CancellationException); - } catch (Throwable fail) { threadUnexpectedException(fail); } assertTrue(f.isDone()); assertFalse(f.isCancelled()); assertTrue(f.toString().contains("[Completed exceptionally]")); @@ -160,7 +160,7 @@ public class CompletableFutureTest exten * by methods isDone, isCancelled, and getNow */ public void testConstructor() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); checkIncomplete(f); } @@ -169,7 +169,7 @@ public class CompletableFutureTest exten * isCancelled, join, get, and getNow */ public void testComplete() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); checkIncomplete(f); f.complete(one); checkCompletedNormally(f, one); @@ -180,7 +180,7 @@ public class CompletableFutureTest exten * methods isDone, isCancelled, join, get, and getNow */ public void testCompleteExceptionally() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); checkIncomplete(f); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(f); @@ -191,7 +191,7 @@ public class CompletableFutureTest exten * methods isDone, isCancelled, join, get, and getNow */ public void testCancel() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); checkIncomplete(f); assertTrue(f.cancel(true)); checkCancelled(f); @@ -201,7 +201,7 @@ public class CompletableFutureTest exten * obtrudeValue forces completion with given value */ public void testObtrudeValue() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); checkIncomplete(f); f.complete(one); checkCompletedNormally(f, one); @@ -209,10 +209,10 @@ public class CompletableFutureTest exten checkCompletedNormally(f, three); f.obtrudeValue(two); checkCompletedNormally(f, two); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.obtrudeValue(three); checkCompletedNormally(f, three); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.completeExceptionally(new CFException()); f.obtrudeValue(four); checkCompletedNormally(f, four); @@ -222,16 +222,16 @@ public class CompletableFutureTest exten * obtrudeException forces completion with given exception */ public void testObtrudeException() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); checkIncomplete(f); f.complete(one); checkCompletedNormally(f, one); f.obtrudeException(new CFException()); checkCompletedWithWrappedCFException(f); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.obtrudeException(new CFException()); checkCompletedWithWrappedCFException(f); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.completeExceptionally(new CFException()); f.obtrudeValue(four); checkCompletedNormally(f, four); @@ -243,7 +243,7 @@ public class CompletableFutureTest exten * getNumberOfDependents returns number of dependent tasks */ public void testGetNumberOfDependents() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); assertEquals(f.getNumberOfDependents(), 0); CompletableFuture g = f.thenRun(new Noop()); assertEquals(f.getNumberOfDependents(), 1); @@ -282,20 +282,22 @@ public class CompletableFutureTest exten checkCompletedNormally(f, "test"); } + // Choose non-commutative actions for better coverage + static final Supplier supplyOne = () -> Integer.valueOf(1); static final Function inc = (Integer x) -> Integer.valueOf(x.intValue() + 1); - static final BiFunction add = - (Integer x, Integer y) -> Integer.valueOf(x.intValue() + y.intValue()); + static final BiFunction subtract = + (Integer x, Integer y) -> Integer.valueOf(x.intValue() - y.intValue()); static final class IncAction implements Consumer { int value; public void accept(Integer x) { value = x.intValue() + 1; } } - static final class AddAction implements BiConsumer { + static final class SubtractAction implements BiConsumer { int value; public void accept(Integer x, Integer y) { - value = x.intValue() + y.intValue(); + value = x.intValue() - y.intValue(); } } static final class Noop implements Runnable { @@ -328,15 +330,19 @@ public class CompletableFutureTest exten public void run() { ran = true; throw new CFException(); } } - static final class CompletableFutureInc implements Function> { + static final class CompletableFutureInc + implements Function> { + boolean ran; public CompletableFuture apply(Integer x) { - CompletableFuture f = new CompletableFuture(); + ran = true; + CompletableFuture f = new CompletableFuture<>(); f.complete(Integer.valueOf(x.intValue() + 1)); return f; } } - static final class FailingCompletableFutureFunction implements Function> { + static final class FailingCompletableFutureFunction + implements Function> { boolean ran; public CompletableFuture apply(Integer x) { ran = true; throw new CFException(); @@ -345,7 +351,10 @@ public class CompletableFutureTest exten // Used for explicit executor tests static final class ThreadExecutor implements Executor { + AtomicInteger count = new AtomicInteger(0); + public void execute(Runnable r) { + count.getAndIncrement(); new Thread(r).start(); } } @@ -355,7 +364,9 @@ public class CompletableFutureTest exten } static final class IntegerHandler implements BiFunction { + boolean ran; public Integer apply(Integer x, Throwable t) { + ran = true; return (t == null) ? two : three; } } @@ -366,13 +377,13 @@ public class CompletableFutureTest exten * exception; otherwise with source value */ public void testExceptionally() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); ExceptionToInteger r = new ExceptionToInteger(); CompletableFuture g = f.exceptionally(r); f.completeExceptionally(new CFException()); checkCompletedNormally(g, three); - f = new CompletableFuture(); + f = new CompletableFuture<>(); r = new ExceptionToInteger(); g = f.exceptionally(r); f.complete(one); @@ -384,16 +395,33 @@ public class CompletableFutureTest exten * normal or exceptional completion of source */ public void testHandle() { - CompletableFuture f = new CompletableFuture(); - IntegerHandler r = new IntegerHandler(); - CompletableFuture g = f.handle(r); + CompletableFuture f, g; + IntegerHandler r; + + f = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g = f.handle(r = new IntegerHandler()); + assertTrue(r.ran); + checkCompletedNormally(g, three); + + f = new CompletableFuture<>(); + g = f.handle(r = new IntegerHandler()); + assertFalse(r.ran); f.completeExceptionally(new CFException()); checkCompletedNormally(g, three); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + f.complete(one); + g = f.handle(r = new IntegerHandler()); + assertTrue(r.ran); + checkCompletedNormally(g, two); - f = new CompletableFuture(); - r = new IntegerHandler(); - g = f.handle(r); + f = new CompletableFuture<>(); + g = f.handle(r = new IntegerHandler()); + assertFalse(r.ran); f.complete(one); + assertTrue(r.ran); checkCompletedNormally(g, two); } @@ -413,10 +441,12 @@ public class CompletableFutureTest exten */ public void testRunAsync2() { Noop r = new Noop(); - CompletableFuture f = CompletableFuture.runAsync(r, new ThreadExecutor()); + ThreadExecutor exec = new ThreadExecutor(); + CompletableFuture f = CompletableFuture.runAsync(r, exec); assertNull(f.join()); assertTrue(r.ran); checkCompletedNormally(f, null); + assertEquals(1, exec.count.get()); } /** @@ -433,16 +463,20 @@ public class CompletableFutureTest exten * supplyAsync completes with result of supplier */ public void testSupplyAsync() { - CompletableFuture f = CompletableFuture.supplyAsync(supplyOne); + CompletableFuture f; + f = CompletableFuture.supplyAsync(supplyOne); assertEquals(f.join(), one); + checkCompletedNormally(f, one); } /** * supplyAsync with executor completes with result of supplier */ public void testSupplyAsync2() { - CompletableFuture f = CompletableFuture.supplyAsync(supplyOne, new ThreadExecutor()); + CompletableFuture f; + f = CompletableFuture.supplyAsync(supplyOne, new ThreadExecutor()); assertEquals(f.join(), one); + checkCompletedNormally(f, one); } /** @@ -461,17 +495,21 @@ public class CompletableFutureTest exten * thenRun result completes normally after normal completion of source */ public void testThenRun() { - CompletableFuture f = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.thenRun(r); + CompletableFuture f; + CompletableFuture g; + Noop r; + + f = new CompletableFuture<>(); + g = f.thenRun(r = new Noop()); f.complete(null); checkCompletedNormally(g, null); - // reordered version - f = new CompletableFuture(); + assertTrue(r.ran); + + f = new CompletableFuture<>(); f.complete(null); - r = new Noop(); - g = f.thenRun(r); + g = f.thenRun(r = new Noop()); checkCompletedNormally(g, null); + assertTrue(r.ran); } /** @@ -479,40 +517,66 @@ public class CompletableFutureTest exten * completion of source */ public void testThenRun2() { - CompletableFuture f = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.thenRun(r); + CompletableFuture f; + CompletableFuture g; + Noop r; + + f = new CompletableFuture<>(); + g = f.thenRun(r = new Noop()); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); + assertFalse(r.ran); + + f = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g = f.thenRun(r = new Noop()); + checkCompletedWithWrappedCFException(g); + assertFalse(r.ran); } /** * thenRun result completes exceptionally if action does */ public void testThenRun3() { - CompletableFuture f = new CompletableFuture(); - FailingNoop r = new FailingNoop(); - CompletableFuture g = f.thenRun(r); + CompletableFuture f; + CompletableFuture g; + FailingNoop r; + + f = new CompletableFuture<>(); + g = f.thenRun(r = new FailingNoop()); f.complete(null); checkCompletedWithWrappedCFException(g); + + f = new CompletableFuture<>(); + f.complete(null); + g = f.thenRun(r = new FailingNoop()); + checkCompletedWithWrappedCFException(g); } /** * thenRun result completes exceptionally if source cancelled */ public void testThenRun4() { - CompletableFuture f = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.thenRun(r); + CompletableFuture f; + CompletableFuture g; + Noop r; + + f = new CompletableFuture<>(); + g = f.thenRun(r = new Noop()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); + + f = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + g = f.thenRun(r = new Noop()); + checkCompletedWithWrappedCancellationException(g); } /** * thenApply result completes normally after normal completion of source */ public void testThenApply() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApply(inc); f.complete(one); checkCompletedNormally(g, two); @@ -523,7 +587,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenApply2() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApply(inc); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); @@ -533,7 +597,7 @@ public class CompletableFutureTest exten * thenApply result completes exceptionally if action does */ public void testThenApply3() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApply(new FailingFunction()); f.complete(one); checkCompletedWithWrappedCFException(g); @@ -543,7 +607,7 @@ public class CompletableFutureTest exten * thenApply result completes exceptionally if source cancelled */ public void testThenApply4() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApply(inc); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); @@ -553,7 +617,7 @@ public class CompletableFutureTest exten * thenAccept result completes normally after normal completion of source */ public void testThenAccept() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAccept(r); f.complete(one); @@ -566,7 +630,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAccept2() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAccept(r); f.completeExceptionally(new CFException()); @@ -577,7 +641,7 @@ public class CompletableFutureTest exten * thenAccept result completes exceptionally if action does */ public void testThenAccept3() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingConsumer r = new FailingConsumer(); CompletableFuture g = f.thenAccept(r); f.complete(one); @@ -589,7 +653,7 @@ public class CompletableFutureTest exten * thenAccept result completes exceptionally if source cancelled */ public void testThenAccept4() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAccept(r); assertTrue(f.cancel(true)); @@ -598,24 +662,34 @@ public class CompletableFutureTest exten /** - * thenCombine result completes normally after normal completion of sources + * thenCombine result completes normally after normal completion + * of sources */ public void testThenCombine() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombine(f2, add); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, three); + CompletableFuture f, g, h; - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.thenCombine(f2, add); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, three); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombine(g, subtract); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombine(g, subtract); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.thenCombine(g, subtract); + checkCompletedNormally(h, 2); } /** @@ -623,51 +697,83 @@ public class CompletableFutureTest exten * completion of either source */ public void testThenCombine2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombine(f2, add); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g, h; - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.thenCombine(f2, add); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombine(g, subtract); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombine(g, subtract); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.completeExceptionally(new CFException()); + h = f.thenCombine(g, subtract); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g.complete(3); + h = f.thenCombine(g, subtract); + checkCompletedWithWrappedCFException(h); } /** * thenCombine result completes exceptionally if action does */ public void testThenCombine3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingBiFunction r = new FailingBiFunction(); CompletableFuture g = f.thenCombine(f2, r); f.complete(one); checkIncomplete(g); + assertFalse(r.ran); f2.complete(two); checkCompletedWithWrappedCFException(g); + assertTrue(r.ran); } /** * thenCombine result completes exceptionally if either source cancelled */ public void testThenCombine4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombine(f2, add); - assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenCombine(f2, add); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + CompletableFuture f, g, h; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombine(g, subtract); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombine(g, subtract); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + assertTrue(g.cancel(true)); + h = f.thenCombine(g, subtract); + checkCompletedWithWrappedCancellationException(h); } /** @@ -675,25 +781,35 @@ public class CompletableFutureTest exten * completion of sources */ public void testThenAcceptBoth() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBoth(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); - assertEquals(r.value, 3); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); - r = new AddAction(); - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.thenAcceptBoth(f2, r); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); - assertEquals(r.value, 3); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); } /** @@ -701,55 +817,102 @@ public class CompletableFutureTest exten * completion of either source */ public void testThenAcceptBoth2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBoth(f2, r); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); - - r = new AddAction(); - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.thenAcceptBoth(f2, r); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.completeExceptionally(new CFException()); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g.complete(3); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + checkCompletedWithWrappedCFException(h); } /** * thenAcceptBoth result completes exceptionally if action does */ public void testThenAcceptBoth3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - FailingBiConsumer r = new FailingBiConsumer(); - CompletableFuture g = f.thenAcceptBoth(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + FailingBiConsumer r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new FailingBiConsumer()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.complete(1); + h = f.thenAcceptBoth(g, r = new FailingBiConsumer()); + checkCompletedWithWrappedCFException(h); } /** * thenAcceptBoth result completes exceptionally if either source cancelled */ public void testThenAcceptBoth4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBoth(f2, r); - assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - r = new AddAction(); - g = f.thenAcceptBoth(f2, r); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + assertTrue(g.cancel(true)); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + g.complete(3); + h = f.thenAcceptBoth(g, r = new SubtractAction()); + checkCompletedWithWrappedCancellationException(h); } /** @@ -757,24 +920,34 @@ public class CompletableFutureTest exten * completion of sources */ public void testRunAfterBoth() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBoth(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); + CompletableFuture f, g; + CompletableFuture h; + Noop r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.runAfterBoth(g, r = new Noop()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, null); assertTrue(r.ran); - r = new Noop(); - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.runAfterBoth(f2, r); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.runAfterBoth(g, r = new Noop()); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, null); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.runAfterBoth(g, r = new Noop()); + checkCompletedNormally(h, null); assertTrue(r.ran); } @@ -783,29 +956,51 @@ public class CompletableFutureTest exten * completion of either source */ public void testRunAfterBoth2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBoth(f2, r); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); - - r = new Noop(); - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.runAfterBoth(f2, r); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + Noop r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.runAfterBoth(g, r = new Noop()); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + assertFalse(r.ran); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.runAfterBoth(g, r = new Noop()); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + assertFalse(r.ran); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.completeExceptionally(new CFException()); + f.complete(3); + h = f.runAfterBoth(g, r = new Noop()); + checkCompletedWithWrappedCFException(h); + assertFalse(r.ran); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g.complete(1); + h = f.runAfterBoth(g, r = new Noop()); + checkCompletedWithWrappedCFException(h); + assertFalse(r.ran); } /** * runAfterBoth result completes exceptionally if action does */ public void testRunAfterBoth3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.runAfterBoth(f2, r); f.complete(one); @@ -818,15 +1013,15 @@ public class CompletableFutureTest exten * runAfterBoth result completes exceptionally if either source cancelled */ public void testRunAfterBoth4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBoth(f2, r); assertTrue(f.cancel(true)); f2.complete(two); checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); r = new Noop(); g = f.runAfterBoth(f2, r); f.complete(one); @@ -839,17 +1034,17 @@ public class CompletableFutureTest exten * of either source */ public void testApplyToEither() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEither(f2, inc); f.complete(one); checkCompletedNormally(g, two); f2.complete(one); checkCompletedNormally(g, two); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.applyToEither(f2, inc); checkCompletedNormally(g, two); } @@ -859,15 +1054,15 @@ public class CompletableFutureTest exten * completion of either source */ public void testApplyToEither2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEither(f2, inc); f.completeExceptionally(new CFException()); f2.complete(one); checkCompletedWithWrappedCFException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.applyToEither(f2, inc); checkCompletedWithWrappedCFException(g); @@ -877,8 +1072,8 @@ public class CompletableFutureTest exten * applyToEither result completes exceptionally if action does */ public void testApplyToEither3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingFunction r = new FailingFunction(); CompletableFuture g = f.applyToEither(f2, r); f2.complete(two); @@ -889,13 +1084,13 @@ public class CompletableFutureTest exten * applyToEither result completes exceptionally if either source cancelled */ public void testApplyToEither4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEither(f2, inc); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); checkCompletedWithWrappedCancellationException(g); } @@ -905,8 +1100,8 @@ public class CompletableFutureTest exten * of either source */ public void testAcceptEither() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEither(f2, r); f.complete(one); @@ -916,9 +1111,9 @@ public class CompletableFutureTest exten assertEquals(r.value, 2); r = new IncAction(); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.acceptEither(f2, r); checkCompletedNormally(g, null); assertEquals(r.value, 2); @@ -929,8 +1124,8 @@ public class CompletableFutureTest exten * completion of either source */ public void testAcceptEither2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEither(f2, r); f.completeExceptionally(new CFException()); @@ -938,8 +1133,8 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g); r = new IncAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.acceptEither(f2, r); checkCompletedWithWrappedCFException(g); @@ -949,8 +1144,8 @@ public class CompletableFutureTest exten * acceptEither result completes exceptionally if action does */ public void testAcceptEither3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingConsumer r = new FailingConsumer(); CompletableFuture g = f.acceptEither(f2, r); f2.complete(two); @@ -961,14 +1156,14 @@ public class CompletableFutureTest exten * acceptEither result completes exceptionally if either source cancelled */ public void testAcceptEither4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEither(f2, r); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); checkCompletedWithWrappedCancellationException(g); } @@ -979,8 +1174,8 @@ public class CompletableFutureTest exten * of either source */ public void testRunAfterEither() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEither(f2, r); f.complete(one); @@ -990,9 +1185,9 @@ public class CompletableFutureTest exten assertTrue(r.ran); r = new Noop(); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.runAfterEither(f2, r); checkCompletedNormally(g, null); assertTrue(r.ran); @@ -1003,8 +1198,8 @@ public class CompletableFutureTest exten * completion of either source */ public void testRunAfterEither2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEither(f2, r); f.completeExceptionally(new CFException()); @@ -1012,8 +1207,8 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.runAfterEither(f2, r); checkCompletedWithWrappedCFException(g); @@ -1023,8 +1218,8 @@ public class CompletableFutureTest exten * runAfterEither result completes exceptionally if action does */ public void testRunAfterEither3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.runAfterEither(f2, r); f2.complete(two); @@ -1035,14 +1230,14 @@ public class CompletableFutureTest exten * runAfterEither result completes exceptionally if either source cancelled */ public void testRunAfterEither4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEither(f2, r); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); checkCompletedWithWrappedCancellationException(g); } @@ -1051,11 +1246,20 @@ public class CompletableFutureTest exten * thenCompose result completes normally after normal completion of source */ public void testThenCompose() { - CompletableFuture f = new CompletableFuture(); - CompletableFutureInc r = new CompletableFutureInc(); - CompletableFuture g = f.thenCompose(r); + CompletableFuture f, g; + CompletableFutureInc r; + + f = new CompletableFuture<>(); + g = f.thenCompose(r = new CompletableFutureInc()); + f.complete(one); + checkCompletedNormally(g, two); + assertTrue(r.ran); + + f = new CompletableFuture<>(); f.complete(one); + g = f.thenCompose(r = new CompletableFutureInc()); checkCompletedNormally(g, two); + assertTrue(r.ran); } /** @@ -1063,21 +1267,35 @@ public class CompletableFutureTest exten * completion of source */ public void testThenCompose2() { - CompletableFuture f = new CompletableFuture(); - CompletableFutureInc r = new CompletableFutureInc(); - CompletableFuture g = f.thenCompose(r); + CompletableFuture f, g; + CompletableFutureInc r; + + f = new CompletableFuture<>(); + g = f.thenCompose(r = new CompletableFutureInc()); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); + + f = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g = f.thenCompose(r = new CompletableFutureInc()); + checkCompletedWithWrappedCFException(g); } /** * thenCompose result completes exceptionally if action does */ public void testThenCompose3() { - CompletableFuture f = new CompletableFuture(); - FailingCompletableFutureFunction r = new FailingCompletableFutureFunction(); - CompletableFuture g = f.thenCompose(r); + CompletableFuture f, g; + FailingCompletableFutureFunction r; + + f = new CompletableFuture<>(); + g = f.thenCompose(r = new FailingCompletableFutureFunction()); + f.complete(one); + checkCompletedWithWrappedCFException(g); + + f = new CompletableFuture<>(); f.complete(one); + g = f.thenCompose(r = new FailingCompletableFutureFunction()); checkCompletedWithWrappedCFException(g); } @@ -1085,11 +1303,18 @@ public class CompletableFutureTest exten * thenCompose result completes exceptionally if source cancelled */ public void testThenCompose4() { - CompletableFuture f = new CompletableFuture(); - CompletableFutureInc r = new CompletableFutureInc(); - CompletableFuture g = f.thenCompose(r); + CompletableFuture f, g; + CompletableFutureInc r; + + f = new CompletableFuture<>(); + g = f.thenCompose(r = new CompletableFutureInc()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); + + f = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + g = f.thenCompose(r = new CompletableFutureInc()); + checkCompletedWithWrappedCancellationException(g); } @@ -1099,14 +1324,14 @@ public class CompletableFutureTest exten * thenRunAsync result completes normally after normal completion of source */ public void testThenRunAsync() { - CompletableFuture f = new CompletableFuture(); + 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 = new CompletableFuture<>(); f.complete(null); r = new Noop(); g = f.thenRunAsync(r); @@ -1118,7 +1343,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenRunAsync2() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.thenRunAsync(r); f.completeExceptionally(new CFException()); @@ -1134,7 +1359,7 @@ public class CompletableFutureTest exten * thenRunAsync result completes exceptionally if action does */ public void testThenRunAsync3() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.thenRunAsync(r); f.complete(null); @@ -1145,7 +1370,7 @@ public class CompletableFutureTest exten * thenRunAsync result completes exceptionally if source cancelled */ public void testThenRunAsync4() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.thenRunAsync(r); assertTrue(f.cancel(true)); @@ -1156,7 +1381,7 @@ public class CompletableFutureTest exten * thenApplyAsync result completes normally after normal completion of source */ public void testThenApplyAsync() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApplyAsync(inc); f.complete(one); checkCompletedNormally(g, two); @@ -1167,7 +1392,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenApplyAsync2() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApplyAsync(inc); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); @@ -1177,7 +1402,7 @@ public class CompletableFutureTest exten * thenApplyAsync result completes exceptionally if action does */ public void testThenApplyAsync3() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingFunction r = new FailingFunction(); CompletableFuture g = f.thenApplyAsync(r); f.complete(null); @@ -1188,7 +1413,7 @@ public class CompletableFutureTest exten * thenApplyAsync result completes exceptionally if source cancelled */ public void testThenApplyAsync4() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApplyAsync(inc); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); @@ -1199,7 +1424,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAcceptAsync() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAcceptAsync(r); f.complete(one); @@ -1212,7 +1437,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAcceptAsync2() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAcceptAsync(r); f.completeExceptionally(new CFException()); @@ -1223,7 +1448,7 @@ public class CompletableFutureTest exten * thenAcceptAsync result completes exceptionally if action does */ public void testThenAcceptAsync3() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingConsumer r = new FailingConsumer(); CompletableFuture g = f.thenAcceptAsync(r); f.complete(null); @@ -1234,77 +1459,126 @@ public class CompletableFutureTest exten * thenAcceptAsync result completes exceptionally if source cancelled */ public void testThenAcceptAsync4() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAcceptAsync(r); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); } + /** * thenCombineAsync result completes normally after normal * completion of sources */ public void testThenCombineAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombineAsync(f2, add); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, three); + CompletableFuture f, g, h; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.thenCombineAsync(g, subtract); + checkCompletedNormally(h, 2); } /** * thenCombineAsync result completes exceptionally after exceptional - * completion of source + * completion of either source */ public void testThenCombineAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombineAsync(f2, add); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g, h; - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenCombineAsync(f2, add); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.completeExceptionally(new CFException()); + f.complete(3); + h = f.thenCombineAsync(g, subtract); + checkCompletedWithWrappedCFException(h); } /** * thenCombineAsync result completes exceptionally if action does */ public void testThenCombineAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingBiFunction r = new FailingBiFunction(); CompletableFuture g = f.thenCombineAsync(f2, r); f.complete(one); checkIncomplete(g); + assertFalse(r.ran); f2.complete(two); checkCompletedWithWrappedCFException(g); + assertTrue(r.ran); } /** * thenCombineAsync result completes exceptionally if either source cancelled */ public void testThenCombineAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombineAsync(f2, add); - assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); + CompletableFuture f, g, h; - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenCombineAsync(f2, add); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(3); + assertTrue(f.cancel(true)); + h = f.thenCombineAsync(g, subtract); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + assertTrue(g.cancel(true)); + h = f.thenCombineAsync(g, subtract); + checkCompletedWithWrappedCancellationException(h); } /** @@ -1312,15 +1586,35 @@ public class CompletableFutureTest exten * completion of sources */ public void testThenAcceptBothAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); - assertEquals(r.value, 3); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); } /** @@ -1328,56 +1622,102 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAcceptBothAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); - - r = new AddAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenAcceptBothAsync(f2, r); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.completeExceptionally(new CFException()); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedWithWrappedCFException(h); } /** * thenAcceptBothAsync result completes exceptionally if action does */ public void testThenAcceptBothAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - FailingBiConsumer r = new FailingBiConsumer(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + FailingBiConsumer r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.complete(1); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer()); + checkCompletedWithWrappedCFException(h); } /** * thenAcceptBothAsync result completes exceptionally if either source cancelled */ public void testThenAcceptBothAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r); - assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); - - r = new AddAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenAcceptBothAsync(f2, r); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + assertTrue(g.cancel(true)); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + g.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedWithWrappedCancellationException(h); } /** @@ -1385,8 +1725,8 @@ public class CompletableFutureTest exten * completion of sources */ public void testRunAfterBothAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBothAsync(f2, r); f.complete(one); @@ -1401,8 +1741,8 @@ public class CompletableFutureTest exten * completion of source */ public void testRunAfterBothAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBothAsync(f2, r); f.completeExceptionally(new CFException()); @@ -1410,8 +1750,8 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); g = f.runAfterBothAsync(f2, r); f.complete(one); f2.completeExceptionally(new CFException()); @@ -1422,8 +1762,8 @@ public class CompletableFutureTest exten * runAfterBothAsync result completes exceptionally if action does */ public void testRunAfterBothAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.runAfterBothAsync(f2, r); f.complete(one); @@ -1436,8 +1776,8 @@ public class CompletableFutureTest exten * runAfterBothAsync result completes exceptionally if either source cancelled */ public void testRunAfterBothAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBothAsync(f2, r); assertTrue(f.cancel(true)); @@ -1445,8 +1785,8 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCancellationException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); g = f.runAfterBothAsync(f2, r); f.complete(one); assertTrue(f2.cancel(true)); @@ -1458,15 +1798,15 @@ public class CompletableFutureTest exten * completion of sources */ public void testApplyToEitherAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEitherAsync(f2, inc); f.complete(one); checkCompletedNormally(g, two); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.applyToEitherAsync(f2, inc); checkCompletedNormally(g, two); } @@ -1476,14 +1816,14 @@ public class CompletableFutureTest exten * completion of source */ public void testApplyToEitherAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEitherAsync(f2, inc); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.applyToEitherAsync(f2, inc); f.complete(one); @@ -1494,8 +1834,8 @@ public class CompletableFutureTest exten * applyToEitherAsync result completes exceptionally if action does */ public void testApplyToEitherAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingFunction r = new FailingFunction(); CompletableFuture g = f.applyToEitherAsync(f2, r); f.complete(one); @@ -1506,14 +1846,14 @@ public class CompletableFutureTest exten * applyToEitherAsync result completes exceptionally if either source cancelled */ public void testApplyToEitherAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEitherAsync(f2, inc); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); g = f.applyToEitherAsync(f2, inc); checkCompletedWithWrappedCancellationException(g); @@ -1524,8 +1864,8 @@ public class CompletableFutureTest exten * completion of sources */ public void testAcceptEitherAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEitherAsync(f2, r); f.complete(one); @@ -1533,9 +1873,9 @@ public class CompletableFutureTest exten assertEquals(r.value, 2); r = new IncAction(); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.acceptEitherAsync(f2, r); checkCompletedNormally(g, null); assertEquals(r.value, 2); @@ -1546,16 +1886,16 @@ public class CompletableFutureTest exten * completion of source */ public void testAcceptEitherAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEitherAsync(f2, r); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); r = new IncAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.acceptEitherAsync(f2, r); f.complete(one); @@ -1566,8 +1906,8 @@ public class CompletableFutureTest exten * acceptEitherAsync result completes exceptionally if action does */ public void testAcceptEitherAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingConsumer r = new FailingConsumer(); CompletableFuture g = f.acceptEitherAsync(f2, r); f.complete(one); @@ -1579,16 +1919,16 @@ public class CompletableFutureTest exten * source cancelled */ public void testAcceptEitherAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEitherAsync(f2, r); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); r = new IncAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); g = f.acceptEitherAsync(f2, r); checkCompletedWithWrappedCancellationException(g); @@ -1599,8 +1939,8 @@ public class CompletableFutureTest exten * completion of sources */ public void testRunAfterEitherAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEitherAsync(f2, r); f.complete(one); @@ -1608,9 +1948,9 @@ public class CompletableFutureTest exten assertTrue(r.ran); r = new Noop(); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.runAfterEitherAsync(f2, r); checkCompletedNormally(g, null); assertTrue(r.ran); @@ -1621,16 +1961,16 @@ public class CompletableFutureTest exten * completion of source */ public void testRunAfterEitherAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEitherAsync(f2, r); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.runAfterEitherAsync(f2, r); f.complete(one); @@ -1641,8 +1981,8 @@ public class CompletableFutureTest exten * runAfterEitherAsync result completes exceptionally if action does */ public void testRunAfterEitherAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.runAfterEitherAsync(f2, r); f.complete(one); @@ -1654,16 +1994,16 @@ public class CompletableFutureTest exten * source cancelled */ public void testRunAfterEitherAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEitherAsync(f2, r); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); g = f.runAfterEitherAsync(f2, r); checkCompletedWithWrappedCancellationException(g); @@ -1674,11 +2014,18 @@ public class CompletableFutureTest exten * completion of source */ public void testThenComposeAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFutureInc r = new CompletableFutureInc(); - CompletableFuture g = f.thenComposeAsync(r); + CompletableFuture f, g; + CompletableFutureInc r; + + f = new CompletableFuture<>(); + g = f.thenComposeAsync(r = new CompletableFutureInc()); f.complete(one); checkCompletedNormally(g, two); + + f = new CompletableFuture<>(); + f.complete(one); + g = f.thenComposeAsync(r = new CompletableFutureInc()); + checkCompletedNormally(g, two); } /** @@ -1686,33 +2033,56 @@ public class CompletableFutureTest exten * exceptional completion of source */ public void testThenComposeAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFutureInc r = new CompletableFutureInc(); - CompletableFuture g = f.thenComposeAsync(r); + CompletableFuture f, g; + CompletableFutureInc r; + + f = new CompletableFuture<>(); + g = f.thenComposeAsync(r = new CompletableFutureInc()); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(g); + assertFalse(r.ran); + + f = new CompletableFuture<>(); f.completeExceptionally(new CFException()); + g = f.thenComposeAsync(r = new CompletableFutureInc()); checkCompletedWithWrappedCFException(g); + assertFalse(r.ran); } /** * thenComposeAsync result completes exceptionally if action does */ public void testThenComposeAsync3() { - CompletableFuture f = new CompletableFuture(); - FailingCompletableFutureFunction r = new FailingCompletableFutureFunction(); - CompletableFuture g = f.thenComposeAsync(r); + CompletableFuture f, g; + FailingCompletableFutureFunction r; + + f = new CompletableFuture<>(); + g = f.thenComposeAsync(r = new FailingCompletableFutureFunction()); f.complete(one); checkCompletedWithWrappedCFException(g); + + f = new CompletableFuture<>(); + f.complete(one); + g = f.thenComposeAsync(r = new FailingCompletableFutureFunction()); + checkCompletedWithWrappedCFException(g); } /** * thenComposeAsync result completes exceptionally if source cancelled */ public void testThenComposeAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFutureInc r = new CompletableFutureInc(); - CompletableFuture g = f.thenComposeAsync(r); + CompletableFuture f, g; + CompletableFutureInc r; + + f = new CompletableFuture<>(); + g = f.thenComposeAsync(r = new CompletableFutureInc()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); + + f = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + g = f.thenComposeAsync(r = new CompletableFutureInc()); + checkCompletedWithWrappedCancellationException(g); } @@ -1722,14 +2092,14 @@ public class CompletableFutureTest exten * thenRunAsync result completes normally after normal completion of source */ public void testThenRunAsyncE() { - CompletableFuture f = new CompletableFuture(); + 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 = new CompletableFuture<>(); f.complete(null); r = new Noop(); g = f.thenRunAsync(r, new ThreadExecutor()); @@ -1741,7 +2111,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenRunAsync2E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); f.completeExceptionally(new CFException()); @@ -1757,7 +2127,7 @@ public class CompletableFutureTest exten * thenRunAsync result completes exceptionally if action does */ public void testThenRunAsync3E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); f.complete(null); @@ -1768,7 +2138,7 @@ public class CompletableFutureTest exten * thenRunAsync result completes exceptionally if source cancelled */ public void testThenRunAsync4E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.thenRunAsync(r, new ThreadExecutor()); assertTrue(f.cancel(true)); @@ -1779,7 +2149,7 @@ public class CompletableFutureTest exten * thenApplyAsync result completes normally after normal completion of source */ public void testThenApplyAsyncE() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApplyAsync(inc, new ThreadExecutor()); f.complete(one); checkCompletedNormally(g, two); @@ -1790,7 +2160,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenApplyAsync2E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApplyAsync(inc, new ThreadExecutor()); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); @@ -1800,7 +2170,7 @@ public class CompletableFutureTest exten * thenApplyAsync result completes exceptionally if action does */ public void testThenApplyAsync3E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingFunction r = new FailingFunction(); CompletableFuture g = f.thenApplyAsync(r, new ThreadExecutor()); f.complete(null); @@ -1811,7 +2181,7 @@ public class CompletableFutureTest exten * thenApplyAsync result completes exceptionally if source cancelled */ public void testThenApplyAsync4E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFuture g = f.thenApplyAsync(inc, new ThreadExecutor()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); @@ -1822,7 +2192,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAcceptAsyncE() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); f.complete(one); @@ -1835,7 +2205,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAcceptAsync2E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); f.completeExceptionally(new CFException()); @@ -1846,7 +2216,7 @@ public class CompletableFutureTest exten * thenAcceptAsync result completes exceptionally if action does */ public void testThenAcceptAsync3E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingConsumer r = new FailingConsumer(); CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); f.complete(null); @@ -1857,77 +2227,140 @@ public class CompletableFutureTest exten * thenAcceptAsync result completes exceptionally if source cancelled */ public void testThenAcceptAsync4E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.thenAcceptAsync(r, new ThreadExecutor()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); } + /** * thenCombineAsync result completes normally after normal * completion of sources */ public void testThenCombineAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombineAsync(f2, add, new ThreadExecutor()); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, three); + CompletableFuture f, g, h; + ThreadExecutor e = new ThreadExecutor(); + int count = 0; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract, e); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, 2); + assertEquals(++count, e.count.get()); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract, e); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, 2); + assertEquals(++count, e.count.get()); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.thenCombineAsync(g, subtract, e); + checkCompletedNormally(h, 2); + assertEquals(++count, e.count.get()); } /** * thenCombineAsync result completes exceptionally after exceptional - * completion of source + * completion of either source */ public void testThenCombineAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombineAsync(f2, add, new ThreadExecutor()); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g, h; + ThreadExecutor e = new ThreadExecutor(); + int count = 0; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract, e); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract, e); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.completeExceptionally(new CFException()); + h = f.thenCombineAsync(g, subtract, e); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenCombineAsync(f2, add, new ThreadExecutor()); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + assertEquals(0, e.count.get()); } /** * thenCombineAsync result completes exceptionally if action does */ public void testThenCombineAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingBiFunction r = new FailingBiFunction(); CompletableFuture g = f.thenCombineAsync(f2, r, new ThreadExecutor()); f.complete(one); checkIncomplete(g); + assertFalse(r.ran); f2.complete(two); checkCompletedWithWrappedCFException(g); + assertTrue(r.ran); } /** * thenCombineAsync result completes exceptionally if either source cancelled */ public void testThenCombineAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - CompletableFuture g = f.thenCombineAsync(f2, add, new ThreadExecutor()); - assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); + CompletableFuture f, g, h; + ThreadExecutor e = new ThreadExecutor(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenCombineAsync(f2, add, new ThreadExecutor()); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract, e); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenCombineAsync(g, subtract, e); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + assertTrue(g.cancel(true)); + h = f.thenCombineAsync(g, subtract, e); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + assertTrue(g.cancel(true)); + h = f.thenCombineAsync(g, subtract, e); + checkCompletedWithWrappedCancellationException(h); + + assertEquals(0, e.count.get()); } /** @@ -1935,15 +2368,38 @@ public class CompletableFutureTest exten * completion of sources */ public void testThenAcceptBothAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); - assertEquals(r.value, 3); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + ThreadExecutor e = new ThreadExecutor(); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + g.complete(1); + checkIncomplete(h); + f.complete(3); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + g.complete(1); + f.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + assertEquals(3, e.count.get()); } /** @@ -1951,56 +2407,111 @@ public class CompletableFutureTest exten * completion of source */ public void testThenAcceptBothAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor()); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + ThreadExecutor e = new ThreadExecutor(); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + f.completeExceptionally(new CFException()); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + g.completeExceptionally(new CFException()); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.completeExceptionally(new CFException()); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.completeExceptionally(new CFException()); + g.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + checkCompletedWithWrappedCFException(h); - r = new AddAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + assertEquals(0, e.count.get()); } /** * thenAcceptBothAsync result completes exceptionally if action does */ public void testThenAcceptBothAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - FailingBiConsumer r = new FailingBiConsumer(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + CompletableFuture f, g; + CompletableFuture h; + FailingBiConsumer r; + ThreadExecutor e = new ThreadExecutor(); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.complete(1); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e); + checkCompletedWithWrappedCFException(h); + + assertEquals(2, e.count.get()); } /** * thenAcceptBothAsync result completes exceptionally if either source cancelled */ public void testThenAcceptBothAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - AddAction r = new AddAction(); - CompletableFuture g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor()); - assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + ThreadExecutor e = new ThreadExecutor(); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + assertTrue(g.cancel(true)); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + checkCompletedWithWrappedCancellationException(h); + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + assertTrue(f.cancel(true)); + g.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + checkCompletedWithWrappedCancellationException(h); - r = new AddAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenAcceptBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + assertEquals(0, e.count.get()); } /** @@ -2008,8 +2519,8 @@ public class CompletableFutureTest exten * completion of sources */ public void testRunAfterBothAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2024,8 +2535,8 @@ public class CompletableFutureTest exten * completion of source */ public void testRunAfterBothAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); f.completeExceptionally(new CFException()); @@ -2033,8 +2544,8 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCFException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); f.complete(one); f2.completeExceptionally(new CFException()); @@ -2045,8 +2556,8 @@ public class CompletableFutureTest exten * runAfterBothAsync result completes exceptionally if action does */ public void testRunAfterBothAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2059,8 +2570,8 @@ public class CompletableFutureTest exten * runAfterBothAsync result completes exceptionally if either source cancelled */ public void testRunAfterBothAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); assertTrue(f.cancel(true)); @@ -2068,8 +2579,8 @@ public class CompletableFutureTest exten checkCompletedWithWrappedCancellationException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); f.complete(one); assertTrue(f2.cancel(true)); @@ -2081,15 +2592,15 @@ public class CompletableFutureTest exten * completion of sources */ public void testApplyToEitherAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEitherAsync(f2, inc, new ThreadExecutor()); f.complete(one); checkCompletedNormally(g, two); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.applyToEitherAsync(f2, inc, new ThreadExecutor()); checkCompletedNormally(g, two); } @@ -2099,14 +2610,14 @@ public class CompletableFutureTest exten * completion of source */ public void testApplyToEitherAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEitherAsync(f2, inc, new ThreadExecutor()); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.applyToEitherAsync(f2, inc, new ThreadExecutor()); f.complete(one); @@ -2117,8 +2628,8 @@ public class CompletableFutureTest exten * applyToEitherAsync result completes exceptionally if action does */ public void testApplyToEitherAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingFunction r = new FailingFunction(); CompletableFuture g = f.applyToEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2129,14 +2640,14 @@ public class CompletableFutureTest exten * applyToEitherAsync result completes exceptionally if either source cancelled */ public void testApplyToEitherAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); CompletableFuture g = f.applyToEitherAsync(f2, inc, new ThreadExecutor()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); g = f.applyToEitherAsync(f2, inc, new ThreadExecutor()); checkCompletedWithWrappedCancellationException(g); @@ -2147,8 +2658,8 @@ public class CompletableFutureTest exten * completion of sources */ public void testAcceptEitherAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2156,9 +2667,9 @@ public class CompletableFutureTest exten assertEquals(r.value, 2); r = new IncAction(); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); checkCompletedNormally(g, null); assertEquals(r.value, 2); @@ -2169,16 +2680,16 @@ public class CompletableFutureTest exten * completion of source */ public void testAcceptEitherAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); r = new IncAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2189,8 +2700,8 @@ public class CompletableFutureTest exten * acceptEitherAsync result completes exceptionally if action does */ public void testAcceptEitherAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingConsumer r = new FailingConsumer(); CompletableFuture g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2202,16 +2713,16 @@ public class CompletableFutureTest exten * source cancelled */ public void testAcceptEitherAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); IncAction r = new IncAction(); CompletableFuture g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); r = new IncAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); g = f.acceptEitherAsync(f2, r, new ThreadExecutor()); checkCompletedWithWrappedCancellationException(g); @@ -2222,8 +2733,8 @@ public class CompletableFutureTest exten * completion of sources */ public void testRunAfterEitherAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2231,9 +2742,9 @@ public class CompletableFutureTest exten assertTrue(r.ran); r = new Noop(); - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.complete(one); - f2 = new CompletableFuture(); + f2 = new CompletableFuture<>(); g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); checkCompletedNormally(g, null); assertTrue(r.ran); @@ -2244,16 +2755,16 @@ public class CompletableFutureTest exten * completion of source */ public void testRunAfterEitherAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); f.completeExceptionally(new CFException()); checkCompletedWithWrappedCFException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); f2.completeExceptionally(new CFException()); g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2264,8 +2775,8 @@ public class CompletableFutureTest exten * runAfterEitherAsync result completes exceptionally if action does */ public void testRunAfterEitherAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); FailingNoop r = new FailingNoop(); CompletableFuture g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); f.complete(one); @@ -2277,16 +2788,16 @@ public class CompletableFutureTest exten * source cancelled */ public void testRunAfterEitherAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture f2 = new CompletableFuture<>(); Noop r = new Noop(); CompletableFuture g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); assertTrue(f.cancel(true)); checkCompletedWithWrappedCancellationException(g); r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); + f = new CompletableFuture<>(); + f2 = new CompletableFuture<>(); assertTrue(f2.cancel(true)); g = f.runAfterEitherAsync(f2, r, new ThreadExecutor()); checkCompletedWithWrappedCancellationException(g); @@ -2297,7 +2808,7 @@ public class CompletableFutureTest exten * completion of source */ public void testThenComposeAsyncE() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFutureInc r = new CompletableFutureInc(); CompletableFuture g = f.thenComposeAsync(r, new ThreadExecutor()); f.complete(one); @@ -2309,7 +2820,7 @@ public class CompletableFutureTest exten * exceptional completion of source */ public void testThenComposeAsync2E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFutureInc r = new CompletableFutureInc(); CompletableFuture g = f.thenComposeAsync(r, new ThreadExecutor()); f.completeExceptionally(new CFException()); @@ -2320,7 +2831,7 @@ public class CompletableFutureTest exten * thenComposeAsync result completes exceptionally if action does */ public void testThenComposeAsync3E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); FailingCompletableFutureFunction r = new FailingCompletableFutureFunction(); CompletableFuture g = f.thenComposeAsync(r, new ThreadExecutor()); f.complete(one); @@ -2331,7 +2842,7 @@ public class CompletableFutureTest exten * thenComposeAsync result completes exceptionally if source cancelled */ public void testThenComposeAsync4E() { - CompletableFuture f = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); CompletableFutureInc r = new CompletableFutureInc(); CompletableFuture g = f.thenComposeAsync(r, new ThreadExecutor()); assertTrue(f.cancel(true)); @@ -2354,9 +2865,9 @@ public class CompletableFutureTest exten */ public void testAllOf() throws Exception { for (int k = 1; k < 20; ++k) { - CompletableFuture[] fs = new CompletableFuture[k]; + CompletableFuture[] fs = (CompletableFuture[]) new CompletableFuture[k]; for (int i = 0; i < k; ++i) - fs[i] = new CompletableFuture(); + fs[i] = new CompletableFuture<>(); CompletableFuture f = CompletableFuture.allOf(fs); for (int i = 0; i < k; ++i) { checkIncomplete(f); @@ -2381,7 +2892,7 @@ public class CompletableFutureTest exten for (int k = 1; k < 20; ++k) { CompletableFuture[] fs = new CompletableFuture[k]; for (int i = 0; i < k; ++i) - fs[i] = new CompletableFuture(); + fs[i] = new CompletableFuture<>(); CompletableFuture f = CompletableFuture.anyOf(fs); checkIncomplete(f); for (int i = 0; i < k; ++i) { @@ -2395,16 +2906,16 @@ public class CompletableFutureTest exten * Completion methods throw NullPointerException with null arguments */ public void testNPE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture g = new CompletableFuture(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = new CompletableFuture<>(); CompletableFuture nullFuture = (CompletableFuture)null; CompletableFuture h; - Executor exec = new ThreadExecutor(); + ThreadExecutor exec = new ThreadExecutor(); Runnable[] throwingActions = { () -> { CompletableFuture.supplyAsync(null); }, () -> { CompletableFuture.supplyAsync(null, exec); }, - () -> { CompletableFuture.supplyAsync(() -> one, null); }, + () -> { CompletableFuture.supplyAsync(supplyOne, null); }, () -> { CompletableFuture.runAsync(null); }, () -> { CompletableFuture.runAsync(null, exec); }, @@ -2493,14 +3004,10 @@ public class CompletableFutureTest exten () -> { CompletableFuture.anyOf((CompletableFuture[])null); }, () -> { CompletableFuture.anyOf(f, null); }, () -> { CompletableFuture.anyOf(null, f); }, - - // TODO: Crashes javac with lambda-8-2013-03-31... - //() -> { CompletableFuture x = f.thenAccept(null); }, - //() -> { CompletableFuture x = f.thenRun(null); }, - //() -> { CompletableFuture x = f.thenApply(() -> { ; }); }, }; assertThrows(NullPointerException.class, throwingActions); + assertEquals(0, exec.count.get()); } }