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.53 by jsr166, Mon Jun 2 20:20:47 2014 UTC vs.
Revision 1.54 by jsr166, Mon Jun 2 21:32:24 2014 UTC

# Line 1474 | Line 1474 | public class CompletableFutureTest exten
1474       * runAfterBoth result completes normally after normal
1475       * completion of sources
1476       */
1477 <    public void testRunAfterBoth_normalCompletion1() {
1478 <        for (ExecutionMode m : ExecutionMode.values())
1479 <        for (Integer v1 : new Integer[] { 1, null })
1480 <        for (Integer v2 : new Integer[] { 2, null })
1481 <    {
1482 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1483 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1484 <        final Noop r = new Noop();
1485 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1486 <
1487 <        f.complete(v1);
1488 <        checkIncomplete(h);
1489 <        assertEquals(0, r.invocationCount);
1490 <        g.complete(v2);
1491 <
1492 <        checkCompletedNormally(h, null);
1493 <        assertEquals(1, r.invocationCount);
1494 <        checkCompletedNormally(f, v1);
1495 <        checkCompletedNormally(g, v2);
1496 <    }}
1497 <
1498 <    public void testRunAfterBoth_normalCompletion2() {
1499 <        for (ExecutionMode m : ExecutionMode.values())
1500 <        for (Integer v1 : new Integer[] { 1, null })
1501 <        for (Integer v2 : new Integer[] { 2, null })
1502 <    {
1503 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1504 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1505 <        final Noop r = new Noop();
1506 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1507 <
1508 <        g.complete(v2);
1509 <        checkIncomplete(h);
1510 <        assertEquals(0, r.invocationCount);
1511 <        f.complete(v1);
1512 <
1513 <        checkCompletedNormally(h, null);
1514 <        assertEquals(1, r.invocationCount);
1515 <        checkCompletedNormally(f, v1);
1516 <        checkCompletedNormally(g, v2);
1517 <    }}
1518 <
1519 <    public void testRunAfterBoth_normalCompletion3() {
1477 >    public void testRunAfterBoth_normalCompletion() {
1478          for (ExecutionMode m : ExecutionMode.values())
1479 +        for (boolean createIncomplete : new boolean[] { true, false })
1480 +        for (boolean fFirst : new boolean[] { true, false })
1481          for (Integer v1 : new Integer[] { 1, null })
1482          for (Integer v2 : new Integer[] { 2, null })
1483      {
# Line 1525 | Line 1485 | public class CompletableFutureTest exten
1485          final CompletableFuture<Integer> g = new CompletableFuture<>();
1486          final Noop r = new Noop();
1487  
1488 <        g.complete(v2);
1489 <        f.complete(v1);
1490 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1531 <
1532 <        checkCompletedNormally(h, null);
1533 <        assertEquals(1, r.invocationCount);
1534 <        checkCompletedNormally(f, v1);
1535 <        checkCompletedNormally(g, v2);
1536 <    }}
1537 <
1538 <    public void testRunAfterBoth_normalCompletion4() {
1539 <        for (ExecutionMode m : ExecutionMode.values())
1540 <        for (Integer v1 : new Integer[] { 1, null })
1541 <        for (Integer v2 : new Integer[] { 2, null })
1542 <    {
1543 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1544 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1545 <        final Noop r = new Noop();
1546 <
1547 <        f.complete(v1);
1548 <        g.complete(v2);
1488 >        if (fFirst) f.complete(v1); else g.complete(v2);
1489 >        if (!createIncomplete)
1490 >            if (!fFirst) f.complete(v1); else g.complete(v2);
1491          final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1492 +        if (createIncomplete) {
1493 +            checkIncomplete(h);
1494 +            assertEquals(0, r.invocationCount);
1495 +            if (!fFirst) f.complete(v1); else g.complete(v2);
1496 +        }
1497  
1498          checkCompletedNormally(h, null);
1499          assertEquals(1, r.invocationCount);
# Line 1558 | Line 1505 | public class CompletableFutureTest exten
1505       * runAfterBoth result completes exceptionally after exceptional
1506       * completion of either source
1507       */
1508 <    public void testRunAfterBoth_exceptionalCompletion1() {
1562 <        for (ExecutionMode m : ExecutionMode.values())
1563 <        for (Integer v1 : new Integer[] { 1, null })
1564 <    {
1565 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1566 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1567 <        final Noop r = new Noop();
1568 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1569 <        final CFException ex = new CFException();
1570 <
1571 <        f.completeExceptionally(ex);
1572 <        checkIncomplete(h);
1573 <        g.complete(v1);
1574 <
1575 <        checkCompletedWithWrappedCFException(h, ex);
1576 <        checkCompletedWithWrappedCFException(f, ex);
1577 <        assertEquals(0, r.invocationCount);
1578 <        checkCompletedNormally(g, v1);
1579 <    }}
1580 <
1581 <    public void testRunAfterBoth_exceptionalCompletion2() {
1508 >    public void testRunAfterBoth_exceptionalCompletion() {
1509          for (ExecutionMode m : ExecutionMode.values())
1510 +        for (boolean createIncomplete : new boolean[] { true, false })
1511 +        for (boolean fFirst : new boolean[] { true, false })
1512          for (Integer v1 : new Integer[] { 1, null })
1513      {
1514          final CompletableFuture<Integer> f = new CompletableFuture<>();
1515          final CompletableFuture<Integer> g = new CompletableFuture<>();
1587        final Noop r = new Noop();
1588        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1516          final CFException ex = new CFException();
1590
1591        g.completeExceptionally(ex);
1592        checkIncomplete(h);
1593        f.complete(v1);
1594
1595        checkCompletedWithWrappedCFException(h, ex);
1596        checkCompletedWithWrappedCFException(g, ex);
1597        assertEquals(0, r.invocationCount);
1598        checkCompletedNormally(f, v1);
1599    }}
1600
1601    public void testRunAfterBoth_exceptionalCompletion3() {
1602        for (ExecutionMode m : ExecutionMode.values())
1603        for (Integer v1 : new Integer[] { 1, null })
1604    {
1605        final CompletableFuture<Integer> f = new CompletableFuture<>();
1606        final CompletableFuture<Integer> g = new CompletableFuture<>();
1517          final Noop r = new Noop();
1608        final CFException ex = new CFException();
1518  
1519 <        g.completeExceptionally(ex);
1520 <        f.complete(v1);
1521 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1522 <
1523 <        checkCompletedWithWrappedCFException(h, ex);
1524 <        checkCompletedWithWrappedCFException(g, ex);
1525 <        assertEquals(0, r.invocationCount);
1526 <        checkCompletedNormally(f, v1);
1618 <    }}
1619 <
1620 <    public void testRunAfterBoth_exceptionalCompletion4() {
1621 <        for (ExecutionMode m : ExecutionMode.values())
1622 <        for (Integer v1 : new Integer[] { 1, null })
1623 <    {
1624 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1625 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1626 <        final Noop r = new Noop();
1627 <        final CFException ex = new CFException();
1628 <
1629 <        f.completeExceptionally(ex);
1630 <        g.complete(v1);
1631 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1519 >        (fFirst ? f : g).complete(v1);
1520 >        if (!createIncomplete)
1521 >            (!fFirst ? f : g).completeExceptionally(ex);
1522 >        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1523 >        if (createIncomplete) {
1524 >            checkIncomplete(h);
1525 >            (!fFirst ? f : g).completeExceptionally(ex);
1526 >        }
1527  
1528          checkCompletedWithWrappedCFException(h, ex);
1634        checkCompletedWithWrappedCFException(f, ex);
1529          assertEquals(0, r.invocationCount);
1530 <        checkCompletedNormally(g, v1);
1530 >        checkCompletedNormally(fFirst ? f : g, v1);
1531 >        checkCompletedWithWrappedCFException(!fFirst ? f : g, ex);
1532      }}
1533  
1534      /**
1535       * runAfterBoth result completes exceptionally if action does
1536       */
1537 <    public void testRunAfterBoth_actionFailed1() {
1643 <        for (ExecutionMode m : ExecutionMode.values())
1644 <        for (Integer v1 : new Integer[] { 1, null })
1645 <        for (Integer v2 : new Integer[] { 2, null })
1646 <    {
1647 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1648 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1649 <        final FailingRunnable r = new FailingRunnable();
1650 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1651 <
1652 <        f.complete(v1);
1653 <        checkIncomplete(h);
1654 <        g.complete(v2);
1655 <
1656 <        checkCompletedWithWrappedCFException(h);
1657 <        checkCompletedNormally(f, v1);
1658 <        checkCompletedNormally(g, v2);
1659 <    }}
1660 <
1661 <    public void testRunAfterBoth_actionFailed2() {
1537 >    public void testRunAfterBoth_actionFailed() {
1538          for (ExecutionMode m : ExecutionMode.values())
1539 +        for (boolean fFirst : new boolean[] { true, false })
1540          for (Integer v1 : new Integer[] { 1, null })
1541          for (Integer v2 : new Integer[] { 2, null })
1542      {
1543          final CompletableFuture<Integer> f = new CompletableFuture<>();
1544          final CompletableFuture<Integer> g = new CompletableFuture<>();
1545          final FailingRunnable r = new FailingRunnable();
1669        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1546  
1547 <        g.complete(v2);
1548 <        checkIncomplete(h);
1549 <        f.complete(v1);
1547 >        CompletableFuture<Void> h1 = m.runAfterBoth(f, g, r);
1548 >        if (fFirst) {
1549 >            f.complete(v1);
1550 >            g.complete(v2);
1551 >        } else {
1552 >            g.complete(v2);
1553 >            f.complete(v1);
1554 >        }
1555 >        CompletableFuture<Void> h2 = m.runAfterBoth(f, g, r);
1556  
1557 <        checkCompletedWithWrappedCFException(h);
1557 >        checkCompletedWithWrappedCFException(h1);
1558 >        checkCompletedWithWrappedCFException(h2);
1559          checkCompletedNormally(f, v1);
1560          checkCompletedNormally(g, v2);
1561      }}
# Line 1680 | Line 1563 | public class CompletableFutureTest exten
1563      /**
1564       * runAfterBoth result completes exceptionally if either source cancelled
1565       */
1566 <    public void testRunAfterBoth_sourceCancelled1() {
1566 >    public void testRunAfterBoth_sourceCancelled() {
1567          for (ExecutionMode m : ExecutionMode.values())
1568          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1569 +        for (boolean createIncomplete : new boolean[] { true, false })
1570 +        for (boolean fFirst : new boolean[] { true, false })
1571          for (Integer v1 : new Integer[] { 1, null })
1572      {
1573          final CompletableFuture<Integer> f = new CompletableFuture<>();
1574          final CompletableFuture<Integer> g = new CompletableFuture<>();
1575          final Noop r = new Noop();
1691        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1576  
1693        assertTrue(f.cancel(mayInterruptIfRunning));
1694        checkIncomplete(h);
1695        g.complete(v1);
1577  
1578 <        checkCompletedWithWrappedCancellationException(h);
1579 <        checkCancelled(f);
1580 <        assertEquals(0, r.invocationCount);
1700 <        checkCompletedNormally(g, v1);
1701 <    }}
1702 <
1703 <    public void testRunAfterBoth_sourceCancelled2() {
1704 <        for (ExecutionMode m : ExecutionMode.values())
1705 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1706 <        for (Integer v1 : new Integer[] { 1, null })
1707 <    {
1708 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1709 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1710 <        final Noop r = new Noop();
1711 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1712 <
1713 <        assertTrue(g.cancel(mayInterruptIfRunning));
1714 <        checkIncomplete(h);
1715 <        f.complete(v1);
1716 <
1717 <        checkCompletedWithWrappedCancellationException(h);
1718 <        checkCancelled(g);
1719 <        assertEquals(0, r.invocationCount);
1720 <        checkCompletedNormally(f, v1);
1721 <    }}
1722 <
1723 <    public void testRunAfterBoth_sourceCancelled3() {
1724 <        for (ExecutionMode m : ExecutionMode.values())
1725 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1726 <        for (Integer v1 : new Integer[] { 1, null })
1727 <    {
1728 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1729 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1730 <        final Noop r = new Noop();
1731 <
1732 <        assertTrue(g.cancel(mayInterruptIfRunning));
1733 <        f.complete(v1);
1734 <        final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1735 <
1736 <        checkCompletedWithWrappedCancellationException(h);
1737 <        checkCancelled(g);
1738 <        assertEquals(0, r.invocationCount);
1739 <        checkCompletedNormally(f, v1);
1740 <    }}
1741 <
1742 <    public void testRunAfterBoth_sourceCancelled4() {
1743 <        for (ExecutionMode m : ExecutionMode.values())
1744 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1745 <        for (Integer v1 : new Integer[] { 1, null })
1746 <    {
1747 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1748 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1749 <        final Noop r = new Noop();
1750 <
1751 <        assertTrue(f.cancel(mayInterruptIfRunning));
1752 <        g.complete(v1);
1578 >        (fFirst ? f : g).complete(v1);
1579 >        if (!createIncomplete)
1580 >            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1581          final CompletableFuture<Void> h = m.runAfterBoth(f, g, r);
1582 +        if (createIncomplete) {
1583 +            checkIncomplete(h);
1584 +            assertTrue((!fFirst ? f : g).cancel(mayInterruptIfRunning));
1585 +        }
1586  
1587          checkCompletedWithWrappedCancellationException(h);
1588 <        checkCancelled(f);
1588 >        checkCancelled(!fFirst ? f : g);
1589          assertEquals(0, r.invocationCount);
1590 <        checkCompletedNormally(g, v1);
1590 >        checkCompletedNormally(fFirst ? f : g, v1);
1591      }}
1592  
1593      /**
1594       * applyToEither result completes normally after normal completion
1595       * of either source
1596       */
1597 <    public void testApplyToEither_normalCompletion1() {
1597 >    public void testApplyToEither_normalCompletion() {
1598          for (ExecutionMode m : ExecutionMode.values())
1599 +        for (boolean createIncomplete : new boolean[] { true, false })
1600 +        for (boolean fFirst : new boolean[] { true, false })
1601          for (Integer v1 : new Integer[] { 1, null })
1602          for (Integer v2 : new Integer[] { 2, null })
1603      {
1604          final CompletableFuture<Integer> f = new CompletableFuture<>();
1605          final CompletableFuture<Integer> g = new CompletableFuture<>();
1606          final IncFunction r = new IncFunction();
1773        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1607  
1608 <        f.complete(v1);
1609 <        checkCompletedNormally(h, inc(v1));
1610 <        g.complete(v2);
1608 >        if (!createIncomplete)
1609 >            if (fFirst) f.complete(v1); else g.complete(v2);
1610 >        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1611 >        if (createIncomplete) {
1612 >            checkIncomplete(h);
1613 >            assertEquals(0, r.invocationCount);
1614 >            if (fFirst) f.complete(v1); else g.complete(v2);
1615 >        }
1616 >        checkCompletedNormally(h, inc(fFirst ? v1 : v2));
1617 >        if (!fFirst) f.complete(v1); else g.complete(v2);
1618  
1619          checkCompletedNormally(f, v1);
1620          checkCompletedNormally(g, v2);
1621 <        checkCompletedNormally(h, inc(v1));
1621 >        checkCompletedNormally(h, inc(fFirst ? v1 : v2));
1622      }}
1623  
1624 <    public void testApplyToEither_normalCompletion2() {
1624 >    public void testApplyToEither_normalCompletionBothAvailable() {
1625          for (ExecutionMode m : ExecutionMode.values())
1626 +        for (boolean fFirst : new boolean[] { true, false })
1627          for (Integer v1 : new Integer[] { 1, null })
1628          for (Integer v2 : new Integer[] { 2, null })
1629      {
1630          final CompletableFuture<Integer> f = new CompletableFuture<>();
1631          final CompletableFuture<Integer> g = new CompletableFuture<>();
1632          final IncFunction r = new IncFunction();
1792        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1793
1794        g.complete(v2);
1795        checkCompletedNormally(h, inc(v2));
1796        f.complete(v1);
1633  
1634 <        checkCompletedNormally(f, v1);
1635 <        checkCompletedNormally(g, v2);
1636 <        checkCompletedNormally(h, inc(v2));
1637 <        }}
1638 <
1639 <    public void testApplyToEither_normalCompletion3() {
1640 <        for (ExecutionMode m : ExecutionMode.values())
1805 <        for (Integer v1 : new Integer[] { 1, null })
1806 <        for (Integer v2 : new Integer[] { 2, null })
1807 <    {
1808 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1809 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1810 <        final IncFunction r = new IncFunction();
1634 >        if (fFirst) {
1635 >            f.complete(v1);
1636 >            g.complete(v2);
1637 >        } else {
1638 >            g.complete(v2);
1639 >            f.complete(v1);
1640 >        }
1641  
1812        f.complete(v1);
1813        g.complete(v2);
1642          final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1643  
1644          checkCompletedNormally(f, v1);
# Line 1828 | Line 1656 | public class CompletableFutureTest exten
1656       */
1657      public void testApplyToEither_exceptionalCompletion1() {
1658          for (ExecutionMode m : ExecutionMode.values())
1659 +        for (boolean createIncomplete : new boolean[] { true, false })
1660 +        for (boolean fFirst : 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<>();
1835        final IncFunction r = new IncFunction();
1836        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1665          final CFException ex = new CFException();
1838
1839        f.completeExceptionally(ex);
1840        checkCompletedWithWrappedCFException(h, ex);
1841        g.complete(v1);
1842
1843        assertEquals(0, r.invocationCount);
1844        checkCompletedNormally(g, v1);
1845        checkCompletedWithWrappedCFException(f, ex);
1846        checkCompletedWithWrappedCFException(h, ex);
1847    }}
1848
1849    public void testApplyToEither_exceptionalCompletion2() {
1850        for (ExecutionMode m : ExecutionMode.values())
1851        for (Integer v1 : new Integer[] { 1, null })
1852    {
1853        final CompletableFuture<Integer> f = new CompletableFuture<>();
1854        final CompletableFuture<Integer> g = new CompletableFuture<>();
1666          final IncFunction r = new IncFunction();
1667 +
1668 +        if (!createIncomplete) (fFirst ? f : g).completeExceptionally(ex);
1669          final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1670 <        final CFException ex = new CFException();
1670 >        if (createIncomplete) {
1671 >            checkIncomplete(h);
1672 >            assertEquals(0, r.invocationCount);
1673 >            (fFirst ? f : g).completeExceptionally(ex);
1674 >        }
1675  
1859        g.completeExceptionally(ex);
1676          checkCompletedWithWrappedCFException(h, ex);
1677 <        f.complete(v1);
1677 >        (!fFirst ? f : g).complete(v1);
1678  
1679          assertEquals(0, r.invocationCount);
1680 <        checkCompletedNormally(f, v1);
1681 <        checkCompletedWithWrappedCFException(g, ex);
1680 >        checkCompletedNormally(!fFirst ? f : g, v1);
1681 >        checkCompletedWithWrappedCFException(fFirst ? f : g, ex);
1682          checkCompletedWithWrappedCFException(h, ex);
1683      }}
1684  
1685 <    public void testApplyToEither_exceptionalCompletion3() {
1685 >    public void testApplyToEither_exceptionalCompletion2() {
1686          for (ExecutionMode m : ExecutionMode.values())
1687 +        for (boolean reverseArgs : new boolean[] { true, false })
1688 +        for (boolean fFirst : new boolean[] { true, false })
1689          for (Integer v1 : new Integer[] { 1, null })
1690      {
1691          final CompletableFuture<Integer> f = new CompletableFuture<>();
1692          final CompletableFuture<Integer> g = new CompletableFuture<>();
1693 <        final IncFunction r = new IncFunction();
1693 >        final IncFunction r1 = new IncFunction();
1694 >        final IncFunction r2 = new IncFunction();
1695          final CFException ex = new CFException();
1696 <
1697 <        g.completeExceptionally(ex);
1698 <        f.complete(v1);
1699 <        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1696 >        final CompletableFuture<Integer> j = (reverseArgs ? g : f);
1697 >        final CompletableFuture<Integer> k = (reverseArgs ? f : g);
1698 >        final CompletableFuture<Integer> h1 = m.applyToEither(j, k, r1);
1699 >        if (fFirst) {
1700 >            f.complete(v1);
1701 >            g.completeExceptionally(ex);
1702 >        } else {
1703 >            g.completeExceptionally(ex);
1704 >            f.complete(v1);
1705 >        }
1706 >        final CompletableFuture<Integer> h2 = m.applyToEither(j, k, r2);
1707  
1708          // unspecified behavior
1883        Integer v;
1709          try {
1710 <            assertEquals(inc(v1), h.join());
1711 <            assertEquals(1, r.invocationCount);
1710 >            assertEquals(inc(v1), h1.join());
1711 >            assertEquals(1, r1.invocationCount);
1712          } catch (CompletionException ok) {
1713 <            checkCompletedWithWrappedCFException(h, ex);
1714 <            assertEquals(0, r.invocationCount);
1713 >            checkCompletedWithWrappedCFException(h1, ex);
1714 >            assertEquals(0, r1.invocationCount);
1715          }
1716  
1892        checkCompletedWithWrappedCFException(g, ex);
1893        checkCompletedNormally(f, v1);
1894    }}
1895
1896    public void testApplyToEither_exceptionalCompletion4() {
1897        for (ExecutionMode m : ExecutionMode.values())
1898        for (Integer v1 : new Integer[] { 1, null })
1899    {
1900        final CompletableFuture<Integer> f = new CompletableFuture<>();
1901        final CompletableFuture<Integer> g = new CompletableFuture<>();
1902        final IncFunction r = new IncFunction();
1903        final CFException ex = new CFException();
1904
1905        f.completeExceptionally(ex);
1906        g.complete(v1);
1907        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1908
1909        // unspecified behavior
1910        Integer v;
1717          try {
1718 <            assertEquals(inc(v1), h.join());
1719 <            assertEquals(1, r.invocationCount);
1718 >            assertEquals(inc(v1), h2.join());
1719 >            assertEquals(1, r2.invocationCount);
1720          } catch (CompletionException ok) {
1721 <            checkCompletedWithWrappedCFException(h, ex);
1722 <            assertEquals(0, r.invocationCount);
1721 >            checkCompletedWithWrappedCFException(h2, ex);
1722 >            assertEquals(0, r2.invocationCount);
1723          }
1724  
1725 <        checkCompletedWithWrappedCFException(f, ex);
1726 <        checkCompletedNormally(g, v1);
1725 >        checkCompletedWithWrappedCFException(g, ex);
1726 >        checkCompletedNormally(f, v1);
1727      }}
1728  
1729      /**
# Line 1963 | Line 1769 | public class CompletableFutureTest exten
1769      public void testApplyToEither_sourceCancelled1() {
1770          for (ExecutionMode m : ExecutionMode.values())
1771          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1772 +        for (boolean createIncomplete : new boolean[] { true, false })
1773 +        for (boolean fFirst : new boolean[] { true, false })
1774          for (Integer v1 : new Integer[] { 1, null })
1775      {
1776          final CompletableFuture<Integer> f = new CompletableFuture<>();
1777          final CompletableFuture<Integer> g = new CompletableFuture<>();
1778          final IncFunction r = new IncFunction();
1971        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1972
1973        assertTrue(f.cancel(mayInterruptIfRunning));
1974        checkCompletedWithWrappedCancellationException(h);
1975        g.complete(v1);
1779  
1780 <        checkCancelled(f);
1978 <        assertEquals(0, r.invocationCount);
1979 <        checkCompletedNormally(g, v1);
1980 <        checkCompletedWithWrappedCancellationException(h);
1981 <    }}
1982 <
1983 <    public void testApplyToEither_sourceCancelled2() {
1984 <        for (ExecutionMode m : ExecutionMode.values())
1985 <        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1986 <        for (Integer v1 : new Integer[] { 1, null })
1987 <    {
1988 <        final CompletableFuture<Integer> f = new CompletableFuture<>();
1989 <        final CompletableFuture<Integer> g = new CompletableFuture<>();
1990 <        final IncFunction r = new IncFunction();
1780 >        if (!createIncomplete) assertTrue((fFirst ? f : g).cancel(mayInterruptIfRunning));
1781          final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1782 +        if (createIncomplete) {
1783 +            checkIncomplete(h);
1784 +            assertEquals(0, r.invocationCount);
1785 +            assertTrue((fFirst ? f : g).cancel(mayInterruptIfRunning));
1786 +        }
1787  
1993        assertTrue(g.cancel(mayInterruptIfRunning));
1788          checkCompletedWithWrappedCancellationException(h);
1789 <        f.complete(v1);
1789 >        (!fFirst ? f : g).complete(v1);
1790  
1997        checkCancelled(g);
1791          assertEquals(0, r.invocationCount);
1792 <        checkCompletedNormally(f, v1);
1792 >        checkCompletedNormally(!fFirst ? f : g, v1);
1793 >        checkCancelled(fFirst ? f : g);
1794          checkCompletedWithWrappedCancellationException(h);
1795      }}
1796  
1797 <    public void testApplyToEither_sourceCancelled3() {
1797 >    public void testApplyToEither_sourceCancelled2() {
1798          for (ExecutionMode m : ExecutionMode.values())
1799          for (boolean mayInterruptIfRunning : new boolean[] { true, false })
1800 +        for (boolean reverseArgs : new boolean[] { true, false })
1801 +        for (boolean fFirst : new boolean[] { true, false })
1802          for (Integer v1 : new Integer[] { 1, null })
1803      {
1804          final CompletableFuture<Integer> f = new CompletableFuture<>();
1805          final CompletableFuture<Integer> g = new CompletableFuture<>();
1806 <        final IncFunction r = new IncFunction();
1806 >        final IncFunction r1 = new IncFunction();
1807 >        final IncFunction r2 = new IncFunction();
1808 >        final CFException ex = new CFException();
1809 >        final CompletableFuture<Integer> j = (reverseArgs ? g : f);
1810 >        final CompletableFuture<Integer> k = (reverseArgs ? f : g);
1811  
1812 <        assertTrue(g.cancel(mayInterruptIfRunning));
1813 <        f.complete(v1);
1814 <        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
1812 >        final CompletableFuture<Integer> h1 = m.applyToEither(j, k, r1);
1813 >        if (fFirst) {
1814 >            f.complete(v1);
1815 >            assertTrue(g.cancel(mayInterruptIfRunning));
1816 >        } else {
1817 >            assertTrue(g.cancel(mayInterruptIfRunning));
1818 >            f.complete(v1);
1819 >        }
1820 >        final CompletableFuture<Integer> h2 = m.applyToEither(j, k, r2);
1821  
1822          // unspecified behavior
2017        Integer v;
1823          try {
1824 <            assertEquals(inc(v1), h.join());
1825 <            assertEquals(1, r.invocationCount);
1824 >            assertEquals(inc(v1), h1.join());
1825 >            assertEquals(1, r1.invocationCount);
1826          } catch (CompletionException ok) {
1827 <            checkCompletedWithWrappedCancellationException(h);
1828 <            assertEquals(0, r.invocationCount);
1827 >            checkCompletedWithWrappedCancellationException(h1);
1828 >            assertEquals(0, r1.invocationCount);
1829          }
1830  
2026        checkCancelled(g);
2027        checkCompletedNormally(f, v1);
2028    }}
2029
2030    public void testApplyToEither_sourceCancelled4() {
2031        for (ExecutionMode m : ExecutionMode.values())
2032        for (boolean mayInterruptIfRunning : new boolean[] { true, false })
2033        for (Integer v1 : new Integer[] { 1, null })
2034    {
2035        final CompletableFuture<Integer> f = new CompletableFuture<>();
2036        final CompletableFuture<Integer> g = new CompletableFuture<>();
2037        final IncFunction r = new IncFunction();
2038
2039        assertTrue(f.cancel(mayInterruptIfRunning));
2040        g.complete(v1);
2041        final CompletableFuture<Integer> h = m.applyToEither(f, g, r);
2042
2043        // unspecified behavior
2044        Integer v;
1831          try {
1832 <            assertEquals(inc(v1), h.join());
1833 <            assertEquals(1, r.invocationCount);
1832 >            assertEquals(inc(v1), h2.join());
1833 >            assertEquals(1, r2.invocationCount);
1834          } catch (CompletionException ok) {
1835 <            checkCompletedWithWrappedCancellationException(h);
1836 <            assertEquals(0, r.invocationCount);
1835 >            checkCompletedWithWrappedCancellationException(h2);
1836 >            assertEquals(0, r2.invocationCount);
1837          }
1838  
1839 <        checkCancelled(f);
1840 <        checkCompletedNormally(g, v1);
1839 >        checkCancelled(g);
1840 >        checkCompletedNormally(f, v1);
1841      }}
1842  
1843      /**

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines