import { html } from 'dhtml'
import { assert, assert_deep_eq, assert_eq, test } from '../../../scripts/test/test.ts'
import { setup } from './setup.ts'
test('regular attributes', () => {
const { root, el } = setup()
root.render(html`
Hello, world!
`)
assert_eq(el.querySelector('h1')!.getAttribute('style'), 'color: red;')
})
test('can toggle attributes', () => {
const { root, el } = setup()
const template = (hidden: unknown) => html`Hello, world!
`
root.render(template(false))
assert(!el.querySelector('h1')!.hasAttribute('data-hidden'))
root.render(template(true))
assert(el.querySelector('h1')!.hasAttribute('data-hidden'))
root.render(template(null))
assert(!el.querySelector('h1')!.hasAttribute('data-hidden'))
})
test('supports property attributes', () => {
const { root, el } = setup()
root.render(html` `)
assert(el.querySelector('details')!.open)
root.render(html` `)
assert(!el.querySelector('details')!.open)
})
test('maintains the case of properties', () => {
const { root, el } = setup()
const innerHTML = 'Hello, world!
'
root.render(html``)
// @ts-expect-error -- no such property
assert_eq(el.querySelector('div')!.innerhtml, innerHTML)
root.render(html``)
assert_eq(el.querySelector('span')!.innerHTML, innerHTML)
})
test('does not maintain the case of attributes', () => {
const { root, el } = setup()
root.render(html``)
assert_deep_eq(el.querySelector('div')!.getAttributeNames(), ['thething'])
})
test('treats class/for specially', () => {
const { root, el } = setup()
root.render(html`Hello, world!
`)
assert_eq(el.querySelector('h1')!.className, 'foo')
root.render(html``)
assert_eq(el.querySelector('label')!.htmlFor, 'foo')
})
test('handles data attributes', () => {
const { root, el } = setup()
root.render(html`Hello, world!
`)
assert_eq(el.querySelector('h1')!.dataset.foo, 'bar')
})
test('supports events', () => {
const { root, el } = setup()
let clicks = 0
root.render(html`
`)
assert_eq(clicks, 0)
el.querySelector('button')!.click()
assert_eq(clicks, 1)
el.querySelector('button')!.click()
assert_eq(clicks, 2)
})
test('supports event handlers that change', () => {
const { root, el } = setup()
const template = (handler: ((event: Event) => void) | null) => html`Click me`
const calls: Event[] = []
root.render(template(event => calls.push(event)))
assert_eq(calls.length, 0)
const event = new Event('blur')
el.querySelector('input')!.dispatchEvent(event)
assert_eq(calls.length, 1)
assert_eq(calls[0], event)
root.render(template(null))
el.querySelector('input')!.dispatchEvent(new Event('blur'))
assert_eq(calls.length, 1)
})