'
let first = container.firstChild
let last = container.lastChild
invariant(first && last)
diffDom(container, '
hello
')
expect(container.innerHTML).toBe('
hello
')
expect(container.firstChild).toBe(first)
expect(container.lastChild).toBe(last)
})
it('updates hydration marker ids while fast-forwarding boundaries', () => {
let container = document.createElement('div')
container.innerHTML = ''
diffDom(container, '')
let start = container.firstChild
invariant(start && start.nodeType === Node.COMMENT_NODE)
expect((start as Comment).data.trim()).toBe('rmx:h:new')
})
})
describe('keyed diffs', () => {
it('retains keyed elements via data-key', () => {
let container = document.createElement('div')
container.innerHTML =
'
A
B
C
'
let list = container.querySelector('ul')
invariant(list)
let a = list.children.item(0)
let b = list.children.item(1)
let c = list.children.item(2)
invariant(a && b && c)
diffDom(
container,
'
',
)
})
})
describe('live browser state', () => {
it('preserves current details open state when incoming html removes open', () => {
let container = document.createElement('div')
container.innerHTML = 'Toggle
Body
'
let details = container.querySelector('details')
invariant(details)
diffDom(container, 'Toggle
Body
')
expect(details.open).toBe(true)
expect(details.hasAttribute('open')).toBe(true)
})
it('preserves current dialog open state when incoming html removes open', () => {
let container = document.createElement('div')
container.innerHTML = ''
let dialog = container.querySelector('dialog')
invariant(dialog)
diffDom(container, '')
expect(dialog.open).toBe(true)
expect(dialog.hasAttribute('open')).toBe(true)
})
it('preserves current input checked state when incoming html removes checked', () => {
let container = document.createElement('div')
container.innerHTML = ''
let input = container.querySelector('input')
invariant(input)
diffDom(container, '')
expect(input.checked).toBe(true)
expect(input.hasAttribute('checked')).toBe(true)
})
it('preserves current input value when incoming html changes value', () => {
let container = document.createElement('div')
container.innerHTML = ''
let input = container.querySelector('input')
invariant(input)
input.value = 'user'
diffDom(container, '')
expect(input.value).toBe('user')
expect(input.getAttribute('value')).toBe('server')
})
it('preserves current textarea value when incoming html changes its text', () => {
let container = document.createElement('div')
container.innerHTML = ''
let textarea = container.querySelector('textarea')
invariant(textarea)
textarea.value = 'user'
diffDom(container, '')
expect(textarea.value).toBe('user')
expect(textarea.textContent).toBe('server')
})
it('preserves current select value when incoming html changes selected options', () => {
let container = document.createElement('div')
container.innerHTML =
''
let select = container.querySelector('select')
invariant(select)
let first = select.options.item(0)
let second = select.options.item(1)
invariant(first && second)
select.value = 'b'
diffDom(
container,
'',
)
expect(select.value).toBe('b')
expect(first.selected).toBe(false)
expect(second.selected).toBe(true)
expect(first.hasAttribute('selected')).toBe(false)
})
it('preserves current popover visibility when incoming html removes popover', () => {
let container = document.createElement('div')
container.innerHTML = '