(NaN);
+ const [show, setShow] = createSignal(false);
+ let span!: HTMLSpanElement;
+ const dispose = createRoot(d => {
+ {show() ? x : value()};
+ return d;
+ });
+ flush();
+
+ expect(span.childNodes.length).toBe(1);
+ expect(span.textContent).toBe("NaN");
+
+ setShow(true);
+ flush();
+ expect(span.childNodes.length).toBe(1);
+ expect(span.firstChild!.nodeName).toBe("B");
+ expect(span.textContent).toBe("x");
+
+ setShow(false);
+ flush();
+ expect(span.childNodes.length).toBe(1);
+ expect(span.textContent).toBe("NaN");
+
+ setValue(2);
+ flush();
+ expect(span.childNodes.length).toBe(1);
+ expect(span.textContent).toBe("2");
+
+ dispose();
+ });
+
+ test("0 swaps with an array and back without leaving text behind", () => {
+ const [showList, setShowList] = createSignal(false);
+ let div!: HTMLDivElement;
+ const dispose = createRoot(d => {
+ {showList() ? [b, i] : 0}
;
+ return d;
+ });
+ flush();
+
+ expect(div.childNodes.length).toBe(1);
+ expect(div.textContent).toBe("0");
+
+ setShowList(true);
+ flush();
+ expect(directText(div)).toEqual([]);
+ expect(div.textContent).toBe("bi");
+ expect(div.childNodes.length).toBe(2);
+
+ setShowList(false);
+ flush();
+ expect(div.childNodes.length).toBe(1);
+ expect(div.textContent).toBe("0");
+
+ setShowList(true);
+ flush();
+ expect(directText(div)).toEqual([]);
+ expect(div.textContent).toBe("bi");
+
+ dispose();
+ });
+
+ test("length && list replaces the 0 text node", () => {
+ const [items, setItems] = createSignal([]);
+ let div!: HTMLDivElement;
+ const dispose = createRoot(d => {
+
+ {items().length && {item => {item}}}
+
;
+ return d;
+ });
+ flush();
+
+ expect(div.childNodes.length).toBe(1);
+ expect(div.textContent).toBe("0");
+
+ setItems(["a", "b"]);
+ flush();
+ expect(directText(div)).not.toContain("0");
+ expect(div.textContent).toBe("ab");
+ expect(div.querySelectorAll("span").length).toBe(2);
+
+ setItems([]);
+ flush();
+ expect(div.childNodes.length).toBe(1);
+ expect(div.textContent).toBe("0");
+
+ setItems(["c"]);
+ flush();
+ expect(directText(div)).not.toContain("0");
+ expect(div.textContent).toBe("c");
+ expect(div.querySelectorAll("span").length).toBe(1);
+
+ dispose();
+ });
+
+ test("NaN swaps with an array and back without leaving text behind", () => {
+ const [showList, setShowList] = createSignal(false);
+ let div!: HTMLDivElement;
+ const dispose = createRoot(d => {
+ {showList() ? [b, i] : NaN}
;
+ return d;
+ });
+ flush();
+
+ expect(div.childNodes.length).toBe(1);
+ expect(div.textContent).toBe("NaN");
+
+ setShowList(true);
+ flush();
+ expect(directText(div)).toEqual([]);
+ expect(div.textContent).toBe("bi");
+ expect(div.childNodes.length).toBe(2);
+
+ setShowList(false);
+ flush();
+ expect(div.childNodes.length).toBe(1);
+ expect(div.textContent).toBe("NaN");
+
+ setShowList(true);
+ flush();
+ expect(directText(div)).toEqual([]);
+ expect(div.textContent).toBe("bi");
+
+ dispose();
+ });
+
+ test.each([
+ ["empty string", ""],
+ ["null", null],
+ ["false", false]
+ ])("%s swaps with an element and back (nothing to clean up)", (_label, empty) => {
+ const [show, setShow] = createSignal(false);
+ let span!: HTMLSpanElement;
+ const dispose = createRoot(d => {
+ {show() ? x : empty};
+ return d;
+ });
+ flush();
+
+ expect(span.childNodes.length).toBe(0);
+
+ setShow(true);
+ flush();
+ expect(span.childNodes.length).toBe(1);
+ expect(span.firstChild!.nodeName).toBe("I");
+ expect(span.textContent).toBe("x");
+
+ setShow(false);
+ flush();
+ expect(span.childNodes.length).toBe(0);
+
+ setShow(true);
+ flush();
+ expect(span.childNodes.length).toBe(1);
+ expect(span.textContent).toBe("x");
+
+ dispose();
+ });
+});