diff --git a/src/runtime/component_node.ts b/src/runtime/component_node.ts
index 4a3adf02..62128757 100644
--- a/src/runtime/component_node.ts
+++ b/src/runtime/component_node.ts
@@ -73,6 +73,7 @@ export class ComponentNode
implements VNode implements VNode implements VNode implements VNode {
+ let b: any;
+
+ class B extends Component {
+ static template = xml`
+
+ `;
+
+ setup() {
+ useLogLifecycle();
+ b = this;
+ }
+ }
+
+ class A extends Component {
+ static components = { B };
+ static template = xml``;
+
+ state = useState({ groups: [], config: { test: "initial" } });
+ setup() {
+ useLogLifecycle();
+ }
+ }
+
+ await mount(A, fixture);
+
+ expect([
+ "A:setup",
+ "A:willStart",
+ "A:willRender",
+ "B:setup",
+ "B:willStart",
+ "A:rendered",
+ "B:willRender",
+ "B:rendered",
+ "B:mounted",
+ "A:mounted",
+ ]).toBeLogged();
+
+ expect(fixture.innerHTML).toBe("0initial");
+
+ b.props.state.config.test = "red";
+ b.props.state.groups.push(1);
+ expect([]).toBeLogged();
+ await Promise.resolve();
+ await Promise.resolve();
+ await Promise.resolve();
+ await Promise.resolve();
+ await Promise.resolve();
+ b.props.state.config.test = "black";
+ b.props.state.groups.push(1);
+ expect([
+ "A:willRender",
+ "B:willUpdateProps",
+ "A:rendered",
+ "B:willRender",
+ "B:rendered",
+ ]).toBeLogged();
+
+ await nextTick();
+ expect(fixture.innerHTML).toBe("2black");
+ expect([
+ "A:willRender",
+ "B:willUpdateProps",
+ "A:rendered",
+ "B:willRender",
+ "B:rendered",
+ "A:willPatch",
+ "B:willPatch",
+ "B:patched",
+ "A:patched",
+ ]).toBeLogged();
+});
+
// test.skip("components with shouldUpdate=false", async () => {
// const state = { p: 1, cc: 10 };
diff --git a/tests/shadow_dom/__snapshots__/shadow_dom.test.ts.snap b/tests/shadow_dom/__snapshots__/shadow_dom.test.ts.snap
new file mode 100644
index 00000000..60644d42
--- /dev/null
+++ b/tests/shadow_dom/__snapshots__/shadow_dom.test.ts.snap
@@ -0,0 +1,42 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`shadow_dom can bind event handler 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+
+ let block1 = createBlock(\`\`);
+
+ return function template(ctx, node, key = \\"\\") {
+ let hdlr1 = [ctx['add'], ctx];
+ return block1([hdlr1]);
+ }
+}"
+`;
+
+exports[`shadow_dom can mount app 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+
+ let block1 = createBlock(\`\`);
+
+ return function template(ctx, node, key = \\"\\") {
+ return block1();
+ }
+}"
+`;
+
+exports[`shadow_dom useRef hook 1`] = `
+"function anonymous(app, bdom, helpers
+) {
+ let { text, createBlock, list, multi, html, toggler, comment } = bdom;
+
+ let block1 = createBlock(\`
\`);
+
+ return function template(ctx, node, key = \\"\\") {
+ let ref1 = (el) => this.__owl__.setRef((\`refName\`), el);
+ return block1([ref1]);
+ }
+}"
+`;