--- jsr166/src/test/tck/CompletableFutureTest.java 2014/06/06 17:41:02 1.65 +++ jsr166/src/test/tck/CompletableFutureTest.java 2014/06/06 20:01:16 1.71 @@ -1171,7 +1171,7 @@ public class CompletableFutureTest exten checkCompletedNormally(g, inc(v1)); checkCompletedNormally(f, v1); - r.assertInvoked(); + r.assertValue(inc(v1)); }} /** @@ -1356,7 +1356,7 @@ public class CompletableFutureTest exten checkCompletedNormally(h, subtract(v1, v2)); checkCompletedNormally(f, v1); checkCompletedNormally(g, v2); - r.assertInvoked(); + r.assertValue(subtract(v1, v2)); }} /** @@ -1765,14 +1765,14 @@ public class CompletableFutureTest exten final CompletableFuture h5 = m.applyToEither(g, f, rs[5]); try { assertEquals(inc(v1), h4.join()); - rs[4].assertInvoked(); + rs[4].assertValue(inc(v1)); } catch (CompletionException ok) { checkCompletedWithWrappedCFException(h4, ex); rs[4].assertNotInvoked(); } try { assertEquals(inc(v1), h5.join()); - rs[5].assertInvoked(); + rs[5].assertValue(inc(v1)); } catch (CompletionException ok) { checkCompletedWithWrappedCFException(h5, ex); rs[5].assertNotInvoked(); @@ -1788,6 +1788,63 @@ public class CompletableFutureTest exten for (int i = 0; i < 4; i++) rs[i].assertNotInvoked(); }} + public void testApplyToEither_exceptionalCompletion2() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean fFirst : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final CFException ex = new CFException(); + final IncFunction[] rs = new IncFunction[6]; + for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m); + + final CompletableFuture h0 = m.applyToEither(f, g, rs[0]); + final CompletableFuture h1 = m.applyToEither(g, f, rs[1]); + if (fFirst) { + f.complete(v1); + g.completeExceptionally(ex); + } else { + g.completeExceptionally(ex); + f.complete(v1); + } + final CompletableFuture h2 = m.applyToEither(f, g, rs[2]); + final CompletableFuture h3 = m.applyToEither(g, f, rs[3]); + + // unspecified behavior - both source completions available + try { + assertEquals(inc(v1), h0.join()); + rs[0].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h0, ex); + rs[0].assertNotInvoked(); + } + try { + assertEquals(inc(v1), h1.join()); + rs[1].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h1, ex); + rs[1].assertNotInvoked(); + } + try { + assertEquals(inc(v1), h2.join()); + rs[2].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h2, ex); + rs[2].assertNotInvoked(); + } + try { + assertEquals(inc(v1), h3.join()); + rs[3].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h3, ex); + rs[3].assertNotInvoked(); + } + + checkCompletedNormally(f, v1); + checkCompletedWithWrappedCFException(g, ex); + }} + /** * applyToEither result completes exceptionally if either source cancelled */ @@ -1821,14 +1878,14 @@ public class CompletableFutureTest exten final CompletableFuture h5 = m.applyToEither(g, f, rs[5]); try { assertEquals(inc(v1), h4.join()); - rs[4].assertInvoked(); + rs[4].assertValue(inc(v1)); } catch (CompletionException ok) { checkCompletedWithWrappedCancellationException(h4); rs[4].assertNotInvoked(); } try { assertEquals(inc(v1), h5.join()); - rs[5].assertInvoked(); + rs[5].assertValue(inc(v1)); } catch (CompletionException ok) { checkCompletedWithWrappedCancellationException(h5); rs[5].assertNotInvoked(); @@ -1843,6 +1900,63 @@ public class CompletableFutureTest exten for (int i = 0; i < 4; i++) rs[i].assertNotInvoked(); }} + public void testApplyToEither_sourceCancelled2() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean mayInterruptIfRunning : new boolean[] { true, false }) + for (boolean fFirst : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final IncFunction[] rs = new IncFunction[6]; + for (int i = 0; i < rs.length; i++) rs[i] = new IncFunction(m); + + final CompletableFuture h0 = m.applyToEither(f, g, rs[0]); + final CompletableFuture h1 = m.applyToEither(g, f, rs[1]); + if (fFirst) { + f.complete(v1); + g.cancel(mayInterruptIfRunning); + } else { + g.cancel(mayInterruptIfRunning); + f.complete(v1); + } + final CompletableFuture h2 = m.applyToEither(f, g, rs[2]); + final CompletableFuture h3 = m.applyToEither(g, f, rs[3]); + + // unspecified behavior - both source completions available + try { + assertEquals(inc(v1), h0.join()); + rs[0].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCancellationException(h0); + rs[0].assertNotInvoked(); + } + try { + assertEquals(inc(v1), h1.join()); + rs[1].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCancellationException(h1); + rs[1].assertNotInvoked(); + } + try { + assertEquals(inc(v1), h2.join()); + rs[2].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCancellationException(h2); + rs[2].assertNotInvoked(); + } + try { + assertEquals(inc(v1), h3.join()); + rs[3].assertValue(inc(v1)); + } catch (CompletionException ok) { + checkCompletedWithWrappedCancellationException(h3); + rs[3].assertNotInvoked(); + } + + checkCompletedNormally(f, v1); + checkCancelled(g); + }} + /** * applyToEither result completes exceptionally if action does */ @@ -1994,6 +2108,63 @@ public class CompletableFutureTest exten for (int i = 0; i < 4; i++) rs[i].assertNotInvoked(); }} + public void testAcceptEither_exceptionalCompletion2() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean fFirst : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final CFException ex = new CFException(); + final NoopConsumer[] rs = new NoopConsumer[6]; + for (int i = 0; i < rs.length; i++) rs[i] = new NoopConsumer(m); + + final CompletableFuture h0 = m.acceptEither(f, g, rs[0]); + final CompletableFuture h1 = m.acceptEither(g, f, rs[1]); + if (fFirst) { + f.complete(v1); + g.completeExceptionally(ex); + } else { + g.completeExceptionally(ex); + f.complete(v1); + } + final CompletableFuture h2 = m.acceptEither(f, g, rs[2]); + final CompletableFuture h3 = m.acceptEither(g, f, rs[3]); + + // unspecified behavior - both source completions available + try { + assertEquals(null, h0.join()); + rs[0].assertValue(v1); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h0, ex); + rs[0].assertNotInvoked(); + } + try { + assertEquals(null, h1.join()); + rs[1].assertValue(v1); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h1, ex); + rs[1].assertNotInvoked(); + } + try { + assertEquals(null, h2.join()); + rs[2].assertValue(v1); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h2, ex); + rs[2].assertNotInvoked(); + } + try { + assertEquals(null, h3.join()); + rs[3].assertValue(v1); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h3, ex); + rs[3].assertNotInvoked(); + } + + checkCompletedNormally(f, v1); + checkCompletedWithWrappedCFException(g, ex); + }} + /** * acceptEither result completes exceptionally if either source cancelled */ @@ -2197,6 +2368,63 @@ public class CompletableFutureTest exten for (int i = 0; i < 4; i++) rs[i].assertNotInvoked(); }} + public void testRunAfterEither_exceptionalCompletion2() { + for (ExecutionMode m : ExecutionMode.values()) + for (boolean fFirst : new boolean[] { true, false }) + for (Integer v1 : new Integer[] { 1, null }) + { + final CompletableFuture f = new CompletableFuture<>(); + final CompletableFuture g = new CompletableFuture<>(); + final CFException ex = new CFException(); + final Noop[] rs = new Noop[6]; + for (int i = 0; i < rs.length; i++) rs[i] = new Noop(m); + + final CompletableFuture h0 = m.runAfterEither(f, g, rs[0]); + final CompletableFuture h1 = m.runAfterEither(g, f, rs[1]); + if (fFirst) { + f.complete(v1); + g.completeExceptionally(ex); + } else { + g.completeExceptionally(ex); + f.complete(v1); + } + final CompletableFuture h2 = m.runAfterEither(f, g, rs[2]); + final CompletableFuture h3 = m.runAfterEither(g, f, rs[3]); + + // unspecified behavior - both source completions available + try { + assertEquals(null, h0.join()); + rs[0].assertInvoked(); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h0, ex); + rs[0].assertNotInvoked(); + } + try { + assertEquals(null, h1.join()); + rs[1].assertInvoked(); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h1, ex); + rs[1].assertNotInvoked(); + } + try { + assertEquals(null, h2.join()); + rs[2].assertInvoked(); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h2, ex); + rs[2].assertNotInvoked(); + } + try { + assertEquals(null, h3.join()); + rs[3].assertInvoked(); + } catch (CompletionException ok) { + checkCompletedWithWrappedCFException(h3, ex); + rs[3].assertNotInvoked(); + } + + checkCompletedNormally(f, v1); + checkCompletedWithWrappedCFException(g, ex); + }} + /** * runAfterEither result completes exceptionally if either source cancelled */ @@ -2303,7 +2531,7 @@ public class CompletableFutureTest exten checkCompletedNormally(g, inc(v1)); checkCompletedNormally(f, v1); - r.assertInvoked(); + r.assertValue(v1); }} /** @@ -2593,6 +2821,7 @@ public class CompletableFutureTest exten final CompletableFuture g = m.whenComplete (f, (Integer x, Throwable t) -> { + m.checkExecutionMode(); threadAssertSame(x, v1); threadAssertNull(t); a.getAndIncrement(); @@ -2620,6 +2849,7 @@ public class CompletableFutureTest exten final CompletableFuture g = m.whenComplete (f, (Integer x, Throwable t) -> { + m.checkExecutionMode(); threadAssertNull(x); threadAssertSame(t, ex); a.getAndIncrement(); @@ -2645,13 +2875,13 @@ public class CompletableFutureTest exten final CompletableFuture g = m.whenComplete (f, (Integer x, Throwable t) -> { + m.checkExecutionMode(); threadAssertNull(x); threadAssertTrue(t instanceof CancellationException); a.getAndIncrement(); }); if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning)); - //try { g.join(); } catch (Throwable t) { throw new Error(t); } checkCompletedWithWrappedCancellationException(g); checkCancelled(f); assertEquals(1, a.get()); @@ -2673,6 +2903,7 @@ public class CompletableFutureTest exten final CompletableFuture g = m.whenComplete (f, (Integer x, Throwable t) -> { + m.checkExecutionMode(); threadAssertSame(x, v1); threadAssertNull(t); a.getAndIncrement(); @@ -2703,6 +2934,7 @@ public class CompletableFutureTest exten final CompletableFuture g = m.whenComplete (f, (Integer x, Throwable t) -> { + m.checkExecutionMode(); threadAssertSame(t, ex1); threadAssertNull(x); a.getAndIncrement();