import { mock, test } from 'bun:test' import { html } from 'dhtml' import { renderToReadableStream, renderToString } from 'dhtml/server' import assert from 'node:assert/strict' const dev_test = test.skipIf(!__DEV__) test('basic html renders correctly', () => { assert.equal(renderToString(html`

Hello, world!

`), '

Hello, world!

') }) test('basic html renders correctly via stream', async () => { const stream = renderToReadableStream(html`

Hello, world!

`) assert.equal(await new Response(stream).text(), '

Hello, world!

') }) test('inner content renders correctly', () => { assert.equal(renderToString(html`

${html`Inner content!`}

`), '

Inner content!

') }) test('template with number renders correctly', () => { const template = (n: number) => html`

Hello, ${n}!

` assert.equal(renderToString(template(1)), '

Hello, 1!

') assert.equal(renderToString(template(2)), '

Hello, 2!

') }) test('lists of items', () => { assert.equal(renderToString([1, 'a', html`thing`]), '1athing') }) test('basic children render correctly', () => { assert.equal( renderToString(html`${'This is a'} ${html`test`} ${html`test`} ${html`test`}`), 'This is a test test test', ) }) dev_test('invalid part placement raises error', () => { assert.throws(() => renderToString(html`<${'div'}>${'text'}`)) }) test('parts in comments do not throw', () => { renderToString(html``) }) dev_test('manually specifying internal template syntax throws', () => { assert.throws(() => { renderToString(html`${1} dyn-$0$`) }) }) test('syntax close but not exact does not throw', () => { assert.equal(renderToString(html`dyn-$${0}1$`), 'dyn-$01$') }) test('directives', () => { const directive = mock() assert.equal(renderToString(html`

`), '

') assert.equal(directive.mock.calls.length, 1) assert.deepEqual(directive.mock.calls[0], []) }) test('attributes', () => { assert.equal(renderToString(html``), '') assert.equal(renderToString(html``), '
') assert.equal(renderToString(html``), '') }) test('collapses whitespace', () => { // prettier-ignore assert.equal(renderToString(html`

`), '

') // prettier-ignore assert.equal(renderToString(html`

x

`), '

x

') })