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(` `), data: { a: 'A', b: false, hidden: true, }, }) const elem = glassEasel.Component.createWithContext('root', def.general(), domBackend) expect(elem.$$).toBeInstanceOf(Element) expect(domHtml(elem)).toBe( '', ) 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([]) }) })