import { describe, it, expect } from 'vitest'
import { createRoot } from '../lib/vdom.ts'
import type { Handle } from '../lib/component.ts'
describe('vnode rendering', () => {
it('runs update tasks after updates', () => {
let container = document.createElement('div')
let root = createRoot(container)
let taskRan = false
let capturedUpdate = () => {}
function App(handle: Handle) {
capturedUpdate = () => {
handle.queueTask(() => {
taskRan = true
})
handle.update()
}
return () =>
Hello, world!
}
root.render()
root.flush()
expect(taskRan).toBe(false)
capturedUpdate()
expect(taskRan).toBe(false)
root.flush()
expect(taskRan).toBe(true)
})
it('handle.update() returns a promise that resolves with a signal', async () => {
let container = document.createElement('div')
let root = createRoot(container)
let capturedSignal: AbortSignal | undefined
let capturedUpdate = () => {}
function App(handle: Handle) {
capturedUpdate = () => {
handle.update().then((signal) => {
capturedSignal = signal
})
}
return () => Hello, world!
}
root.render()
root.flush()
expect(capturedSignal).toBe(undefined)
capturedUpdate()
expect(capturedSignal).toBe(undefined)
root.flush()
await Promise.resolve()
expect(capturedSignal).toBeInstanceOf(AbortSignal)
expect(capturedSignal?.aborted).toBe(false)
})
})