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('

Hello

world!

Goodbye

') }) it('inserts new nodes in a parent', () => { let container = document.createElement('div') let { render } = createRoot(container) render(

Hello

, ) expect(container.innerHTML).toBe('

Hello

') let p = container.querySelector('p') invariant(p) render(

Hello

Goodbye

, ) expect(container.innerHTML).toBe('

Hello

Goodbye

') expect(container.querySelector('p')).toBe(p) }) }) })