import { tmpl, domBackend } from '../base/env'
import * as glassEasel from '../../src'
const domHtml = (elem: glassEasel.Element): string => {
const domElem = elem.getBackendElement() as unknown as Element
return domElem.innerHTML
}
describe('native rendering mode', () => {
test('basic tree building', () => {
const def = glassEasel.registerElement({
options: { externalComponent: true },
template: tmpl(`
{{a}}
`),
data: {
a: 'A',
b: false,
hidden: true,
},
})
const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
expect(elem.$$).toBeInstanceOf(Element)
expect(domHtml(elem)).toBe(
' A
',
)
elem.setData({
a: 'BB',
b: true,
hidden: false,
})
expect(domHtml(elem)).toBe(
' BB
',
)
})
test('slot shrinking', () => {
const subComp = glassEasel.registerElement({
options: { externalComponent: true },
template: tmpl(`
{{a}}
`),
properties: {
a: Number,
},
})
const def = glassEasel.registerElement({
using: {
comp: subComp.general(),
},
template: tmpl(`
{{c}}
`),
data: {
c: 1,
},
})
const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
expect(domHtml(elem)).toBe('21
')
elem.setData({
c: 10,
})
expect(domHtml(elem)).toBe('1110
')
})
test('slot appending', () => {
const subComp = glassEasel.registerElement({
options: { externalComponent: true },
template: tmpl(`
{{a}}
`),
properties: {
a: String,
},
})
const def = glassEasel.registerElement({
using: {
comp: subComp.general(),
},
template: tmpl(`
{{c}}
`),
data: {
c: 'A',
},
})
const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
expect(domHtml(elem)).toBe('cA
A')
elem.setData({
c: 'B',
})
expect(domHtml(elem)).toBe('cB
B')
})
test('default template', () => {
const subComp = glassEasel.registerElement({
options: { externalComponent: true },
})
const def = glassEasel.registerElement({
using: {
comp: subComp,
},
template: tmpl(`
{{c}}
`),
data: {
c: 123,
},
})
const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
expect(domHtml(elem)).toBe('123')
elem.setData({
c: 'ABC',
})
expect(domHtml(elem)).toBe('ABC')
})
test('event handling', () => {
const ops: number[] = []
const def = glassEasel.registerElement({
options: {
externalComponent: true,
},
template: tmpl(`
`),
methods: {
outerStart() {
ops.push(1)
},
innerStart() {
ops.push(2)
},
outerEnd() {
throw new Error('unreachable')
},
innerEnd() {
ops.push(3)
return false
},
},
})
const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend)
expect(domHtml(elem)).toBe('
')
const evOps = {
bubbles: true,
composed: true,
}
glassEasel.triggerExternalEvent(
elem,
elem.$.inner as glassEasel.GeneralBackendElement,
'touchstart',
{},
evOps,
)
glassEasel.triggerExternalEvent(
elem,
elem.$.inner as glassEasel.GeneralBackendElement,
'touchend',
{},
evOps,
)
expect(ops).toStrictEqual([2, 1, 3])
})
test('nesting event handling', () => {
let ops: number[] = []
const native = glassEasel.registerElement({
options: {
externalComponent: true,
},
template: tmpl(`
`),
methods: {
onStart() {
ops.push(1)
},
},
})
const normal = glassEasel.registerElement({
template: tmpl(`
`),
methods: {
captureStart() {
ops.push(2)
},
onStart() {
ops.push(3)
},
},
})
const comp = glassEasel.registerElement({
using: {
native,
normal,
},
template: tmpl(`
`),
methods: {
captureStart() {
ops.push(4)
},
onStart() {
ops.push(5)
},
},
})
const elem = glassEasel.Component.createWithContext('root', comp.general(), domBackend)
expect(domHtml(elem)).toBe(
'',
)
const inner = (elem.$.inner as glassEasel.Element).asInstanceOf(native)!
glassEasel.triggerExternalEvent(
inner,
inner.$.div as glassEasel.GeneralBackendElement,
'touchstart',
{},
{ bubbles: true, capturePhase: true, composed: true },
)
expect(ops).toStrictEqual([4, 2, 1, 3, 1, 5])
ops = []
glassEasel.triggerExternalEvent(
inner,
inner.$.div as glassEasel.GeneralBackendElement,
'touchstart',
{},
{ bubbles: false, capturePhase: true, composed: true },
)
expect(ops).toStrictEqual([4, 2, 1])
ops = []
glassEasel.triggerExternalEvent(
inner,
inner.$.div as glassEasel.GeneralBackendElement,
'touchstart',
{},
{ bubbles: true, capturePhase: false, composed: true },
)
expect(ops).toStrictEqual([1, 3, 1, 5])
ops = []
glassEasel.triggerExternalEvent(
inner,
inner.$.div as glassEasel.GeneralBackendElement,
'touchstart',
{},
{ bubbles: true, capturePhase: true, composed: false },
)
expect(ops).toStrictEqual([1])
ops = []
glassEasel.triggerExternalEvent(
inner,
inner.$$ as glassEasel.GeneralBackendElement,
'touchstart',
{},
{ bubbles: true, capturePhase: true, composed: true },
)
expect(ops).toStrictEqual([4, 2, 3, 1, 5])
ops = []
glassEasel.triggerExternalEvent(
inner,
inner.$$ as glassEasel.GeneralBackendElement,
'touchstart',
{},
{ bubbles: true, capturePhase: true, composed: false },
)
expect(ops).toStrictEqual([])
})
})