|
23 | 23 | </dom-repeat>
|
24 | 24 |
|
25 | 25 | <script>
|
26 |
| - |
| 26 | +/* |
27 | 27 | suite('single-element binding effects', function() {
|
28 | 28 |
|
29 | 29 | var el;
|
|
1504 | 1504 | assert.equal(fn.callCount, 2);
|
1505 | 1505 | });
|
1506 | 1506 |
|
| 1507 | +}); |
| 1508 | +*/ |
| 1509 | + |
| 1510 | +suite('a la carte usage of API', function() { |
| 1511 | + |
| 1512 | + class BaseClass extends Polymer.PropertyEffects(HTMLElement) { |
| 1513 | + connectedCallback() { |
| 1514 | + this.pcSpy = sinon.spy(); |
| 1515 | + this._flushProperties(); |
| 1516 | + } |
| 1517 | + _propertiesChanged(props, changedProps, oldProps) { |
| 1518 | + this.pcSpy(props, changedProps, oldProps); |
| 1519 | + super._propertiesChanged(props, changedProps, oldProps); |
| 1520 | + } |
| 1521 | + } |
| 1522 | + |
| 1523 | + test('generic property effect', function() { |
| 1524 | + class TestClass extends BaseClass { |
| 1525 | + constructor() { |
| 1526 | + super(); |
| 1527 | + this.observer = sinon.spy(); |
| 1528 | + } |
| 1529 | + } |
| 1530 | + let observer = sinon.spy(); |
| 1531 | + TestClass.addPropertyEffect('prop', TestClass.prototype.PROPERTY_EFFECT_TYPES.OBSERVE, { |
| 1532 | + fn: observer |
| 1533 | + }); |
| 1534 | + customElements.define('pe-pe', TestClass); |
| 1535 | + let el = document.createElement('pe-pe'); |
| 1536 | + document.body.appendChild(el); |
| 1537 | + assert.equal(observer.callCount, 0); |
| 1538 | + assert.equal(el.pcSpy.callCount, 0); |
| 1539 | + el.prop = true; |
| 1540 | + assert.equal(observer.callCount, 1); |
| 1541 | + assert.equal(el.pcSpy.callCount, 1); |
| 1542 | + el.prop = 'hithere'; |
| 1543 | + assert.equal(observer.callCount, 2); |
| 1544 | + assert.equal(el.pcSpy.callCount, 2); |
| 1545 | + el.prop = false; |
| 1546 | + assert.equal(observer.callCount, 3); |
| 1547 | + assert.equal(el.pcSpy.callCount, 3); |
| 1548 | + document.body.removeChild(el); |
| 1549 | + }); |
| 1550 | + |
| 1551 | + test('read only property', function() { |
| 1552 | + class TestClass extends BaseClass {} |
| 1553 | + TestClass.createReadOnlyProperty('prop', true); |
| 1554 | + customElements.define('pe-read-only', TestClass); |
| 1555 | + let el = document.createElement('pe-read-only'); |
| 1556 | + document.body.appendChild(el); |
| 1557 | + el.prop = true; |
| 1558 | + assert.equal(el.prop, undefined); |
| 1559 | + assert.equal(el.pcSpy.callCount, 0); |
| 1560 | + el._setProp(true); |
| 1561 | + assert.equal(el.prop, true); |
| 1562 | + assert.equal(el.pcSpy.callCount, 1); |
| 1563 | + el.prop = false; |
| 1564 | + assert.equal(el.prop, true); |
| 1565 | + assert.equal(el.pcSpy.callCount, 1); |
| 1566 | + document.body.removeChild(el); |
| 1567 | + }); |
| 1568 | + |
| 1569 | + test('reflected property', function() { |
| 1570 | + class TestClass extends BaseClass {} |
| 1571 | + TestClass.createReflectedProperty('prop', true); |
| 1572 | + customElements.define('pe-reflected', TestClass); |
| 1573 | + let el = document.createElement('pe-reflected'); |
| 1574 | + document.body.appendChild(el); |
| 1575 | + assert.equal(el.hasAttribute('prop'), false); |
| 1576 | + assert.equal(el.pcSpy.callCount, 0); |
| 1577 | + el.prop = true; |
| 1578 | + assert.equal(el.getAttribute('prop'), ''); |
| 1579 | + assert.equal(el.pcSpy.callCount, 1); |
| 1580 | + el.prop = 'hithere'; |
| 1581 | + assert.equal(el.getAttribute('prop'), 'hithere'); |
| 1582 | + assert.equal(el.pcSpy.callCount, 2); |
| 1583 | + el.prop = false; |
| 1584 | + assert.equal(el.hasAttribute('prop'), false); |
| 1585 | + assert.equal(el.pcSpy.callCount, 3); |
| 1586 | + document.body.removeChild(el); |
| 1587 | + }); |
| 1588 | + |
| 1589 | + test('property observer', function() { |
| 1590 | + class TestClass extends BaseClass { |
| 1591 | + constructor() { |
| 1592 | + super(); |
| 1593 | + this.observer = sinon.spy(); |
| 1594 | + } |
| 1595 | + } |
| 1596 | + TestClass.createPropertyObserver('prop', 'observer'); |
| 1597 | + customElements.define('pe-observer', TestClass); |
| 1598 | + let el = document.createElement('pe-observer'); |
| 1599 | + document.body.appendChild(el); |
| 1600 | + assert.equal(el.observer.callCount, 0); |
| 1601 | + assert.equal(el.pcSpy.callCount, 0); |
| 1602 | + el.prop = true; |
| 1603 | + assert.equal(el.observer.callCount, 1); |
| 1604 | + assert.equal(el.pcSpy.callCount, 1); |
| 1605 | + el.prop = 'hithere'; |
| 1606 | + assert.equal(el.observer.callCount, 2); |
| 1607 | + assert.equal(el.pcSpy.callCount, 2); |
| 1608 | + el.prop = false; |
| 1609 | + assert.equal(el.observer.callCount, 3); |
| 1610 | + assert.equal(el.pcSpy.callCount, 3); |
| 1611 | + document.body.removeChild(el); |
| 1612 | + }); |
| 1613 | + |
| 1614 | + test('method observer', function() { |
| 1615 | + class TestClass extends BaseClass { |
| 1616 | + constructor() { |
| 1617 | + super(); |
| 1618 | + this.observer = sinon.spy(); |
| 1619 | + } |
| 1620 | + } |
| 1621 | + TestClass.createMethodObserver('observer(a, b.c)'); |
| 1622 | + customElements.define('pe-method-observer', TestClass); |
| 1623 | + let el = document.createElement('pe-method-observer'); |
| 1624 | + document.body.appendChild(el); |
| 1625 | + assert.equal(el.observer.callCount, 0); |
| 1626 | + assert.equal(el.pcSpy.callCount, 0); |
| 1627 | + el.a = 'a'; |
| 1628 | + assert.equal(el.observer.callCount, 1); |
| 1629 | + assert.deepEqual(el.observer.getCall(0).args, ['a', undefined]); |
| 1630 | + assert.equal(el.pcSpy.callCount, 1); |
| 1631 | + el.b = {c: 'c'}; |
| 1632 | + assert.equal(el.observer.callCount, 2); |
| 1633 | + assert.deepEqual(el.observer.getCall(1).args, ['a', 'c']); |
| 1634 | + assert.equal(el.pcSpy.callCount, 2); |
| 1635 | + el.setProperties({ |
| 1636 | + a: 'A', |
| 1637 | + b: {c: 'C'} |
| 1638 | + }) |
| 1639 | + assert.equal(el.observer.callCount, 3); |
| 1640 | + assert.deepEqual(el.observer.getCall(2).args, ['A', 'C']); |
| 1641 | + assert.equal(el.pcSpy.callCount, 3); |
| 1642 | + document.body.removeChild(el); |
| 1643 | + }); |
| 1644 | + |
| 1645 | + test('computed property', function() { |
| 1646 | + class TestClass extends BaseClass { |
| 1647 | + constructor() { |
| 1648 | + super(); |
| 1649 | + this.compute = sinon.spy(function(a, c) { return a + c; }); |
| 1650 | + } |
| 1651 | + } |
| 1652 | + TestClass.createComputedProperty('prop', 'compute(a, b.c)'); |
| 1653 | + customElements.define('pe-computed', TestClass); |
| 1654 | + let el = document.createElement('pe-computed'); |
| 1655 | + document.body.appendChild(el); |
| 1656 | + assert.equal(el.compute.callCount, 0); |
| 1657 | + assert.equal(el.pcSpy.callCount, 0); |
| 1658 | + el.a = 'a'; |
| 1659 | + assert.equal(el.compute.callCount, 1); |
| 1660 | + assert.deepEqual(el.compute.getCall(0).args, ['a', undefined]); |
| 1661 | + assert.equal(el.prop, 'aundefined'); |
| 1662 | + assert.equal(el.pcSpy.callCount, 1); |
| 1663 | + el.b = {c: 'c'}; |
| 1664 | + assert.equal(el.compute.callCount, 2); |
| 1665 | + assert.deepEqual(el.compute.getCall(1).args, ['a', 'c']); |
| 1666 | + assert.equal(el.prop, 'ac'); |
| 1667 | + assert.equal(el.pcSpy.callCount, 2); |
| 1668 | + el.setProperties({ |
| 1669 | + a: 'A', |
| 1670 | + b: {c: 'C'} |
| 1671 | + }) |
| 1672 | + assert.equal(el.compute.callCount, 3); |
| 1673 | + assert.deepEqual(el.compute.getCall(2).args, ['A', 'C']); |
| 1674 | + assert.equal(el.prop, 'AC'); |
| 1675 | + assert.equal(el.pcSpy.callCount, 3); |
| 1676 | + document.body.removeChild(el); |
| 1677 | + }); |
| 1678 | + |
| 1679 | + test('notifying property', function() { |
| 1680 | + class TestClass extends BaseClass { } |
| 1681 | + TestClass.createNotifyingProperty('prop'); |
| 1682 | + customElements.define('pe-notify', TestClass); |
| 1683 | + let el = document.createElement('pe-notify'); |
| 1684 | + let handler = sinon.spy(); |
| 1685 | + el.addEventListener('prop-changed', handler); |
| 1686 | + document.body.appendChild(el); |
| 1687 | + assert.equal(handler.callCount, 0); |
| 1688 | + assert.equal(el.pcSpy.callCount, 0); |
| 1689 | + el.prop = 'prop'; |
| 1690 | + assert.equal(handler.callCount, 1); |
| 1691 | + assert.equal(handler.getCall(0).args[0].detail.value, 'prop'); |
| 1692 | + assert.equal(el.pcSpy.callCount, 1); |
| 1693 | + el.prop += '+'; |
| 1694 | + assert.equal(handler.callCount, 2); |
| 1695 | + assert.equal(handler.getCall(1).args[0].detail.value, 'prop+'); |
| 1696 | + document.body.removeChild(el); |
| 1697 | + }); |
| 1698 | + |
| 1699 | + test('bound template', function() { |
| 1700 | + let template = document.createElement('template'); |
| 1701 | + template.innerHTML = '<div>[[prop]]</div><button on-click="handler"></button>'; |
| 1702 | + class TestClass extends BaseClass { |
| 1703 | + connectedCallback() { |
| 1704 | + this.handler = sinon.spy(); |
| 1705 | + this.attachShadow({mode:'open'}).appendChild(this._stampTemplate(template)); |
| 1706 | + super.connectedCallback(); |
| 1707 | + } |
| 1708 | + } |
| 1709 | + TestClass.bindTemplate(template); |
| 1710 | + customElements.define('pe-template', TestClass); |
| 1711 | + let el = document.createElement('pe-template'); |
| 1712 | + document.body.appendChild(el); |
| 1713 | + assert.equal(el.handler.callCount, 0); |
| 1714 | + el.prop = 'prop'; |
| 1715 | + assert.equal(el.shadowRoot.querySelector('div').textContent, 'prop'); |
| 1716 | + el.shadowRoot.querySelector('button').click(); |
| 1717 | + assert.equal(el.handler.callCount, 1); |
| 1718 | + document.body.removeChild(el); |
| 1719 | + }); |
| 1720 | + |
1507 | 1721 | });
|
1508 | 1722 |
|
1509 | 1723 | </script>
|
|
0 commit comments