2016-06-01 08:36:06 +08:00
|
|
|
import Vue from 'vue'
|
2016-06-06 03:26:45 +08:00
|
|
|
import injectStyles from './inject-styles'
|
2016-06-01 08:36:06 +08:00
|
|
|
import { isIE9 } from 'web/util/index'
|
|
|
|
|
import { nextFrame } from 'web/runtime/modules/transition'
|
|
|
|
|
|
|
|
|
|
if (!isIE9) {
|
|
|
|
|
describe('Transition system', () => {
|
2016-06-06 03:26:45 +08:00
|
|
|
const duration = injectStyles()
|
2016-06-01 08:36:06 +08:00
|
|
|
|
|
|
|
|
let el
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
el = document.createElement('div')
|
|
|
|
|
document.body.appendChild(el)
|
|
|
|
|
})
|
|
|
|
|
|
2016-06-01 09:42:33 +08:00
|
|
|
it('basic transition', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition>foo</div></div>',
|
|
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test v-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test v-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('named transition', done => {
|
2016-06-01 08:36:06 +08:00
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('custom transition classes', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
test: {
|
|
|
|
|
enterClass: 'hello',
|
2016-06-01 08:55:13 +08:00
|
|
|
enterActiveClass: 'hello-active',
|
2016-06-01 08:36:06 +08:00
|
|
|
leaveClass: 'bye',
|
2016-06-23 10:01:11 +08:00
|
|
|
leaveActiveClass: 'byebye active' // testing multi classes
|
2016-06-01 08:36:06 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test bye byebye active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test byebye active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test hello hello-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-01 08:55:13 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test hello-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('dynamic transition', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" :transition="trans">foo</div></div>',
|
|
|
|
|
data: {
|
|
|
|
|
ok: true,
|
|
|
|
|
trans: 'test'
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
vm.trans = 'changed'
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test changed-enter changed-enter-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test changed-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('inline transition object', done => {
|
2016-06-30 09:37:31 +08:00
|
|
|
const enter = jasmine.createSpy('enter')
|
|
|
|
|
const leave = jasmine.createSpy('leave')
|
2016-06-01 08:36:06 +08:00
|
|
|
const vm = new Vue({
|
|
|
|
|
template: `<div><div v-if="ok" class="test" :transition="{
|
2016-06-04 03:18:23 +08:00
|
|
|
name: 'inline',
|
2016-06-01 08:36:06 +08:00
|
|
|
enterClass: 'hello',
|
2016-06-01 08:55:13 +08:00
|
|
|
enterActiveClass: 'hello-active',
|
2016-06-01 08:36:06 +08:00
|
|
|
leaveClass: 'bye',
|
2016-06-23 10:01:11 +08:00
|
|
|
leaveActiveClass: 'byebye active'
|
2016-06-01 08:36:06 +08:00
|
|
|
}">foo</div></div>`,
|
2016-06-04 03:18:23 +08:00
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
inline: {
|
2016-06-30 09:37:31 +08:00
|
|
|
enter,
|
|
|
|
|
leave
|
2016-06-04 03:18:23 +08:00
|
|
|
}
|
|
|
|
|
}
|
2016-06-01 08:36:06 +08:00
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test bye byebye active')
|
2016-06-30 09:37:31 +08:00
|
|
|
expect(leave).toHaveBeenCalled()
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test byebye active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test hello hello-active')
|
2016-06-30 09:37:31 +08:00
|
|
|
expect(enter).toHaveBeenCalled()
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-01 08:55:13 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test hello-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('transition with JavaScript hooks', done => {
|
2016-06-30 09:37:31 +08:00
|
|
|
const onLeaveSpy = jasmine.createSpy('leave')
|
|
|
|
|
const onEnterSpy = jasmine.createSpy('enter')
|
2016-06-01 08:36:06 +08:00
|
|
|
const beforeLeaveSpy = jasmine.createSpy('beforeLeave')
|
|
|
|
|
const beforeEnterSpy = jasmine.createSpy('beforeEnter')
|
2016-06-28 03:11:40 +08:00
|
|
|
const afterLeaveSpy = jasmine.createSpy('afterLeave')
|
|
|
|
|
const afterEnterSpy = jasmine.createSpy('afterEnter')
|
2016-06-01 08:36:06 +08:00
|
|
|
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
2016-06-28 03:11:40 +08:00
|
|
|
test: {
|
|
|
|
|
beforeLeave: (el, vm) => {
|
|
|
|
|
expect(el).toBe(vm.$el.children[0])
|
|
|
|
|
expect(el.className).toBe('test')
|
|
|
|
|
beforeLeaveSpy(el, vm)
|
|
|
|
|
},
|
2016-06-30 09:37:31 +08:00
|
|
|
leave: (el, vm) => onLeaveSpy(el, vm),
|
2016-06-28 03:11:40 +08:00
|
|
|
afterLeave: (el, vm) => afterLeaveSpy(el, vm),
|
|
|
|
|
beforeEnter: (el, vm) => {
|
|
|
|
|
expect(vm.$el.contains(el)).toBe(false)
|
|
|
|
|
expect(el.className).toBe('test')
|
|
|
|
|
beforeEnterSpy(el, vm)
|
|
|
|
|
},
|
2016-07-10 23:14:22 +08:00
|
|
|
enter: (el, vm) => {
|
|
|
|
|
expect(vm.$el.contains(el)).toBe(true)
|
|
|
|
|
onEnterSpy(el, vm)
|
|
|
|
|
},
|
2016-06-28 03:11:40 +08:00
|
|
|
afterEnter: (el, vm) => afterEnterSpy(el, vm)
|
|
|
|
|
}
|
2016-06-01 08:36:06 +08:00
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
2016-06-28 03:11:40 +08:00
|
|
|
|
|
|
|
|
let _el = vm.$el.children[0]
|
2016-06-01 08:36:06 +08:00
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-28 03:11:40 +08:00
|
|
|
expect(beforeLeaveSpy).toHaveBeenCalledWith(_el, vm)
|
|
|
|
|
expect(onLeaveSpy).toHaveBeenCalledWith(_el, vm)
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-28 03:11:40 +08:00
|
|
|
expect(afterLeaveSpy).not.toHaveBeenCalled()
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-28 03:11:40 +08:00
|
|
|
expect(afterLeaveSpy).toHaveBeenCalledWith(_el, vm)
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-28 03:11:40 +08:00
|
|
|
_el = vm.$el.children[0]
|
|
|
|
|
expect(beforeEnterSpy).toHaveBeenCalledWith(_el, vm)
|
|
|
|
|
expect(onEnterSpy).toHaveBeenCalledWith(_el, vm)
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-28 03:11:40 +08:00
|
|
|
expect(afterEnterSpy).not.toHaveBeenCalled()
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-28 03:11:40 +08:00
|
|
|
expect(afterEnterSpy).toHaveBeenCalledWith(_el, vm)
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
2016-06-01 09:42:33 +08:00
|
|
|
it('explicit user callback in JavaScript hooks', done => {
|
|
|
|
|
let next
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
test: {
|
2016-06-30 09:37:31 +08:00
|
|
|
enter: (el, vm, cb) => {
|
2016-06-01 09:42:33 +08:00
|
|
|
next = cb
|
|
|
|
|
},
|
2016-06-30 09:37:31 +08:00
|
|
|
leave: (el, vm, cb) => {
|
2016-06-01 09:42:33 +08:00
|
|
|
next = cb
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
|
|
|
|
expect(next).toBeTruthy()
|
|
|
|
|
next()
|
|
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
}).then(() => {
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
|
|
|
|
expect(next).toBeTruthy()
|
|
|
|
|
next()
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('css: false', done => {
|
|
|
|
|
const enterSpy = jasmine.createSpy('enter')
|
|
|
|
|
const leaveSpy = jasmine.createSpy('leave')
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
test: {
|
|
|
|
|
css: false,
|
2016-06-30 09:37:31 +08:00
|
|
|
enter: enterSpy,
|
|
|
|
|
leave: leaveSpy
|
2016-06-01 09:42:33 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
|
|
|
|
expect(leaveSpy).toHaveBeenCalled()
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
|
|
|
|
expect(enterSpy).toHaveBeenCalled()
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
2016-06-02 05:15:25 +08:00
|
|
|
it('no transition detected', done => {
|
|
|
|
|
const enterSpy = jasmine.createSpy('enter')
|
|
|
|
|
const leaveSpy = jasmine.createSpy('leave')
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" transition="nope">foo</div></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
nope: {
|
2016-06-30 09:37:31 +08:00
|
|
|
enter: enterSpy,
|
|
|
|
|
leave: leaveSpy
|
2016-06-02 05:15:25 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
|
|
|
|
expect(leaveSpy).toHaveBeenCalled()
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="nope-leave nope-leave-active">foo</div>')
|
2016-06-02 05:15:25 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
|
|
|
|
expect(enterSpy).toHaveBeenCalled()
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="nope-enter nope-enter-active">foo</div>')
|
2016-06-02 05:15:25 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.innerHTML).toMatch(/<div( class="")?>foo<\/div>/)
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
2016-06-01 08:36:06 +08:00
|
|
|
it('enterCancelled', done => {
|
|
|
|
|
const spy = jasmine.createSpy('enterCancelled')
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: false },
|
|
|
|
|
transitions: {
|
|
|
|
|
test: {
|
|
|
|
|
enterCancelled: spy
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
|
|
|
|
vm.ok = true
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration / 2).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
vm.ok = false
|
|
|
|
|
}).then(() => {
|
|
|
|
|
expect(spy).toHaveBeenCalled()
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
2016-06-01 08:55:13 +08:00
|
|
|
it('transition with v-show', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-show="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
2016-06-01 08:36:06 +08:00
|
|
|
|
2016-06-01 08:55:13 +08:00
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.textContent).toBe('foo')
|
|
|
|
|
expect(vm.$el.children[0].style.display).toBe('')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 08:55:13 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:55:13 +08:00
|
|
|
expect(vm.$el.children[0].style.display).toBe('none')
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].style.display).toBe('')
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-01 08:55:13 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:55:13 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
2016-06-01 08:36:06 +08:00
|
|
|
})
|
|
|
|
|
|
2016-06-01 08:55:13 +08:00
|
|
|
it('leaveCancelled (v-show only)', done => {
|
|
|
|
|
const spy = jasmine.createSpy('leaveCancelled')
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-show="ok" class="test" transition="test">foo</div></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
test: {
|
|
|
|
|
leaveCancelled: spy
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
2016-06-01 08:36:06 +08:00
|
|
|
|
2016-06-01 08:55:13 +08:00
|
|
|
expect(vm.$el.children[0].style.display).toBe('')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
|
2016-06-01 08:55:13 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-leave-active')
|
2016-06-14 05:51:22 +08:00
|
|
|
}).thenWaitFor(10).then(() => {
|
2016-06-01 08:55:13 +08:00
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
|
|
|
|
expect(spy).toHaveBeenCalled()
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-01 08:55:13 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:55:13 +08:00
|
|
|
expect(vm.$el.children[0].style.display).toBe('')
|
|
|
|
|
}).then(done)
|
2016-06-01 08:36:06 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('animations', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><div v-if="ok" class="test" transition="test-anim">foo</div></div>',
|
|
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-anim-leave test-anim-leave-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-anim-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-anim-enter test-anim-enter-active')
|
2016-06-01 08:36:06 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-anim-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 08:36:06 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
2016-06-01 08:55:13 +08:00
|
|
|
|
2016-06-27 08:03:39 +08:00
|
|
|
it('transition on appear (inline)', done => {
|
2016-06-01 09:42:33 +08:00
|
|
|
const vm = new Vue({
|
2016-06-03 10:29:54 +08:00
|
|
|
template: `
|
|
|
|
|
<div>
|
|
|
|
|
<div v-if="ok"
|
|
|
|
|
class="test"
|
|
|
|
|
:transition="{
|
|
|
|
|
name:'test',
|
|
|
|
|
appear:true,
|
|
|
|
|
appearClass: 'test-appear',
|
|
|
|
|
appearActiveClass: 'test-appear-active'
|
|
|
|
|
}">foo</div>
|
|
|
|
|
</div>
|
|
|
|
|
`,
|
2016-06-01 09:42:33 +08:00
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
2016-06-27 08:03:39 +08:00
|
|
|
waitForUpdate(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-appear test-appear-active')
|
|
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test test-appear-active')
|
|
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('transition on appear (resolved)', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: `
|
|
|
|
|
<div>
|
|
|
|
|
<div v-if="ok"
|
|
|
|
|
class="test"
|
|
|
|
|
transition="test">foo</div>
|
|
|
|
|
</div>
|
|
|
|
|
`,
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
transitions: {
|
|
|
|
|
test: {
|
|
|
|
|
appear: true,
|
|
|
|
|
appearClass: 'test-appear',
|
|
|
|
|
appearActiveClass: 'test-appear-active'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
2016-06-01 09:42:33 +08:00
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-appear test-appear-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-03 06:18:45 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-appear-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
2016-06-01 08:55:13 +08:00
|
|
|
|
2016-06-01 23:17:37 +08:00
|
|
|
it('transition on appear with v-show', done => {
|
|
|
|
|
const vm = new Vue({
|
2016-06-03 10:29:54 +08:00
|
|
|
template: `
|
|
|
|
|
<div>
|
|
|
|
|
<div v-show="ok"
|
|
|
|
|
class="test"
|
|
|
|
|
:transition="{name:'test',appear:true}">foo</div>
|
|
|
|
|
</div>
|
|
|
|
|
`,
|
2016-06-01 23:17:37 +08:00
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active')
|
2016-06-01 23:17:37 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
2016-06-03 10:29:54 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test test-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 23:17:37 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
|
|
|
|
|
2016-06-01 09:42:33 +08:00
|
|
|
it('transition on SVG elements', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<svg><circle cx="0" cy="0" r="10" v-if="ok" class="test" transition></circle></svg>',
|
|
|
|
|
data: { ok: true }
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave v-leave-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.childNodes.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter v-enter-active')
|
2016-06-01 09:42:33 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-01 09:42:33 +08:00
|
|
|
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
|
|
|
|
|
}).then(done)
|
2016-06-01 08:55:13 +08:00
|
|
|
})
|
2016-06-02 05:15:25 +08:00
|
|
|
|
|
|
|
|
it('transition on child components', done => {
|
|
|
|
|
const vm = new Vue({
|
|
|
|
|
template: '<div><test v-if="ok" class="test" transition></test></div>',
|
|
|
|
|
data: { ok: true },
|
|
|
|
|
components: {
|
|
|
|
|
test: {
|
|
|
|
|
template: '<div transition="test">foo</div>' // test transition override from parent
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}).$mount(el)
|
|
|
|
|
|
|
|
|
|
// should not apply transition on initial render by default
|
|
|
|
|
expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>')
|
|
|
|
|
vm.ok = false
|
|
|
|
|
waitForUpdate(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
|
2016-06-02 05:15:25 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test v-leave-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-02 05:15:25 +08:00
|
|
|
expect(vm.$el.children.length).toBe(0)
|
|
|
|
|
vm.ok = true
|
|
|
|
|
}).then(() => {
|
2016-06-23 10:01:11 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active')
|
2016-06-02 05:15:25 +08:00
|
|
|
}).thenWaitFor(nextFrame).then(() => {
|
|
|
|
|
expect(vm.$el.children[0].className).toBe('test v-enter-active')
|
2016-06-06 03:26:45 +08:00
|
|
|
}).thenWaitFor(duration + 10).then(() => {
|
2016-06-02 05:15:25 +08:00
|
|
|
expect(vm.$el.children[0].className).toBe('test')
|
|
|
|
|
}).then(done)
|
|
|
|
|
})
|
2016-06-01 08:36:06 +08:00
|
|
|
})
|
|
|
|
|
}
|