import { describe, it, expect } from 'vitest'
import { createRoot } from '../lib/vdom.ts'
import { invariant } from '../lib/invariant.ts'
describe('vnode rendering', () => {
describe('elements', () => {
it('renders basic elements', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
Hello, world!
)
expect(container.innerHTML).toBe('Hello, world!
')
})
it('renders nested elements', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
Hello, world!
,
)
expect(container.innerHTML).toBe('Hello, world!
')
})
it('renders attributes', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render()
let input = container.querySelector('input')
invariant(input instanceof HTMLInputElement)
expect(input.value).toBe('world')
expect(container.innerHTML).toBe('')
})
it('renders 0 as a child', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render({0}
)
expect(container.innerHTML).toBe('0
')
})
it('renders style object via DOM properties; hydration leaves string in place', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
X
,
)
let div = container.querySelector('div')
invariant(div instanceof HTMLDivElement)
expect(div.style.marginTop).toBe('12px')
expect(div.style.display).toBe('block')
expect(div.getAttribute('style') || '').toContain('--size: 10')
expect(div.style.lineHeight).toBe('')
let container2 = document.createElement('div')
container2.innerHTML = 'X
'
let root2 = createRoot(container2)
root2.render(X
)
let div2 = container2.querySelector('div')
invariant(div2 instanceof HTMLDivElement)
expect(div2.style.color).toBe('blue')
})
})
describe('fragments', () => {
it('inserts fragments', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
<>
Hello
world!
>,
)
expect(container.innerHTML).toBe('Hello
world!
')
})
it('inserts nested fragments', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
<>
Hello
world!
>
Goodbye
,
)
expect(container.innerHTML).toBe('')
})
it('inserts new nodes in a parent', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
,
)
expect(container.innerHTML).toBe('')
let p = container.querySelector('p')
invariant(p)
render(
,
)
expect(container.innerHTML).toBe('')
expect(container.querySelector('p')).toBe(p)
})
})
})