ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/CompletableFutureTest.java
(Generate patch)

Comparing jsr166/src/test/tck/CompletableFutureTest.java (file contents):
Revision 1.50 by jsr166, Mon Jun 2 19:32:57 2014 UTC vs.
Revision 1.55 by jsr166, Mon Jun 2 21:41:37 2014 UTC

# Line 284 | Line 284 | public class CompletableFutureTest exten
284      public void testGetNumberOfDependents() {
285          CompletableFuture<Integer> f = new CompletableFuture<>();
286          assertEquals(0, f.getNumberOfDependents());
287 <        CompletableFuture g = f.thenRun(new Noop());
287 >        CompletableFuture g = f.thenRun(new Noop(ExecutionMode.DEFAULT));
288          assertEquals(1, f.getNumberOfDependents());
289          assertEquals(0, g.getNumberOfDependents());
290 <        CompletableFuture h = f.thenRun(new Noop());
290 >        CompletableFuture h = f.thenRun(new Noop(ExecutionMode.DEFAULT));
291          assertEquals(2, f.getNumberOfDependents());
292          f.complete(1);
293          checkCompletedNormally(g, null);
# Line 375 | Line 375 | public class CompletableFutureTest exten
375          }
376      }
377      static final class Noop implements Runnable {
378 +        final ExecutionMode m;
379          int invocationCount = 0;
380 +        Noop(ExecutionMode m) { this.m = m; }
381          public void run() {
382 +            m.checkExecutionMode();
383              invocationCount++;
384          }
385      }
# Line 909 | Line 912 | public class CompletableFutureTest exten
912       * runAsync completes after running Runnable
913       */
914      public void testRunAsync() {
915 <        Noop r = new Noop();
915 >        Noop r = new Noop(ExecutionMode.ASYNC);
916          CompletableFuture<Void> f = CompletableFuture.runAsync(r);
917          assertNull(f.join());
918          assertEquals(1, r.invocationCount);
# Line 920 | Line 923 | public class CompletableFutureTest exten
923       * runAsync with executor completes after running Runnable
924       */
925      public void testRunAsync2() {
926 <        Noop r = new Noop();
926 >        Noop r = new Noop(ExecutionMode.EXECUTOR);
927          ThreadExecutor exec = new ThreadExecutor();
928          CompletableFuture<Void> f = CompletableFuture.runAsync(r, exec);
929          assertNull(f.join());
# Line 980 | Line 983 | public class CompletableFutureTest exten
983          for (Integer v1 : new Integer[] { 1, null })
984      {
985          final CompletableFuture<Integer> f = new CompletableFuture<>();
986 <        final Noop r = new Noop();
986 >        final Noop r = new Noop(m);
987          if (!createIncomplete) f.complete(v1);
988          final CompletableFuture<Void> g = m.thenRun(f, r);
989 <        if (createIncomplete) f.complete(v1);
989 >        if (createIncomplete) {
990 >            checkIncomplete(g);
991 >            f.complete(v1);
992 >        }
993  
994          checkCompletedNormally(g, null);
995          checkCompletedNormally(f, v1);
# Line 1000 | Line 1006 | public class CompletableFutureTest exten
1006      {
1007          final CFException ex = new CFException();
1008          final CompletableFuture<Integer> f = new CompletableFuture<>();
1009 <        final Noop r = new Noop();
1009 >        final Noop r = new Noop(m);
1010          if (!createIncomplete) f.completeExceptionally(ex);
1011          final CompletableFuture<Void> g = m.thenRun(f, r);
1012 <        if (createIncomplete) f.completeExceptionally(ex);
1012 >        if (createIncomplete) {
1013 >            checkIncomplete(g);
1014 >            f.completeExceptionally(ex);
1015 >        }
1016  
1017          checkCompletedWithWrappedCFException(g, ex);
1018          checkCompletedWithWrappedCFException(f, ex);
# Line 1019 | Line 1028 | public class CompletableFutureTest exten
1028          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1029      {
1030          final CompletableFuture<Integer> f = new CompletableFuture<>();
1031 <        final Noop r = new Noop();
1031 >        final Noop r = new Noop(m);
1032          if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1033          final CompletableFuture<Void> g = f.thenRun(r);
1034 <        if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1034 >        if (createIncomplete) {
1035 >            checkIncomplete(g);
1036 >            assertTrue(f.cancel(mayInterruptIfRunning));
1037 >        }
1038  
1039          checkCompletedWithWrappedCancellationException(g);
1040          checkCancelled(f);
# Line 1041 | Line 1053 | public class CompletableFutureTest exten
1053          final FailingRunnable r = new FailingRunnable();
1054          if (!createIncomplete) f.complete(v1);
1055          final CompletableFuture<Void> g = f.thenRun(r);
1056 <        if (createIncomplete) f.complete(v1);
1056 >        if (createIncomplete) {
1057 >            checkIncomplete(g);
1058 >            f.complete(v1);
1059 >        }
1060  
1061          checkCompletedWithWrappedCFException(g);
1062          checkCompletedNormally(f, v1);
# Line 1082 | Line 1097 | public class CompletableFutureTest exten
1097          final IncFunction r = new IncFunction();
1098          if (!createIncomplete) f.completeExceptionally(ex);
1099          final CompletableFuture<Integer> g = m.thenApply(f, r);
1100 <        if (createIncomplete) f.completeExceptionally(ex);
1100 >        if (createIncomplete) {
1101 >            checkIncomplete(g);
1102 >            f.completeExceptionally(ex);
1103 >        }
1104  
1105          checkCompletedWithWrappedCFException(g, ex);
1106          checkCompletedWithWrappedCFException(f, ex);
# Line 1101 | Line 1119 | public class CompletableFutureTest exten
1119          final IncFunction r = new IncFunction();
1120          if (!createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1121          final CompletableFuture<Integer> g = f.thenApply(r);
1122 <        if (createIncomplete) assertTrue(f.cancel(mayInterruptIfRunning));
1122 >        if (createIncomplete) {
1123 >            checkIncomplete(g);
1124 >            assertTrue(f.cancel(mayInterruptIfRunning));
1125 >        }
1126  
1127          checkCompletedWithWrappedCancellationException(g);
1128          checkCancelled(f);
# Line 1120 | Line 1141 | public class CompletableFutureTest exten
1141          final FailingFunction r = new FailingFunction();
1142          if (!createIncomplete) f.complete(v1);
1143          final CompletableFuture<Integer> g = f.thenApply(r);
1144 <        if (createIncomplete) f.complete(v1);
1144 >        if (createIncomplete) {
1145 >            checkIncomplete(g);
1146 >            f.complete(v1);
1147 >        }
1148  
1149          checkCompletedWithWrappedCFException(g);
1150          checkCompletedNormally(f, v1);
# Line 1138 | Line 1162 | public class CompletableFutureTest exten
1162          final IncAction r = new IncAction();
1163          if (!createIncomplete) f.complete(v1);
1164          final CompletableFuture<Void> g = m.thenAccept(f, r);
1165 <        if (createIncomplete) f.complete(v1);
1165 >        if (createIncomplete) {
1166 >            checkIncomplete(g);
1167 >            f.complete(v1);
1168 >        }
1169  
1170          checkCompletedNormally(g, null);
1171          checkCompletedNormally(f, v1);
# Line 1159 | Line 1186 | public class CompletableFutureTest exten
1186          final IncAction r = new IncAction();
1187          if (!createIncomplete) f.completeExceptionally(ex);
1188          final CompletableFuture<Void> g = m.thenAccept(f, r);
1189 <        if (createIncomplete) f.completeExceptionally(ex);
1189 >        if (createIncomplete) {
1190 >            checkIncomplete(g);
1191 >            f.completeExceptionally(ex);
1192 >        }
1193  
1194          checkCompletedWithWrappedCFException(g, ex);
1195          checkCompletedWithWrappedCFException(f, ex);
# Line 1178 | Line 1208 | public class CompletableFutureTest exten
1208          final FailingConsumer r = new FailingConsumer();
1209          if (!createIncomplete) f.complete(v1);
1210          final CompletableFuture<Void> g = f.thenAccept(r);
1211 <        if (createIncomplete) f.complete(v1);
1211 >        if (createIncomplete) {
1212 >            checkIncomplete(g);
1213 >            f.complete(v1);
1214 >        }
1215  
1216          checkCompletedWithWrappedCFException(g);
1217          checkCompletedNormally(f, v1);
# Line 1210 | Line 1243 | public class CompletableFutureTest exten
1243       * thenCombine result completes normally after normal completion
1244       * of sources
1245       */
1246 <    public void testThenCombine_normalCompletion1() {
1246 >    public void testThenCombine_normalCompletion() {
1247 >        for (ExecutionMode m : ExecutionMode.values())
1248          for (boolean createIncomplete : new boolean[] { true, false })
1249          for (boolean fFirst : new boolean[] { true, false })
1216        for (ExecutionMode m : ExecutionMode.values())
1250          for (Integer v1 : new Integer[] { 1, null })
1251          for (Integer v2 : new Integer[] { 2, null })
1252      {
1253          final CompletableFuture<Integer> f = new CompletableFuture<>();
1254          final CompletableFuture<Integer> g = new CompletableFuture<>();
1255          final SubtractFunction r = new SubtractFunction();
1223        CompletableFuture<Integer> h = null;
1224        if (createIncomplete) h = m.thenCombine(f, g, r);
1256  
1257 <        if (fFirst)
1258 <            f.complete(v1);
1259 <        else
1260 <            g.complete(v2);
1261 <        if (createIncomplete) checkIncomplete(h);
1262 <        assertEquals(0, r.invocationCount);
1263 <        if (!fFirst)
1264 <            f.complete(v1);
1265 <        else
1235 <            g.complete(v2);
1236 <        if (!createIncomplete) h = m.thenCombine(f, g, r);
1257 >        if (fFirst) f.complete(v1); else g.complete(v2);
1258 >        if (!createIncomplete)
1259 >            if (!fFirst) f.complete(v1); else g.complete(v2);
1260 >        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1261 >        if (createIncomplete) {
1262 >            checkIncomplete(h);
1263 >            assertEquals(0, r.invocationCount);
1264 >            if (!fFirst) f.complete(v1); else g.complete(v2);
1265 >        }
1266  
1267          checkCompletedNormally(h, subtract(v1, v2));
1268          checkCompletedNormally(f, v1);
# Line 1245 | Line 1274 | public class CompletableFutureTest exten
1274       * thenCombine result completes exceptionally after exceptional
1275       * completion of either source
1276       */
1277 <    public void testThenCombine_exceptionalCompletion1() {
1249 <        for (ExecutionMode m : ExecutionMode.values())
1250 <        for (Integer v1 : new Integer[] { 1, null })
1251 <    {
1252 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1253 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1254 <        final SubtractFunction r = new SubtractFunction();
1255 <        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1256 <        final CFException ex = new CFException();
1257 <
1258 <        f.completeExceptionally(ex);
1259 <        checkIncomplete(h);
1260 <        g.complete(v1);
1261 <
1262 <        checkCompletedWithWrappedCFException(h, ex);
1263 <        checkCompletedWithWrappedCFException(f, ex);
1264 <        assertEquals(0, r.invocationCount);
1265 <        checkCompletedNormally(g, v1);
1266 <    }}
1267 <
1268 <    public void testThenCombine_exceptionalCompletion2() {
1269 <        for (ExecutionMode m : ExecutionMode.values())
1270 <        for (Integer v1 : new Integer[] { 1, null })
1271 <    {
1272 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1273 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1274 <        final SubtractFunction r = new SubtractFunction();
1275 <        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1276 <        final CFException ex = new CFException();
1277 <
1278 <        g.completeExceptionally(ex);
1279 <        checkIncomplete(h);
1280 <        f.complete(v1);
1281 <
1282 <        checkCompletedWithWrappedCFException(h, ex);
1283 <        checkCompletedWithWrappedCFException(g, ex);
1284 <        assertEquals(0, r.invocationCount);
1285 <        checkCompletedNormally(f, v1);
1286 <    }}
1287 <
1288 <    public void testThenCombine_exceptionalCompletion3() {
1277 >    public void testThenCombine_exceptionalCompletion() {
1278          for (ExecutionMode m : ExecutionMode.values())
1279 +        for (boolean createIncomplete : new boolean[] { true, false })
1280 +        for (boolean fFirst : new boolean[] { true, false })
1281          for (Integer v1 : new Integer[] { 1, null })
1282      {
1283          final CompletableFuture<Integer> f = new CompletableFuture<>();
1284          final CompletableFuture<Integer> g = new CompletableFuture<>();
1294        final SubtractFunction r = new SubtractFunction();
1285          final CFException ex = new CFException();
1296
1297        g.completeExceptionally(ex);
1298        f.complete(v1);
1299        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1300
1301        checkCompletedWithWrappedCFException(h, ex);
1302        checkCompletedWithWrappedCFException(g, ex);
1303        assertEquals(0, r.invocationCount);
1304        checkCompletedNormally(f, v1);
1305    }}
1306
1307    public void testThenCombine_exceptionalCompletion4() {
1308        for (ExecutionMode m : ExecutionMode.values())
1309        for (Integer v1 : new Integer[] { 1, null })
1310    {
1311        final CompletableFuture<Integer> f = new CompletableFuture<>();
1312        final CompletableFuture<Integer> g = new CompletableFuture<>();
1286          final SubtractFunction r = new SubtractFunction();
1314        final CFException ex = new CFException();
1287  
1288 <        f.completeExceptionally(ex);
1289 <        g.complete(v1);
1288 >        (fFirst ? f : g).complete(v1);
1289 >        if (!createIncomplete)
1290 >            (!fFirst ? f : g).completeExceptionally(ex);
1291          final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1292 +        if (createIncomplete) {
1293 +            checkIncomplete(h);
1294 +            (!fFirst ? f : g).completeExceptionally(ex);
1295 +        }
1296  
1297          checkCompletedWithWrappedCFException(h, ex);
1321        checkCompletedWithWrappedCFException(f, ex);
1298          assertEquals(0, r.invocationCount);
1299 <        checkCompletedNormally(g, v1);
1299 >        checkCompletedNormally(fFirst ? f : g, v1);
1300 >        checkCompletedWithWrappedCFException(!fFirst ? f : g, ex);
1301      }}
1302  
1303      /**
1304       * thenCombine result completes exceptionally if action does
1305       */
1306 <    public void testThenCombine_actionFailed1() {
1330 <        for (ExecutionMode m : ExecutionMode.values())
1331 <        for (Integer v1 : new Integer[] { 1, null })
1332 <        for (Integer v2 : new Integer[] { 2, null })
1333 <    {
1334 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1335 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1336 <        final FailingBiFunction r = new FailingBiFunction();
1337 <        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1338 <
1339 <        f.complete(v1);
1340 <        checkIncomplete(h);
1341 <        g.complete(v2);
1342 <
1343 <        checkCompletedWithWrappedCFException(h);
1344 <        checkCompletedNormally(f, v1);
1345 <        checkCompletedNormally(g, v2);
1346 <    }}
1347 <
1348 <    public void testThenCombine_actionFailed2() {
1306 >    public void testThenCombine_actionFailed() {
1307          for (ExecutionMode m : ExecutionMode.values())
1308 +        for (boolean fFirst : new boolean[] { true, false })
1309          for (Integer v1 : new Integer[] { 1, null })
1310          for (Integer v2 : new Integer[] { 2, null })
1311      {
# Line 1355 | Line 1314 | public class CompletableFutureTest exten
1314          final FailingBiFunction r = new FailingBiFunction();
1315          final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1316  
1317 <        g.complete(v2);
1318 <        checkIncomplete(h);
1319 <        f.complete(v1);
1317 >        if (fFirst) {
1318 >            f.complete(v1);
1319 >            g.complete(v2);
1320 >        } else {
1321 >            g.complete(v2);
1322 >            f.complete(v1);
1323 >        }
1324  
1325          checkCompletedWithWrappedCFException(h);
1326          checkCompletedNormally(f, v1);
# Line 1367 | Line 1330 | public class CompletableFutureTest exten
1330      /**
1331       * thenCombine result completes exceptionally if either source cancelled
1332       */
1333 <    public void testThenCombine_sourceCancelled1() {
1371 <        for (ExecutionMode m : ExecutionMode.values())
1372 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1373 <        for (Integer v1 : new Integer[] { 1, null })
1374 <    {
1375 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1376 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1377 <        final SubtractFunction r = new SubtractFunction();
1378 <        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1379 <
1380 <        assertTrue(f.cancel(mayInterruptIfRunning));
1381 <        checkIncomplete(h);
1382 <        g.complete(v1);
1383 <
1384 <        checkCompletedWithWrappedCancellationException(h);
1385 <        checkCancelled(f);
1386 <        assertEquals(0, r.invocationCount);
1387 <        checkCompletedNormally(g, v1);
1388 <    }}
1389 <
1390 <    public void testThenCombine_sourceCancelled2() {
1391 <        for (ExecutionMode m : ExecutionMode.values())
1392 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1393 <        for (Integer v1 : new Integer[] { 1, null })
1394 <    {
1395 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1396 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1397 <        final SubtractFunction r = new SubtractFunction();
1398 <        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1399 <
1400 <        assertTrue(g.cancel(mayInterruptIfRunning));
1401 <        checkIncomplete(h);
1402 <        f.complete(v1);
1403 <
1404 <        checkCompletedWithWrappedCancellationException(h);
1405 <        checkCancelled(g);
1406 <        assertEquals(0, r.invocationCount);
1407 <        checkCompletedNormally(f, v1);
1408 <    }}
1409 <
1410 <    public void testThenCombine_sourceCancelled3() {
1411 <        for (ExecutionMode m : ExecutionMode.values())
1412 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1413 <        for (Integer v1 : new Integer[] { 1, null })
1414 <    {
1415 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1416 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1417 <        final SubtractFunction r = new SubtractFunction();
1418 <
1419 <        assertTrue(g.cancel(mayInterruptIfRunning));
1420 <        f.complete(v1);
1421 <        final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1422 <
1423 <        checkCompletedWithWrappedCancellationException(h);
1424 <        checkCancelled(g);
1425 <        assertEquals(0, r.invocationCount);
1426 <        checkCompletedNormally(f, v1);
1427 <    }}
1428 <
1429 <    public void testThenCombine_sourceCancelled4() {
1333 >    public void testThenCombine_sourceCancelled() {
1334          for (ExecutionMode m : ExecutionMode.values())
1335          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1336 +        for (boolean createIncomplete : new boolean[] { true, false })
1337 +        for (boolean fFirst : new boolean[] { true, false })
1338          for (Integer v1 : new Integer[] { 1, null })
1339      {
1340          final CompletableFuture<Integer> f = new CompletableFuture<>();
1341          final CompletableFuture<Integer> g = new CompletableFuture<>();
1342          final SubtractFunction r = new SubtractFunction();
1343  
1344 <        assertTrue(f.cancel(mayInterruptIfRunning));
1345 <        g.complete(v1);
1344 >        (fFirst ? f : g).complete(v1);
1345 >        if (!createIncomplete)
1346 >            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1347          final CompletableFuture<Integer> h = m.thenCombine(f, g, r);
1348 +        if (createIncomplete) {
1349 +            checkIncomplete(h);
1350 +            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1351 +        }
1352  
1353          checkCompletedWithWrappedCancellationException(h);
1354 <        checkCancelled(f);
1354 >        checkCancelled(!fFirst ? f : g);
1355          assertEquals(0, r.invocationCount);
1356 <        checkCompletedNormally(g, v1);
1356 >        checkCompletedNormally(fFirst ? f : g, v1);
1357      }}
1358  
1359      /**
1360       * thenAcceptBoth result completes normally after normal
1361       * completion of sources
1362       */
1363 <    public void testThenAcceptBoth_normalCompletion1() {
1453 <        for (ExecutionMode m : ExecutionMode.values())
1454 <        for (Integer v1 : new Integer[] { 1, null })
1455 <        for (Integer v2 : new Integer[] { 2, null })
1456 <    {
1457 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1458 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1459 <        final SubtractAction r = new SubtractAction();
1460 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1461 <
1462 <        f.complete(v1);
1463 <        checkIncomplete(h);
1464 <        assertEquals(0, r.invocationCount);
1465 <        g.complete(v2);
1466 <
1467 <        checkCompletedNormally(h, null);
1468 <        assertEquals(subtract(v1, v2), r.value);
1469 <        checkCompletedNormally(f, v1);
1470 <        checkCompletedNormally(g, v2);
1471 <    }}
1472 <
1473 <    public void testThenAcceptBoth_normalCompletion2() {
1474 <        for (ExecutionMode m : ExecutionMode.values())
1475 <        for (Integer v1 : new Integer[] { 1, null })
1476 <        for (Integer v2 : new Integer[] { 2, null })
1477 <    {
1478 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1479 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1480 <        final SubtractAction r = new SubtractAction();
1481 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1482 <
1483 <        g.complete(v2);
1484 <        checkIncomplete(h);
1485 <        assertEquals(0, r.invocationCount);
1486 <        f.complete(v1);
1487 <
1488 <        checkCompletedNormally(h, null);
1489 <        assertEquals(subtract(v1, v2), r.value);
1490 <        checkCompletedNormally(f, v1);
1491 <        checkCompletedNormally(g, v2);
1492 <    }}
1493 <
1494 <    public void testThenAcceptBoth_normalCompletion3() {
1495 <        for (ExecutionMode m : ExecutionMode.values())
1496 <        for (Integer v1 : new Integer[] { 1, null })
1497 <        for (Integer v2 : new Integer[] { 2, null })
1498 <    {
1499 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1500 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1501 <        final SubtractAction r = new SubtractAction();
1502 <
1503 <        g.complete(v2);
1504 <        f.complete(v1);
1505 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1506 <
1507 <        checkCompletedNormally(h, null);
1508 <        assertEquals(subtract(v1, v2), r.value);
1509 <        checkCompletedNormally(f, v1);
1510 <        checkCompletedNormally(g, v2);
1511 <    }}
1512 <
1513 <    public void testThenAcceptBoth_normalCompletion4() {
1363 >    public void testThenAcceptBoth_normalCompletion() {
1364          for (ExecutionMode m : ExecutionMode.values())
1365 +        for (boolean createIncomplete : new boolean[] { true, false })
1366 +        for (boolean fFirst : new boolean[] { true, false })
1367          for (Integer v1 : new Integer[] { 1, null })
1368          for (Integer v2 : new Integer[] { 2, null })
1369      {
# Line 1519 | Line 1371 | public class CompletableFutureTest exten
1371          final CompletableFuture<Integer> g = new CompletableFuture<>();
1372          final SubtractAction r = new SubtractAction();
1373  
1374 <        f.complete(v1);
1375 <        g.complete(v2);
1374 >        if (fFirst) f.complete(v1); else g.complete(v2);
1375 >        if (!createIncomplete)
1376 >            if (!fFirst) f.complete(v1); else g.complete(v2);
1377          final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1378 +        if (createIncomplete) {
1379 +            checkIncomplete(h);
1380 +            assertEquals(0, r.invocationCount);
1381 +            if (!fFirst) f.complete(v1); else g.complete(v2);
1382 +        }
1383  
1384          checkCompletedNormally(h, null);
1385          assertEquals(subtract(v1, v2), r.value);
# Line 1533 | Line 1391 | public class CompletableFutureTest exten
1391       * thenAcceptBoth result completes exceptionally after exceptional
1392       * completion of either source
1393       */
1394 <    public void testThenAcceptBoth_exceptionalCompletion1() {
1537 <        for (ExecutionMode m : ExecutionMode.values())
1538 <        for (Integer v1 : new Integer[] { 1, null })
1539 <    {
1540 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1541 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1542 <        final SubtractAction r = new SubtractAction();
1543 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1544 <        final CFException ex = new CFException();
1545 <
1546 <        f.completeExceptionally(ex);
1547 <        checkIncomplete(h);
1548 <        g.complete(v1);
1549 <
1550 <        checkCompletedWithWrappedCFException(h, ex);
1551 <        checkCompletedWithWrappedCFException(f, ex);
1552 <        assertEquals(0, r.invocationCount);
1553 <        checkCompletedNormally(g, v1);
1554 <    }}
1555 <
1556 <    public void testThenAcceptBoth_exceptionalCompletion2() {
1557 <        for (ExecutionMode m : ExecutionMode.values())
1558 <        for (Integer v1 : new Integer[] { 1, null })
1559 <    {
1560 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1561 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1562 <        final SubtractAction r = new SubtractAction();
1563 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1564 <        final CFException ex = new CFException();
1565 <
1566 <        g.completeExceptionally(ex);
1567 <        checkIncomplete(h);
1568 <        f.complete(v1);
1569 <
1570 <        checkCompletedWithWrappedCFException(h, ex);
1571 <        checkCompletedWithWrappedCFException(g, ex);
1572 <        assertEquals(0, r.invocationCount);
1573 <        checkCompletedNormally(f, v1);
1574 <    }}
1575 <
1576 <    public void testThenAcceptBoth_exceptionalCompletion3() {
1394 >    public void testThenAcceptBoth_exceptionalCompletion() {
1395          for (ExecutionMode m : ExecutionMode.values())
1396 +        for (boolean createIncomplete : new boolean[] { true, false })
1397 +        for (boolean fFirst : new boolean[] { true, false })
1398          for (Integer v1 : new Integer[] { 1, null })
1399      {
1400          final CompletableFuture<Integer> f = new CompletableFuture<>();
1401          final CompletableFuture<Integer> g = new CompletableFuture<>();
1582        final SubtractAction r = new SubtractAction();
1402          final CFException ex = new CFException();
1584
1585        g.completeExceptionally(ex);
1586        f.complete(v1);
1587        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1588
1589        checkCompletedWithWrappedCFException(h, ex);
1590        checkCompletedWithWrappedCFException(g, ex);
1591        assertEquals(0, r.invocationCount);
1592        checkCompletedNormally(f, v1);
1593    }}
1594
1595    public void testThenAcceptBoth_exceptionalCompletion4() {
1596        for (ExecutionMode m : ExecutionMode.values())
1597        for (Integer v1 : new Integer[] { 1, null })
1598    {
1599        final CompletableFuture<Integer> f = new CompletableFuture<>();
1600        final CompletableFuture<Integer> g = new CompletableFuture<>();
1403          final SubtractAction r = new SubtractAction();
1602        final CFException ex = new CFException();
1404  
1405 <        f.completeExceptionally(ex);
1406 <        g.complete(v1);
1405 >        (fFirst ? f : g).complete(v1);
1406 >        if (!createIncomplete)
1407 >            (!fFirst ? f : g).completeExceptionally(ex);
1408          final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1409 +        if (createIncomplete) {
1410 +            checkIncomplete(h);
1411 +            (!fFirst ? f : g).completeExceptionally(ex);
1412 +        }
1413  
1414          checkCompletedWithWrappedCFException(h, ex);
1609        checkCompletedWithWrappedCFException(f, ex);
1415          assertEquals(0, r.invocationCount);
1416 <        checkCompletedNormally(g, v1);
1416 >        checkCompletedNormally(fFirst ? f : g, v1);
1417 >        checkCompletedWithWrappedCFException(!fFirst ? f : g, ex);
1418      }}
1419  
1420      /**
1421       * thenAcceptBoth result completes exceptionally if action does
1422       */
1423 <    public void testThenAcceptBoth_actionFailed1() {
1618 <        for (ExecutionMode m : ExecutionMode.values())
1619 <        for (Integer v1 : new Integer[] { 1, null })
1620 <        for (Integer v2 : new Integer[] { 2, null })
1621 <    {
1622 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1623 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1624 <        final FailingBiConsumer r = new FailingBiConsumer();
1625 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1626 <
1627 <        f.complete(v1);
1628 <        checkIncomplete(h);
1629 <        g.complete(v2);
1630 <
1631 <        checkCompletedWithWrappedCFException(h);
1632 <        checkCompletedNormally(f, v1);
1633 <        checkCompletedNormally(g, v2);
1634 <    }}
1635 <
1636 <    public void testThenAcceptBoth_actionFailed2() {
1423 >    public void testThenAcceptBoth_actionFailed() {
1424          for (ExecutionMode m : ExecutionMode.values())
1425 +        for (boolean fFirst : new boolean[] { true, false })
1426          for (Integer v1 : new Integer[] { 1, null })
1427          for (Integer v2 : new Integer[] { 2, null })
1428      {
# Line 1643 | Line 1431 | public class CompletableFutureTest exten
1431          final FailingBiConsumer r = new FailingBiConsumer();
1432          final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1433  
1434 <        g.complete(v2);
1435 <        checkIncomplete(h);
1436 <        f.complete(v1);
1434 >        if (fFirst) {
1435 >            f.complete(v1);
1436 >            g.complete(v2);
1437 >        } else {
1438 >            g.complete(v2);
1439 >            f.complete(v1);
1440 >        }
1441  
1442          checkCompletedWithWrappedCFException(h);
1443          checkCompletedNormally(f, v1);
# Line 1655 | Line 1447 | public class CompletableFutureTest exten
1447      /**
1448       * thenAcceptBoth result completes exceptionally if either source cancelled
1449       */
1450 <    public void testThenAcceptBoth_sourceCancelled1() {
1659 <        for (ExecutionMode m : ExecutionMode.values())
1660 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1661 <        for (Integer v1 : new Integer[] { 1, null })
1662 <    {
1663 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1664 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1665 <        final SubtractAction r = new SubtractAction();
1666 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1667 <
1668 <        assertTrue(f.cancel(mayInterruptIfRunning));
1669 <        checkIncomplete(h);
1670 <        g.complete(v1);
1671 <
1672 <        checkCompletedWithWrappedCancellationException(h);
1673 <        checkCancelled(f);
1674 <        assertEquals(0, r.invocationCount);
1675 <        checkCompletedNormally(g, v1);
1676 <    }}
1677 <
1678 <    public void testThenAcceptBoth_sourceCancelled2() {
1679 <        for (ExecutionMode m : ExecutionMode.values())
1680 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1681 <        for (Integer v1 : new Integer[] { 1, null })
1682 <    {
1683 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1684 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1685 <        final SubtractAction r = new SubtractAction();
1686 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1687 <
1688 <        assertTrue(g.cancel(mayInterruptIfRunning));
1689 <        checkIncomplete(h);
1690 <        f.complete(v1);
1691 <
1692 <        checkCompletedWithWrappedCancellationException(h);
1693 <        checkCancelled(g);
1694 <        assertEquals(0, r.invocationCount);
1695 <        checkCompletedNormally(f, v1);
1696 <    }}
1697 <
1698 <    public void testThenAcceptBoth_sourceCancelled3() {
1699 <        for (ExecutionMode m : ExecutionMode.values())
1700 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1701 <        for (Integer v1 : new Integer[] { 1, null })
1702 <    {
1703 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1704 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1705 <        final SubtractAction r = new SubtractAction();
1706 <
1707 <        assertTrue(g.cancel(mayInterruptIfRunning));
1708 <        f.complete(v1);
1709 <        final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1710 <
1711 <        checkCompletedWithWrappedCancellationException(h);
1712 <        checkCancelled(g);
1713 <        assertEquals(0, r.invocationCount);
1714 <        checkCompletedNormally(f, v1);
1715 <    }}
1716 <
1717 <    public void testThenAcceptBoth_sourceCancelled4() {
1450 >    public void testThenAcceptBoth_sourceCancelled() {
1451          for (ExecutionMode m : ExecutionMode.values())
1452          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1453 +        for (boolean createIncomplete : new boolean[] { true, false })
1454 +        for (boolean fFirst : new boolean[] { true, false })
1455          for (Integer v1 : new Integer[] { 1, null })
1456      {
1457          final CompletableFuture<Integer> f = new CompletableFuture<>();
1458          final CompletableFuture<Integer> g = new CompletableFuture<>();
1459          final SubtractAction r = new SubtractAction();
1460  
1461 <        assertTrue(f.cancel(mayInterruptIfRunning));
1462 <        g.complete(v1);
1461 >        (fFirst ? f : g).complete(v1);
1462 >        if (!createIncomplete)
1463 >            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1464          final CompletableFuture<Void> h = m.thenAcceptBoth(f, g, r);
1465 +        if (createIncomplete) {
1466 +            checkIncomplete(h);
1467 +            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1468 +        }
1469  
1470          checkCompletedWithWrappedCancellationException(h);
1471 <        checkCancelled(f);
1471 >        checkCancelled(!fFirst ? f : g);
1472          assertEquals(0, r.invocationCount);
1473 <        checkCompletedNormally(g, v1);
1473 >        checkCompletedNormally(fFirst ? f : g, v1);
1474      }}
1475  
1476      /**
1477       * runAfterBoth result completes normally after normal
1478       * completion of sources
1479       */
1480 <    public void testRunAfterBoth_normalCompletion1() {
1741 <        for (ExecutionMode m : ExecutionMode.values())
1742 <        for (Integer v1 : new Integer[] { 1, null })
1743 <        for (Integer v2 : new Integer[] { 2, null })
1744 <    {
1745 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1746 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1747 <        final Noop r = new Noop();
1748 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1749 <
1750 <        f.complete(v1);
1751 <        checkIncomplete(h);
1752 <        assertEquals(0, r.invocationCount);
1753 <        g.complete(v2);
1754 <
1755 <        checkCompletedNormally(h, null);
1756 <        assertEquals(1, r.invocationCount);
1757 <        checkCompletedNormally(f, v1);
1758 <        checkCompletedNormally(g, v2);
1759 <    }}
1760 <
1761 <    public void testRunAfterBoth_normalCompletion2() {
1762 <        for (ExecutionMode m : ExecutionMode.values())
1763 <        for (Integer v1 : new Integer[] { 1, null })
1764 <        for (Integer v2 : new Integer[] { 2, null })
1765 <    {
1766 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1767 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1768 <        final Noop r = new Noop();
1769 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1770 <
1771 <        g.complete(v2);
1772 <        checkIncomplete(h);
1773 <        assertEquals(0, r.invocationCount);
1774 <        f.complete(v1);
1775 <
1776 <        checkCompletedNormally(h, null);
1777 <        assertEquals(1, r.invocationCount);
1778 <        checkCompletedNormally(f, v1);
1779 <        checkCompletedNormally(g, v2);
1780 <    }}
1781 <
1782 <    public void testRunAfterBoth_normalCompletion3() {
1783 <        for (ExecutionMode m : ExecutionMode.values())
1784 <        for (Integer v1 : new Integer[] { 1, null })
1785 <        for (Integer v2 : new Integer[] { 2, null })
1786 <    {
1787 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1788 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1789 <        final Noop r = new Noop();
1790 <
1791 <        g.complete(v2);
1792 <        f.complete(v1);
1793 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1794 <
1795 <        checkCompletedNormally(h, null);
1796 <        assertEquals(1, r.invocationCount);
1797 <        checkCompletedNormally(f, v1);
1798 <        checkCompletedNormally(g, v2);
1799 <    }}
1800 <
1801 <    public void testRunAfterBoth_normalCompletion4() {
1480 >    public void testRunAfterBoth_normalCompletion() {
1481          for (ExecutionMode m : ExecutionMode.values())
1482 +        for (boolean createIncomplete : new boolean[] { true, false })
1483 +        for (boolean fFirst : new boolean[] { true, false })
1484          for (Integer v1 : new Integer[] { 1, null })
1485          for (Integer v2 : new Integer[] { 2, null })
1486      {
1487          final CompletableFuture<Integer> f = new CompletableFuture<>();
1488          final CompletableFuture<Integer> g = new CompletableFuture<>();
1489 <        final Noop r = new Noop();
1489 >        final Noop r = new Noop(m);
1490  
1491 <        f.complete(v1);
1492 <        g.complete(v2);
1491 >        if (fFirst) f.complete(v1); else g.complete(v2);
1492 >        if (!createIncomplete)
1493 >            if (!fFirst) f.complete(v1); else g.complete(v2);
1494          final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1495 +        if (createIncomplete) {
1496 +            checkIncomplete(h);
1497 +            assertEquals(0, r.invocationCount);
1498 +            if (!fFirst) f.complete(v1); else g.complete(v2);
1499 +        }
1500  
1501          checkCompletedNormally(h, null);
1502          assertEquals(1, r.invocationCount);
# Line 1821 | Line 1508 | public class CompletableFutureTest exten
1508       * runAfterBoth result completes exceptionally after exceptional
1509       * completion of either source
1510       */
1511 <    public void testRunAfterBoth_exceptionalCompletion1() {
1825 <        for (ExecutionMode m : ExecutionMode.values())
1826 <        for (Integer v1 : new Integer[] { 1, null })
1827 <    {
1828 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1829 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1830 <        final Noop r = new Noop();
1831 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1832 <        final CFException ex = new CFException();
1833 <
1834 <        f.completeExceptionally(ex);
1835 <        checkIncomplete(h);
1836 <        g.complete(v1);
1837 <
1838 <        checkCompletedWithWrappedCFException(h, ex);
1839 <        checkCompletedWithWrappedCFException(f, ex);
1840 <        assertEquals(0, r.invocationCount);
1841 <        checkCompletedNormally(g, v1);
1842 <    }}
1843 <
1844 <    public void testRunAfterBoth_exceptionalCompletion2() {
1845 <        for (ExecutionMode m : ExecutionMode.values())
1846 <        for (Integer v1 : new Integer[] { 1, null })
1847 <    {
1848 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1849 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1850 <        final Noop r = new Noop();
1851 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1852 <        final CFException ex = new CFException();
1853 <
1854 <        g.completeExceptionally(ex);
1855 <        checkIncomplete(h);
1856 <        f.complete(v1);
1857 <
1858 <        checkCompletedWithWrappedCFException(h, ex);
1859 <        checkCompletedWithWrappedCFException(g, ex);
1860 <        assertEquals(0, r.invocationCount);
1861 <        checkCompletedNormally(f, v1);
1862 <    }}
1863 <
1864 <    public void testRunAfterBoth_exceptionalCompletion3() {
1865 <        for (ExecutionMode m : ExecutionMode.values())
1866 <        for (Integer v1 : new Integer[] { 1, null })
1867 <    {
1868 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1869 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1870 <        final Noop r = new Noop();
1871 <        final CFException ex = new CFException();
1872 <
1873 <        g.completeExceptionally(ex);
1874 <        f.complete(v1);
1875 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1876 <
1877 <        checkCompletedWithWrappedCFException(h, ex);
1878 <        checkCompletedWithWrappedCFException(g, ex);
1879 <        assertEquals(0, r.invocationCount);
1880 <        checkCompletedNormally(f, v1);
1881 <    }}
1882 <
1883 <    public void testRunAfterBoth_exceptionalCompletion4() {
1511 >    public void testRunAfterBoth_exceptionalCompletion() {
1512          for (ExecutionMode m : ExecutionMode.values())
1513 +        for (boolean createIncomplete : new boolean[] { true, false })
1514 +        for (boolean fFirst : new boolean[] { true, false })
1515          for (Integer v1 : new Integer[] { 1, null })
1516      {
1517          final CompletableFuture<Integer> f = new CompletableFuture<>();
1518          final CompletableFuture<Integer> g = new CompletableFuture<>();
1889        final Noop r = new Noop();
1519          final CFException ex = new CFException();
1520 +        final Noop r = new Noop(m);
1521  
1522 <        f.completeExceptionally(ex);
1523 <        g.complete(v1);
1522 >        (fFirst ? f : g).complete(v1);
1523 >        if (!createIncomplete)
1524 >            (!fFirst ? f : g).completeExceptionally(ex);
1525          final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1526 +        if (createIncomplete) {
1527 +            checkIncomplete(h);
1528 +            (!fFirst ? f : g).completeExceptionally(ex);
1529 +        }
1530  
1531          checkCompletedWithWrappedCFException(h, ex);
1897        checkCompletedWithWrappedCFException(f, ex);
1532          assertEquals(0, r.invocationCount);
1533 <        checkCompletedNormally(g, v1);
1533 >        checkCompletedNormally(fFirst ? f : g, v1);
1534 >        checkCompletedWithWrappedCFException(!fFirst ? f : g, ex);
1535      }}
1536  
1537      /**
1538       * runAfterBoth result completes exceptionally if action does
1539       */
1540 <    public void testRunAfterBoth_actionFailed1() {
1906 <        for (ExecutionMode m : ExecutionMode.values())
1907 <        for (Integer v1 : new Integer[] { 1, null })
1908 <        for (Integer v2 : new Integer[] { 2, null })
1909 <    {
1910 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1911 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1912 <        final FailingRunnable r = new FailingRunnable();
1913 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1914 <
1915 <        f.complete(v1);
1916 <        checkIncomplete(h);
1917 <        g.complete(v2);
1918 <
1919 <        checkCompletedWithWrappedCFException(h);
1920 <        checkCompletedNormally(f, v1);
1921 <        checkCompletedNormally(g, v2);
1922 <    }}
1923 <
1924 <    public void testRunAfterBoth_actionFailed2() {
1540 >    public void testRunAfterBoth_actionFailed() {
1541          for (ExecutionMode m : ExecutionMode.values())
1542 +        for (boolean fFirst : new boolean[] { true, false })
1543          for (Integer v1 : new Integer[] { 1, null })
1544          for (Integer v2 : new Integer[] { 2, null })
1545      {
1546          final CompletableFuture<Integer> f = new CompletableFuture<>();
1547          final CompletableFuture<Integer> g = new CompletableFuture<>();
1548          final FailingRunnable r = new FailingRunnable();
1932        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1549  
1550 <        g.complete(v2);
1551 <        checkIncomplete(h);
1552 <        f.complete(v1);
1550 >        CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r);
1551 >        if (fFirst) {
1552 >            f.complete(v1);
1553 >            g.complete(v2);
1554 >        } else {
1555 >            g.complete(v2);
1556 >            f.complete(v1);
1557 >        }
1558 >        CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r);
1559  
1560 <        checkCompletedWithWrappedCFException(h);
1560 >        checkCompletedWithWrappedCFException(h1);
1561 >        checkCompletedWithWrappedCFException(h2);
1562          checkCompletedNormally(f, v1);
1563          checkCompletedNormally(g, v2);
1564      }}
# Line 1943 | Line 1566 | public class CompletableFutureTest exten
1566      /**
1567       * runAfterBoth result completes exceptionally if either source cancelled
1568       */
1569 <    public void testRunAfterBoth_sourceCancelled1() {
1947 <        for (ExecutionMode m : ExecutionMode.values())
1948 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1949 <        for (Integer v1 : new Integer[] { 1, null })
1950 <    {
1951 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1952 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1953 <        final Noop r = new Noop();
1954 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1955 <
1956 <        assertTrue(f.cancel(mayInterruptIfRunning));
1957 <        checkIncomplete(h);
1958 <        g.complete(v1);
1959 <
1960 <        checkCompletedWithWrappedCancellationException(h);
1961 <        checkCancelled(f);
1962 <        assertEquals(0, r.invocationCount);
1963 <        checkCompletedNormally(g, v1);
1964 <    }}
1965 <
1966 <    public void testRunAfterBoth_sourceCancelled2() {
1967 <        for (ExecutionMode m : ExecutionMode.values())
1968 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1969 <        for (Integer v1 : new Integer[] { 1, null })
1970 <    {
1971 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1972 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1973 <        final Noop r = new Noop();
1974 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1975 <
1976 <        assertTrue(g.cancel(mayInterruptIfRunning));
1977 <        checkIncomplete(h);
1978 <        f.complete(v1);
1979 <
1980 <        checkCompletedWithWrappedCancellationException(h);
1981 <        checkCancelled(g);
1982 <        assertEquals(0, r.invocationCount);
1983 <        checkCompletedNormally(f, v1);
1984 <    }}
1985 <
1986 <    public void testRunAfterBoth_sourceCancelled3() {
1569 >    public void testRunAfterBoth_sourceCancelled() {
1570          for (ExecutionMode m : ExecutionMode.values())
1571          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1572 +        for (boolean createIncomplete : new boolean[] { true, false })
1573 +        for (boolean fFirst : new boolean[] { true, false })
1574          for (Integer v1 : new Integer[] { 1, null })
1575      {
1576          final CompletableFuture<Integer> f = new CompletableFuture<>();
1577          final CompletableFuture<Integer> g = new CompletableFuture<>();
1578 <        final Noop r = new Noop();
1578 >        final Noop r = new Noop(m);
1579  
1995        assertTrue(g.cancel(mayInterruptIfRunning));
1996        f.complete(v1);
1997        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1580  
1581 <        checkCompletedWithWrappedCancellationException(h);
1582 <        checkCancelled(g);
1583 <        assertEquals(0, r.invocationCount);
2002 <        checkCompletedNormally(f, v1);
2003 <    }}
2004 <
2005 <    public void testRunAfterBoth_sourceCancelled4() {
2006 <        for (ExecutionMode m : ExecutionMode.values())
2007 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2008 <        for (Integer v1 : new Integer[] { 1, null })
2009 <    {
2010 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
2011 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
2012 <        final Noop r = new Noop();
2013 <
2014 <        assertTrue(f.cancel(mayInterruptIfRunning));
2015 <        g.complete(v1);
1581 >        (fFirst ? f : g).complete(v1);
1582 >        if (!createIncomplete)
1583 >            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1584          final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1585 +        if (createIncomplete) {
1586 +            checkIncomplete(h);
1587 +            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1588 +        }
1589  
1590          checkCompletedWithWrappedCancellationException(h);
1591 <        checkCancelled(f);
1591 >        checkCancelled(!fFirst ? f : g);
1592          assertEquals(0, r.invocationCount);
1593 <        checkCompletedNormally(g, v1);
1593 >        checkCompletedNormally(fFirst ? f : g, v1);
1594      }}
1595  
1596      /**
1597       * applyToEither result completes normally after normal completion
1598       * of either source
1599       */
1600 <    public void testApplyToEither_normalCompletion1() {
1600 >    public void testApplyToEither_normalCompletion() {
1601          for (ExecutionMode m : ExecutionMode.values())
1602 +        for (boolean createIncomplete : new boolean[] { true, false })
1603 +        for (boolean fFirst : new boolean[] { true, false })
1604          for (Integer v1 : new Integer[] { 1, null })
1605          for (Integer v2 : new Integer[] { 2, null })
1606      {
1607          final CompletableFuture<Integer> f = new CompletableFuture<>();
1608          final CompletableFuture<Integer> g = new CompletableFuture<>();
1609          final IncFunction r = new IncFunction();
2036        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1610  
1611 <        f.complete(v1);
1612 <        checkCompletedNormally(h, inc(v1));
1613 <        g.complete(v2);
1611 >        if (!createIncomplete)
1612 >            if (fFirst) f.complete(v1); else g.complete(v2);
1613 >        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1614 >        if (createIncomplete) {
1615 >            checkIncomplete(h);
1616 >            assertEquals(0, r.invocationCount);
1617 >            if (fFirst) f.complete(v1); else g.complete(v2);
1618 >        }
1619 >        checkCompletedNormally(h, inc(fFirst ? v1 : v2));
1620 >        if (!fFirst) f.complete(v1); else g.complete(v2);
1621  
1622          checkCompletedNormally(f, v1);
1623          checkCompletedNormally(g, v2);
1624 <        checkCompletedNormally(h, inc(v1));
1624 >        checkCompletedNormally(h, inc(fFirst ? v1 : v2));
1625      }}
1626  
1627 <    public void testApplyToEither_normalCompletion2() {
1627 >    public void testApplyToEither_normalCompletionBothAvailable() {
1628          for (ExecutionMode m : ExecutionMode.values())
1629 +        for (boolean fFirst : new boolean[] { true, false })
1630          for (Integer v1 : new Integer[] { 1, null })
1631          for (Integer v2 : new Integer[] { 2, null })
1632      {
1633          final CompletableFuture<Integer> f = new CompletableFuture<>();
1634          final CompletableFuture<Integer> g = new CompletableFuture<>();
1635          final IncFunction r = new IncFunction();
2055        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2056
2057        g.complete(v2);
2058        checkCompletedNormally(h, inc(v2));
2059        f.complete(v1);
2060
2061        checkCompletedNormally(f, v1);
2062        checkCompletedNormally(g, v2);
2063        checkCompletedNormally(h, inc(v2));
2064        }}
1636  
1637 <    public void testApplyToEither_normalCompletion3() {
1638 <        for (ExecutionMode m : ExecutionMode.values())
1639 <        for (Integer v1 : new Integer[] { 1, null })
1640 <        for (Integer v2 : new Integer[] { 2, null })
1641 <    {
1642 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1643 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
2073 <        final IncFunction r = new IncFunction();
1637 >        if (fFirst) {
1638 >            f.complete(v1);
1639 >            g.complete(v2);
1640 >        } else {
1641 >            g.complete(v2);
1642 >            f.complete(v1);
1643 >        }
1644  
2075        f.complete(v1);
2076        g.complete(v2);
1645          final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1646  
1647          checkCompletedNormally(f, v1);
# Line 2091 | Line 1659 | public class CompletableFutureTest exten
1659       */
1660      public void testApplyToEither_exceptionalCompletion1() {
1661          for (ExecutionMode m : ExecutionMode.values())
1662 +        for (boolean createIncomplete : new boolean[] { true, false })
1663 +        for (boolean fFirst : new boolean[] { true, false })
1664          for (Integer v1 : new Integer[] { 1, null })
1665      {
1666          final CompletableFuture<Integer> f = new CompletableFuture<>();
1667          final CompletableFuture<Integer> g = new CompletableFuture<>();
2098        final IncFunction r = new IncFunction();
2099        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1668          final CFException ex = new CFException();
2101
2102        f.completeExceptionally(ex);
2103        checkCompletedWithWrappedCFException(h, ex);
2104        g.complete(v1);
2105
2106        assertEquals(0, r.invocationCount);
2107        checkCompletedNormally(g, v1);
2108        checkCompletedWithWrappedCFException(f, ex);
2109        checkCompletedWithWrappedCFException(h, ex);
2110    }}
2111
2112    public void testApplyToEither_exceptionalCompletion2() {
2113        for (ExecutionMode m : ExecutionMode.values())
2114        for (Integer v1 : new Integer[] { 1, null })
2115    {
2116        final CompletableFuture<Integer> f = new CompletableFuture<>();
2117        final CompletableFuture<Integer> g = new CompletableFuture<>();
1669          final IncFunction r = new IncFunction();
1670 +
1671 +        if (!createIncomplete) (fFirst ? f : g).completeExceptionally(ex);
1672          final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1673 <        final CFException ex = new CFException();
1673 >        if (createIncomplete) {
1674 >            checkIncomplete(h);
1675 >            assertEquals(0, r.invocationCount);
1676 >            (fFirst ? f : g).completeExceptionally(ex);
1677 >        }
1678  
2122        g.completeExceptionally(ex);
1679          checkCompletedWithWrappedCFException(h, ex);
1680 <        f.complete(v1);
1680 >        (!fFirst ? f : g).complete(v1);
1681  
1682          assertEquals(0, r.invocationCount);
1683 <        checkCompletedNormally(f, v1);
1684 <        checkCompletedWithWrappedCFException(g, ex);
1683 >        checkCompletedNormally(!fFirst ? f : g, v1);
1684 >        checkCompletedWithWrappedCFException(fFirst ? f : g, ex);
1685          checkCompletedWithWrappedCFException(h, ex);
1686      }}
1687  
1688 <    public void testApplyToEither_exceptionalCompletion3() {
1688 >    public void testApplyToEither_exceptionalCompletion2() {
1689          for (ExecutionMode m : ExecutionMode.values())
1690 +        for (boolean reverseArgs : new boolean[] { true, false })
1691 +        for (boolean fFirst : new boolean[] { true, false })
1692          for (Integer v1 : new Integer[] { 1, null })
1693      {
1694          final CompletableFuture<Integer> f = new CompletableFuture<>();
1695          final CompletableFuture<Integer> g = new CompletableFuture<>();
1696 <        final IncFunction r = new IncFunction();
1696 >        final IncFunction r1 = new IncFunction();
1697 >        final IncFunction r2 = new IncFunction();
1698          final CFException ex = new CFException();
1699 <
1700 <        g.completeExceptionally(ex);
1701 <        f.complete(v1);
1702 <        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1699 >        final CompletableFuture<Integer> j = (reverseArgs ? g : f);
1700 >        final CompletableFuture<Integer> k = (reverseArgs ? f : g);
1701 >        final CompletableFuture<Integer> h1 = m.applyToEither(j, k, r1);
1702 >        if (fFirst) {
1703 >            f.complete(v1);
1704 >            g.completeExceptionally(ex);
1705 >        } else {
1706 >            g.completeExceptionally(ex);
1707 >            f.complete(v1);
1708 >        }
1709 >        final CompletableFuture<Integer> h2 = m.applyToEither(j, k, r2);
1710  
1711          // unspecified behavior
2146        Integer v;
1712          try {
1713 <            assertEquals(inc(v1), h.join());
1714 <            assertEquals(1, r.invocationCount);
1713 >            assertEquals(inc(v1), h1.join());
1714 >            assertEquals(1, r1.invocationCount);
1715          } catch (CompletionException ok) {
1716 <            checkCompletedWithWrappedCFException(h, ex);
1717 <            assertEquals(0, r.invocationCount);
1716 >            checkCompletedWithWrappedCFException(h1, ex);
1717 >            assertEquals(0, r1.invocationCount);
1718          }
1719  
2155        checkCompletedWithWrappedCFException(g, ex);
2156        checkCompletedNormally(f, v1);
2157    }}
2158
2159    public void testApplyToEither_exceptionalCompletion4() {
2160        for (ExecutionMode m : ExecutionMode.values())
2161        for (Integer v1 : new Integer[] { 1, null })
2162    {
2163        final CompletableFuture<Integer> f = new CompletableFuture<>();
2164        final CompletableFuture<Integer> g = new CompletableFuture<>();
2165        final IncFunction r = new IncFunction();
2166        final CFException ex = new CFException();
2167
2168        f.completeExceptionally(ex);
2169        g.complete(v1);
2170        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2171
2172        // unspecified behavior
2173        Integer v;
1720          try {
1721 <            assertEquals(inc(v1), h.join());
1722 <            assertEquals(1, r.invocationCount);
1721 >            assertEquals(inc(v1), h2.join());
1722 >            assertEquals(1, r2.invocationCount);
1723          } catch (CompletionException ok) {
1724 <            checkCompletedWithWrappedCFException(h, ex);
1725 <            assertEquals(0, r.invocationCount);
1724 >            checkCompletedWithWrappedCFException(h2, ex);
1725 >            assertEquals(0, r2.invocationCount);
1726          }
1727  
1728 <        checkCompletedWithWrappedCFException(f, ex);
1729 <        checkCompletedNormally(g, v1);
1728 >        checkCompletedWithWrappedCFException(g, ex);
1729 >        checkCompletedNormally(f, v1);
1730      }}
1731  
1732      /**
# Line 2226 | Line 1772 | public class CompletableFutureTest exten
1772      public void testApplyToEither_sourceCancelled1() {
1773          for (ExecutionMode m : ExecutionMode.values())
1774          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1775 +        for (boolean createIncomplete : new boolean[] { true, false })
1776 +        for (boolean fFirst : new boolean[] { true, false })
1777          for (Integer v1 : new Integer[] { 1, null })
1778      {
1779          final CompletableFuture<Integer> f = new CompletableFuture<>();
1780          final CompletableFuture<Integer> g = new CompletableFuture<>();
1781          final IncFunction r = new IncFunction();
2234        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2235
2236        assertTrue(f.cancel(mayInterruptIfRunning));
2237        checkCompletedWithWrappedCancellationException(h);
2238        g.complete(v1);
2239
2240        checkCancelled(f);
2241        assertEquals(0, r.invocationCount);
2242        checkCompletedNormally(g, v1);
2243        checkCompletedWithWrappedCancellationException(h);
2244    }}
1782  
1783 <    public void testApplyToEither_sourceCancelled2() {
2247 <        for (ExecutionMode m : ExecutionMode.values())
2248 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2249 <        for (Integer v1 : new Integer[] { 1, null })
2250 <    {
2251 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
2252 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
2253 <        final IncFunction r = new IncFunction();
1783 >        if (!createIncomplete) assertTrue((fFirst ? f : g).cancel(mayInterruptIfRunning));
1784          final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1785 +        if (createIncomplete) {
1786 +            checkIncomplete(h);
1787 +            assertEquals(0, r.invocationCount);
1788 +            assertTrue((fFirst ? f : g).cancel(mayInterruptIfRunning));
1789 +        }
1790  
2256        assertTrue(g.cancel(mayInterruptIfRunning));
1791          checkCompletedWithWrappedCancellationException(h);
1792 <        f.complete(v1);
1792 >        (!fFirst ? f : g).complete(v1);
1793  
2260        checkCancelled(g);
1794          assertEquals(0, r.invocationCount);
1795 <        checkCompletedNormally(f, v1);
1795 >        checkCompletedNormally(!fFirst ? f : g, v1);
1796 >        checkCancelled(fFirst ? f : g);
1797          checkCompletedWithWrappedCancellationException(h);
1798      }}
1799  
1800 <    public void testApplyToEither_sourceCancelled3() {
1800 >    public void testApplyToEither_sourceCancelled2() {
1801          for (ExecutionMode m : ExecutionMode.values())
1802          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1803 +        for (boolean reverseArgs : new boolean[] { true, false })
1804 +        for (boolean fFirst : new boolean[] { true, false })
1805          for (Integer v1 : new Integer[] { 1, null })
1806      {
1807          final CompletableFuture<Integer> f = new CompletableFuture<>();
1808          final CompletableFuture<Integer> g = new CompletableFuture<>();
1809 <        final IncFunction r = new IncFunction();
1809 >        final IncFunction r1 = new IncFunction();
1810 >        final IncFunction r2 = new IncFunction();
1811 >        final CFException ex = new CFException();
1812 >        final CompletableFuture<Integer> j = (reverseArgs ? g : f);
1813 >        final CompletableFuture<Integer> k = (reverseArgs ? f : g);
1814  
1815 <        assertTrue(g.cancel(mayInterruptIfRunning));
1816 <        f.complete(v1);
1817 <        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1815 >        final CompletableFuture<Integer> h1 = m.applyToEither(j, k, r1);
1816 >        if (fFirst) {
1817 >            f.complete(v1);
1818 >            assertTrue(g.cancel(mayInterruptIfRunning));
1819 >        } else {
1820 >            assertTrue(g.cancel(mayInterruptIfRunning));
1821 >            f.complete(v1);
1822 >        }
1823 >        final CompletableFuture<Integer> h2 = m.applyToEither(j, k, r2);
1824  
1825          // unspecified behavior
2280        Integer v;
1826          try {
1827 <            assertEquals(inc(v1), h.join());
1828 <            assertEquals(1, r.invocationCount);
1827 >            assertEquals(inc(v1), h1.join());
1828 >            assertEquals(1, r1.invocationCount);
1829          } catch (CompletionException ok) {
1830 <            checkCompletedWithWrappedCancellationException(h);
1831 <            assertEquals(0, r.invocationCount);
1830 >            checkCompletedWithWrappedCancellationException(h1);
1831 >            assertEquals(0, r1.invocationCount);
1832          }
1833  
2289        checkCancelled(g);
2290        checkCompletedNormally(f, v1);
2291    }}
2292
2293    public void testApplyToEither_sourceCancelled4() {
2294        for (ExecutionMode m : ExecutionMode.values())
2295        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2296        for (Integer v1 : new Integer[] { 1, null })
2297    {
2298        final CompletableFuture<Integer> f = new CompletableFuture<>();
2299        final CompletableFuture<Integer> g = new CompletableFuture<>();
2300        final IncFunction r = new IncFunction();
2301
2302        assertTrue(f.cancel(mayInterruptIfRunning));
2303        g.complete(v1);
2304        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2305
2306        // unspecified behavior
2307        Integer v;
1834          try {
1835 <            assertEquals(inc(v1), h.join());
1836 <            assertEquals(1, r.invocationCount);
1835 >            assertEquals(inc(v1), h2.join());
1836 >            assertEquals(1, r2.invocationCount);
1837          } catch (CompletionException ok) {
1838 <            checkCompletedWithWrappedCancellationException(h);
1839 <            assertEquals(0, r.invocationCount);
1838 >            checkCompletedWithWrappedCancellationException(h2);
1839 >            assertEquals(0, r2.invocationCount);
1840          }
1841  
1842 <        checkCancelled(f);
1843 <        checkCompletedNormally(g, v1);
1842 >        checkCancelled(g);
1843 >        checkCompletedNormally(f, v1);
1844      }}
1845  
1846      /**
# Line 2630 | Line 2156 | public class CompletableFutureTest exten
2156      {
2157          final CompletableFuture<Integer> f = new CompletableFuture<>();
2158          final CompletableFuture<Integer> g = new CompletableFuture<>();
2159 <        final Noop r = new Noop();
2159 >        final Noop r = new Noop(m);
2160          final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2161  
2162          f.complete(v1);
# Line 2651 | Line 2177 | public class CompletableFutureTest exten
2177      {
2178          final CompletableFuture<Integer> f = new CompletableFuture<>();
2179          final CompletableFuture<Integer> g = new CompletableFuture<>();
2180 <        final Noop r = new Noop();
2180 >        final Noop r = new Noop(m);
2181          final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2182  
2183          g.complete(v2);
# Line 2672 | Line 2198 | public class CompletableFutureTest exten
2198      {
2199          final CompletableFuture<Integer> f = new CompletableFuture<>();
2200          final CompletableFuture<Integer> g = new CompletableFuture<>();
2201 <        final Noop r = new Noop();
2201 >        final Noop r = new Noop(m);
2202  
2203          f.complete(v1);
2204          g.complete(v2);
# Line 2694 | Line 2220 | public class CompletableFutureTest exten
2220      {
2221          final CompletableFuture<Integer> f = new CompletableFuture<>();
2222          final CompletableFuture<Integer> g = new CompletableFuture<>();
2223 <        final Noop r = new Noop();
2223 >        final Noop r = new Noop(m);
2224          final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2225          final CFException ex = new CFException();
2226  
# Line 2714 | Line 2240 | public class CompletableFutureTest exten
2240      {
2241          final CompletableFuture<Integer> f = new CompletableFuture<>();
2242          final CompletableFuture<Integer> g = new CompletableFuture<>();
2243 <        final Noop r = new Noop();
2243 >        final Noop r = new Noop(m);
2244          final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2245          final CFException ex = new CFException();
2246  
# Line 2734 | Line 2260 | public class CompletableFutureTest exten
2260      {
2261          final CompletableFuture<Integer> f = new CompletableFuture<>();
2262          final CompletableFuture<Integer> g = new CompletableFuture<>();
2263 <        final Noop r = new Noop();
2263 >        final Noop r = new Noop(m);
2264          final CFException ex = new CFException();
2265  
2266          g.completeExceptionally(ex);
# Line 2761 | Line 2287 | public class CompletableFutureTest exten
2287      {
2288          final CompletableFuture<Integer> f = new CompletableFuture<>();
2289          final CompletableFuture<Integer> g = new CompletableFuture<>();
2290 <        final Noop r = new Noop();
2290 >        final Noop r = new Noop(m);
2291          final CFException ex = new CFException();
2292  
2293          f.completeExceptionally(ex);
# Line 2829 | Line 2355 | public class CompletableFutureTest exten
2355      {
2356          final CompletableFuture<Integer> f = new CompletableFuture<>();
2357          final CompletableFuture<Integer> g = new CompletableFuture<>();
2358 <        final Noop r = new Noop();
2358 >        final Noop r = new Noop(m);
2359          final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2360  
2361          assertTrue(f.cancel(mayInterruptIfRunning));
# Line 2849 | Line 2375 | public class CompletableFutureTest exten
2375      {
2376          final CompletableFuture<Integer> f = new CompletableFuture<>();
2377          final CompletableFuture<Integer> g = new CompletableFuture<>();
2378 <        final Noop r = new Noop();
2378 >        final Noop r = new Noop(m);
2379          final CompletableFuture<Void> h = m.runAfterEither(f, g, r);
2380  
2381          assertTrue(g.cancel(mayInterruptIfRunning));
# Line 2869 | Line 2395 | public class CompletableFutureTest exten
2395      {
2396          final CompletableFuture<Integer> f = new CompletableFuture<>();
2397          final CompletableFuture<Integer> g = new CompletableFuture<>();
2398 <        final Noop r = new Noop();
2398 >        final Noop r = new Noop(m);
2399  
2400          assertTrue(g.cancel(mayInterruptIfRunning));
2401          f.complete(v1);
# Line 2896 | Line 2422 | public class CompletableFutureTest exten
2422      {
2423          final CompletableFuture<Integer> f = new CompletableFuture<>();
2424          final CompletableFuture<Integer> g = new CompletableFuture<>();
2425 <        final Noop r = new Noop();
2425 >        final Noop r = new Noop(m);
2426  
2427          assertTrue(f.cancel(mayInterruptIfRunning));
2428          g.complete(v1);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines