import { describe, it, expect } from 'vitest' import { createRoot } from '../lib/vdom.ts' import type { Handle } from '../lib/component.ts' import { ref } from '../lib/mixins/ref-mixin.ts' describe('vnode rendering', () => { describe('ref', () => { it('connects host node lifecycle to component scope', () => { let container = document.createElement('div') let root = createRoot(container) let capturedNode: Element | null = null function App() { return () => (
{ capturedNode = node signal.addEventListener('abort', () => { capturedNode = null }) }), ]} > Hello, world!
) } root.render() root.flush() expect(capturedNode).toBeInstanceOf(HTMLDivElement) root.render(null) root.flush() expect(capturedNode).toBe(null) }) }) it('calls ref only once', () => { let container = document.createElement('div') let root = createRoot(container) let capturedUpdate = () => {} let refCalls = 0 function App(handle: Handle) { capturedUpdate = () => handle.update() return () => (
{ refCalls++ }), ]} > Hello, world!
) } root.render() root.flush() expect(refCalls).toBe(1) capturedUpdate() root.flush() expect(refCalls).toBe(1) }) })