diff --git a/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/Child.svelte b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/Child.svelte new file mode 100644 index 0000000000..189c1a8a8c --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/Child.svelte @@ -0,0 +1,9 @@ + + + + +
+ {message} +
diff --git a/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/_config.js b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/_config.js new file mode 100644 index 0000000000..460b77d563 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/_config.js @@ -0,0 +1,16 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test-dom.test'; + +export default test({ + html: '', + async test({ assert, component, target }) { + const [div] = target.children[0].elements_children; + assert.instanceOf(div, HTMLDivElement); + assert.equal(div.outerHTML, '
hello from child
'); + + component.hide(); + flushSync(); + + assert.isFalse(target.children[0].elements_children.includes(div)); + } +}); diff --git a/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/main.svelte b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/main.svelte new file mode 100644 index 0000000000..acb448db9d --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component-removal/main.svelte @@ -0,0 +1,15 @@ + + + + {#if visible} + + {/if} + diff --git a/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component/_config.js b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component/_config.js index 21ff9d835e..6c3c0d60bd 100644 --- a/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component/_config.js +++ b/packages/svelte/tests/custom-renderers/samples-dom/dom-child-component/_config.js @@ -2,11 +2,11 @@ import { test } from '../../test-dom.test'; export default test({ // this is the custom rendered component...it doesn't have anything inside because the part of the renderer - // responsible for the interleaving is the `before` function on the comment node which only push into `dom_elements` in this case + // responsible for the interleaving is the `before` function on the comment node which only push into `target.elements_children` in this case html: '', - test({ assert, dom_elements }) { - // we then get the element out of dom_elements - const [div] = dom_elements; + test({ assert, target }) { + // we then get the element out of target.elements_children + const [div] = target.children[0].elements_children; // check that is an actual DOM element and that it has the expected content assert.instanceOf(div, HTMLDivElement); assert.equal(div.outerHTML, '
hello from child
'); diff --git a/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/Child.svelte b/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/Child.svelte new file mode 100644 index 0000000000..b7b75c2ddc --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/Child.svelte @@ -0,0 +1 @@ +something diff --git a/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/_config.js b/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/_config.js new file mode 100644 index 0000000000..d4663e3a34 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/_config.js @@ -0,0 +1,25 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test-dom.test'; + +export default test({ + hydrate: true, + test({ assert, component, target, warnings }) { + assert.instanceOf(target, HTMLElement); + assert.deepEqual(warnings, []); + assert.ok(target.querySelector('#keep-me')); + assert.ok(target.querySelector('custom-rendered')); + + component.hide(); + flushSync(); + + assert.ok(target.querySelector('#keep-me')); + assert.equal(target.querySelector('custom-rendered'), null); + assert.notInclude(target.textContent, 'Cool:'); + + component.show(); + flushSync(); + + assert.ok(target.querySelector('#keep-me')); + assert.ok(target.querySelector('custom-rendered')); + } +}); diff --git a/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/main.svelte b/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/main.svelte new file mode 100644 index 0000000000..623d7dabe5 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/hydration-interleaved-dom-custom/main.svelte @@ -0,0 +1,23 @@ + + + + +
+ {#if visible} + Cool: + {/if} +
+ +
diff --git a/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/Child.svelte b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/Child.svelte new file mode 100644 index 0000000000..c8167faeaa --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/Child.svelte @@ -0,0 +1,7 @@ + + +
+ {message} +
diff --git a/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/_config.js b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/_config.js new file mode 100644 index 0000000000..f94d531b16 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/_config.js @@ -0,0 +1,44 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test-dom.test'; + +export default test({ + test({ assert, component, target }) { + // we mounted the component in the root fragment so the div is in the target.elements_children + const [div] = target.elements_children; + assert.instanceOf(div, HTMLDivElement); + + // find the custom-rendered element in the div and assert the json content + let custom_rendered = div.querySelector('custom-rendered'); + assert.instanceOf(custom_rendered, HTMLElement); + assert.deepEqual(JSON.parse(custom_rendered.textContent), { + type: 'element', + name: 'div', + attributes: {}, + children: [ + { + type: 'element', + name: 'span', + attributes: {}, + children: [{ type: 'text', value: 'hello from child' }], + elements_children: [], + listeners: {} + } + ], + elements_children: [], + listeners: {} + }); + + component.hide(); + flushSync(); + + // we unmounted the custom rendered component so the map is empty again + assert.equal(div.querySelector('custom-rendered'), null); + + component.show(); + flushSync(); + + // we mounted the custom rendered component into the div again so it's in the mounted_in_dom_elements map again + custom_rendered = div.querySelector('custom-rendered'); + assert.instanceOf(custom_rendered, HTMLElement); + } +}); diff --git a/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/main.svelte b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/main.svelte new file mode 100644 index 0000000000..ab5cc65d79 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child-extra-text/main.svelte @@ -0,0 +1,20 @@ + + + + +
+ {#if visible} + test: + {/if} +
diff --git a/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/Child.svelte b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/Child.svelte new file mode 100644 index 0000000000..c8167faeaa --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/Child.svelte @@ -0,0 +1,7 @@ + + +
+ {message} +
diff --git a/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/_config.js b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/_config.js new file mode 100644 index 0000000000..f94d531b16 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/_config.js @@ -0,0 +1,44 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test-dom.test'; + +export default test({ + test({ assert, component, target }) { + // we mounted the component in the root fragment so the div is in the target.elements_children + const [div] = target.elements_children; + assert.instanceOf(div, HTMLDivElement); + + // find the custom-rendered element in the div and assert the json content + let custom_rendered = div.querySelector('custom-rendered'); + assert.instanceOf(custom_rendered, HTMLElement); + assert.deepEqual(JSON.parse(custom_rendered.textContent), { + type: 'element', + name: 'div', + attributes: {}, + children: [ + { + type: 'element', + name: 'span', + attributes: {}, + children: [{ type: 'text', value: 'hello from child' }], + elements_children: [], + listeners: {} + } + ], + elements_children: [], + listeners: {} + }); + + component.hide(); + flushSync(); + + // we unmounted the custom rendered component so the map is empty again + assert.equal(div.querySelector('custom-rendered'), null); + + component.show(); + flushSync(); + + // we mounted the custom rendered component into the div again so it's in the mounted_in_dom_elements map again + custom_rendered = div.querySelector('custom-rendered'); + assert.instanceOf(custom_rendered, HTMLElement); + } +}); diff --git a/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/main.svelte b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/main.svelte new file mode 100644 index 0000000000..ad36347f79 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples-dom/renderer-to-dom-child/main.svelte @@ -0,0 +1,20 @@ + + + + +
+ {#if visible} + + {/if} +