You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

137 lines
4.5 KiB

import Vue from 'vue'
import { createElement } from 'core/vdom/create-element'
import { emptyVNode } from 'core/vdom/vnode'
import { bind } from 'shared/util'
describe('create-element', () => {
it('render vnode with basic reserved tag using createElement', () => {
const vm = new Vue({
data: { msg: 'hello world' }
})
const h = bind(createElement, vm)
const vnode = h('p', {})
expect(vnode.tag).toBe('p')
expect(vnode.data).toEqual({})
expect(vnode.children).toBeUndefined()
expect(vnode.text).toBeUndefined()
expect(vnode.elm).toBeUndefined()
expect(vnode.ns).toBeUndefined()
expect(vnode.context).toEqual(vm)
})
it('render vnode with component using createElement', () => {
const vm = new Vue({
data: { message: 'hello world' },
components: {
'my-component': {
props: ['msg']
}
}
})
const h = bind(createElement, vm)
const vnode = h('my-component', { props: { msg: vm.message }})
expect(vnode.tag).toMatch(/vue-component-[0-9]+/)
expect(vnode.componentOptions.propsData).toEqual({ msg: vm.message })
expect(vnode.children).toBeUndefined()
expect(vnode.text).toBeUndefined()
expect(vnode.elm).toBeUndefined()
expect(vnode.ns).toBeUndefined()
expect(vnode.context).toEqual(vm)
})
it('render vnode with custom tag using createElement', () => {
const vm = new Vue({
data: { msg: 'hello world' }
})
const h = bind(createElement, vm)
const tag = 'custom-tag'
const vnode = h(tag, {})
expect(vnode.tag).toBe('custom-tag')
expect(vnode.data).toEqual({})
expect(vnode.children).toBeUndefined()
expect(vnode.text).toBeUndefined()
expect(vnode.elm).toBeUndefined()
expect(vnode.ns).toBeUndefined()
expect(vnode.context).toEqual(vm)
expect(vnode.componentOptions).toBeUndefined()
})
it('render empty vnode with falsy tag using createElement', () => {
const vm = new Vue({
data: { msg: 'hello world' }
})
const h = bind(createElement, vm)
const vnode = h(null, {})
expect(vnode).toEqual(emptyVNode())
})
it('render vnode with not string tag using createElement', () => {
const vm = new Vue({
data: { msg: 'hello world' }
})
const h = bind(createElement, vm)
const vnode = h(Vue.extend({ // Component class
props: ['msg']
}), { props: { msg: vm.message }})
expect(vnode.tag).toMatch(/vue-component-[0-9]+/)
expect(vnode.componentOptions.propsData).toEqual({ msg: vm.message })
expect(vnode.children).toBeUndefined()
expect(vnode.text).toBeUndefined()
expect(vnode.elm).toBeUndefined()
expect(vnode.ns).toBeUndefined()
expect(vnode.context).toEqual(vm)
})
it('render vnode with createElement with children', () => {
const vm = new Vue({})
const h = bind(createElement, vm)
const vnode = h('p', void 0, [h('br'), 'hello world', h('br')])
expect(vnode.children[0].tag).toBe('br')
expect(vnode.children[1].text).toBe('hello world')
expect(vnode.children[2].tag).toBe('br')
})
it('render vnode with children, omitting data', () => {
const vm = new Vue({})
const h = bind(createElement, vm)
const vnode = h('p', [h('br'), 'hello world', h('br')])
expect(vnode.children[0].tag).toBe('br')
expect(vnode.children[1].text).toBe('hello world')
expect(vnode.children[2].tag).toBe('br')
})
it('render svg elements with correct namespace', () => {
const vm = new Vue({})
const h = bind(createElement, vm)
const vnode = h('svg', [h('a', [h('foo', [h('bar')])])])
expect(vnode.ns).toBe('svg')
// should apply ns to children recursively
expect(vnode.children[0].ns).toBe('svg')
expect(vnode.children[0].children[0].ns).toBe('svg')
expect(vnode.children[0].children[0].children[0].ns).toBe('svg')
})
it('render MathML elements with correct namespace', () => {
const vm = new Vue({})
const h = bind(createElement, vm)
const vnode = h('math', [h('matrix')])
expect(vnode.ns).toBe('math')
// should apply ns to children
expect(vnode.children[0].ns).toBe('math')
// although not explicitly listed, elements nested under <math>
// should not be treated as component
expect(vnode.children[0].componentOptions).toBeUndefined()
})
it('warn observed data objects', () => {
new Vue({
data: {
data: {}
},
render (h) {
return h('div', this.data)
}
}).$mount()
expect('Avoid using observed data object as vnode data').toHaveBeenWarned()
})
})