import { describe, it, expect } from 'vitest'
import { createRoot } from '../lib/vdom.ts'
import { invariant } from '../lib/invariant.ts'
describe('vnode rendering', () => {
describe('type<-->type updates', () => {
it('updates a text node', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render('Hello, world!')
expect(container.innerHTML).toBe('Hello, world!')
render('Hello, world! 2')
expect(container.innerHTML).toBe('Hello, world! 2')
})
it('updates an element', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
Hello, world!
)
expect(container.innerHTML).toBe('
Hello, world!
')
let div = container.querySelector('div')
render(
Hello, world! 2
)
expect(container.innerHTML).toBe('
Hello, world! 2
')
expect(container.querySelector('div')).toBe(div)
})
it('updates an element with attributes', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render()
let input = container.querySelector('input')
invariant(input)
expect(input.getAttribute('id')).toBe('hello')
expect(input.value).toBe('world')
render()
expect(container.querySelector('input')).toBe(input)
expect(input.getAttribute('id')).toBe('hello')
expect(input.value).toBe('world 2')
})
it('updates a fragment', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
<>
Hello
world!
>,
)
let pTags = container.querySelectorAll('p')
invariant(pTags.length === 2)
expect(container.innerHTML).toBe('
Hello
world!
')
render(
<>
Goodbye
Universe
>,
)
expect(container.innerHTML).toBe('
Goodbye
Universe
')
let newPTags = container.querySelectorAll('p')
expect(newPTags.length).toBe(2)
expect(newPTags[0]).toBe(pTags[0])
expect(newPTags[1]).toBe(pTags[1])
})
it('updates a component', () => {
let container = document.createElement('div')
let setupCalls = 0
function App() {
let state = ++setupCalls
return ({ title }: { title: string }) => (
{title} {state}
)
}
let root = createRoot(container)
root.render()
expect(container.innerHTML).toBe('