--- jsr166/src/test/tck/CompletableFutureTest.java 2013/04/07 15:04:14 1.19 +++ jsr166/src/test/tck/CompletableFutureTest.java 2014/06/01 21:17:05 1.34 @@ -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,16 +66,20 @@ 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()); + assertFalse(f.isCompletedExceptionally()); assertTrue(f.toString().contains("[Completed normally]")); } 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,11 +97,36 @@ public class CompletableFutureTest exten } 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]")); + } + + void checkCompletedWithWrappedCFException(CompletableFuture f, + CFException ex) { try { - f.get(0L, SECONDS); + f.get(LONG_DELAY_MS, MILLISECONDS); shouldThrow(); } catch (ExecutionException success) { - assertTrue(success.getCause() instanceof CFException); + assertSame(ex, success.getCause()); + } catch (Throwable fail) { threadUnexpectedException(fail); } + try { + f.join(); + shouldThrow(); + } catch (CompletionException success) { + assertSame(ex, success.getCause()); + } + try { + f.getNow(null); + shouldThrow(); + } catch (CompletionException success) { + assertSame(ex, success.getCause()); + } + try { + f.get(); + shouldThrow(); + } catch (ExecutionException success) { + assertSame(ex, success.getCause()); } catch (Throwable fail) { threadUnexpectedException(fail); } assertTrue(f.isDone()); assertFalse(f.isCancelled()); @@ -103,6 +135,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,18 +152,20 @@ 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.isCompletedExceptionally()); assertTrue(f.isCancelled()); assertTrue(f.toString().contains("[Completed exceptionally]")); } 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,14 +183,9 @@ 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.isCompletedExceptionally()); assertTrue(f.toString().contains("[Completed exceptionally]")); } @@ -160,7 +194,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 +203,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 +214,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 +225,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 +235,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 +243,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 +256,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 +277,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); @@ -256,7 +290,6 @@ public class CompletableFutureTest exten assertEquals(g.getNumberOfDependents(), 0); } - /** * toString indicates current completion state */ @@ -294,10 +327,10 @@ public class CompletableFutureTest exten 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 { @@ -332,8 +365,10 @@ public class CompletableFutureTest exten 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; } @@ -369,19 +404,18 @@ public class CompletableFutureTest exten } } - /** * exceptionally action completes with function value on source - * exception; otherwise with source value + * 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); @@ -396,26 +430,26 @@ public class CompletableFutureTest exten CompletableFuture f, g; IntegerHandler r; - f = new CompletableFuture(); + f = new CompletableFuture<>(); f.completeExceptionally(new CFException()); g = f.handle(r = new IntegerHandler()); assertTrue(r.ran); checkCompletedNormally(g, three); - f = new CompletableFuture(); + 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 = new CompletableFuture<>(); f.complete(one); g = f.handle(r = new IntegerHandler()); assertTrue(r.ran); checkCompletedNormally(g, two); - f = new CompletableFuture(); + f = new CompletableFuture<>(); g = f.handle(r = new IntegerHandler()); assertFalse(r.ran); f.complete(one); @@ -493,17 +527,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); } /** @@ -511,21 +549,39 @@ 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); } @@ -533,10 +589,18 @@ public class CompletableFutureTest exten * 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); } @@ -544,7 +608,7 @@ public class CompletableFutureTest exten * 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); @@ -555,7 +619,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); @@ -565,7 +629,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); @@ -575,7 +639,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); @@ -585,7 +649,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); @@ -598,7 +662,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()); @@ -609,7 +673,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); @@ -621,14 +685,13 @@ 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)); checkCompletedWithWrappedCancellationException(g); } - /** * thenCombine result completes normally after normal completion * of sources @@ -636,24 +699,24 @@ public class CompletableFutureTest exten public void testThenCombine() { CompletableFuture f, g, h; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); g.complete(1); f.complete(3); h = f.thenCombine(g, subtract); @@ -667,31 +730,31 @@ public class CompletableFutureTest exten public void testThenCombine2() { CompletableFuture f, g, h; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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 = 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 = new CompletableFuture<>(); + g = new CompletableFuture<>(); f.completeExceptionally(new CFException()); g.complete(3); h = f.thenCombine(g, subtract); @@ -702,8 +765,8 @@ public class CompletableFutureTest exten * 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); @@ -720,24 +783,24 @@ public class CompletableFutureTest exten public void testThenCombine4() { CompletableFuture f, g, h; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); assertTrue(f.cancel(true)); assertTrue(g.cancel(true)); h = f.thenCombine(g, subtract); @@ -749,25 +812,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; - 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()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedNormally(h, null); + assertEquals(r.value, 2); + + 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); } /** @@ -775,137 +848,434 @@ 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); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); - r = new AddAction(); - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.thenAcceptBoth(f2, r); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + 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); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBoth(g, r = new SubtractAction()); 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); + 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); + } + + /** + * Permits the testing of parallel code for the 3 different + * execution modes without repeating all the testing code. + */ + enum ExecutionMode { + DEFAULT { + public CompletableFuture runAfterBoth + (CompletableFuture f, CompletableFuture g, Runnable r) { + return f.runAfterBoth(g, r); + } + }, + + DEFAULT_ASYNC { + public CompletableFuture runAfterBoth + (CompletableFuture f, CompletableFuture g, Runnable r) { + return f.runAfterBothAsync(g, r); + } + }, + + EXECUTOR { + public CompletableFuture runAfterBoth + (CompletableFuture f, CompletableFuture g, Runnable r) { + return f.runAfterBothAsync(g, r, new ThreadExecutor()); + } + }; + + public abstract CompletableFuture runAfterBoth + (CompletableFuture f, CompletableFuture g, Runnable r); } /** * runAfterBoth result completes normally after normal * 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); + public void testRunAfterBoth_normalCompletion1() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) + for (Integer v2 : new Integer[] { 2, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + f.complete(v1); + checkIncomplete(h); + assertFalse(r.ran); + g.complete(v2); + + checkCompletedNormally(h, null); assertTrue(r.ran); + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v2); + } + } - 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); + public void testRunAfterBoth_normalCompletion2() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) + for (Integer v2 : new Integer[] { 2, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + g.complete(v2); + checkIncomplete(h); + assertFalse(r.ran); + f.complete(v1); + + checkCompletedNormally(h, null); assertTrue(r.ran); + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v2); + } + } + + public void testRunAfterBoth_normalCompletion3() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) + for (Integer v2 : new Integer[] { 2, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + + g.complete(v2); + f.complete(v1); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + checkCompletedNormally(h, null); + assertTrue(r.ran); + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v2); + } + } + + public void testRunAfterBoth_normalCompletion4() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) + for (Integer v2 : new Integer[] { 2, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + + f.complete(v1); + g.complete(v2); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + checkCompletedNormally(h, null); + assertTrue(r.ran); + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v2); + } } /** * runAfterBoth result completes exceptionally after exceptional * 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); + public void testRunAfterBoth_exceptionalCompletion1() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + final CFException ex = new CFException(); - r = new Noop(); - f = new CompletableFuture(); - f.complete(one); - f2 = new CompletableFuture(); - g = f.runAfterBoth(f2, r); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + f.completeExceptionally(ex); + checkIncomplete(h); + g.complete(v1); + + checkCompletedWithWrappedCFException(h, ex); + checkCompletedWithWrappedCFException(f, ex); + assertFalse(r.ran); + checkCompletedNormally(g, v1); + } + } + + public void testRunAfterBoth_exceptionalCompletion2() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + final CFException ex = new CFException(); + + g.completeExceptionally(ex); + checkIncomplete(h); + f.complete(v1); + + checkCompletedWithWrappedCFException(h, ex); + checkCompletedWithWrappedCFException(g, ex); + assertFalse(r.ran); + checkCompletedNormally(f, v1); + } + } + + public void testRunAfterBoth_exceptionalCompletion3() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CFException ex = new CFException(); + + g.completeExceptionally(ex); + f.complete(v1); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + checkCompletedWithWrappedCFException(h, ex); + checkCompletedWithWrappedCFException(g, ex); + assertFalse(r.ran); + checkCompletedNormally(f, v1); + } + } + + public void testRunAfterBoth_exceptionalCompletion4() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CFException ex = new CFException(); + + f.completeExceptionally(ex); + g.complete(v1); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + checkCompletedWithWrappedCFException(h, ex); + checkCompletedWithWrappedCFException(f, ex); + assertFalse(r.ran); + checkCompletedNormally(g, v1); + } } /** * runAfterBoth result completes exceptionally if action does */ - public void testRunAfterBoth3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - FailingNoop r = new FailingNoop(); - CompletableFuture g = f.runAfterBoth(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + public void testRunAfterBoth_actionFailed1() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) + for (Integer v2 : new Integer[] { 2, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final FailingNoop r = new FailingNoop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + f.complete(v1); + checkIncomplete(h); + g.complete(v2); + + checkCompletedWithWrappedCFException(h); + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v2); + } + } + + public void testRunAfterBoth_actionFailed2() { + for (ExecutionMode m : ExecutionMode.values()) + for (Integer v1 : new Integer[] { 1, null }) + for (Integer v2 : new Integer[] { 2, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final FailingNoop r = new FailingNoop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + g.complete(v2); + checkIncomplete(h); + f.complete(v1); + + checkCompletedWithWrappedCFException(h); + checkCompletedNormally(f, v1); + checkCompletedNormally(g, v2); + } } /** * runAfterBoth result completes exceptionally if either source cancelled */ - public void testRunAfterBoth4() { - 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(); - r = new Noop(); - g = f.runAfterBoth(f2, r); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + public void testRunAfterBoth_sourceCancelled1() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + assertTrue(f.cancel(mayInterruptIfRunning)); + checkIncomplete(h); + g.complete(v1); + + checkCompletedWithWrappedCancellationException(h); + checkCancelled(f); + assertFalse(r.ran); + checkCompletedNormally(g, v1); + } + } + + public void testRunAfterBoth_sourceCancelled2() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + assertTrue(g.cancel(mayInterruptIfRunning)); + checkIncomplete(h); + f.complete(v1); + + checkCompletedWithWrappedCancellationException(h); + checkCancelled(g); + assertFalse(r.ran); + checkCompletedNormally(f, v1); + } + } + + public void testRunAfterBoth_sourceCancelled3() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + + assertTrue(g.cancel(mayInterruptIfRunning)); + f.complete(v1); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + checkCompletedWithWrappedCancellationException(h); + checkCancelled(g); + assertFalse(r.ran); + checkCompletedNormally(f, v1); + } + } + + public void testRunAfterBoth_sourceCancelled4() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) { + + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final Noop r = new Noop(); + + assertTrue(f.cancel(mayInterruptIfRunning)); + g.complete(v1); + final CompletableFuture h = m.runAfterBoth(f, g, r); + + checkCompletedWithWrappedCancellationException(h); + checkCancelled(f); + assertFalse(r.ran); + checkCompletedNormally(g, v1); + } } /** @@ -913,17 +1283,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); } @@ -933,15 +1303,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); @@ -951,8 +1321,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); @@ -963,13 +1333,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); } @@ -979,8 +1349,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); @@ -990,9 +1360,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); @@ -1003,8 +1373,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()); @@ -1012,8 +1382,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); @@ -1023,8 +1393,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); @@ -1035,26 +1405,25 @@ 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); } - /** * runAfterEither result completes normally after normal completion * 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); @@ -1064,9 +1433,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); @@ -1077,8 +1446,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()); @@ -1086,8 +1455,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); @@ -1097,8 +1466,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); @@ -1109,14 +1478,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); } @@ -1125,11 +1494,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); } /** @@ -1137,10 +1515,17 @@ 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); } @@ -1148,10 +1533,17 @@ public class CompletableFutureTest exten * 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); } @@ -1159,13 +1551,19 @@ 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); + } // asyncs @@ -1173,14 +1571,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); @@ -1192,15 +1590,14 @@ 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()); try { g.join(); shouldThrow(); - } catch (Exception ok) { - } + } catch (CompletionException success) {} checkCompletedWithWrappedCFException(g); } @@ -1208,7 +1605,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); @@ -1219,7 +1616,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)); @@ -1230,7 +1627,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); @@ -1241,7 +1638,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); @@ -1251,7 +1648,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); @@ -1262,7 +1659,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); @@ -1273,7 +1670,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); @@ -1286,7 +1683,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()); @@ -1297,7 +1694,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); @@ -1308,7 +1705,7 @@ 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)); @@ -1322,24 +1719,24 @@ public class CompletableFutureTest exten public void testThenCombineAsync() { CompletableFuture f, g, h; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); g.complete(1); f.complete(3); h = f.thenCombineAsync(g, subtract); @@ -1353,24 +1750,24 @@ public class CompletableFutureTest exten public void testThenCombineAsync2() { CompletableFuture f, g, h; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); g.completeExceptionally(new CFException()); f.complete(3); h = f.thenCombineAsync(g, subtract); @@ -1381,8 +1778,8 @@ public class CompletableFutureTest exten * 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); @@ -1399,31 +1796,31 @@ public class CompletableFutureTest exten public void testThenCombineAsync4() { CompletableFuture f, g, h; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + 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 = new CompletableFuture<>(); + g = new CompletableFuture<>(); f.complete(3); assertTrue(g.cancel(true)); h = f.thenCombineAsync(g, subtract); @@ -1435,15 +1832,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); } /** @@ -1451,129 +1868,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); + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); - r = new AddAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenAcceptBothAsync(f2, r); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); + 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; - /** - * 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); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer()); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(h); - r = new AddAction(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.thenAcceptBothAsync(f2, r); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.complete(1); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer()); + checkCompletedWithWrappedCFException(h); } /** - * runAfterBothAsync result completes normally after normal - * completion of sources + * thenAcceptBothAsync result completes exceptionally if either source cancelled */ - public void testRunAfterBothAsync() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBothAsync(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); - assertTrue(r.ran); - } + public void testThenAcceptBothAsync4() { + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; - /** - * runAfterBothAsync result completes exceptionally after exceptional - * completion of source - */ - public void testRunAfterBothAsync2() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBothAsync(f2, r); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + assertTrue(f.cancel(true)); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCancellationException(h); - r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.runAfterBothAsync(f2, r); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + assertTrue(g.cancel(true)); + checkIncomplete(h); + f.complete(3); + checkCompletedWithWrappedCancellationException(h); - /** - * runAfterBothAsync result completes exceptionally if action does - */ - public void testRunAfterBothAsync3() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - FailingNoop r = new FailingNoop(); - CompletableFuture g = f.runAfterBothAsync(f2, r); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedWithWrappedCFException(g); - } + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + assertTrue(g.cancel(true)); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedWithWrappedCancellationException(h); - /** - * runAfterBothAsync result completes exceptionally if either source cancelled - */ - public void testRunAfterBothAsync4() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBothAsync(f2, r); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); assertTrue(f.cancel(true)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); - - r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.runAfterBothAsync(f2, r); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + g.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction()); + checkCompletedWithWrappedCancellationException(h); } /** @@ -1581,15 +1971,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); } @@ -1599,14 +1989,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); @@ -1617,8 +2007,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); @@ -1629,14 +2019,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); @@ -1647,8 +2037,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); @@ -1656,9 +2046,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); @@ -1669,16 +2059,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); @@ -1689,8 +2079,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); @@ -1702,16 +2092,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); @@ -1722,8 +2112,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); @@ -1731,9 +2121,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); @@ -1744,16 +2134,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); @@ -1764,8 +2154,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); @@ -1777,16 +2167,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); @@ -1797,11 +2187,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); } /** @@ -1809,21 +2206,37 @@ 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); } @@ -1831,13 +2244,19 @@ public class CompletableFutureTest exten * 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); + } // async with explicit executors @@ -1845,14 +2264,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()); @@ -1864,15 +2283,14 @@ 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()); try { g.join(); shouldThrow(); - } catch (Exception ok) { - } + } catch (CompletionException success) {} checkCompletedWithWrappedCFException(g); } @@ -1880,7 +2298,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); @@ -1891,7 +2309,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)); @@ -1902,7 +2320,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); @@ -1913,7 +2331,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); @@ -1923,7 +2341,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); @@ -1934,7 +2352,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); @@ -1945,7 +2363,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); @@ -1958,7 +2376,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()); @@ -1969,7 +2387,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); @@ -1980,7 +2398,7 @@ 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)); @@ -1996,8 +2414,8 @@ public class CompletableFutureTest exten ThreadExecutor e = new ThreadExecutor(); int count = 0; - f = new CompletableFuture(); - g = new CompletableFuture(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); h = f.thenCombineAsync(g, subtract, e); f.complete(3); checkIncomplete(h); @@ -2005,8 +2423,8 @@ public class CompletableFutureTest exten checkCompletedNormally(h, 2); assertEquals(++count, e.count.get()); - f = new CompletableFuture(); - g = new CompletableFuture(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); h = f.thenCombineAsync(g, subtract, e); g.complete(1); checkIncomplete(h); @@ -2014,8 +2432,8 @@ public class CompletableFutureTest exten checkCompletedNormally(h, 2); assertEquals(++count, e.count.get()); - f = new CompletableFuture(); - g = new CompletableFuture(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); g.complete(1); f.complete(3); h = f.thenCombineAsync(g, subtract, e); @@ -2032,24 +2450,24 @@ public class CompletableFutureTest exten ThreadExecutor e = new ThreadExecutor(); int count = 0; - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); g.completeExceptionally(new CFException()); h = f.thenCombineAsync(g, subtract, e); checkIncomplete(h); @@ -2063,8 +2481,8 @@ public class CompletableFutureTest exten * 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); @@ -2082,32 +2500,32 @@ public class CompletableFutureTest exten CompletableFuture f, g, h; ThreadExecutor e = new ThreadExecutor(); - f = new CompletableFuture(); - g = new CompletableFuture(); + 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(); + 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(); + 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(); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); assertTrue(f.cancel(true)); assertTrue(g.cancel(true)); h = f.thenCombineAsync(g, subtract, e); @@ -2121,15 +2539,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()); } /** @@ -2137,129 +2578,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()); + 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()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + checkIncomplete(h); + g.complete(1); + 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); + 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); + + 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(); - /** - * 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); + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e); + f.complete(3); + checkIncomplete(h); + g.complete(1); + checkCompletedWithWrappedCFException(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); - } + f = new CompletableFuture<>(); + g = new CompletableFuture<>(); + f.complete(3); + g.complete(1); + h = f.thenAcceptBothAsync(g, r = new FailingBiConsumer(), e); + checkCompletedWithWrappedCFException(h); - /** - * runAfterBothAsync result completes normally after normal - * completion of sources - */ - public void testRunAfterBothAsyncE() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedNormally(g, null); - assertTrue(r.ran); + assertEquals(2, e.count.get()); } /** - * runAfterBothAsync result completes exceptionally after exceptional - * completion of source + * thenAcceptBothAsync result completes exceptionally if either source cancelled */ - public void testRunAfterBothAsync2E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); - f.completeExceptionally(new CFException()); - f2.complete(two); - checkCompletedWithWrappedCFException(g); + public void testThenAcceptBothAsync4E() { + CompletableFuture f, g; + CompletableFuture h; + SubtractAction r; + ThreadExecutor e = new ThreadExecutor(); - r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - f2.completeExceptionally(new CFException()); - checkCompletedWithWrappedCFException(g); - } + 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); - /** - * runAfterBothAsync result completes exceptionally if action does - */ - public void testRunAfterBothAsync3E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - FailingNoop r = new FailingNoop(); - CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - checkIncomplete(g); - f2.complete(two); - checkCompletedWithWrappedCFException(g); - } + 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); - /** - * runAfterBothAsync result completes exceptionally if either source cancelled - */ - public void testRunAfterBothAsync4E() { - CompletableFuture f = new CompletableFuture(); - CompletableFuture f2 = new CompletableFuture(); - Noop r = new Noop(); - CompletableFuture g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); + 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)); - f2.complete(two); - checkCompletedWithWrappedCancellationException(g); + g.complete(3); + h = f.thenAcceptBothAsync(g, r = new SubtractAction(), e); + checkCompletedWithWrappedCancellationException(h); - r = new Noop(); - f = new CompletableFuture(); - f2 = new CompletableFuture(); - g = f.runAfterBothAsync(f2, r, new ThreadExecutor()); - f.complete(one); - assertTrue(f2.cancel(true)); - checkCompletedWithWrappedCancellationException(g); + assertEquals(0, e.count.get()); } /** @@ -2267,15 +2690,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); } @@ -2285,14 +2708,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); @@ -2303,8 +2726,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); @@ -2315,14 +2738,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); @@ -2333,8 +2756,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); @@ -2342,9 +2765,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); @@ -2355,16 +2778,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); @@ -2375,8 +2798,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); @@ -2388,16 +2811,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); @@ -2408,8 +2831,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); @@ -2417,9 +2840,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); @@ -2430,16 +2853,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); @@ -2450,8 +2873,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); @@ -2463,16 +2886,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); @@ -2483,7 +2906,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); @@ -2495,7 +2918,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()); @@ -2506,7 +2929,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); @@ -2517,7 +2940,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)); @@ -2531,24 +2954,27 @@ public class CompletableFutureTest exten * with the value null */ public void testAllOf_empty() throws Exception { - CompletableFuture f = CompletableFuture.allOf(); + CompletableFuture f = CompletableFuture.allOf(); checkCompletedNormally(f, null); } /** - * allOf returns a future completed when all components complete + * allOf returns a future completed normally with the value null + * when all components complete normally */ - public void testAllOf() throws Exception { + public void testAllOf_normal() 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); + checkIncomplete(CompletableFuture.allOf(fs)); fs[i].complete(one); } checkCompletedNormally(f, null); + checkCompletedNormally(CompletableFuture.allOf(fs), null); } } @@ -2556,23 +2982,43 @@ public class CompletableFutureTest exten * anyOf(no component futures) returns an incomplete future */ public void testAnyOf_empty() throws Exception { - CompletableFuture f = CompletableFuture.anyOf(); + CompletableFuture f = CompletableFuture.anyOf(); checkIncomplete(f); } /** - * anyOf returns a future completed when any components complete + * anyOf returns a future completed normally with a value when + * a component future does */ - public void testAnyOf() throws Exception { - for (int k = 1; k < 20; ++k) { + public void testAnyOf_normal() throws Exception { + for (int k = 0; k < 10; ++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) { fs[i].complete(one); checkCompletedNormally(f, one); + checkCompletedNormally(CompletableFuture.anyOf(fs), one); + } + } + } + + /** + * anyOf result completes exceptionally when any component does. + */ + public void testAnyOf_exceptional() throws Exception { + for (int k = 0; k < 10; ++k) { + CompletableFuture[] fs = new CompletableFuture[k]; + for (int i = 0; i < k; ++i) + fs[i] = new CompletableFuture<>(); + CompletableFuture f = CompletableFuture.anyOf(fs); + checkIncomplete(f); + for (int i = 0; i < k; ++i) { + fs[i].completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedWithWrappedCFException(CompletableFuture.anyOf(fs)); } } } @@ -2581,108 +3027,339 @@ 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; ThreadExecutor exec = new ThreadExecutor(); Runnable[] throwingActions = { - () -> { CompletableFuture.supplyAsync(null); }, - () -> { CompletableFuture.supplyAsync(null, exec); }, - () -> { CompletableFuture.supplyAsync(supplyOne, null); }, - - () -> { CompletableFuture.runAsync(null); }, - () -> { CompletableFuture.runAsync(null, exec); }, - () -> { CompletableFuture.runAsync(() -> {}, null); }, - - () -> { f.completeExceptionally(null); }, - - () -> { f.thenApply(null); }, - () -> { f.thenApplyAsync(null); }, - () -> { f.thenApplyAsync((x) -> x, null); }, - () -> { f.thenApplyAsync(null, exec); }, - - () -> { f.thenAccept(null); }, - () -> { f.thenAcceptAsync(null); }, - () -> { f.thenAcceptAsync((x) -> { ; }, null); }, - () -> { f.thenAcceptAsync(null, exec); }, - - () -> { f.thenRun(null); }, - () -> { f.thenRunAsync(null); }, - () -> { f.thenRunAsync(() -> { ; }, null); }, - () -> { f.thenRunAsync(null, exec); }, - - () -> { f.thenCombine(g, null); }, - () -> { f.thenCombineAsync(g, null); }, - () -> { f.thenCombineAsync(g, null, exec); }, - () -> { f.thenCombine(nullFuture, (x, y) -> x); }, - () -> { f.thenCombineAsync(nullFuture, (x, y) -> x); }, - () -> { f.thenCombineAsync(nullFuture, (x, y) -> x, exec); }, - () -> { f.thenCombineAsync(g, (x, y) -> x, null); }, - - () -> { f.thenAcceptBoth(g, null); }, - () -> { f.thenAcceptBothAsync(g, null); }, - () -> { f.thenAcceptBothAsync(g, null, exec); }, - () -> { f.thenAcceptBoth(nullFuture, (x, y) -> {}); }, - () -> { f.thenAcceptBothAsync(nullFuture, (x, y) -> {}); }, - () -> { f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec); }, - () -> { f.thenAcceptBothAsync(g, (x, y) -> {}, null); }, - - () -> { f.runAfterBoth(g, null); }, - () -> { f.runAfterBothAsync(g, null); }, - () -> { f.runAfterBothAsync(g, null, exec); }, - () -> { f.runAfterBoth(nullFuture, () -> {}); }, - () -> { f.runAfterBothAsync(nullFuture, () -> {}); }, - () -> { f.runAfterBothAsync(nullFuture, () -> {}, exec); }, - () -> { f.runAfterBothAsync(g, () -> {}, null); }, - - () -> { f.applyToEither(g, null); }, - () -> { f.applyToEitherAsync(g, null); }, - () -> { f.applyToEitherAsync(g, null, exec); }, - () -> { f.applyToEither(nullFuture, (x) -> x); }, - () -> { f.applyToEitherAsync(nullFuture, (x) -> x); }, - () -> { f.applyToEitherAsync(nullFuture, (x) -> x, exec); }, - () -> { f.applyToEitherAsync(g, (x) -> x, null); }, - - () -> { f.acceptEither(g, null); }, - () -> { f.acceptEitherAsync(g, null); }, - () -> { f.acceptEitherAsync(g, null, exec); }, - () -> { f.acceptEither(nullFuture, (x) -> {}); }, - () -> { f.acceptEitherAsync(nullFuture, (x) -> {}); }, - () -> { f.acceptEitherAsync(nullFuture, (x) -> {}, exec); }, - () -> { f.acceptEitherAsync(g, (x) -> {}, null); }, - - () -> { f.runAfterEither(g, null); }, - () -> { f.runAfterEitherAsync(g, null); }, - () -> { f.runAfterEitherAsync(g, null, exec); }, - () -> { f.runAfterEither(nullFuture, () -> {}); }, - () -> { f.runAfterEitherAsync(nullFuture, () -> {}); }, - () -> { f.runAfterEitherAsync(nullFuture, () -> {}, exec); }, - () -> { f.runAfterEitherAsync(g, () -> {}, null); }, - - () -> { f.thenCompose(null); }, - () -> { f.thenComposeAsync(null); }, - () -> { f.thenComposeAsync(new CompletableFutureInc(), null); }, - () -> { f.thenComposeAsync(null, exec); }, - - () -> { f.exceptionally(null); }, - - () -> { f.handle(null); }, - - () -> { CompletableFuture.allOf((CompletableFuture)null); }, - () -> { CompletableFuture.allOf((CompletableFuture[])null); }, - () -> { CompletableFuture.allOf(f, null); }, - () -> { CompletableFuture.allOf(null, f); }, - - () -> { CompletableFuture.anyOf((CompletableFuture)null); }, - () -> { CompletableFuture.anyOf((CompletableFuture[])null); }, - () -> { CompletableFuture.anyOf(f, null); }, - () -> { CompletableFuture.anyOf(null, f); }, + () -> CompletableFuture.supplyAsync(null), + () -> CompletableFuture.supplyAsync(null, exec), + () -> CompletableFuture.supplyAsync(supplyOne, null), + + () -> CompletableFuture.runAsync(null), + () -> CompletableFuture.runAsync(null, exec), + () -> CompletableFuture.runAsync(() -> {}, null), + + () -> f.completeExceptionally(null), + + () -> f.thenApply(null), + () -> f.thenApplyAsync(null), + () -> f.thenApplyAsync((x) -> x, null), + () -> f.thenApplyAsync(null, exec), + + () -> f.thenAccept(null), + () -> f.thenAcceptAsync(null), + () -> f.thenAcceptAsync((x) -> {} , null), + () -> f.thenAcceptAsync(null, exec), + + () -> f.thenRun(null), + () -> f.thenRunAsync(null), + () -> f.thenRunAsync(() -> {} , null), + () -> f.thenRunAsync(null, exec), + + () -> f.thenCombine(g, null), + () -> f.thenCombineAsync(g, null), + () -> f.thenCombineAsync(g, null, exec), + () -> f.thenCombine(nullFuture, (x, y) -> x), + () -> f.thenCombineAsync(nullFuture, (x, y) -> x), + () -> f.thenCombineAsync(nullFuture, (x, y) -> x, exec), + () -> f.thenCombineAsync(g, (x, y) -> x, null), + + () -> f.thenAcceptBoth(g, null), + () -> f.thenAcceptBothAsync(g, null), + () -> f.thenAcceptBothAsync(g, null, exec), + () -> f.thenAcceptBoth(nullFuture, (x, y) -> {}), + () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}), + () -> f.thenAcceptBothAsync(nullFuture, (x, y) -> {}, exec), + () -> f.thenAcceptBothAsync(g, (x, y) -> {}, null), + + () -> f.runAfterBoth(g, null), + () -> f.runAfterBothAsync(g, null), + () -> f.runAfterBothAsync(g, null, exec), + () -> f.runAfterBoth(nullFuture, () -> {}), + () -> f.runAfterBothAsync(nullFuture, () -> {}), + () -> f.runAfterBothAsync(nullFuture, () -> {}, exec), + () -> f.runAfterBothAsync(g, () -> {}, null), + + () -> f.applyToEither(g, null), + () -> f.applyToEitherAsync(g, null), + () -> f.applyToEitherAsync(g, null, exec), + () -> f.applyToEither(nullFuture, (x) -> x), + () -> f.applyToEitherAsync(nullFuture, (x) -> x), + () -> f.applyToEitherAsync(nullFuture, (x) -> x, exec), + () -> f.applyToEitherAsync(g, (x) -> x, null), + + () -> f.acceptEither(g, null), + () -> f.acceptEitherAsync(g, null), + () -> f.acceptEitherAsync(g, null, exec), + () -> f.acceptEither(nullFuture, (x) -> {}), + () -> f.acceptEitherAsync(nullFuture, (x) -> {}), + () -> f.acceptEitherAsync(nullFuture, (x) -> {}, exec), + () -> f.acceptEitherAsync(g, (x) -> {}, null), + + () -> f.runAfterEither(g, null), + () -> f.runAfterEitherAsync(g, null), + () -> f.runAfterEitherAsync(g, null, exec), + () -> f.runAfterEither(nullFuture, () -> {}), + () -> f.runAfterEitherAsync(nullFuture, () -> {}), + () -> f.runAfterEitherAsync(nullFuture, () -> {}, exec), + () -> f.runAfterEitherAsync(g, () -> {}, null), + + () -> f.thenCompose(null), + () -> f.thenComposeAsync(null), + () -> f.thenComposeAsync(new CompletableFutureInc(), null), + () -> f.thenComposeAsync(null, exec), + + () -> f.exceptionally(null), + + () -> f.handle(null), + + () -> CompletableFuture.allOf((CompletableFuture)null), + () -> CompletableFuture.allOf((CompletableFuture[])null), + () -> CompletableFuture.allOf(f, null), + () -> CompletableFuture.allOf(null, f), + + () -> CompletableFuture.anyOf((CompletableFuture)null), + () -> CompletableFuture.anyOf((CompletableFuture[])null), + () -> CompletableFuture.anyOf(f, null), + () -> CompletableFuture.anyOf(null, f), + + () -> f.obtrudeException(null), }; assertThrows(NullPointerException.class, throwingActions); assertEquals(0, exec.count.get()); } + /** + * toCompletableFuture returns this CompletableFuture. + */ + public void testToCompletableFuture() { + CompletableFuture f = new CompletableFuture<>(); + assertSame(f, f.toCompletableFuture()); + } + + /** + * whenComplete action executes on normal completion, propagating + * source result. + */ + public void testWhenComplete1() { + final AtomicInteger a = new AtomicInteger(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenComplete((Integer x, Throwable t) -> a.getAndIncrement()); + f.complete(three); + checkCompletedNormally(f, three); + checkCompletedNormally(g, three); + assertEquals(a.get(), 1); + } + + /** + * whenComplete action executes on exceptional completion, propagating + * source result. + */ + public void testWhenComplete2() { + final AtomicInteger a = new AtomicInteger(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenComplete((Integer x, Throwable t) -> a.getAndIncrement()); + f.completeExceptionally(new CFException()); + assertTrue(f.isCompletedExceptionally()); + assertTrue(g.isCompletedExceptionally()); + assertEquals(a.get(), 1); + } + + /** + * If a whenComplete action throws an exception when triggered by + * a normal completion, it completes exceptionally + */ + public void testWhenComplete3() { + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenComplete((Integer x, Throwable t) -> + { throw new CFException(); } ); + f.complete(three); + checkCompletedNormally(f, three); + assertTrue(g.isCompletedExceptionally()); + checkCompletedWithWrappedCFException(g); + } + + /** + * whenCompleteAsync action executes on normal completion, propagating + * source result. + */ + public void testWhenCompleteAsync1() { + final AtomicInteger a = new AtomicInteger(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement()); + f.complete(three); + checkCompletedNormally(f, three); + checkCompletedNormally(g, three); + assertEquals(a.get(), 1); + } + + /** + * whenCompleteAsync action executes on exceptional completion, propagating + * source result. + */ + public void testWhenCompleteAsync2() { + final AtomicInteger a = new AtomicInteger(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement()); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedWithWrappedCFException(g); + } + + /** + * If a whenCompleteAsync action throws an exception when + * triggered by a normal completion, it completes exceptionally + */ + public void testWhenCompleteAsync3() { + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenCompleteAsync((Integer x, Throwable t) -> + { throw new CFException(); } ); + f.complete(three); + checkCompletedNormally(f, three); + checkCompletedWithWrappedCFException(g); + } + + /** + * whenCompleteAsync action executes on normal completion, propagating + * source result. + */ + public void testWhenCompleteAsync1e() { + final AtomicInteger a = new AtomicInteger(); + ThreadExecutor exec = new ThreadExecutor(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement(), + exec); + f.complete(three); + checkCompletedNormally(f, three); + checkCompletedNormally(g, three); + assertEquals(a.get(), 1); + } + + /** + * whenCompleteAsync action executes on exceptional completion, propagating + * source result. + */ + public void testWhenCompleteAsync2e() { + final AtomicInteger a = new AtomicInteger(); + ThreadExecutor exec = new ThreadExecutor(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenCompleteAsync((Integer x, Throwable t) -> a.getAndIncrement(), + exec); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedWithWrappedCFException(g); + } + + /** + * If a whenCompleteAsync action throws an exception when triggered + * by a normal completion, it completes exceptionally + */ + public void testWhenCompleteAsync3e() { + ThreadExecutor exec = new ThreadExecutor(); + CompletableFuture f = new CompletableFuture<>(); + CompletableFuture g = + f.whenCompleteAsync((Integer x, Throwable t) -> + { throw new CFException(); }, + exec); + f.complete(three); + checkCompletedNormally(f, three); + checkCompletedWithWrappedCFException(g); + } + + /** + * handleAsync action completes normally with function value on + * either normal or exceptional completion of source + */ + public void testHandleAsync() { + CompletableFuture f, g; + IntegerHandler r; + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler()); + assertFalse(r.ran); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedNormally(g, three); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler()); + assertFalse(r.ran); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedNormally(g, three); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler()); + assertFalse(r.ran); + f.complete(one); + checkCompletedNormally(f, one); + checkCompletedNormally(g, two); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler()); + assertFalse(r.ran); + f.complete(one); + checkCompletedNormally(f, one); + checkCompletedNormally(g, two); + assertTrue(r.ran); + } + + /** + * handleAsync action with Executor completes normally with + * function value on either normal or exceptional completion of + * source + */ + public void testHandleAsync2() { + CompletableFuture f, g; + ThreadExecutor exec = new ThreadExecutor(); + IntegerHandler r; + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler(), exec); + assertFalse(r.ran); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedNormally(g, three); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler(), exec); + assertFalse(r.ran); + f.completeExceptionally(new CFException()); + checkCompletedWithWrappedCFException(f); + checkCompletedNormally(g, three); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler(), exec); + assertFalse(r.ran); + f.complete(one); + checkCompletedNormally(f, one); + checkCompletedNormally(g, two); + assertTrue(r.ran); + + f = new CompletableFuture<>(); + g = f.handleAsync(r = new IntegerHandler(), exec); + assertFalse(r.ran); + f.complete(one); + checkCompletedNormally(f, one); + checkCompletedNormally(g, two); + assertTrue(r.ran); + } + }