import { html } from 'dhtml'
import { renderToReadableStream, renderToString } from 'dhtml/server'
import { assert, assert_eq, test } from '../../../scripts/test/test.ts'
test('basic html renders correctly', () => {
assert_eq(renderToString(html`
Hello, world!
`), '[>Hello, world!
]>')
})
test('basic html renders correctly via stream', async () => {
const stream = renderToReadableStream(html`Hello, world!
`)
assert_eq(await new Response(stream).text(), '[>Hello, world!
]>')
})
test('inner content renders correctly', () => {
assert_eq(renderToString(html`${html`Inner content!`}
`), '[>[>Inner content!]>
]>')
})
test('template with number renders correctly', () => {
const template = (n: number) => html`Hello, ${n}!
`
assert_eq(renderToString(template(1)), '[>Hello, [>1]>!
]>')
assert_eq(renderToString(template(2)), '[>Hello, [>2]>!
]>')
})
test('lists of items', () => {
assert_eq(renderToString([1, 'a', html`thing`]), '[>[>1]>[>a]>[>thing]>]>')
})
test('basic children render correctly', () => {
assert_eq(
renderToString(html`${'This is a'} ${html`test`} ${html`test`} ${html`test`}`),
'[>[>This is a]> [>test]> [>test]> [>test]>]>',
)
})
if (__DEV__) {
test('invalid part placement raises error', () => {
try {
renderToString(html`<${'div'}>${'text'}${'div'}>`)
assert(false, 'Expected error to be thrown')
} catch (error) {
assert(error instanceof Error)
}
})
}
test('parts in comments do not throw', () => {
renderToString(html``)
})
if (__DEV__) {
test('manually specifying internal template syntax throws', () => {
try {
// why is prettier deleting null bytes?
// prettier-ignore
renderToString(html`${1} \0`)
assert(false, 'Expected error to be thrown')
} catch (error) {
assert(error instanceof Error)
}
})
}
test('directives', () => {
let calls = 0
const directive = () => {
calls++
}
assert_eq(renderToString(html``), '[>]>')
assert_eq(calls, 0) // TODO: what should these look like on the server?
})
test('unquoted attributes', () => {
assert_eq(renderToString(html``), '[>]>')
assert_eq(renderToString(html` `), '[> ]>')
assert_eq(renderToString(html` `), '[> ]>')
})
test('quoted attributes', () => {
assert_eq(renderToString(html``), '[>]>')
assert_eq(renderToString(html` `), '[> ]>')
// prettier-ignore
assert_eq(renderToString(html` `), '[> ]>')
})
test('collapses whitespace', () => {
// prettier-ignore
assert_eq(renderToString(html`
`), '[>
]>')
// prettier-ignore
assert_eq(renderToString(html` x
`), '[> x
]>')
})
test('lexer edge cases', () => {
// prettier-ignore
assert_eq(renderToString(html``), '[>
]>')
assert_eq(renderToString(html`
![]()
`), '[>
![]()
]>')
assert_eq(renderToString(html`
`), '[>
]>')
})