Item 1
`, html`Item 2
`, html`Item 3
`] const wrapped = html`[${items}]` root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
Item 2
Item 3
]') const [item1, item2] = el.children items.pop() root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
Item 2
]') assert_eq(el.children[0], item1) assert_eq(el.children[1], item2) items.pop() root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
]') assert_eq(el.children[0], item1) items.pop() root.render(wrapped) assert_eq(el.innerHTML, '[]') }) test('swap operation works correctly on lists', () => { const { root, el } = setup() const items = [html`Item 1
`, html`Item 2
`, html`Item 3
`] const wrapped = html`[${items}]` root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
Item 2
Item 3
]') const [item1, item2, item3] = el.children // swap the first two items ;[items[0], items[1]] = [items[1], items[0]] root.render(wrapped) assert_eq(el.innerHTML, '[Item 2
Item 1
Item 3
]') assert_eq(el.children[0], item2) assert_eq(el.children[1], item1) assert_eq(el.children[2], item3) // swap the last two items ;[items[1], items[2]] = [items[2], items[1]] root.render(wrapped) assert_eq(el.innerHTML, '[Item 2
Item 3
Item 1
]') assert_eq(el.children[0], item2) assert_eq(el.children[1], item3) assert_eq(el.children[2], item1) // swap the first and last items ;[items[0], items[2]] = [items[2], items[0]] root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
Item 3
Item 2
]') assert_eq(el.children[0], item1) assert_eq(el.children[1], item3) assert_eq(el.children[2], item2) // put things back ;[items[1], items[2]] = [items[2], items[1]] root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
Item 2
Item 3
]') assert_eq(el.children[0], item1) assert_eq(el.children[1], item2) assert_eq(el.children[2], item3) }) test('shift operation works correctly on lists', () => { const { root, el } = setup() const items = [html`Item 1
`, html`Item 2
`, html`Item 3
`] const wrapped = html`[${items}]` root.render(wrapped) assert_eq(el.innerHTML, '[Item 1
Item 2
Item 3
]') const [, item2, item3] = el.children items.shift() root.render(wrapped) assert_eq(el.innerHTML, '[Item 2
Item 3
]') assert_eq(el.children[0], item2) assert_eq(el.children[1], item3) items.shift() root.render(wrapped) assert_eq(el.innerHTML, '[Item 3
]') assert_eq(el.children[0], item3) items.shift() root.render(wrapped) assert_eq(el.innerHTML, '[]') }) test('full then empty then full list renders correctly', () => { const { root, el } = setup() root.render([1]) assert_eq(el.innerHTML, '1') root.render([]) assert_eq(el.innerHTML, '') root.render([2]) assert_eq(el.innerHTML, '2') }) test('list can disappear when condition changes', async () => { const { root, el } = setup() const app = { show: true, render() { if (!this.show) return null return [1, 2, 3].map(i => html`Body content
`, ] root.render(items) assert_eq(el.innerHTML.replace(/\s+/g, ' '), 'Body content
') const [h1, h2, p] = el.children assert_eq(h1.tagName, 'H1') assert_eq(h2.tagName, 'H2') assert_eq(p.tagName, 'P') // Swap ;[items[0], items[1]] = [items[1], items[0]] root.render(items) assert_eq(el.innerHTML.replace(/\s+/g, ' '), 'Body content
Body content
') assert_eq(el.children[0].tagName, 'H1') assert_eq(el.children[1].tagName, 'H2') assert_eq(el.children[2].tagName, 'P') assert_eq(el.children[0], h1) assert_eq(el.children[1], h2) assert_eq(el.children[2], p) }) test('implicit keyed renderable lists preserve identity when reordered', () => { const { root, el } = setup() const items = [{ render: () => html`Item ${i}
`, `Item ${i}
`]) root.render(items.map(([item]) => item)) assert_eq(el.innerHTML, items.map(([, html]) => html).join('')) shuffle(items) root.render(items.map(([item]) => item)) assert_eq(el.innerHTML, items.map(([, html]) => html).join('')) }) if (__DEV__) { test('keying something twice throws an error', () => { keyed(html``, 1) // make sure this doesn't throw try { keyed(keyed(html``, 1), 1) assert(false, 'Expected an error') } catch {} }) } test('can render the same item multiple times', () => { const { root, el } = setup() const item = html`Item
` root.render([item, item]) assert_eq(el.innerHTML, 'Item
Item
') root.render([item, item, item]) assert_eq(el.innerHTML, 'Item
Item
Item
') root.render([item, item]) assert_eq(el.innerHTML, 'Item
Item
') })