test: add normalizeBlock

This commit is contained in:
三咲智子 Kevin Deng 2024-01-30 05:34:54 +08:00
parent 489f11a1f9
commit cd0e3273d2
No known key found for this signature in database
GPG Key ID: 69992F2250DFD93E
3 changed files with 129 additions and 2 deletions

View File

@ -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.',
)
})
})
})

View File

@ -74,7 +74,7 @@ describe('createIf', () => {
return n4 return n4
})), })),
), ),
n1, n1 as any as ParentNode,
) )
return n0 return n0
})() })()

View File

@ -5,7 +5,7 @@ export * from './dom/patchProp'
export * from './dom/templateRef' export * from './dom/templateRef'
export * from './dom/on' export * from './dom/on'
function normalizeBlock(block: Block): Node[] { export function normalizeBlock(block: Block): Node[] {
const nodes: Node[] = [] const nodes: Node[] = []
if (block instanceof Node) { if (block instanceof Node) {
nodes.push(block) nodes.push(block)