import { snapshotEverything, makeTestFixture, nextTick } from "../helpers"; import { Component, mount, xml } from "../../src/index"; snapshotEverything(); let fixture: HTMLElement; beforeEach(() => { fixture = makeTestFixture(); }); describe("t-key", () => { test("t-key on Component", async () => { let childInstance = null; class Child extends Component { static template = xml`
`; setup() { childInstance = this; } } class Parent extends Component { static components = { Child }; static template = xml``; key = 1; } const parent = await mount(Parent, fixture); expect((parent.el as HTMLElement).innerHTML).toBe("
1
"); const oldChild = childInstance; parent.key = 2; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
2
"); expect(oldChild === childInstance).toBeFalsy(); }); test("t-key on Component as a function", async () => { let childInstance = null; class Child extends Component { static template = xml`
`; setup() { childInstance = this; } } let keyCalls = 0; let __key = 1; class Parent extends Component { static components = { Child }; static template = xml``; get key() { keyCalls++; return __key; } } const parent = await mount(Parent, fixture); expect((parent.el as HTMLElement).innerHTML).toBe("
1
"); expect(keyCalls).toBe(2); // one for t-key, the other for the props const oldChild = childInstance; __key = 2; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
2
"); expect(oldChild === childInstance).toBeFalsy(); expect(keyCalls).toBe(4); }); test("t-key on multiple Components", async () => { const childInstances = []; class Child extends Component { static template = xml`
`; setup() { childInstances.push(this); } } class Parent extends Component { static components = { Child }; static template = xml` `; key1 = 1; key2 = 2; } const parent = await mount(Parent, fixture); expect((parent.el as HTMLElement).innerHTML).toBe("
1
2
"); parent.key1 = 2; parent.key2 = 1; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
2
1
"); expect(childInstances.length).toBe(4); }); test("t-key on multiple Components with t-call 1", async () => { const childInstances = []; class Child extends Component { static template = xml`
`; setup() { childInstances.push(this); } } class Parent extends Component { static components = { Child }; static template = xml` `; key1 = 1; key2 = 2; } const parent = await mount(Parent, fixture, { templates: ` `, }); expect((parent.el as HTMLElement).innerHTML).toBe("
1
2
"); parent.key1 = 2; parent.key2 = 1; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
2
1
"); expect(childInstances.length).toBe(4); }); test("t-key on multiple Components with t-call 2", async () => { const childInstances = []; class Child extends Component { static template = xml`
`; setup() { childInstances.push(this); } } class Parent extends Component { static components = { Child }; static template = xml` `; key1 = 1; key2 = 2; } const parent = await mount(Parent, fixture, { templates: ` `, }); expect((parent.el as HTMLElement).innerHTML).toBe("
1
2
"); parent.key1 = 2; parent.key2 = 1; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
2
1
"); expect(childInstances.length).toBe(4); }); test("t-foreach with t-key switch component position", async () => { const childInstances = []; class Child extends Component { static template = xml`
`; setup() { childInstances.push(this); } } class Parent extends Component { static components = { Child }; static template = xml` `; key1 = "key1"; clist = [1, 2]; } const parent = await mount(Parent, fixture); expect((parent.el as HTMLElement).innerHTML).toBe("
1key1
2key1
"); parent.clist = [2, 1]; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
2key1
1key1
"); expect(childInstances.length).toBe(2); childInstances.length = 0; parent.clist = [1, 2]; parent.key1 = "key2"; parent.render(); await nextTick(); expect((parent.el as HTMLElement).innerHTML).toBe("
1key2
2key2
"); expect(childInstances.length).toBe(2); }); });