import { describe, it, expect } from 'vitest'
import { createRoot } from '../lib/vdom.ts'
describe('vnode rendering', () => {
describe('inserts', () => {
it('renders text', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render('Hello, world!')
expect(container.innerHTML).toBe('Hello, world!')
})
it('renders number', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(42)
expect(container.innerHTML).toBe('42')
})
it('renders 0', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(0)
expect(container.innerHTML).toBe('0')
})
it('renders bigint', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(BigInt(9007199254740991))
expect(container.innerHTML).toBe('9007199254740991')
})
it('renders true', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(true)
expect(container.innerHTML).toBe('')
})
it('renders false', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(false)
expect(container.innerHTML).toBe('')
})
it('renders null', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(null)
expect(container.innerHTML).toBe('')
})
it('renders undefined', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(undefined)
expect(container.innerHTML).toBe('')
})
})
describe('removals', () => {
it('removes a text node', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
Hello, world!
)
expect(container.innerHTML).toBe('
Hello, world!
')
render()
expect(container.innerHTML).toBe('')
})
it('removes an element', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
Hello, world!
,
)
expect(container.innerHTML).toBe('
Hello, world!
')
render()
expect(container.innerHTML).toBe('')
})
it('removes attributes', () => {
let container = document.createElement('div')
let root = createRoot(container)
root.render()
let input = container.querySelector('input')
expect(input).toBeInstanceOf(HTMLInputElement)
expect((input as HTMLInputElement).value).toBe('world')
expect((input as HTMLInputElement).getAttribute('id')).toBe('hello')
root.render()
root.flush()
expect((input as HTMLInputElement).value).toBe('')
expect((input as HTMLInputElement).hasAttribute('id')).toBe(false)
expect((input as HTMLInputElement).hasAttribute('value')).toBe(false)
})
it('removes reflected attributes without leaving empty values', () => {
let container = document.createElement('div')
let root = createRoot(container)
root.render(
content
,
)
let div = container.querySelector('div')
expect(div).toBeInstanceOf(HTMLDivElement)
expect((div as HTMLDivElement).getAttribute('id')).toBe('hello')
expect((div as HTMLDivElement).getAttribute('class')).toBe('world')
root.render(
content
)
root.flush()
expect((div as HTMLDivElement).hasAttribute('id')).toBe(false)
expect((div as HTMLDivElement).hasAttribute('class')).toBe(false)
})
it('removes a fragment', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
render(
<>
Hello
world!
>
,
)
expect(container.innerHTML).toBe('
Hello
world!
')
render()
expect(container.innerHTML).toBe('')
})
it('removes a component', () => {
let container = document.createElement('div')
let { render } = createRoot(container)
function App() {
return () =>