import { Component, mount, onMounted, useState, xml } from "../../src/index"; import { makeTestFixture, nextTick, snapshotEverything } from "../helpers"; import { status } from "../../src/component/status"; snapshotEverything(); let fixture: HTMLElement; beforeEach(() => { fixture = makeTestFixture(); }); describe("t-on", () => { test("t-on on destroyed components", async () => { const steps: string[] = []; let child; class Child extends Component { static template = xml`
`; setup() { onMounted(() => { child = this; }); } onClick() { steps.push("click"); } } class Parent extends Component { static template = xml`
`; static components = { Child }; state = useState({ flag: true }); } const parent = await mount(Parent, fixture); let el = (child as any).el as HTMLElement; el.click(); expect(steps).toEqual(["click"]); (parent as any).state.flag = false; await nextTick(); expect(status(child as any)).toBe("destroyed"); el.click(); expect(steps).toEqual(["click"]); }); test("t-on expression in t-foreach", async () => { class Comp extends Component { static template = xml`
:
`; state = useState({ values: ["a", "b"] }); otherState = { vals: [] }; } const comp = await mount(Comp, fixture); expect(fixture.innerHTML).toBe( "
0: a
1: b
" ); expect(comp.otherState.vals).toStrictEqual([]); const buttons = fixture.querySelectorAll("button"); buttons[0].click(); buttons[1].click(); expect(comp.otherState.vals).toStrictEqual(["a", "b"]); }); test("t-on expression in t-foreach with t-set", async () => { class Comp extends Component { static template = xml`
:
`; state = useState({ values: ["a", "b"] }); otherState = { vals: [] }; } const comp = await mount(Comp, fixture); expect(fixture.innerHTML).toBe( "
0: a
1: b
" ); expect(comp.otherState.vals).toStrictEqual([]); const buttons = fixture.querySelectorAll("button"); buttons[0].click(); buttons[1].click(); expect(comp.otherState.vals).toStrictEqual(["a_nova_0", "b_nova_0_1"]); }); test("t-on method call in t-foreach", async () => { class Comp extends Component { static template = xml`
:
`; state = useState({ values: ["a", "b"] }); otherState = { vals: new Array() }; addVal(val: string) { this.otherState.vals.push(val); } } const comp = await mount(Comp, fixture); expect(fixture.innerHTML).toBe( "
0: a
1: b
" ); expect(comp.otherState.vals).toStrictEqual([]); const buttons = fixture.querySelectorAll("button"); buttons[0].click(); buttons[1].click(); expect(comp.otherState.vals).toStrictEqual(["a", "b"]); }); test("t-on expression captured in t-foreach", async () => { class Comp extends Component { static template = xml`
`; arr = ["a", "b"]; otherState = { vals: new Array() }; } const comp = await mount(Comp, fixture); expect(fixture.innerHTML).toBe( "
" ); expect(comp.otherState.vals).toStrictEqual([]); const buttons = fixture.querySelectorAll("button"); buttons[0].click(); buttons[1].click(); expect(comp.otherState.vals).toStrictEqual(["0_0", "1_1"]); }); });