//import { AsyncRoot } from "../../src/misc/async_root";
import { useState, mount } from "../../src";
import { xml } from "../../src/tags";
import { makeDeferred, makeTestFixture, snapshotEverything, nextTick } from "../helpers";
import { Component } from "../../src/component/component";
let fixture: HTMLElement;
snapshotEverything();
beforeEach(() => {
fixture = makeTestFixture();
});
describe("Asyncroot", () => {
test.skip("delayed component with AsyncRoot component", async () => {
class Child extends Component {
static template = xml``;
}
class AsyncChild extends Child {
willUpdateProps() {
return def;
}
}
class Parent extends Component {
static template = xml`
`;
static components = { Child, AsyncChild /*AsyncRoot*/ };
state = useState({ val: 0 });
updateApp() {
this.state.val++;
}
}
await mount(Parent, fixture);
expect(fixture.querySelector(".children")!.innerHTML).toBe("00");
// click on button to increment Parent counter
const def = makeDeferred();
fixture.querySelector("button")!.click();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("10");
def.resolve();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("11");
});
test.skip("fast component with AsyncRoot", async () => {
class Child extends Component {
static template = xml``;
}
class AsyncChild extends Child {
willUpdateProps() {
return def;
}
}
class Parent extends Component {
static template = xml`
`;
static components = { Child, AsyncChild /*AsyncRoot*/ };
state = useState({ val: 0 });
updateApp() {
this.state.val++;
}
}
await mount(Parent, fixture);
expect(fixture.querySelector(".children")!.innerHTML).toBe("00");
// click on button to increment Parent counter
const def = makeDeferred();
fixture.querySelector("button")!.click();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("10");
def.resolve();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("11");
});
test.skip("asyncroot component: mixed re-renderings", async () => {
class Child extends Component {
static template = xml`
/
`;
state = useState({ val: 0 });
increment() {
this.state.val++;
}
}
class AsyncChild extends Child {
willUpdateProps() {
return def;
}
}
class Parent extends Component {
static template = xml`
`;
static components = { Child, AsyncChild /*AsyncRoot*/ };
state = useState({ val: 0 });
updateApp() {
this.state.val++;
}
}
const parent = await mount(Parent, fixture);
expect(fixture.querySelector(".children")!.innerHTML).toBe("0/00/0");
// click on button to increment Parent counter
const def = makeDeferred();
fixture.querySelector("button")!.click();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("0/10/0");
// click on each Child to increment their local counter
const children = (parent.el).querySelectorAll("span");
children[0]!.click();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("1/10/0");
children[1]!.click();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("1/10/0");
// finalize first re-rendering (coming from the props update)
def.resolve();
await nextTick();
expect(fixture.querySelector(".children")!.innerHTML).toBe("1/11/1");
});
});