import { snapshotEverything, makeTestFixture, nextTick, elem } 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(fixture.innerHTML).toBe("1
");
const oldChild = childInstance;
parent.key = 2;
parent.render();
await nextTick();
expect(fixture.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(fixture.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(fixture.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(elem(parent).innerHTML).toBe("1
2
");
parent.key1 = 2;
parent.key2 = 1;
parent.render();
await nextTick();
expect(elem(parent).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(elem(parent).innerHTML).toBe("1
2
");
parent.key1 = 2;
parent.key2 = 1;
parent.render();
await nextTick();
expect(elem(parent).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(elem(parent).innerHTML).toBe("1
2
");
parent.key1 = 2;
parent.key2 = 1;
parent.render();
await nextTick();
expect(elem(parent).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(elem(parent).innerHTML).toBe("1key1
2key1
");
parent.clist = [2, 1];
parent.render();
await nextTick();
expect(elem(parent).innerHTML).toBe("2key1
1key1
");
expect(childInstances.length).toBe(2);
childInstances.length = 0;
parent.clist = [1, 2];
parent.key1 = "key2";
parent.render();
await nextTick();
expect(elem(parent).innerHTML).toBe("1key2
2key2
");
expect(childInstances.length).toBe(2);
});
});