]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test: add normalizeBlock
author三咲智子 Kevin Deng <sxzz@sxzz.moe>
Mon, 29 Jan 2024 21:34:54 +0000 (05:34 +0800)
committer三咲智子 Kevin Deng <sxzz@sxzz.moe>
Mon, 29 Jan 2024 21:39:53 +0000 (05:39 +0800)
packages/runtime-vapor/__tests__/dom.spec.ts [new file with mode: 0644]
packages/runtime-vapor/__tests__/if.spec.ts
packages/runtime-vapor/src/dom.ts

diff --git a/packages/runtime-vapor/__tests__/dom.spec.ts b/packages/runtime-vapor/__tests__/dom.spec.ts
new file mode 100644 (file)
index 0000000..16139c6
--- /dev/null
@@ -0,0 +1,127 @@
+import { append, insert, normalizeBlock, prepend, remove } from '../src/dom'
+import { type Fragment, type ParentBlock, fragmentKey } from '../src/render'
+
+const node1 = document.createTextNode('node1')
+const node2 = document.createTextNode('node2')
+const node3 = document.createTextNode('node3')
+const anchor = document.createTextNode('anchor')
+
+describe('dom', () => {
+  test('normalizeBlock', () => {
+    expect(normalizeBlock([node1, node2, node3])).toEqual([node1, node2, node3])
+    expect(normalizeBlock([node1, [node2, [node3]]])).toEqual([
+      node1,
+      node2,
+      node3,
+    ])
+    expect(
+      normalizeBlock([
+        node1,
+        { nodes: node2, anchor, [fragmentKey]: true },
+        [node3],
+      ]),
+    ).toEqual([node1, node2, anchor, node3])
+  })
+
+  describe('insert', () => {
+    test('parent is node', () => {
+      const container = document.createElement('div')
+      insert([anchor], container)
+      insert([node1], container)
+      insert([node2], container, anchor)
+      insert([], container, node3)
+      expect(Array.from(container.childNodes)).toEqual([node2, anchor, node1])
+
+      expect(() => insert(node3, container, node3)).toThrowError(
+        'The child can not be found in the parent.',
+      )
+    })
+
+    test('parent is array', () => {
+      const container: Node[] = []
+      insert(anchor, container)
+      insert({ nodes: node1, [fragmentKey]: true }, container)
+      insert([node2], container, anchor)
+      expect(container).toEqual([
+        [node2],
+        anchor,
+        { nodes: node1, [fragmentKey]: true },
+      ])
+
+      expect(() => insert([], container, node3)).toThrowError(
+        'The child can not be found in the parent.',
+      )
+      expect(() => insert(node3, container, node3)).toThrowError(
+        'The child can not be found in the parent.',
+      )
+    })
+  })
+
+  describe('prepend', () => {
+    test('parent is node', () => {
+      const container = document.createElement('div')
+      prepend(container, [node1], node2)
+      prepend(container, { nodes: node3, [fragmentKey]: true })
+      expect(Array.from(container.childNodes)).toEqual([node3, node1, node2])
+    })
+
+    test('parent is array', () => {
+      const container: Node[] = []
+      prepend(container, [node1], node2)
+      prepend(container, { nodes: node3, [fragmentKey]: true })
+      expect(container).toEqual([
+        { nodes: node3, [fragmentKey]: true },
+        [node1],
+        node2,
+      ])
+    })
+  })
+
+  describe('append', () => {
+    test('parent is node', () => {
+      const container = document.createElement('div')
+      append(container, [node1], node2)
+      append(container, { nodes: node3, [fragmentKey]: true })
+      expect(Array.from(container.childNodes)).toEqual([node1, node2, node3])
+    })
+
+    test('parent is array', () => {
+      const container: Node[] = []
+      append(container, [node1], node2)
+      append(container, { nodes: node3, [fragmentKey]: true })
+      expect(container).toEqual([
+        [node1],
+        node2,
+        { nodes: node3, [fragmentKey]: true },
+      ])
+    })
+  })
+
+  describe('remove', () => {
+    test('parent is node', () => {
+      const container = document.createElement('div')
+      container.append(node1, node2, node3)
+      remove([node1], container)
+      remove({ nodes: node3, [fragmentKey]: true }, container)
+      expect(Array.from(container.childNodes)).toEqual([node2])
+
+      expect(() => remove(anchor, container)).toThrowError(
+        'The node to be removed is not a child of this node.',
+      )
+    })
+
+    test('parent is array', () => {
+      const n1 = [node1]
+      const n3: Fragment = { nodes: node3, [fragmentKey]: true }
+      const container: ParentBlock = [n1, node2, n3]
+
+      remove(n1, container)
+      remove(n3, container)
+      expect(container).toEqual([node2])
+
+      expect(() => remove(anchor, container)).toThrowError(
+        'The node to be removed is not a child of this node.',
+      )
+    })
+  })
+})
index ee4b87907e633a9a2c94d925af1484827bce3477..6254bfbf386870072e9afc0845c271502cc526fb 100644 (file)
@@ -74,7 +74,7 @@ describe('createIf', () => {
                 return n4
               })),
             ),
-            n1,
+            n1 as any as ParentNode,
           )
           return n0
         })()
index eedb73722d4ba252f065a110385340f29ac336b7..82de1efb3adad2cc1b237e8c434254cc563156fe 100644 (file)
@@ -5,7 +5,7 @@ export * from './dom/patchProp'
 export * from './dom/templateRef'
 export * from './dom/on'
 
-function normalizeBlock(block: Block): Node[] {
+export function normalizeBlock(block: Block): Node[] {
   const nodes: Node[] = []
   if (block instanceof Node) {
     nodes.push(block)