| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import {
- h,
- applyDirectives,
- ref,
- render,
- nodeOps,
- DirectiveHook,
- VNode,
- DirectiveBinding,
- nextTick
- } from '@vue/runtime-test'
- import { currentInstance, ComponentInternalInstance } from '../src/component'
- describe('directives', () => {
- it('should work', async () => {
- const count = ref(0)
- function assertBindings(binding: DirectiveBinding) {
- expect(binding.value).toBe(count.value)
- expect(binding.arg).toBe('foo')
- expect(binding.instance).toBe(_instance && _instance.renderProxy)
- expect(binding.modifiers && binding.modifiers.ok).toBe(true)
- }
- const beforeMount = jest.fn(((el, binding, vnode, prevVNode) => {
- expect(el.tag).toBe('div')
- // should not be inserted yet
- expect(el.parentNode).toBe(null)
- expect(root.children.length).toBe(0)
- assertBindings(binding)
- expect(vnode).toBe(_vnode)
- expect(prevVNode).toBe(null)
- }) as DirectiveHook)
- const mounted = jest.fn(((el, binding, vnode, prevVNode) => {
- expect(el.tag).toBe('div')
- // should be inserted now
- expect(el.parentNode).toBe(root)
- expect(root.children[0]).toBe(el)
- assertBindings(binding)
- expect(vnode).toBe(_vnode)
- expect(prevVNode).toBe(null)
- }) as DirectiveHook)
- const beforeUpdate = jest.fn(((el, binding, vnode, prevVNode) => {
- expect(el.tag).toBe('div')
- expect(el.parentNode).toBe(root)
- expect(root.children[0]).toBe(el)
- // node should not have been updated yet
- expect(el.children[0].text).toBe(`${count.value - 1}`)
- assertBindings(binding)
- expect(vnode).toBe(_vnode)
- expect(prevVNode).toBe(_prevVnode)
- }) as DirectiveHook)
- const updated = jest.fn(((el, binding, vnode, prevVNode) => {
- expect(el.tag).toBe('div')
- expect(el.parentNode).toBe(root)
- expect(root.children[0]).toBe(el)
- // node should have been updated
- expect(el.children[0].text).toBe(`${count.value}`)
- assertBindings(binding)
- expect(vnode).toBe(_vnode)
- expect(prevVNode).toBe(_prevVnode)
- }) as DirectiveHook)
- const beforeUnmount = jest.fn(((el, binding, vnode, prevVNode) => {
- expect(el.tag).toBe('div')
- // should be removed now
- expect(el.parentNode).toBe(root)
- expect(root.children[0]).toBe(el)
- assertBindings(binding)
- expect(vnode).toBe(_vnode)
- expect(prevVNode).toBe(null)
- }) as DirectiveHook)
- const unmounted = jest.fn(((el, binding, vnode, prevVNode) => {
- expect(el.tag).toBe('div')
- // should have been removed
- expect(el.parentNode).toBe(null)
- expect(root.children.length).toBe(0)
- assertBindings(binding)
- expect(vnode).toBe(_vnode)
- expect(prevVNode).toBe(null)
- }) as DirectiveHook)
- let _instance: ComponentInternalInstance | null = null
- let _vnode: VNode | null = null
- let _prevVnode: VNode | null = null
- const Comp = {
- setup() {
- _instance = currentInstance
- },
- render() {
- _prevVnode = _vnode
- _vnode = applyDirectives(h('div', count.value), [
- [
- {
- beforeMount,
- mounted,
- beforeUpdate,
- updated,
- beforeUnmount,
- unmounted
- },
- // value
- count.value,
- // argument
- 'foo',
- // modifiers
- { ok: true }
- ]
- ])
- return _vnode
- }
- }
- const root = nodeOps.createElement('div')
- render(h(Comp), root)
- expect(beforeMount).toHaveBeenCalled()
- expect(mounted).toHaveBeenCalled()
- count.value++
- await nextTick()
- expect(beforeUpdate).toHaveBeenCalled()
- expect(updated).toHaveBeenCalled()
- render(null, root)
- expect(beforeUnmount).toHaveBeenCalled()
- expect(unmounted).toHaveBeenCalled()
- })
- })
|