wip: compat test coverage
This commit is contained in:
parent
324a00c85d
commit
80303bcf5a
@ -113,7 +113,7 @@ export function compatH(
|
|||||||
): VNode
|
): VNode
|
||||||
export function compatH(
|
export function compatH(
|
||||||
type: string | Component,
|
type: string | Component,
|
||||||
props?: LegacyVNodeProps,
|
props?: Data & LegacyVNodeProps,
|
||||||
children?: LegacyVNodeChildren
|
children?: LegacyVNodeChildren
|
||||||
): VNode
|
): VNode
|
||||||
|
|
||||||
@ -190,16 +190,12 @@ function convertLegacyProps(
|
|||||||
} else if (key === 'on' || key === 'nativeOn') {
|
} else if (key === 'on' || key === 'nativeOn') {
|
||||||
const listeners = legacyProps[key]
|
const listeners = legacyProps[key]
|
||||||
for (const event in listeners) {
|
for (const event in listeners) {
|
||||||
const handlerKey = convertLegacyEventKey(event)
|
let handlerKey = convertLegacyEventKey(event)
|
||||||
|
if (key === 'nativeOn') handlerKey += `Native`
|
||||||
const existing = converted[handlerKey]
|
const existing = converted[handlerKey]
|
||||||
const incoming = listeners[event]
|
const incoming = listeners[event]
|
||||||
if (existing !== incoming) {
|
if (existing !== incoming) {
|
||||||
if (existing) {
|
if (existing) {
|
||||||
// for the rare case where the same handler is attached
|
|
||||||
// twice with/without .native modifier...
|
|
||||||
if (key === 'nativeOn' && String(existing) === String(incoming)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
converted[handlerKey] = [].concat(existing as any, incoming as any)
|
converted[handlerKey] = [].concat(existing as any, incoming as any)
|
||||||
} else {
|
} else {
|
||||||
converted[handlerKey] = incoming
|
converted[handlerKey] = incoming
|
||||||
@ -307,6 +303,7 @@ function convertLegacySlots(vnode: VNode): VNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function defineLegacyVNodeProperties(vnode: VNode) {
|
export function defineLegacyVNodeProperties(vnode: VNode) {
|
||||||
|
/* istanbul ignore if */
|
||||||
if (
|
if (
|
||||||
isCompatEnabled(
|
isCompatEnabled(
|
||||||
DeprecationTypes.RENDER_FUNCTION,
|
DeprecationTypes.RENDER_FUNCTION,
|
||||||
|
@ -59,4 +59,24 @@ describe('COMPONENT_ASYNC', () => {
|
|||||||
)
|
)
|
||||||
).toHaveBeenWarned()
|
).toHaveBeenWarned()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('object syntax', async () => {
|
||||||
|
const comp = () => ({
|
||||||
|
component: Promise.resolve({ template: 'foo' })
|
||||||
|
})
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
template: `<div><comp/></div>`,
|
||||||
|
components: { comp }
|
||||||
|
}).$mount()
|
||||||
|
expect(vm.$el.innerHTML).toBe(`<!---->`)
|
||||||
|
await timeout(0)
|
||||||
|
expect(vm.$el.innerHTML).toBe(`foo`)
|
||||||
|
|
||||||
|
expect(
|
||||||
|
(deprecationData[DeprecationTypes.COMPONENT_ASYNC].message as Function)(
|
||||||
|
comp
|
||||||
|
)
|
||||||
|
).toHaveBeenWarned()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Vue from '@vue/compat'
|
import Vue from '@vue/compat'
|
||||||
import { effect, isReactive } from '@vue/reactivity'
|
import { effect, isReactive } from '@vue/reactivity'
|
||||||
|
import { nextTick } from '@vue/runtime-core'
|
||||||
import {
|
import {
|
||||||
DeprecationTypes,
|
DeprecationTypes,
|
||||||
deprecationData,
|
deprecationData,
|
||||||
@ -333,4 +334,50 @@ describe('GLOBAL_PRIVATE_UTIL', () => {
|
|||||||
deprecationData[DeprecationTypes.GLOBAL_PRIVATE_UTIL].message
|
deprecationData[DeprecationTypes.GLOBAL_PRIVATE_UTIL].message
|
||||||
).toHaveBeenWarned()
|
).toHaveBeenWarned()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('defineReactive on instance', async () => {
|
||||||
|
const vm = new Vue({
|
||||||
|
beforeCreate() {
|
||||||
|
// @ts-ignore
|
||||||
|
Vue.util.defineReactive(this, 'foo', 1)
|
||||||
|
},
|
||||||
|
template: `<div>{{ foo }}</div>`
|
||||||
|
}).$mount() as any
|
||||||
|
expect(vm.$el.textContent).toBe('1')
|
||||||
|
vm.foo = 2
|
||||||
|
await nextTick()
|
||||||
|
expect(vm.$el.textContent).toBe('2')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('defineReactive with object value', () => {
|
||||||
|
const obj: any = {}
|
||||||
|
const val = { a: 1 }
|
||||||
|
// @ts-ignore
|
||||||
|
Vue.util.defineReactive(obj, 'foo', val)
|
||||||
|
|
||||||
|
let n
|
||||||
|
effect(() => {
|
||||||
|
n = obj.foo.a
|
||||||
|
})
|
||||||
|
expect(n).toBe(1)
|
||||||
|
// mutating original
|
||||||
|
val.a++
|
||||||
|
expect(n).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('defineReactive with array value', () => {
|
||||||
|
const obj: any = {}
|
||||||
|
const val = [1]
|
||||||
|
// @ts-ignore
|
||||||
|
Vue.util.defineReactive(obj, 'foo', val)
|
||||||
|
|
||||||
|
let n
|
||||||
|
effect(() => {
|
||||||
|
n = obj.foo.length
|
||||||
|
})
|
||||||
|
expect(n).toBe(1)
|
||||||
|
// mutating original
|
||||||
|
val.push(2)
|
||||||
|
expect(n).toBe(2)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -123,9 +123,29 @@ describe('compat: render function', () => {
|
|||||||
})
|
})
|
||||||
).toMatchObject({
|
).toMatchObject({
|
||||||
props: {
|
props: {
|
||||||
onClick: fn, // should dedupe
|
onClick: fn,
|
||||||
|
onClickNative: fn,
|
||||||
onFooBar: fn,
|
onFooBar: fn,
|
||||||
'onBar-baz': fn
|
'onBar-bazNative': fn
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test('v2 legacy event prefixes', () => {
|
||||||
|
const fn = () => {}
|
||||||
|
expect(
|
||||||
|
h('div', {
|
||||||
|
on: {
|
||||||
|
'&click': fn,
|
||||||
|
'~keyup': fn,
|
||||||
|
'!touchend': fn
|
||||||
|
}
|
||||||
|
})
|
||||||
|
).toMatchObject({
|
||||||
|
props: {
|
||||||
|
onClickPassive: fn,
|
||||||
|
onKeyupOnce: fn,
|
||||||
|
onTouchendCapture: fn
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user