import { App, Component, mount, useState, xml } from "../../src/index"; import { isDirectChildOf, makeTestFixture, nextTick, snapshotEverything } from "../helpers"; snapshotEverything(); let fixture: HTMLElement; beforeEach(() => { fixture = makeTestFixture(); }); describe("t-call", () => { test("dynamic t-call", async () => { class Root extends Component { static template = xml` owl `; current = useState({ template: "foo" }); } const root = await mount(Root, fixture, { templates: `
foo
bar
`, }); expect(fixture.innerHTML).toBe("
foo
"); root.current.template = "bar"; await nextTick(); expect(fixture.innerHTML).toBe("bar"); }); test("sub components in two t-calls", async () => { class Child extends Component { static template = xml``; } class Parent extends Component { static template = xml`
`; static components = { Child }; state = useState({ val: 1 }); } const app = new App(Parent); app.addTemplate("sub", ``); const parent = await app.mount(fixture); expect(fixture.innerHTML).toBe("1"); parent.state.val = 2; await nextTick(); expect(fixture.innerHTML).toBe("
2
"); }); test("handlers are properly bound through a t-call", async () => { let parent: any; const subTemplate = xml`

lucas

`; class Parent extends Component { static template = xml`
`; counter = 0; update() { expect(this).toBe(parent); this.counter++; this.render(); } } parent = await mount(Parent, fixture); expect(fixture.innerHTML).toBe("

lucas

0
"); fixture.querySelector("p")!.click(); await nextTick(); expect(fixture.innerHTML).toBe("

lucas

1
"); }); test("handlers are properly bound through a dynamic t-call", async () => { let parent: any; const subTemplate = xml`

lucas

`; class Parent extends Component { static template = xml`
`; counter = 0; update() { expect(this).toBe(parent); this.counter++; this.render(); } } parent = await mount(Parent, fixture); expect(fixture.innerHTML).toBe("

lucas

0
"); fixture.querySelector("p")!.click(); await nextTick(); expect(fixture.innerHTML).toBe("

lucas

1
"); }); test("parent is set within t-call", async () => { const sub = xml``; let child: any = null; class Child extends Component { static template = xml`lucas`; setup() { child = this; } } class Parent extends Component { static components = { Child }; static template = xml`
`; } const parent = await mount(Parent, fixture); expect(fixture.innerHTML).toBe("
lucas
"); expect(isDirectChildOf(child, parent)).toBeTruthy(); }); test("t-call in t-foreach and children component", async () => { const sub = xml``; class Child extends Component { static template = xml``; } class Parent extends Component { static components = { Child }; static template = xml`
`; } await mount(Parent, fixture); expect(fixture.innerHTML).toBe("
abc
"); }); test("parent is set within t-call with no parentNode", async () => { const sub = xml``; let child: any = null; class Child extends Component { setup() { child = this; } static template = xml`lucas`; } class Parent extends Component { static components = { Child }; static template = xml``; } const parent = await mount(Parent, fixture); expect(fixture.innerHTML).toBe("lucas"); expect(isDirectChildOf(child, parent)).toBe(true); }); test("handlers with arguments are properly bound through a t-call", async () => { const sub = xml`

lucas

`; let value: any = null; class Parent extends Component { static template = xml`
`; update(a: any) { expect(this).toBe(parent); value = a; } a = 3; } const parent = await mount(Parent, fixture); fixture.querySelector("p")!.click(); expect(value).toBe(3); }); test("dynamic t-call: key is propagated", async () => { let childId = 0; class Child extends Component { static template = xml`
`; id: any; setup() { this.id = childId++; } } const sub = xml``; class Parent extends Component { static template = xml``; static components = { Child }; sub = sub; } await mount(Parent, fixture); expect(fixture.innerHTML).toBe(`
`); }); test("recursive t-call binding this -- static t-call", async () => { let clickCount = 0; class Parent extends Component { onClicked?: Function; setup() { const instance = this; this.onClicked = function () { clickCount++; expect(this).toBe(instance); }; } static template = xml`
`; } const app = new App(Parent); app.addTemplate( "recursive", `
` ); await app.mount(fixture); for (const div of fixture.querySelectorAll("div")) { div.click(); } expect(clickCount).toBe(2); }); test("t-call with t-call-context, simple use", async () => { class Root extends Component { static template = xml` `; subctx = { aab: "aaron", lpe: "lucas" }; } await mount(Root, fixture, { templates: ` `, }); expect(fixture.innerHTML).toBe("aaronlucas"); }); test("t-call with t-call-context and subcomponent", async () => { class Child extends Component { static template = xml`child`; } class Root extends Component { static template = xml` `; static components = { Child }; subctx = { aab: "aaron", lpe: "lucas" }; } await mount(Root, fixture, { templates: ` `, }); expect(fixture.innerHTML).toBe("childaaronchildlucas"); }); });