From fa13bbb919e2ee822f43439c321b24170b75f493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Thu, 7 Feb 2019 20:24:01 +0100 Subject: [PATCH] add concurrent rendering test --- web/static/tests/core/component.test.ts | 88 ++++++++++++++++++++----- 1 file changed, 70 insertions(+), 18 deletions(-) diff --git a/web/static/tests/core/component.test.ts b/web/static/tests/core/component.test.ts index cec1ea7c..51f6fc14 100644 --- a/web/static/tests/core/component.test.ts +++ b/web/static/tests/core/component.test.ts @@ -796,23 +796,23 @@ describe("random stuff/miscellaneous", () => { }); describe("async rendering", () => { - let resolveA, resolveB; - - class ChildA extends Widget { - inlineTemplate = "a"; - willStart(): Promise { - return new Promise(r => (resolveA = r)); - } - } - - class ChildB extends Widget { - inlineTemplate = "b"; - willStart(): Promise { - return new Promise(r => (resolveB = r)); - } - } - test("creating two async widgets, scenario 1", async () => { + let defA = makeDeferred(); + let defB = makeDeferred(); + + class ChildA extends Widget { + inlineTemplate = "a"; + willStart(): Promise { + return defA; + } + } + + class ChildB extends Widget { + inlineTemplate = "b"; + willStart(): Promise { + return defB; + } + } class Parent extends Widget { inlineTemplate = `
@@ -831,12 +831,64 @@ describe("async rendering", () => { parent.updateState({ flagB: true }); await nextTick(); expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe("
"); - resolveB(); + defB.resolve(); expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe("
"); - resolveA(); + defA.resolve(); await nextTick(); expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe( "
ab
" ); }); + + test("creating two async widgets, scenario 2", async () => { + let defA = makeDeferred(); + let defB = makeDeferred(); + + class ChildA extends Widget { + inlineTemplate = `a`; + updateProps(props): Promise { + return defA.then(() => super.updateProps(props)); + } + } + class ChildB extends Widget { + inlineTemplate = `b`; + willStart(): Promise { + return defB; + } + } + + class Parent extends Widget { + inlineTemplate = ` +
+ + +
`; + widgets = { ChildA, ChildB }; + state = { valA: 1, valB: 2, flagB: false }; + } + const parent = new Parent(env); + await parent.mount(fixture); + expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe( + "
a1
" + ); + parent.updateState({ valA: 2 }); + await nextTick(); + expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe( + "
a1
" + ); + parent.updateState({ flagB: true }); + await nextTick(); + expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe( + "
a1
" + ); + defB.resolve(); + expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe( + "
a1
" + ); + defA.resolve(); + await nextTick(); + expect(fixture.innerHTML.replace(/\r?\n|\r|\s+/g, "")).toBe( + "
a2b2
" + ); + }); });