describe.skip("reactivity in lifecycle", () => {
test.skip("can use a state hook", async () => {
/* class Counter extends Component {
static template = xml`
`;
counter = useState({ value: 42 });
}
const counter = new Counter();
await counter.mount(fixture);
expect(fixture.innerHTML).toBe("42
");
counter.counter.value = 3;
await nextTick();
expect(fixture.innerHTML).toBe("3
");*/
});
test("state changes in willUnmount do not trigger rerender", async () => {
// const steps: string[] = [];
// class Child extends Component {
// static template = xml`
//
// `;
// state = useState({ n: 2 });
// __render(f) {
// steps.push("render");
// return super.__render(f);
// }
// willPatch() {
// steps.push("willPatch");
// }
// patched() {
// steps.push("patched");
// }
// willUnmount() {
// steps.push("willUnmount");
// this.state.n = 3;
// }
// }
// class Parent extends Component {
// static template = xml`
//
//
//
// `;
// static components = { Child };
// state = useState({ val: 1, flag: true });
// }
// const widget = await mount(Parent, { target: fixture });
// expect(steps).toEqual(["render"]);
// expect(fixture.innerHTML).toBe("12
");
// widget.state.flag = false;
// await nextTick();
// // we make sure here that no call to __render is done
// expect(steps).toEqual(["render", "willUnmount"]);
});
test("state changes in willUnmount will be applied on remount", async () => {
// class TestWidget extends Component {
// static template = xml`
//
// `;
// state = useState({ val: 1 });
// willUnmount() {
// this.state.val = 3;
// }
// }
// const widget = new TestWidget();
// await widget.mount(fixture);
// expect(fixture.innerHTML).toBe("1
");
// widget.unmount();
// expect(fixture.innerHTML).toBe("");
// await nextTick(); // wait for changes to be detected before remounting
// await widget.mount(fixture);
// expect(fixture.innerHTML).toBe("3
");
// // we want to make sure that there are no remaining tasks left at this point.
// expect(Component.scheduler.tasks.length).toBe(0);
});
test("change state just before mounting component", async () => {
// const steps: number[] = [];
// class TestWidget extends Component {
// static template = xml`
//
// `;
// state = useState({ val: 1 });
// __render(f) {
// steps.push(this.state.val);
// return super.__render(f);
// }
// }
// TestWidget.prototype.__render = jest.fn(TestWidget.prototype.__render);
// const widget = new TestWidget();
// widget.state.val = 2;
// await widget.mount(fixture);
// expect(fixture.innerHTML).toBe("2
");
// expect(TestWidget.prototype.__render).toHaveBeenCalledTimes(1);
// // unmount and re-mount, as in this case, willStart won't be called, so it's
// // slightly different
// widget.unmount();
// widget.state.val = 3;
// await widget.mount(fixture);
// expect(fixture.innerHTML).toBe("3
");
// expect(TestWidget.prototype.__render).toHaveBeenCalledTimes(2);
// expect(steps).toEqual([2, 3]);
});
test("change state while mounting component", async () => {
// const steps: number[] = [];
// class TestWidget extends Component {
// static template = xml`
//
// `;
// state = useState({ val: 1 });
// __render(f) {
// steps.push(this.state.val);
// return super.__render(f);
// }
// }
// TestWidget.prototype.__render = jest.fn(TestWidget.prototype.__render);
// TestWidget.prototype.__patch = jest.fn(TestWidget.prototype.__patch);
// const widget = new TestWidget();
// let prom = widget.mount(fixture);
// widget.state.val = 2;
// await prom;
// expect(fixture.innerHTML).toBe("2
");
// expect(TestWidget.prototype.__render).toHaveBeenCalledTimes(1);
// // unmount and re-mount, as in this case, willStart won't be called, so it's
// // slightly different
// widget.unmount();
// prom = widget.mount(fixture);
// widget.state.val = 3;
// await prom;
// expect(fixture.innerHTML).toBe("3
");
// expect(TestWidget.prototype.__render).toHaveBeenCalledTimes(3);
// expect(TestWidget.prototype.__patch).toHaveBeenCalledTimes(2);
// expect(steps).toEqual([2, 2, 3]);
});
test("change state and render while mounted in detached dom", async () => {
// class App extends Component {
// static template = xml`
`;
// state = useState({ val: 1 });
// }
// const detachedDiv = document.createElement("div");
// const app = await mount(App, { target: detachedDiv });
// expect(detachedDiv.innerHTML).toBe("1
");
// app.state.val = 2;
// await nextTick();
// expect(detachedDiv.innerHTML).toBe("2
");
});
test("destroy and change state after mounted in detached dom", async () => {
// class App extends Component {
// static template = xml`
`;
// state = useState({ val: 1 });
// }
// const detachedDiv = document.createElement("div");
// const app = await mount(App, { target: detachedDiv });
// expect(detachedDiv.innerHTML).toBe("1
");
// app.destroy();
// app.state.val = 2;
// await nextTick();
// expect(detachedDiv.innerHTML).toBe("");
});
test("change state while component is unmounted", async () => {
// let child;
// class Child extends Component {
// static template = xml``;
// state = useState({
// val: "C1",
// });
// constructor(parent, props) {
// super(parent, props);
// child = this;
// }
// }
// class Parent extends Component {
// static components = { Child };
// static template = xml`
`;
// state = useState({ val: "P1" });
// }
// const parent = new Parent();
// await parent.mount(fixture);
// expect(fixture.innerHTML).toBe("P1C1
");
// parent.unmount();
// expect(fixture.innerHTML).toBe("");
// parent.state.val = "P2";
// child.state.val = "C2";
// await parent.mount(fixture);
// expect(fixture.innerHTML).toBe("P2C2
");
});
});