import { describe, it, expect } from 'vitest'
import { invariant } from './invariant.ts'
import { diffDom } from './diff-dom.ts'
describe('diffDom', () => {
describe('basic diffing', () => {
it('diffs text nodes', () => {
let container = document.createElement('div')
container.innerHTML = 'Hello, world!'
let text = container.firstChild
invariant(text)
diffDom(container.childNodes, 'Goodbye, world!')
expect(container.innerHTML).toBe('Goodbye, world!')
expect(container.firstChild).toBe(text)
})
it('diffs element nodes', () => {
let container = document.createElement('div')
container.innerHTML = '
Hello, world!
'
let div = container.firstChild
invariant(div)
diffDom(container.childNodes, 'Goodbye, world!
')
expect(container.innerHTML).toBe('Goodbye, world!
')
expect(container.firstChild).toBe(div)
})
it('diffs element nodes with attributes', () => {
let container = document.createElement('div')
container.innerHTML = 'Hello, world!
'
let div = container.firstChild
invariant(div)
diffDom(container.childNodes, 'Goodbye, world!
')
expect(container.innerHTML).toBe('Goodbye, world!
')
expect(container.firstChild).toBe(div)
})
it('diffs children', () => {
let container = document.createElement('div')
container.innerHTML = 'Hello, world!
'
let div = container.firstChild
invariant(div)
let span = container.querySelector('span')
invariant(span)
diffDom(container.childNodes, 'Goodbye, world!
')
expect(container.innerHTML).toBe('Goodbye, world!
')
expect(container.firstChild).toBe(div)
expect(container.querySelector('span')).toBe(span)
})
it('replaces children elements', () => {
let container = document.createElement('div')
container.innerHTML = 'Hello, world!
'
let div = container.firstChild
invariant(div)
diffDom(container.childNodes, '')
expect(container.innerHTML).toBe('')
expect(container.firstChild).toBe(div)
})
})
describe('comments', () => {
it('retains comments', () => {
let container = document.createElement('div')
container.innerHTML = 'hello
'
let comment = container.firstChild
invariant(comment)
diffDom(container.childNodes, 'goodbye
')
expect(container.innerHTML).toBe('goodbye
')
expect(container.firstChild === comment).toBe(true)
})
it('diffs comment data', () => {
let container = document.createElement('div')
container.innerHTML = 'hello
'
let first = container.firstChild
let last = container.lastChild
invariant(first && last)
diffDom(container.childNodes, 'hello
')
expect(container.innerHTML).toBe('hello
')
expect(container.firstChild === first).toBe(true)
expect(container.lastChild === last).toBe(true)
})
})
describe('keyed diffs', () => {
it.todo('retains keyed elements')
})
})