mirror of https://github.com/vuejs/core.git
wip: add more tests
This commit is contained in:
parent
7dff4bca49
commit
3913f9df43
|
@ -1,9 +1,11 @@
|
||||||
import {
|
import {
|
||||||
child,
|
child,
|
||||||
createFor,
|
createFor,
|
||||||
|
createIf,
|
||||||
getDefaultValue,
|
getDefaultValue,
|
||||||
getRestElement,
|
getRestElement,
|
||||||
renderEffect,
|
renderEffect,
|
||||||
|
setClass,
|
||||||
setInsertionState,
|
setInsertionState,
|
||||||
setStyle,
|
setStyle,
|
||||||
setText,
|
setText,
|
||||||
|
@ -1170,15 +1172,120 @@ describe('createFor', () => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
test.todo(
|
test('children with the same key but with different tag', async () => {
|
||||||
'children with the same key but with different tag',
|
const items = ref([
|
||||||
async () => {},
|
{ key: 1, tag: 'div', text: 'one' },
|
||||||
)
|
{ key: 2, tag: 'div', text: 'two' },
|
||||||
|
{ key: 3, tag: 'div', text: 'three' },
|
||||||
|
{ key: 4, tag: 'div', text: 'four' },
|
||||||
|
])
|
||||||
|
|
||||||
test.todo(
|
const { host } = define(() => {
|
||||||
'children with the same tag, same key, but one with data and one without data',
|
return createFor(
|
||||||
async () => {},
|
() => items.value,
|
||||||
)
|
_for_item0 => {
|
||||||
|
const n2 = createIf(
|
||||||
|
() => _for_item0.value.tag === 'div',
|
||||||
|
() => {
|
||||||
|
const n4 = template('<div> </div>')() as any
|
||||||
|
const x4 = child(n4) as any
|
||||||
|
renderEffect(() =>
|
||||||
|
setText(x4, toDisplayString(_for_item0.value.text)),
|
||||||
|
)
|
||||||
|
return n4
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
const n6 = template('<span> </span>', true)() as any
|
||||||
|
const x6 = child(n6) as any
|
||||||
|
renderEffect(() =>
|
||||||
|
setText(x6, toDisplayString(_for_item0.value.text)),
|
||||||
|
)
|
||||||
|
return n6
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return n2
|
||||||
|
},
|
||||||
|
item => item.key,
|
||||||
|
)
|
||||||
|
}).render()
|
||||||
|
|
||||||
|
expect(host.children.length).toBe(4)
|
||||||
|
expect(
|
||||||
|
Array.from(host.children).map(c =>
|
||||||
|
(c as HTMLElement).tagName.toLowerCase(),
|
||||||
|
),
|
||||||
|
).toEqual(['div', 'div', 'div', 'div'])
|
||||||
|
expect(Array.from(host.children).map(c => c.textContent)).toEqual([
|
||||||
|
'one',
|
||||||
|
'two',
|
||||||
|
'three',
|
||||||
|
'four',
|
||||||
|
])
|
||||||
|
|
||||||
|
items.value = [
|
||||||
|
{ key: 4, tag: 'div', text: 'four' },
|
||||||
|
{ key: 3, tag: 'span', text: 'three' },
|
||||||
|
{ key: 2, tag: 'span', text: 'two' },
|
||||||
|
{ key: 1, tag: 'div', text: 'one' },
|
||||||
|
]
|
||||||
|
await nextTick()
|
||||||
|
|
||||||
|
expect(host.children.length).toBe(4)
|
||||||
|
expect(
|
||||||
|
Array.from(host.children).map(c =>
|
||||||
|
(c as HTMLElement).tagName.toLowerCase(),
|
||||||
|
),
|
||||||
|
).toEqual(['div', 'span', 'span', 'div'])
|
||||||
|
expect(Array.from(host.children).map(c => c.textContent)).toEqual([
|
||||||
|
'four',
|
||||||
|
'three',
|
||||||
|
'two',
|
||||||
|
'one',
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('children with the same tag, same key, but one with data and one without data', async () => {
|
||||||
|
const items = ref([{ key: 1, text: 'one', className: 'hi' }])
|
||||||
|
const { host } = define(() => {
|
||||||
|
const n1 = createFor(
|
||||||
|
() => items.value,
|
||||||
|
_for_item0 => {
|
||||||
|
const n2 = template('<div> </div>')() as any
|
||||||
|
const x2 = child(n2) as any
|
||||||
|
|
||||||
|
renderEffect(() => {
|
||||||
|
const _item = _for_item0.value
|
||||||
|
setText(x2, _item.text)
|
||||||
|
|
||||||
|
if (_item.className) {
|
||||||
|
setClass(n2, _item.className)
|
||||||
|
} else {
|
||||||
|
setClass(n2, null)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return n2
|
||||||
|
},
|
||||||
|
item => item.key,
|
||||||
|
)
|
||||||
|
return n1
|
||||||
|
}).render()
|
||||||
|
|
||||||
|
expect(host.children.length).toBe(1)
|
||||||
|
const firstChild = host.children[0] as HTMLDivElement
|
||||||
|
expect(firstChild.textContent?.trim()).toBe('one')
|
||||||
|
expect(firstChild.className).toBe('hi')
|
||||||
|
|
||||||
|
items.value = [{ key: 1, text: 'four', className: null as any }]
|
||||||
|
await nextTick()
|
||||||
|
|
||||||
|
expect(host.children.length).toBe(1)
|
||||||
|
const updatedChild = host.children[0] as HTMLDivElement
|
||||||
|
expect(updatedChild.textContent?.trim()).toBe('four')
|
||||||
|
expect(updatedChild.className).toBe('')
|
||||||
|
|
||||||
|
expect(updatedChild).toBe(firstChild)
|
||||||
|
})
|
||||||
|
|
||||||
test.todo('should warn with duplicate keys', async () => {})
|
test.todo('should warn with duplicate keys', async () => {})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue