diff --git a/src/runtime/component_node.ts b/src/runtime/component_node.ts
index bffc0fc5..97950ab4 100644
--- a/src/runtime/component_node.ts
+++ b/src/runtime/component_node.ts
@@ -6,7 +6,7 @@ import { OwlError } from "../common/owl_error";
import { Fiber, makeChildFiber, makeRootFiber, MountFiber, MountOptions } from "./fibers";
import { clearReactivesForCallback, getSubscriptions, reactive, targets } from "./reactivity";
import { STATUS } from "./status";
-import { batched, Callback } from "./utils";
+import { batched, Callback, possiblySync } from "./utils";
let currentNode: ComponentNode | null = null;
@@ -128,21 +128,29 @@ export class ComponentNode
implements VNode f.call(component)));
- } catch (e) {
- this.app.handleError({ node: this, error: e });
- return;
- }
- if (this.status === STATUS.NEW && this.fiber === fiber) {
- fiber.render();
- }
+ return possiblySync(
+ () => {
+ const willStartResults = this.willStart.map((f) => f.call(component));
+ if (willStartResults.some((r) => typeof r?.then === "function")) {
+ return Promise.all(willStartResults);
+ }
+ return;
+ },
+ () => {
+ if (this.status === STATUS.NEW && this.fiber === fiber) {
+ fiber.render();
+ }
+ },
+ (e: any) => {
+ this.app.handleError({ node: this, error: e });
+ }
+ );
}
async render(deep: boolean) {
@@ -238,7 +246,7 @@ export class ComponentNode implements VNode implements VNode f.call(component, props)));
- await prom;
- if (fiber !== this.fiber) {
- return;
- }
- component.props = props;
- fiber.render();
- const parentRoot = parentFiber.root!;
- if (this.willPatch.length) {
- parentRoot.willPatch.push(fiber);
- }
- if (this.patched.length) {
- parentRoot.patched.push(fiber);
- }
+ return possiblySync(
+ () => {
+ const willUpdateProps = this.willUpdateProps.map((f) => f.call(component, props));
+ if (willUpdateProps.some((p) => typeof p?.then === "function")) {
+ return Promise.all(willUpdateProps);
+ }
+ return;
+ },
+ () => {
+ if (fiber !== this.fiber) {
+ return;
+ }
+ component.props = props;
+ fiber.render();
+ const parentRoot = parentFiber.root!;
+ if (this.willPatch.length) {
+ parentRoot.willPatch.push(fiber);
+ }
+ if (this.patched.length) {
+ parentRoot.patched.push(fiber);
+ }
+ }
+ );
}
/**
diff --git a/src/runtime/utils.ts b/src/runtime/utils.ts
index 7aa9b112..4721950b 100644
--- a/src/runtime/utils.ts
+++ b/src/runtime/utils.ts
@@ -88,3 +88,24 @@ export class Markup extends String {}
export function markup(value: any) {
return new Markup(value);
}
+
+export function possiblySync(computation: Function, onSuccess: Function, onError?: Function) {
+ try {
+ let result;
+ if (onError) {
+ try {
+ result = computation();
+ } catch (e) {
+ return onError(e);
+ }
+ } else {
+ result = computation();
+ }
+ if (typeof result?.then === "function") {
+ return result.then(onSuccess, onError);
+ }
+ return onSuccess(result);
+ } catch (e) {
+ return Promise.reject(e);
+ }
+}
diff --git a/tests/components/__snapshots__/concurrency.test.ts.snap b/tests/components/__snapshots__/concurrency.test.ts.snap
index e9d6b70c..331eb0b3 100644
--- a/tests/components/__snapshots__/concurrency.test.ts.snap
+++ b/tests/components/__snapshots__/concurrency.test.ts.snap
@@ -1861,10 +1861,10 @@ exports[`renderings, destruction, patch, stuff, ... yet another variation 3`] =
) {
let { text, createBlock, list, multi, html, toggler, comment } = bdom;
- let block3 = createBlock(\`
\`);
+ let block3 = createBlock(\`\`);
return function template(ctx, node, key = \\"\\") {
- const b2 = text(\`D\`);
+ const b2 = text(\`C\`);
let hdlr1 = [ctx['increment'], ctx];
let txt1 = ctx['state'].val;
const b3 = block3([hdlr1, txt1]);
@@ -1878,10 +1878,10 @@ exports[`renderings, destruction, patch, stuff, ... yet another variation 4`] =
) {
let { text, createBlock, list, multi, html, toggler, comment } = bdom;
- let block3 = createBlock(\`\`);
+ let block3 = createBlock(\`
\`);
return function template(ctx, node, key = \\"\\") {
- const b2 = text(\`C\`);
+ const b2 = text(\`D\`);
let hdlr1 = [ctx['increment'], ctx];
let txt1 = ctx['state'].val;
const b3 = block3([hdlr1, txt1]);
diff --git a/tests/components/concurrency.test.ts b/tests/components/concurrency.test.ts
index b6ff3e55..8507037f 100644
--- a/tests/components/concurrency.test.ts
+++ b/tests/components/concurrency.test.ts
@@ -206,13 +206,15 @@ test("destroying/recreating a subcomponent, other scenario", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Parent:rendered",
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:willDestroy",
"Parent:willPatch",
"Child:mounted",
@@ -369,9 +371,9 @@ test("creating two async components, scenario 2", async () => {
"Parent:willRender",
"ChildA:setup",
"ChildA:willStart",
- "Parent:rendered",
"ChildA:willRender",
"ChildA:rendered",
+ "Parent:rendered",
"ChildA:mounted",
"Parent:mounted",
]
@@ -467,9 +469,9 @@ test("creating two async components, scenario 3 (patching in the same frame)", a
"Parent:willRender",
"ChildA:setup",
"ChildA:willStart",
- "Parent:rendered",
"ChildA:willRender",
"ChildA:rendered",
+ "Parent:rendered",
"ChildA:mounted",
"Parent:mounted",
]
@@ -550,9 +552,9 @@ test("update a sub-component twice in the same frame", async () => {
"Parent:willRender",
"ChildA:setup",
"ChildA:willStart",
- "Parent:rendered",
"ChildA:willRender",
"ChildA:rendered",
+ "Parent:rendered",
"ChildA:mounted",
"Parent:mounted",
]
@@ -626,9 +628,9 @@ test("update a sub-component twice in the same frame, 2", async () => {
"Parent:willRender",
"ChildA:setup",
"ChildA:willStart",
- "Parent:rendered",
"ChildA:willRender",
"ChildA:rendered",
+ "Parent:rendered",
"ChildA:mounted",
"Parent:mounted",
]
@@ -642,6 +644,8 @@ test("update a sub-component twice in the same frame, 2", async () => {
Array [
"Parent:willRender",
"ChildA:willUpdateProps",
+ "ChildA:willRender",
+ "ChildA:rendered",
"Parent:rendered",
]
`);
@@ -651,12 +655,7 @@ test("update a sub-component twice in the same frame, 2", async () => {
// I do not see anything harmful in waiting an extra tick. But it is annoying to not
// know what is different.
await nextMicroTick();
- expect(steps.splice(0)).toMatchInlineSnapshot(`
- Array [
- "ChildA:willRender",
- "ChildA:rendered",
- ]
- `);
+ expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`);
expect(fixture.innerHTML).toBe("1
");
parent.state.valA = 3;
await nextMicroTick();
@@ -665,6 +664,8 @@ test("update a sub-component twice in the same frame, 2", async () => {
Array [
"Parent:willRender",
"ChildA:willUpdateProps",
+ "ChildA:willRender",
+ "ChildA:rendered",
"Parent:rendered",
]
`);
@@ -672,12 +673,7 @@ test("update a sub-component twice in the same frame, 2", async () => {
await nextMicroTick();
// same as above
await nextMicroTick();
- expect(steps.splice(0)).toMatchInlineSnapshot(`
- Array [
- "ChildA:willRender",
- "ChildA:rendered",
- ]
- `);
+ expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`);
expect(fixture.innerHTML).toBe("1
");
await nextTick();
@@ -733,13 +729,13 @@ test("properly behave when destroyed/unmounted while rendering ", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"SubChild:setup",
"SubChild:willStart",
- "Child:rendered",
"SubChild:willRender",
"SubChild:rendered",
+ "Child:rendered",
+ "Parent:rendered",
"SubChild:mounted",
"Child:mounted",
"Parent:mounted",
@@ -755,10 +751,10 @@ test("properly behave when destroyed/unmounted while rendering ", async () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"SubChild:willUpdateProps",
"Child:rendered",
+ "Parent:rendered",
]
`);
@@ -835,13 +831,15 @@ test("rendering component again in next microtick", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Parent:rendered",
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:willDestroy",
"Parent:willPatch",
"Child:mounted",
@@ -895,13 +893,13 @@ test("concurrent renderings scenario 1", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:setup",
"ComponentC:willStart",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentC:rendered",
+ "ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentC:mounted",
"ComponentB:mounted",
"ComponentA:mounted",
@@ -926,10 +924,10 @@ test("concurrent renderings scenario 1", async () => {
Array [
"ComponentA:willRender",
"ComponentB:willUpdateProps",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:willUpdateProps",
"ComponentB:rendered",
+ "ComponentA:rendered",
]
`);
expect(ComponentC.prototype.someValue).toBeCalledTimes(1);
@@ -996,13 +994,13 @@ test("concurrent renderings scenario 2", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:setup",
"ComponentC:willStart",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentC:rendered",
+ "ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentC:mounted",
"ComponentB:mounted",
"ComponentA:mounted",
@@ -1016,10 +1014,10 @@ test("concurrent renderings scenario 2", async () => {
Array [
"ComponentA:willRender",
"ComponentB:willUpdateProps",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:willUpdateProps",
"ComponentB:rendered",
+ "ComponentA:rendered",
]
`);
@@ -1099,13 +1097,13 @@ test("concurrent renderings scenario 2bis", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:setup",
"ComponentC:willStart",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentC:rendered",
+ "ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentC:mounted",
"ComponentB:mounted",
"ComponentA:mounted",
@@ -1119,10 +1117,10 @@ test("concurrent renderings scenario 2bis", async () => {
Array [
"ComponentA:willRender",
"ComponentB:willUpdateProps",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:willUpdateProps",
"ComponentB:rendered",
+ "ComponentA:rendered",
]
`);
@@ -1217,17 +1215,17 @@ test("concurrent renderings scenario 3", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:setup",
"ComponentC:willStart",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentD:setup",
"ComponentD:willStart",
- "ComponentC:rendered",
"ComponentD:willRender",
"ComponentD:rendered",
+ "ComponentC:rendered",
+ "ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentD:mounted",
"ComponentC:mounted",
"ComponentB:mounted",
@@ -1258,10 +1256,10 @@ test("concurrent renderings scenario 3", async () => {
Array [
"ComponentB:willRender",
"ComponentC:willUpdateProps",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentD:willUpdateProps",
"ComponentC:rendered",
+ "ComponentB:rendered",
]
`);
@@ -1273,12 +1271,12 @@ test("concurrent renderings scenario 3", async () => {
"ComponentD:willRender",
"ComponentD:rendered",
"ComponentA:willPatch",
- "ComponentB:willPatch",
"ComponentC:willPatch",
+ "ComponentB:willPatch",
"ComponentD:willPatch",
"ComponentD:patched",
- "ComponentC:patched",
"ComponentB:patched",
+ "ComponentC:patched",
"ComponentA:patched",
]
`);
@@ -1343,17 +1341,17 @@ test("concurrent renderings scenario 4", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentC:setup",
"ComponentC:willStart",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentD:setup",
"ComponentD:willStart",
- "ComponentC:rendered",
"ComponentD:willRender",
"ComponentD:rendered",
+ "ComponentC:rendered",
+ "ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentD:mounted",
"ComponentC:mounted",
"ComponentB:mounted",
@@ -1384,10 +1382,10 @@ test("concurrent renderings scenario 4", async () => {
Array [
"ComponentB:willRender",
"ComponentC:willUpdateProps",
- "ComponentB:rendered",
"ComponentC:willRender",
"ComponentD:willUpdateProps",
"ComponentC:rendered",
+ "ComponentB:rendered",
]
`);
@@ -1406,12 +1404,12 @@ test("concurrent renderings scenario 4", async () => {
"ComponentD:willRender",
"ComponentD:rendered",
"ComponentA:willPatch",
- "ComponentB:willPatch",
"ComponentC:willPatch",
+ "ComponentB:willPatch",
"ComponentD:willPatch",
"ComponentD:patched",
- "ComponentC:patched",
"ComponentB:patched",
+ "ComponentC:patched",
"ComponentA:patched",
]
`);
@@ -1452,9 +1450,9 @@ test("concurrent renderings scenario 5", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentB:mounted",
"ComponentA:mounted",
]
@@ -1540,9 +1538,9 @@ test("concurrent renderings scenario 6", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentB:mounted",
"ComponentA:mounted",
]
@@ -1628,9 +1626,9 @@ test("concurrent renderings scenario 7", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentB:mounted",
"ComponentA:mounted",
]
@@ -1639,11 +1637,13 @@ test("concurrent renderings scenario 7", async () => {
component.state.fromA = 2;
await nextTick();
expect(fixture.innerHTML).toBe("");
- expect(ComponentB.prototype.someValue).toBeCalledTimes(2);
+ expect(ComponentB.prototype.someValue).toBeCalledTimes(3);
expect(steps.splice(0)).toMatchInlineSnapshot(`
Array [
"ComponentA:willRender",
"ComponentB:willUpdateProps",
+ "ComponentB:willRender",
+ "ComponentB:rendered",
"ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
@@ -1686,9 +1686,9 @@ test("concurrent renderings scenario 8", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentB:mounted",
"ComponentA:mounted",
]
@@ -1789,17 +1789,17 @@ test("concurrent renderings scenario 9", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentC:setup",
- "ComponentC:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
+ "ComponentC:setup",
+ "ComponentC:willStart",
"ComponentC:willRender",
"ComponentD:setup",
"ComponentD:willStart",
- "ComponentC:rendered",
"ComponentD:willRender",
"ComponentD:rendered",
+ "ComponentC:rendered",
+ "ComponentA:rendered",
"ComponentD:mounted",
"ComponentC:mounted",
"ComponentB:mounted",
@@ -1815,12 +1815,12 @@ test("concurrent renderings scenario 9", async () => {
"ComponentA:willRender",
"ComponentB:willUpdateProps",
"ComponentC:willUpdateProps",
- "ComponentA:rendered",
"ComponentC:willRender",
"ComponentD:willUpdateProps",
- "ComponentC:rendered",
"ComponentD:willRender",
"ComponentD:rendered",
+ "ComponentC:rendered",
+ "ComponentA:rendered",
]
`);
@@ -1831,9 +1831,9 @@ test("concurrent renderings scenario 9", async () => {
Array [
"ComponentC:willRender",
"ComponentD:willUpdateProps",
- "ComponentC:rendered",
"ComponentD:willRender",
"ComponentD:rendered",
+ "ComponentC:rendered",
]
`);
@@ -1918,9 +1918,9 @@ test("concurrent renderings scenario 10", async () => {
"ComponentA:willRender",
"ComponentB:setup",
"ComponentB:willStart",
- "ComponentA:rendered",
"ComponentB:willRender",
"ComponentB:rendered",
+ "ComponentA:rendered",
"ComponentB:mounted",
"ComponentA:mounted",
]
@@ -2010,9 +2010,9 @@ test("concurrent renderings scenario 11", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -2086,9 +2086,9 @@ test("concurrent renderings scenario 12", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -2175,9 +2175,9 @@ test("concurrent renderings scenario 13", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
"Child:willRender",
@@ -2201,9 +2201,9 @@ test("concurrent renderings scenario 13", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:mounted",
"Parent:patched",
@@ -2271,13 +2271,13 @@ test("concurrent renderings scenario 14", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -2297,10 +2297,12 @@ test("concurrent renderings scenario 14", async () => {
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"C:willUpdateProps",
+ "C:willRender",
+ "C:rendered",
"B:rendered",
+ "A:rendered",
]
`);
@@ -2317,13 +2319,11 @@ test("concurrent renderings scenario 14", async () => {
);
expect(steps.splice(0)).toMatchInlineSnapshot(`
Array [
- "C:willRender",
- "C:rendered",
"B:willRender",
"C:willUpdateProps",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
"A:willPatch",
"B:willPatch",
"C:willPatch",
@@ -2378,13 +2378,13 @@ test("concurrent renderings scenario 15", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -2404,10 +2404,12 @@ test("concurrent renderings scenario 15", async () => {
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"C:willUpdateProps",
+ "C:willRender",
+ "C:rendered",
"B:rendered",
+ "A:rendered",
]
`);
@@ -2426,12 +2428,7 @@ test("concurrent renderings scenario 15", async () => {
await nextMicroTick();
app.scheduler.flush();
expect(fixture.innerHTML).toBe("123
");
- expect(steps.splice(0)).toMatchInlineSnapshot(`
- Array [
- "C:willRender",
- "C:rendered",
- ]
- `);
+ expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`);
await nextTick();
expect(fixture.innerHTML).toBe(
@@ -2441,9 +2438,9 @@ test("concurrent renderings scenario 15", async () => {
Array [
"B:willRender",
"C:willUpdateProps",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
"A:willPatch",
"B:willPatch",
"C:willPatch",
@@ -2506,13 +2503,13 @@ test("concurrent renderings scenario 16", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -2533,12 +2530,12 @@ test("concurrent renderings scenario 16", async () => {
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"C:willUpdateProps",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
]
`);
@@ -2558,11 +2555,11 @@ test("concurrent renderings scenario 16", async () => {
"C:rendered",
"B:willRender",
"C:willUpdateProps",
- "B:rendered",
"C:willRender",
"D:setup",
"D:willStart",
"C:rendered",
+ "B:rendered",
"D:willDestroy",
]
`);
@@ -2722,7 +2719,7 @@ test("changing state before first render does not trigger a render", async () =>
setup() {
useLogLifecycle();
this.state.drinks++;
- onWillStart(() => {
+ onWillStart(async () => {
this.state.drinks++;
});
}
@@ -2757,7 +2754,7 @@ test("changing state before first render does not trigger a render (with parent)
setup() {
useLogLifecycle();
this.state.drinks++;
- onWillStart(() => {
+ onWillStart(async () => {
this.state.drinks++;
});
}
@@ -2843,24 +2840,21 @@ test("two renderings initiated between willPatch and patched", async () => {
"Parent:willRender",
"Panel:setup",
"Panel:willStart",
- "Parent:rendered",
"Panel:willRender",
"Panel:rendered",
+ "Parent:rendered",
"Panel:mounted",
"Parent:mounted",
"Parent:willRender",
"Panel:willUpdateProps",
+ "Panel:willRender",
+ "Panel:rendered",
"Parent:rendered",
]
`);
await nextMicroTick();
- expect(steps.splice(0)).toMatchInlineSnapshot(`
- Array [
- "Panel:willRender",
- "Panel:rendered",
- ]
- `);
+ expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`);
await nextTick();
expect(steps.splice(0)).toMatchInlineSnapshot(`
@@ -2881,9 +2875,9 @@ test("two renderings initiated between willPatch and patched", async () => {
"Parent:willRender",
"Panel:setup",
"Panel:willStart",
- "Parent:rendered",
"Panel:willRender",
"Panel:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Panel:willUnmount",
"Panel:willDestroy",
@@ -2891,6 +2885,8 @@ test("two renderings initiated between willPatch and patched", async () => {
"Parent:patched",
"Parent:willRender",
"Panel:willUpdateProps",
+ "Panel:willRender",
+ "Panel:rendered",
"Parent:rendered",
]
`);
@@ -2899,8 +2895,6 @@ test("two renderings initiated between willPatch and patched", async () => {
expect(fixture.innerHTML).toBe("");
expect(steps.splice(0)).toMatchInlineSnapshot(`
Array [
- "Panel:willRender",
- "Panel:rendered",
"Parent:willPatch",
"Panel:willPatch",
"Panel:patched",
@@ -2963,9 +2957,9 @@ test("parent and child rendered at exact same time", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -2980,9 +2974,9 @@ test("parent and child rendered at exact same time", async () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:willPatch",
"Child:patched",
@@ -3026,9 +3020,9 @@ test("delay willUpdateProps", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -3148,17 +3142,17 @@ test("delay willUpdateProps with rendering grandchild", async () => {
"GrandParent:willRender",
"Parent:setup",
"Parent:willStart",
- "GrandParent:rendered",
"Parent:willRender",
"DelayedChild:setup",
"DelayedChild:willStart",
- "ReactiveChild:setup",
- "ReactiveChild:willStart",
- "Parent:rendered",
"DelayedChild:willRender",
"DelayedChild:rendered",
+ "ReactiveChild:setup",
+ "ReactiveChild:willStart",
"ReactiveChild:willRender",
"ReactiveChild:rendered",
+ "Parent:rendered",
+ "GrandParent:rendered",
"ReactiveChild:mounted",
"DelayedChild:mounted",
"Parent:mounted",
@@ -3178,13 +3172,13 @@ test("delay willUpdateProps with rendering grandchild", async () => {
Array [
"GrandParent:willRender",
"Parent:willUpdateProps",
- "GrandParent:rendered",
"Parent:willRender",
"DelayedChild:willUpdateProps",
"ReactiveChild:willUpdateProps",
- "Parent:rendered",
"ReactiveChild:willRender",
"ReactiveChild:rendered",
+ "Parent:rendered",
+ "GrandParent:rendered",
]
`);
@@ -3200,13 +3194,13 @@ test("delay willUpdateProps with rendering grandchild", async () => {
Array [
"GrandParent:willRender",
"Parent:willUpdateProps",
- "GrandParent:rendered",
"Parent:willRender",
"DelayedChild:willUpdateProps",
"ReactiveChild:willUpdateProps",
- "Parent:rendered",
"ReactiveChild:willRender",
"ReactiveChild:rendered",
+ "Parent:rendered",
+ "GrandParent:rendered",
]
`);
@@ -3218,12 +3212,12 @@ test("delay willUpdateProps with rendering grandchild", async () => {
"DelayedChild:willRender",
"DelayedChild:rendered",
"GrandParent:willPatch",
- "Parent:willPatch",
"ReactiveChild:willPatch",
+ "Parent:willPatch",
"DelayedChild:willPatch",
"DelayedChild:patched",
- "ReactiveChild:patched",
"Parent:patched",
+ "ReactiveChild:patched",
"GrandParent:patched",
]
`);
@@ -3266,9 +3260,9 @@ test("two sequential renderings before an animation frame", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -3285,9 +3279,9 @@ test("two sequential renderings before an animation frame", async () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
]
`);
@@ -3303,9 +3297,9 @@ test("two sequential renderings before an animation frame", async () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
]
`);
@@ -3581,9 +3575,9 @@ test("rendering parent twice, with different props on child and stuff", async ()
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -3599,9 +3593,9 @@ test("rendering parent twice, with different props on child and stuff", async ()
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
]
`);
expect(fixture.innerHTML).toBe("1");
@@ -3614,9 +3608,9 @@ test("rendering parent twice, with different props on child and stuff", async ()
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:willPatch",
"Child:patched",
@@ -3677,17 +3671,17 @@ test("delayed rendering, but then initial rendering is cancelled by yet another
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"D:setup",
"D:willStart",
- "C:rendered",
"D:willRender",
"D:rendered",
+ "C:rendered",
+ "B:rendered",
+ "A:rendered",
"D:mounted",
"C:mounted",
"B:mounted",
@@ -3718,10 +3712,10 @@ test("delayed rendering, but then initial rendering is cancelled by yet another
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"C:willUpdateProps",
"B:rendered",
+ "A:rendered",
]
`);
@@ -3798,13 +3792,13 @@ test("delayed rendering, reusing fiber and stuff", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -3901,13 +3895,13 @@ test("delayed rendering, then component is destroyed and stuff", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -3989,13 +3983,13 @@ test("delayed rendering, reusing fiber then component is destroyed and stuff",
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -4085,13 +4079,13 @@ test("another scenario with delayed rendering", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -4197,15 +4191,15 @@ test("delayed fiber does not get rendered if it was cancelled", async () => {
"A:setup",
"A:willRender",
"B:setup",
- "A:rendered",
"B:willRender",
"C:setup",
- "B:rendered",
"C:willRender",
"D:setup",
- "C:rendered",
"D:willRender",
"D:rendered",
+ "C:rendered",
+ "B:rendered",
+ "A:rendered",
"D:mounted",
"C:mounted",
"B:mounted",
@@ -4218,6 +4212,8 @@ test("delayed fiber does not get rendered if it was cancelled", async () => {
expect(steps.splice(0)).toMatchInlineSnapshot(`
Array [
"C:willRender",
+ "D:willRender",
+ "D:rendered",
"C:rendered",
]
`);
@@ -4229,20 +4225,20 @@ test("delayed fiber does not get rendered if it was cancelled", async () => {
expect(steps.splice(0)).toMatchInlineSnapshot(`
Array [
"A:willRender",
- "A:rendered",
"B:willRender",
- "B:rendered",
"C:willRender",
- "C:rendered",
"D:willRender",
"D:rendered",
+ "C:rendered",
+ "B:rendered",
+ "A:rendered",
"A:willPatch",
- "B:willPatch",
- "C:willPatch",
"D:willPatch",
- "D:patched",
- "C:patched",
+ "C:willPatch",
+ "B:willPatch",
"B:patched",
+ "C:patched",
+ "D:patched",
"A:patched",
]
`);
@@ -4310,13 +4306,13 @@ test("destroyed component causes other soon to be destroyed component to rerende
"A:willRender",
"B:setup",
"B:willStart",
- "C:setup",
- "C:willStart",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "C:setup",
+ "C:willStart",
"C:willRender",
"C:rendered",
+ "A:rendered",
]
`);
@@ -4328,13 +4324,13 @@ test("destroyed component causes other soon to be destroyed component to rerende
"A:willRender",
"B:setup",
"B:willStart",
- "C:setup",
- "C:willStart",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "C:setup",
+ "C:willStart",
"C:willRender",
"C:rendered",
+ "A:rendered",
"B:willDestroy",
"C:willDestroy",
"A:willPatch",
@@ -4399,17 +4395,17 @@ test("delayed rendering, destruction, stuff happens", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"D:setup",
"D:willStart",
- "C:rendered",
"D:willRender",
"D:rendered",
+ "C:rendered",
+ "B:rendered",
+ "A:rendered",
"D:mounted",
"C:mounted",
"B:mounted",
@@ -4424,10 +4420,10 @@ test("delayed rendering, destruction, stuff happens", async () => {
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"C:willUpdateProps",
"B:rendered",
+ "A:rendered",
]
`);
@@ -4506,19 +4502,19 @@ test("renderings, destruction, patch, stuff, ... yet another variation", async (
"A:willRender",
"B:setup",
"B:willStart",
- "D:setup",
- "D:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
- "D:willRender",
- "D:rendered",
"C:willRender",
"C:rendered",
- "C:mounted",
+ "B:rendered",
+ "D:setup",
+ "D:willStart",
+ "D:willRender",
+ "D:rendered",
+ "A:rendered",
"D:mounted",
+ "C:mounted",
"B:mounted",
"A:mounted",
]
@@ -4604,9 +4600,9 @@ test("delayed render does not go through when t-component value changed", async
"A:setup",
"A:willRender",
"B:setup",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "A:rendered",
"B:mounted",
"A:mounted",
]
@@ -4621,9 +4617,9 @@ test("delayed render does not go through when t-component value changed", async
Array [
"A:willRender",
"C:setup",
- "A:rendered",
"C:willRender",
"C:rendered",
+ "A:rendered",
"A:willPatch",
"B:willUnmount",
"B:willDestroy",
@@ -4666,9 +4662,9 @@ test("delayed render is not cancelled by upcoming render", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "A:rendered",
"B:mounted",
"A:mounted",
]
@@ -4690,9 +4686,9 @@ test("delayed render is not cancelled by upcoming render", async () => {
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "A:rendered",
]
`);
@@ -4702,9 +4698,9 @@ test("delayed render is not cancelled by upcoming render", async () => {
Array [
"A:willRender",
"B:willUpdateProps",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "A:rendered",
"A:willPatch",
"B:willPatch",
"B:patched",
@@ -4785,9 +4781,9 @@ test("components are not destroyed between animation frame", async () => {
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
"B:willDestroy",
"A:willPatch",
"C:mounted",
@@ -4824,9 +4820,9 @@ test("component destroyed just after render", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "A:rendered",
"B:mounted",
"A:mounted",
]
diff --git a/tests/components/error_handling.test.ts b/tests/components/error_handling.test.ts
index 24a178f8..b9b4b36e 100644
--- a/tests/components/error_handling.test.ts
+++ b/tests/components/error_handling.test.ts
@@ -76,8 +76,9 @@ describe("basics", () => {
}
const app = new App(Parent);
let error: Error;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
'Cannot find the definition of component "SomeMispelledComponent"'
);
await mountProm;
@@ -96,8 +97,9 @@ describe("basics", () => {
}
const app = new App(Parent, { test: true });
let error: Error;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
'Cannot find the definition of component "SomeMispelledComponent"'
);
await mountProm;
@@ -116,8 +118,9 @@ describe("basics", () => {
}
const app = new App(Parent as typeof Component);
let error: Error;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
'"SomeComponent" is not a Component. It must inherit from the Component class'
);
await mountProm;
@@ -133,8 +136,9 @@ describe("basics", () => {
}
const app = new App(Parent as typeof Component);
let error: Error;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
'Cannot find the definition of component "MissingChild", missing static components key in parent'
);
await mountProm;
@@ -197,8 +201,9 @@ function(app, bdom, helpers) {
}`;
const app = new App(Parent as typeof Component);
let error: Error;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(expectedErrorMessage);
+ await expect(appError).resolves.toThrow(expectedErrorMessage);
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(expectedErrorMessage);
@@ -244,8 +249,9 @@ describe("errors and promises", () => {
const app = new App(Root);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).toBeDefined();
expect(error!.cause).toBeDefined();
@@ -268,8 +274,9 @@ describe("errors and promises", () => {
const app = new App(Root);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).toBeDefined();
expect(error!.cause).toBeDefined();
@@ -291,8 +298,9 @@ describe("errors and promises", () => {
const app = new App(Root, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occurred in onMounted");
+ await expect(appError).resolves.toThrow("error occurred in onMounted");
await mountProm;
expect(error!).toBeDefined();
expect(error!.stack).toContain("Root.setup");
@@ -317,8 +325,9 @@ describe("errors and promises", () => {
const app = new App(Root, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occurred in onWillRender");
+ await expect(appError).resolves.toThrow("error occurred in onWillRender");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -358,8 +367,9 @@ describe("errors and promises", () => {
const app = new App(Root, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occurred in onWillStart");
+ await expect(appError).resolves.toThrow("error occurred in onWillStart");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -426,8 +436,9 @@ describe("errors and promises", () => {
const app = new App(Parent);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).toBeDefined();
expect(error!.cause).toBeDefined();
@@ -472,8 +483,9 @@ describe("errors and promises", () => {
const app = new App(Parent);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).toBeDefined();
expect(error!.cause).toBeDefined();
@@ -502,8 +514,9 @@ describe("errors and promises", () => {
const app = new App(Example, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occurred in onMounted");
+ await expect(appError).resolves.toThrow("error occurred in onMounted");
await mountProm;
expect(error!.message).toBe(`The following error occurred in onMounted: "Error in mounted"`);
// 1 additional error is logged because the destruction of the app causes
@@ -577,9 +590,9 @@ describe("can catch errors", () => {
}
const app = new App(Root, { test: true });
let error: OwlError;
- const crashProm = expect(nextAppError(app)).resolves.toThrow("error occurred in onWillStart");
+ const appError = nextAppError(app);
await app.mount(fixture).catch((e: Error) => (error = e));
- await crashProm;
+ await expect(appError).resolves.toThrow("error occurred in onWillStart");
expect(error!.message).toBe(
`The following error occurred in onWillStart: "No active component (a hook function should only be called in 'setup')"`
);
@@ -599,8 +612,9 @@ describe("can catch errors", () => {
}
const app = new App(Root, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occurred in onMounted");
+ await expect(appError).resolves.toThrow("error occurred in onMounted");
await mountProm;
expect(error!.message).toBe(`The following error occurred in onMounted: "test error"`);
expect(error!.cause).toBe(err);
@@ -621,8 +635,9 @@ describe("can catch errors", () => {
}
const app = new App(Root, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occurred in onWillStart");
+ await expect(appError).resolves.toThrow("error occurred in onWillStart");
await mountProm;
expect(error!.message).toBe(`The following error occurred in onWillStart: "test error"`);
expect(error!.cause).toBe(err);
@@ -642,8 +657,9 @@ describe("can catch errors", () => {
}
const app = new App(Root);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!.message).toBe(
`An error occured in the owl lifecycle (see this Error's "cause" property)`
@@ -666,8 +682,9 @@ describe("can catch errors", () => {
}
const app = new App(Root);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!.message).toBe(
`An error occured in the owl lifecycle (see this Error's "cause" property)`
@@ -688,8 +705,9 @@ describe("can catch errors", () => {
}
const app = new App(Root, { test: true });
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("not an Error was thrown in onMounted");
+ await expect(appError).resolves.toThrow("not an Error was thrown in onMounted");
await mountProm;
expect(error!.message).toBe(
`Something that is not an Error was thrown in onMounted (see this Error's "cause" property)`
@@ -710,8 +728,9 @@ describe("can catch errors", () => {
}
const app = new App(Root);
let error: OwlError;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!.message).toBe(
`An error occured in the owl lifecycle (see this Error's "cause" property)`
@@ -956,13 +975,13 @@ describe("can catch errors", () => {
"Root:willRender",
"ErrorBoundary:setup",
"ErrorBoundary:willStart",
- "Root:rendered",
"ErrorBoundary:willRender",
"ErrorComponent:setup",
"ErrorComponent:willStart",
- "ErrorBoundary:rendered",
"ErrorComponent:willRender",
"ErrorComponent:rendered",
+ "ErrorBoundary:rendered",
+ "Root:rendered",
"ErrorComponent:mounted",
"boom",
"ErrorBoundary:willRender",
@@ -1008,9 +1027,9 @@ describe("can catch errors", () => {
"Root:willRender",
"ErrorComponent:setup",
"ErrorComponent:willStart",
- "Root:rendered",
"ErrorComponent:willRender",
"ErrorComponent:rendered",
+ "Root:rendered",
"ErrorComponent:mounted",
"boom",
"Root:willRender",
@@ -1071,17 +1090,17 @@ describe("can catch errors", () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"Boom:setup",
"Boom:willStart",
- "C:rendered",
"Boom:willRender",
"Boom:rendered",
+ "C:rendered",
+ "B:rendered",
+ "A:rendered",
"Boom:mounted",
"boom",
"C:willRender",
@@ -1144,17 +1163,17 @@ describe("can catch errors", () => {
"Root:willRender",
"OK:setup",
"OK:willStart",
- "ErrorBoundary:setup",
- "ErrorBoundary:willStart",
- "Root:rendered",
"OK:willRender",
"OK:rendered",
+ "ErrorBoundary:setup",
+ "ErrorBoundary:willStart",
"ErrorBoundary:willRender",
"ErrorComponent:setup",
"ErrorComponent:willStart",
- "ErrorBoundary:rendered",
"ErrorComponent:willRender",
"ErrorComponent:rendered",
+ "ErrorBoundary:rendered",
+ "Root:rendered",
"ErrorComponent:mounted",
"boom",
"ErrorBoundary:willRender",
@@ -1497,9 +1516,9 @@ describe("can catch errors", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -1576,9 +1595,9 @@ describe("can catch errors", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
]
`);
parent.state.hasChild = false;
diff --git a/tests/components/hooks.test.ts b/tests/components/hooks.test.ts
index 7b72e265..74ea564c 100644
--- a/tests/components/hooks.test.ts
+++ b/tests/components/hooks.test.ts
@@ -660,8 +660,9 @@ describe("hooks", () => {
let error: OwlError;
const app = new App(MyComponent);
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!.cause.message).toBe("Intentional error");
// no console.error because the error has been caught in this test
diff --git a/tests/components/lifecycle.test.ts b/tests/components/lifecycle.test.ts
index a140b2b4..8640e106 100644
--- a/tests/components/lifecycle.test.ts
+++ b/tests/components/lifecycle.test.ts
@@ -342,15 +342,16 @@ describe("lifecycle hooks", () => {
parent.state.n = 2;
await nextTick();
app.destroy();
- expect(steps).toEqual([
- "parent:willPatch",
- "child:willPatch",
- "childchild:willPatch",
- "childchild:patched",
- "child:patched",
- "parent:patched",
- ]);
- Object.freeze(steps);
+ expect(steps.splice(0)).toMatchInlineSnapshot(`
+ Array [
+ "parent:willPatch",
+ "childchild:willPatch",
+ "child:willPatch",
+ "child:patched",
+ "childchild:patched",
+ "parent:patched",
+ ]
+ `);
});
test("willStart, mounted on subwidget rendered after main is mounted in some other position", async () => {
@@ -463,9 +464,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -478,9 +479,9 @@ describe("lifecycle hooks", () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:willPatch",
"Child:patched",
@@ -528,9 +529,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -650,9 +651,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -712,13 +713,13 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"GrandChild:setup",
"GrandChild:willStart",
- "Child:rendered",
"GrandChild:willRender",
"GrandChild:rendered",
+ "Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"GrandChild:mounted",
"Child:mounted",
@@ -834,11 +835,11 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"GrandChild:setup",
"GrandChild:willStart",
"Child:rendered",
+ "Parent:rendered",
]
`);
@@ -878,9 +879,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -925,9 +926,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -939,9 +940,9 @@ describe("lifecycle hooks", () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:willPatch",
"Child:patched",
@@ -986,9 +987,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -1113,21 +1114,21 @@ describe("lifecycle hooks", () => {
"A:willRender",
"B:setup",
"B:willStart",
- "C:setup",
- "C:willStart",
- "A:rendered",
"B:willRender",
"B:rendered",
+ "C:setup",
+ "C:willStart",
"C:willRender",
"D:setup",
"D:willStart",
- "E:setup",
- "E:willStart",
- "C:rendered",
"D:willRender",
"D:rendered",
+ "E:setup",
+ "E:willStart",
"E:willRender",
"E:rendered",
+ "C:rendered",
+ "A:rendered",
"E:mounted",
"D:mounted",
"C:mounted",
@@ -1144,9 +1145,9 @@ describe("lifecycle hooks", () => {
"C:willRender",
"F:setup",
"F:willStart",
- "C:rendered",
"F:willRender",
"F:rendered",
+ "C:rendered",
"C:willPatch",
"E:willUnmount",
"E:willDestroy",
@@ -1181,9 +1182,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -1209,9 +1210,9 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:mounted",
"Parent:patched",
@@ -1465,6 +1466,8 @@ describe("lifecycle hooks", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Parent:rendered",
"Parent:willUnmount",
"Child:willDestroy",
diff --git a/tests/components/props.test.ts b/tests/components/props.test.ts
index e1a11a9a..8d80f22c 100644
--- a/tests/components/props.test.ts
+++ b/tests/components/props.test.ts
@@ -279,9 +279,9 @@ test("bound functions are considered 'alike'", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -341,9 +341,9 @@ test(".alike suffix in a simple case", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -403,13 +403,13 @@ test(".alike suffix in a list", async () => {
"Parent:willRender",
"Todo:setup",
"Todo:willStart",
+ "Todo:willRender",
+ "Todo:rendered",
"Todo:setup",
"Todo:willStart",
+ "Todo:willRender",
+ "Todo:rendered",
"Parent:rendered",
- "Todo:willRender",
- "Todo:rendered",
- "Todo:willRender",
- "Todo:rendered",
"Todo:mounted",
"Todo:mounted",
"Parent:mounted",
diff --git a/tests/components/props_validation.test.ts b/tests/components/props_validation.test.ts
index 265a36ba..6efb9355 100644
--- a/tests/components/props_validation.test.ts
+++ b/tests/components/props_validation.test.ts
@@ -51,8 +51,9 @@ describe("props validation", () => {
const app = new App(Parent, { test: true });
let error: OwlError | undefined;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
"Invalid props for component 'SubComp': 'message' is missing"
);
await mountProm;
@@ -80,8 +81,9 @@ describe("props validation", () => {
const app = new App(Parent, { test: true });
let error: OwlError | undefined;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
"Invalid props for component 'SubComp': 'message' is missing"
);
await mountProm;
@@ -131,8 +133,9 @@ describe("props validation", () => {
props = {};
let app = new App(Parent, { test: true });
let error: OwlError | undefined;
+ let appError = nextAppError(app);
let mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'");
+ await expect(appError).resolves.toThrow("Invalid props for component '_a'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -148,8 +151,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: test.ko };
app = new App(Parent, { test: true });
+ appError = nextAppError(app);
mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'");
+ await expect(appError).resolves.toThrow("Invalid props for component '_a'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -183,8 +187,9 @@ describe("props validation", () => {
props = {};
let app = new App(Parent, { test: true });
let error: OwlError | undefined;
+ let appError = nextAppError(app);
let mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'");
+ await expect(appError).resolves.toThrow("Invalid props for component '_a'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -200,8 +205,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: test.ko };
app = new App(Parent, { test: true });
+ appError = nextAppError(app);
mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'");
+ await expect(appError).resolves.toThrow("Invalid props for component '_a'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -240,8 +246,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: 1 };
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -279,8 +286,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: 1 };
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe("Invalid props for component 'SubComp': 'p' is not a string");
@@ -316,14 +324,16 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: [1] };
let app = new App(Parent, { test: true });
+ let appError = nextAppError(app);
let mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
error = undefined;
app = new App(Parent, { test: true });
+ appError = nextAppError(app);
mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
});
@@ -365,8 +375,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: [true, 1] };
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -399,8 +410,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: { id: 1, url: "url", extra: true } };
let app = new App(Parent, { test: true });
+ let appError = nextAppError(app);
let mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -408,8 +420,9 @@ describe("props validation", () => {
);
props = { p: { id: "1", url: "url" } };
app = new App(Parent, { test: true });
+ appError = nextAppError(app);
mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -418,8 +431,9 @@ describe("props validation", () => {
error = undefined;
props = { p: { id: 1 } };
app = new App(Parent, { test: true });
+ appError = nextAppError(app);
mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -465,8 +479,9 @@ describe("props validation", () => {
expect(error!).toBeUndefined();
props = { p: { id: 1, url: [12, true] } };
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -675,8 +690,9 @@ describe("props validation", () => {
}
let error: Error;
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe("Invalid props for component 'SubComp': 'p' is missing");
@@ -765,8 +781,9 @@ describe("props validation", () => {
}
let error: Error;
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'Child'");
+ await expect(appError).resolves.toThrow("Invalid props for component 'Child'");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
@@ -821,8 +838,9 @@ describe("props validation", () => {
const app = new App(Parent, { test: true });
let error: OwlError | undefined;
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
"Invalid props for component 'Child': 'message' is missing"
);
await mountProm;
@@ -895,10 +913,9 @@ describe("default props", () => {
}
let error: Error;
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow(
- "default value cannot be defined for a mandatory prop"
- );
+ await expect(appError).resolves.toThrow("default value cannot be defined for a mandatory prop");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(
diff --git a/tests/components/reactivity.test.ts b/tests/components/reactivity.test.ts
index 042757d5..e7b86963 100644
--- a/tests/components/reactivity.test.ts
+++ b/tests/components/reactivity.test.ts
@@ -151,9 +151,10 @@ describe("reactivity in lifecycle", () => {
}
}
const prom = mount(Comp, fixture);
+ expect(steps).toEqual([1]);
(STATE as any).val = 2;
await prom;
- expect(steps).toEqual([2]);
+ expect(steps).toEqual([1, 2]);
expect(fixture.innerHTML).toBe("2
");
});
@@ -182,9 +183,9 @@ describe("reactivity in lifecycle", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
diff --git a/tests/components/refs.test.ts b/tests/components/refs.test.ts
index b6cf1fb7..aa5e0795 100644
--- a/tests/components/refs.test.ts
+++ b/tests/components/refs.test.ts
@@ -125,10 +125,11 @@ describe("refs", () => {
}
const app = new App(Test, { test: true });
+ const appError = nextAppError(app);
const mountProm = expect(app.mount(fixture)).rejects.toThrowError(
'Cannot set the same ref more than once in the same component, ref "coucou" was set multiple times in Test'
);
- await expect(nextAppError(app)).resolves.toThrow(
+ await expect(appError).resolves.toThrow(
'Cannot set the same ref more than once in the same component, ref "coucou" was set multiple times in Test'
);
await mountProm;
diff --git a/tests/components/rendering.test.ts b/tests/components/rendering.test.ts
index 2464b623..d6272d4f 100644
--- a/tests/components/rendering.test.ts
+++ b/tests/components/rendering.test.ts
@@ -49,9 +49,9 @@ describe("rendering semantics", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -179,9 +179,9 @@ describe("rendering semantics", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -198,9 +198,9 @@ describe("rendering semantics", () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
]
`);
@@ -213,9 +213,9 @@ describe("rendering semantics", () => {
Array [
"Parent:willRender",
"Child:willUpdateProps",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"Child:willPatch",
"Child:patched",
@@ -253,9 +253,9 @@ describe("rendering semantics", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -305,9 +305,9 @@ describe("rendering semantics", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -404,13 +404,13 @@ describe("rendering semantics", () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -473,13 +473,13 @@ test("force render in case of existing render", async () => {
"A:willRender",
"B:setup",
"B:willStart",
- "A:rendered",
"B:willRender",
"C:setup",
"C:willStart",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
+ "A:rendered",
"C:mounted",
"B:mounted",
"A:mounted",
@@ -516,14 +516,14 @@ test("force render in case of existing render", async () => {
Array [
"B:willRender",
"C:willUpdateProps",
- "B:rendered",
"C:willRender",
"C:rendered",
+ "B:rendered",
"A:willPatch",
- "B:willPatch",
"C:willPatch",
- "C:patched",
+ "B:willPatch",
"B:patched",
+ "C:patched",
"A:patched",
]
`);
@@ -561,9 +561,9 @@ test("children, default props and renderings", async () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
diff --git a/tests/components/slots.test.ts b/tests/components/slots.test.ts
index f36ef6d0..c3a478d3 100644
--- a/tests/components/slots.test.ts
+++ b/tests/components/slots.test.ts
@@ -223,8 +223,9 @@ describe("slots", () => {
let error: Error;
const app = new App(Parent);
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).not.toBeNull();
expect(mockConsoleWarn).toBeCalledTimes(1);
diff --git a/tests/components/style_class.test.ts b/tests/components/style_class.test.ts
index e57dcd5e..988c12af 100644
--- a/tests/components/style_class.test.ts
+++ b/tests/components/style_class.test.ts
@@ -349,8 +349,9 @@ describe("style and class handling", () => {
}
let error: OwlError;
const app = new App(Parent);
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).toBeDefined();
expect(error!.cause).toBeDefined();
diff --git a/tests/components/t_component.test.ts b/tests/components/t_component.test.ts
index b682fe53..a32aaff2 100644
--- a/tests/components/t_component.test.ts
+++ b/tests/components/t_component.test.ts
@@ -36,9 +36,9 @@ describe("t-component", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]
@@ -77,9 +77,9 @@ describe("t-component", () => {
"Parent:willRender",
"ChildA:setup",
"ChildA:willStart",
- "Parent:rendered",
"ChildA:willRender",
"ChildA:rendered",
+ "Parent:rendered",
"ChildA:mounted",
"Parent:mounted",
]
@@ -94,9 +94,9 @@ describe("t-component", () => {
"Parent:willRender",
"ChildB:setup",
"ChildB:willStart",
- "Parent:rendered",
"ChildB:willRender",
"ChildB:rendered",
+ "Parent:rendered",
"Parent:willPatch",
"ChildA:willUnmount",
"ChildA:willDestroy",
diff --git a/tests/components/t_foreach.test.ts b/tests/components/t_foreach.test.ts
index 952d76d9..b570e92b 100644
--- a/tests/components/t_foreach.test.ts
+++ b/tests/components/t_foreach.test.ts
@@ -99,13 +99,13 @@ describe("list of components", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Parent:rendered",
- "Child:willRender",
- "Child:rendered",
- "Child:willRender",
- "Child:rendered",
"Child:mounted",
"Child:mounted",
"Parent:mounted",
@@ -326,10 +326,11 @@ describe("list of components", () => {
}
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = expect(app.mount(fixture)).rejects.toThrow(
"Got duplicate key in t-foreach: child"
);
- await expect(nextAppError(app)).resolves.toThrow("Got duplicate key in t-foreach: child");
+ await expect(appError).resolves.toThrow("Got duplicate key in t-foreach: child");
await mountProm;
console.info = consoleInfo;
expect(mockConsoleWarn).toBeCalledTimes(1);
@@ -352,12 +353,11 @@ describe("list of components", () => {
}
const app = new App(Parent, { test: true });
+ const appError = nextAppError(app);
const mountProm = expect(app.mount(fixture)).rejects.toThrow(
"Got duplicate key in t-foreach: [object Object]"
);
- await expect(nextAppError(app)).resolves.toThrow(
- "Got duplicate key in t-foreach: [object Object]"
- );
+ await expect(appError).resolves.toThrow("Got duplicate key in t-foreach: [object Object]");
await mountProm;
console.info = consoleInfo;
expect(mockConsoleWarn).toBeCalledTimes(1);
diff --git a/tests/helpers.ts b/tests/helpers.ts
index 377d9953..f5515d90 100644
--- a/tests/helpers.ts
+++ b/tests/helpers.ts
@@ -235,7 +235,7 @@ expect.extend({
};
const currentSteps = steps.splice(0);
- const pass = this.equals(currentSteps, expected);
+ let pass = this.equals(currentSteps, expected);
const message = pass
? () =>
diff --git a/tests/misc/portal.test.ts b/tests/misc/portal.test.ts
index e07d524f..3e6e74ce 100644
--- a/tests/misc/portal.test.ts
+++ b/tests/misc/portal.test.ts
@@ -270,8 +270,9 @@ describe("Portal", () => {
let error: Error;
const app = new App(Parent);
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("invalid portal target");
+ await expect(appError).resolves.toThrow("invalid portal target");
await mountProm;
expect(error!).toBeDefined();
@@ -1002,8 +1003,9 @@ describe("Portal: Props validation", () => {
}
let error: OwlError;
const app = new App(Parent);
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle");
+ await expect(appError).resolves.toThrow("error occured in the owl lifecycle");
await mountProm;
expect(error!).toBeDefined();
expect(error!.cause).toBeDefined();
@@ -1021,8 +1023,9 @@ describe("Portal: Props validation", () => {
}
let error: Error;
const app = new App(Parent);
+ const appError = nextAppError(app);
const mountProm = app.mount(fixture).catch((e: Error) => (error = e));
- await expect(nextAppError(app)).resolves.toThrow("invalid portal target");
+ await expect(appError).resolves.toThrow("invalid portal target");
await mountProm;
expect(error!).toBeDefined();
expect(error!.message).toBe(`invalid portal target`);
diff --git a/tests/reactivity.test.ts b/tests/reactivity.test.ts
index d1adda0e..081bcc1e 100644
--- a/tests/reactivity.test.ts
+++ b/tests/reactivity.test.ts
@@ -1858,13 +1858,13 @@ describe("Reactivity: useState", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Parent:rendered",
- "Child:willRender",
- "Child:rendered",
- "Child:willRender",
- "Child:rendered",
"Child:mounted",
"Child:mounted",
"Parent:mounted",
@@ -1916,13 +1916,13 @@ describe("Reactivity: useState", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Child:setup",
"Child:willStart",
+ "Child:willRender",
+ "Child:rendered",
"Parent:rendered",
- "Child:willRender",
- "Child:rendered",
- "Child:willRender",
- "Child:rendered",
"Child:mounted",
"Child:mounted",
"Parent:mounted",
@@ -1992,17 +1992,17 @@ describe("Reactivity: useState", () => {
"GrandFather:willRender",
"Child:setup",
"Child:willStart",
- "Parent:setup",
- "Parent:willStart",
- "GrandFather:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:setup",
+ "Parent:willStart",
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
+ "GrandFather:rendered",
"Child:mounted",
"Parent:mounted",
"Child:mounted",
@@ -2215,9 +2215,9 @@ describe("Reactivity: useState", () => {
"Parent:willRender",
"Child:setup",
"Child:willStart",
- "Parent:rendered",
"Child:willRender",
"Child:rendered",
+ "Parent:rendered",
"Child:mounted",
"Parent:mounted",
]