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, '

Goodbye, world!

') expect(container.innerHTML).toBe('

Goodbye, world!

') 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') }) })