| 
									
										
										
										
											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-09-24 06:16:43 +08:00
										 |  |  | import { isIE9 } from 'core/util/env' | 
					
						
							| 
									
										
										
										
											2016-07-14 09:49:09 +08:00
										 |  |  | import { nextFrame } from 'web/runtime/transition-util' | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | if (!isIE9) { | 
					
						
							| 
									
										
										
										
											2016-07-15 05:51:25 +08:00
										 |  |  |   describe('Transition basic', () => { | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |     const { duration, buffer } = injectStyles() | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |     const explicitDuration = duration * 2 | 
					
						
							| 
									
										
										
										
											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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: '<div><transition><div v-if="ok" class="test">foo</div></transition></div>', | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         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-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: '<div><transition name="test"><div v-if="ok" class="test">foo</div></transition></div>', | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         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-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition | 
					
						
							|  |  |  |               enter-class="hello" | 
					
						
							|  |  |  |               enter-active-class="hello-active" | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |               enter-to-class="hello-to" | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |               leave-class="bye" | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |               leave-to-class="bye-to" | 
					
						
							| 
									
										
										
										
											2017-02-07 00:53:04 +08:00
										 |  |  |               leave-active-class="byebye active more "> | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |         data: { ok: true } | 
					
						
							| 
									
										
										
										
											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(() => { | 
					
						
							| 
									
										
										
										
											2017-02-07 00:53:04 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test bye byebye active more') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-07 00:53:04 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test byebye active more bye-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test hello-active hello-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition :name="trans"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         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-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |         vm.trans = 'changed' | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test changed-enter-active changed-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         render (h) { | 
					
						
							|  |  |  |           return h('div', null, [ | 
					
						
							|  |  |  |             h('transition', { | 
					
						
							|  |  |  |               props: { | 
					
						
							|  |  |  |                 name: 'inline', | 
					
						
							|  |  |  |                 enterClass: 'hello', | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |                 enterToClass: 'hello-to', | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |                 enterActiveClass: 'hello-active', | 
					
						
							|  |  |  |                 leaveClass: 'bye', | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |                 leaveToClass: 'bye-to', | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |                 leaveActiveClass: 'byebye active' | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |               on: { | 
					
						
							|  |  |  |                 enter, | 
					
						
							|  |  |  |                 leave | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2016-08-06 01:23:43 +08:00
										 |  |  |             }, this.ok ? [h('div', { class: 'test' }, 'foo')] : undefined) | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |           ]) | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         data: { ok: true } | 
					
						
							| 
									
										
										
										
											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-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test byebye active bye-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test hello-active hello-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |     it('transition events', 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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition | 
					
						
							|  |  |  |               name="test" | 
					
						
							|  |  |  |               @before-enter="beforeEnter" | 
					
						
							|  |  |  |               @enter="enter" | 
					
						
							|  |  |  |               @after-enter="afterEnter" | 
					
						
							|  |  |  |               @before-leave="beforeLeave" | 
					
						
							|  |  |  |               @leave="leave" | 
					
						
							|  |  |  |               @after-leave="afterLeave"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         data: { ok: true }, | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         methods: { | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |           beforeLeave: (el) => { | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             expect(el).toBe(vm.$el.children[0]) | 
					
						
							|  |  |  |             expect(el.className).toBe('test') | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |             beforeLeaveSpy(el) | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |           leave: (el) => onLeaveSpy(el), | 
					
						
							|  |  |  |           afterLeave: (el) => afterLeaveSpy(el), | 
					
						
							|  |  |  |           beforeEnter: (el) => { | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             expect(vm.$el.contains(el)).toBe(false) | 
					
						
							|  |  |  |             expect(el.className).toBe('test') | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |             beforeEnterSpy(el) | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |           enter: (el) => { | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             expect(vm.$el.contains(el)).toBe(true) | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |             onEnterSpy(el) | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |           afterEnter: (el) => afterEnterSpy(el) | 
					
						
							| 
									
										
										
										
											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-07-14 01:51:45 +08:00
										 |  |  |         expect(beforeLeaveSpy).toHaveBeenCalledWith(_el) | 
					
						
							|  |  |  |         expect(onLeaveSpy).toHaveBeenCalledWith(_el) | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |         expect(afterLeaveSpy).toHaveBeenCalledWith(_el) | 
					
						
							| 
									
										
										
										
											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] | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |         expect(beforeEnterSpy).toHaveBeenCalledWith(_el) | 
					
						
							|  |  |  |         expect(onEnterSpy).toHaveBeenCalledWith(_el) | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |         expect(afterEnterSpy).toHaveBeenCalledWith(_el) | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 02:51:44 +08:00
										 |  |  |     it('transition events (v-show)', done => { | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |       const onLeaveSpy = jasmine.createSpy('leave') | 
					
						
							|  |  |  |       const onEnterSpy = jasmine.createSpy('enter') | 
					
						
							|  |  |  |       const beforeLeaveSpy = jasmine.createSpy('beforeLeave') | 
					
						
							|  |  |  |       const beforeEnterSpy = jasmine.createSpy('beforeEnter') | 
					
						
							|  |  |  |       const afterLeaveSpy = jasmine.createSpy('afterLeave') | 
					
						
							|  |  |  |       const afterEnterSpy = jasmine.createSpy('afterEnter') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							|  |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition | 
					
						
							|  |  |  |               name="test" | 
					
						
							|  |  |  |               @before-enter="beforeEnter" | 
					
						
							|  |  |  |               @enter="enter" | 
					
						
							|  |  |  |               @after-enter="afterEnter" | 
					
						
							|  |  |  |               @before-leave="beforeLeave" | 
					
						
							|  |  |  |               @leave="leave" | 
					
						
							|  |  |  |               @after-leave="afterLeave"> | 
					
						
							|  |  |  |               <div v-show="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |         data: { ok: true }, | 
					
						
							|  |  |  |         methods: { | 
					
						
							|  |  |  |           beforeLeave: (el) => { | 
					
						
							| 
									
										
										
										
											2016-12-09 05:54:09 +08:00
										 |  |  |             expect(el.style.display).toBe('') | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |             expect(el).toBe(vm.$el.children[0]) | 
					
						
							|  |  |  |             expect(el.className).toBe('test') | 
					
						
							|  |  |  |             beforeLeaveSpy(el) | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-12-09 05:54:09 +08:00
										 |  |  |           leave: (el) => { | 
					
						
							|  |  |  |             expect(el.style.display).toBe('') | 
					
						
							|  |  |  |             onLeaveSpy(el) | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           afterLeave: (el) => { | 
					
						
							|  |  |  |             expect(el.style.display).toBe('none') | 
					
						
							|  |  |  |             afterLeaveSpy(el) | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |           beforeEnter: (el) => { | 
					
						
							|  |  |  |             expect(el.className).toBe('test') | 
					
						
							| 
									
										
										
										
											2016-12-09 05:54:09 +08:00
										 |  |  |             expect(el.style.display).toBe('none') | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |             beforeEnterSpy(el) | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           enter: (el) => { | 
					
						
							| 
									
										
										
										
											2016-12-09 05:54:09 +08:00
										 |  |  |             expect(el.style.display).toBe('') | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |             onEnterSpy(el) | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-12-09 05:54:09 +08:00
										 |  |  |           afterEnter: (el) => { | 
					
						
							|  |  |  |             expect(el.style.display).toBe('') | 
					
						
							|  |  |  |             afterEnterSpy(el) | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // should not apply transition on initial render by default
 | 
					
						
							|  |  |  |       expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let _el = vm.$el.children[0] | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							|  |  |  |         expect(beforeLeaveSpy).toHaveBeenCalledWith(_el) | 
					
						
							|  |  |  |         expect(onLeaveSpy).toHaveBeenCalledWith(_el) | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(afterLeaveSpy).not.toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |         expect(afterLeaveSpy).toHaveBeenCalledWith(_el) | 
					
						
							|  |  |  |         expect(vm.$el.children[0].style.display).toBe('none') | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         _el = vm.$el.children[0] | 
					
						
							|  |  |  |         expect(beforeEnterSpy).toHaveBeenCalledWith(_el) | 
					
						
							|  |  |  |         expect(onEnterSpy).toHaveBeenCalledWith(_el) | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-08-13 02:46:03 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(afterEnterSpy).not.toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |         expect(afterEnterSpy).toHaveBeenCalledWith(_el) | 
					
						
							| 
									
										
										
										
											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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `<div>
 | 
					
						
							|  |  |  |           <transition name="test" @enter="enter" @leave="leave"> | 
					
						
							|  |  |  |             <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |           </transition> | 
					
						
							|  |  |  |         </div>`, | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         data: { ok: true }, | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         methods: { | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |           enter: (el, cb) => { | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             next = cb | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2016-07-14 01:51:45 +08:00
										 |  |  |           leave: (el, cb) => { | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             next = cb | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         expect(next).toBeTruthy() | 
					
						
							|  |  |  |         next() | 
					
						
							|  |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition :css="false" name="test" @enter="enter" @leave="leave"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         data: { ok: true }, | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         methods: { | 
					
						
							|  |  |  |           enter: enterSpy, | 
					
						
							|  |  |  |           leave: leaveSpy | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							|  |  |  |         expect(leaveSpy).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-08-05 13:52:09 +08:00
										 |  |  |         expect(vm.$el.innerHTML).toBe('<!---->') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: '<div><transition name="nope" @enter="enter" @leave="leave"><div v-if="ok">foo</div></transition></div>', | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         data: { ok: true }, | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         methods: { | 
					
						
							|  |  |  |           enter: enterSpy, | 
					
						
							|  |  |  |           leave: leaveSpy | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							|  |  |  |         expect(leaveSpy).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-08-05 13:52:09 +08:00
										 |  |  |         expect(vm.$el.innerHTML).toBe('<!---->') | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(enterSpy).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test" @enter-cancelled="enterCancelled"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         data: { ok: false }, | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         methods: { | 
					
						
							|  |  |  |           enterCancelled: spy | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 13:52:09 +08:00
										 |  |  |       expect(vm.$el.innerHTML).toBe('<!---->') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       vm.ok = true | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											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-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-14 23:06:22 +08:00
										 |  |  |     it('should remove stale leaving elements', done => { | 
					
						
							|  |  |  |       const spy = jasmine.createSpy('afterLeave') | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							|  |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test" @after-leave="afterLeave"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |         data: { ok: true }, | 
					
						
							|  |  |  |         methods: { | 
					
						
							|  |  |  |           afterLeave: spy | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-07-14 23:06:22 +08:00
										 |  |  |       }).thenWaitFor(duration / 2).then(() => { | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(spy).toHaveBeenCalled() | 
					
						
							|  |  |  |         expect(vm.$el.children.length).toBe(1) // should have removed leaving element
 | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-07-14 23:06:22 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 23:06:22 +08:00
										 |  |  |         expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |     it('transition with v-show', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test"> | 
					
						
							|  |  |  |               <div v-show="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         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('') | 
					
						
							| 
									
										
										
										
											2016-08-30 22:45:38 +08:00
										 |  |  |       expect(vm.$el.children[0].className).toBe('test') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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-08-01 05:31:02 +08:00
										 |  |  |     it('transition with v-show, inside child component', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							|  |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <test v-show="ok"></test> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |         data: { ok: true }, | 
					
						
							|  |  |  |         components: { | 
					
						
							|  |  |  |           test: { | 
					
						
							|  |  |  |             template: `<transition name="test"><div class="test">foo</div></transition>` | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // 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-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |         expect(vm.$el.children[0].style.display).toBe('none') | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].style.display).toBe('') | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |     it('leaveCancelled (v-show only)', done => { | 
					
						
							|  |  |  |       const spy = jasmine.createSpy('leaveCancelled') | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test" @leave-cancelled="leaveCancelled"> | 
					
						
							|  |  |  |               <div v-show="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         data: { ok: true }, | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         methods: { | 
					
						
							|  |  |  |           leaveCancelled: spy | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       }).$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-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											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-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test-anim"> | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |               <div v-if="ok">foo</div> | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         data: { ok: true } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // should not apply transition on initial render by default
 | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       expect(vm.$el.innerHTML).toBe('<div>foo</div>') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test-anim-leave test-anim-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test-anim-leave-active test-anim-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test-anim-enter test-anim-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test-anim-enter-active test-anim-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('explicit transition type', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							|  |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test-anim-long" type="animation"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </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-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-long-leave test-anim-long-leave-active') | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-long-leave-active test-anim-long-leave-to') | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       }).thenWaitFor(duration + 5).then(() => { | 
					
						
							|  |  |  |         // should not end early due to transition presence
 | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-long-leave-active test-anim-long-leave-to') | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       }).thenWaitFor(duration + 5).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-long-enter test-anim-long-enter-active') | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-long-enter-active test-anim-long-enter-to') | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       }).thenWaitFor(duration + 5).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-long-enter-active test-anim-long-enter-to') | 
					
						
							| 
									
										
										
										
											2016-07-27 11:26:05 +08:00
										 |  |  |       }).thenWaitFor(duration + 5).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-07-13 23:33:57 +08:00
										 |  |  |     it('transition on appear', done => { | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-06-03 10:29:54 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             <transition name="test" | 
					
						
							|  |  |  |               appear | 
					
						
							|  |  |  |               appear-class="test-appear" | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |               appear-to-class="test-appear-to" | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |               appear-active-class="test-appear-active"> | 
					
						
							|  |  |  |               <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							| 
									
										
										
										
											2016-06-03 10:29:54 +08:00
										 |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         data: { ok: true } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-27 08:03:39 +08:00
										 |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-appear test-appear-active') | 
					
						
							| 
									
										
										
										
											2016-06-27 08:03:39 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-appear-active test-appear-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-27 08:03:39 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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> | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             <transition name="test" appear> | 
					
						
							|  |  |  |               <div v-show="ok" class="test">foo</div> | 
					
						
							|  |  |  |             </transition> | 
					
						
							| 
									
										
										
										
											2016-06-03 10:29:54 +08:00
										 |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 23:17:37 +08:00
										 |  |  |         data: { ok: true } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).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({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <svg> | 
					
						
							|  |  |  |             <transition> | 
					
						
							|  |  |  |               <circle cx="0" cy="0" r="10" v-if="ok" class="test"></circle> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </svg> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         data: { ok: true } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // should not apply transition on initial render by default
 | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +08:00
										 |  |  |       expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +08:00
										 |  |  |         expect(vm.$el.childNodes.length).toBe(1) | 
					
						
							| 
									
										
										
										
											2016-08-05 13:52:09 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].nodeType).toBe(8) // should be an empty comment node
 | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].textContent).toBe('') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       }).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({ | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +08:00
										 |  |  |         template: `
 | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |           <div> | 
					
						
							|  |  |  |             <transition> | 
					
						
							|  |  |  |               <test v-if="ok" class="test"></test> | 
					
						
							|  |  |  |             </transition> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         data: { ok: true }, | 
					
						
							|  |  |  |         components: { | 
					
						
							|  |  |  |           test: { | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |             template: `
 | 
					
						
							|  |  |  |               <transition name="test"> | 
					
						
							|  |  |  |                 <div>foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             ` // test transition override from parent
 | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |       // should not apply transition on initial render by default
 | 
					
						
							|  |  |  |       expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-08-01 05:31:02 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('transition inside child component', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							|  |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <test v-if="ok" class="test"></test> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         `,
 | 
					
						
							|  |  |  |         data: { ok: true }, | 
					
						
							|  |  |  |         components: { | 
					
						
							|  |  |  |           test: { | 
					
						
							|  |  |  |             template: `
 | 
					
						
							|  |  |  |               <transition> | 
					
						
							|  |  |  |                 <div>foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             `
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }).$mount(el) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |       // should not apply transition on initial render by default
 | 
					
						
							|  |  |  |       expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +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(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-07-14 22:59:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('custom transition higher-order component', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							|  |  |  |         template: '<div><my-transition><div v-if="ok" class="test">foo</div></my-transition></div>', | 
					
						
							|  |  |  |         data: { ok: true }, | 
					
						
							|  |  |  |         components: { | 
					
						
							|  |  |  |           'my-transition': { | 
					
						
							|  |  |  |             functional: true, | 
					
						
							|  |  |  |             render (h, { data, children }) { | 
					
						
							|  |  |  |               (data.props || (data.props = {})).name = 'test' | 
					
						
							|  |  |  |               return h('transition', data, children) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }).$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-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-07-14 22:59:10 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 22:59:10 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 03:11:45 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-07-14 22:59:10 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-12-28 04:03:48 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to') | 
					
						
							| 
									
										
										
										
											2016-11-20 11:08:06 +08:00
										 |  |  |       }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 22:59:10 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-11-25 01:59:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('warn when used on multiple elements', () => { | 
					
						
							|  |  |  |       new Vue({ | 
					
						
							|  |  |  |         template: `<transition><p>1</p><p>2</p></transition>` | 
					
						
							|  |  |  |       }).$mount() | 
					
						
							|  |  |  |       expect(`<transition> can only be used on a single element`).toHaveBeenWarned() | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |     describe('explicit durations -', () => { | 
					
						
							|  |  |  |       it('single value', done => { | 
					
						
							|  |  |  |         const vm = new Vue({ | 
					
						
							|  |  |  |           template: `
 | 
					
						
							|  |  |  |             <div> | 
					
						
							| 
									
										
										
										
											2017-02-26 07:58:15 +08:00
										 |  |  |               <transition duration="${explicitDuration}"> | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |                 <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |           data: { ok: true } | 
					
						
							|  |  |  |         }).$mount(el) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         vm.ok = false | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         waitForUpdate(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(explicitDuration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(explicitDuration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |         }).then(done) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('enter and auto leave', done => { | 
					
						
							|  |  |  |         const vm = new Vue({ | 
					
						
							|  |  |  |           template: `
 | 
					
						
							|  |  |  |             <div> | 
					
						
							|  |  |  |               <transition :duration="{ enter: ${explicitDuration} }"> | 
					
						
							|  |  |  |                 <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |           data: { ok: true } | 
					
						
							|  |  |  |         }).$mount(el) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         vm.ok = false | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         waitForUpdate(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(explicitDuration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |         }).then(done) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('leave and auto enter', done => { | 
					
						
							|  |  |  |         const vm = new Vue({ | 
					
						
							|  |  |  |           template: `
 | 
					
						
							|  |  |  |             <div> | 
					
						
							|  |  |  |               <transition :duration="{ leave: ${explicitDuration} }"> | 
					
						
							|  |  |  |                 <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |           data: { ok: true } | 
					
						
							|  |  |  |         }).$mount(el) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         vm.ok = false | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         waitForUpdate(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(explicitDuration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |         }).then(done) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('separate enter and leave', done => { | 
					
						
							|  |  |  |         const enter = explicitDuration | 
					
						
							|  |  |  |         const leave = explicitDuration * 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const vm = new Vue({ | 
					
						
							|  |  |  |           template: `
 | 
					
						
							|  |  |  |             <div> | 
					
						
							|  |  |  |               <transition :duration="{ enter: ${enter}, leave: ${leave} }"> | 
					
						
							|  |  |  |                 <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |           data: { ok: true } | 
					
						
							|  |  |  |         }).$mount(el) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         vm.ok = false | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         waitForUpdate(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(leave + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(enter + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |         }).then(done) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('enter and leave + duration change', done => { | 
					
						
							|  |  |  |         const enter1 = explicitDuration * 2 | 
					
						
							|  |  |  |         const enter2 = explicitDuration | 
					
						
							|  |  |  |         const leave1 = explicitDuration * 0.5 | 
					
						
							|  |  |  |         const leave2 = explicitDuration * 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const vm = new Vue({ | 
					
						
							|  |  |  |           template: `
 | 
					
						
							|  |  |  |             <div> | 
					
						
							|  |  |  |               <transition :duration="{ enter: enter, leave: leave }"> | 
					
						
							|  |  |  |                 <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |           data: { | 
					
						
							|  |  |  |             ok: true, | 
					
						
							|  |  |  |             enter: enter1, | 
					
						
							|  |  |  |             leave: leave1 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }).$mount(el) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         vm.ok = false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         waitForUpdate(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(leave1 + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(enter1 + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |           vm.enter = enter2 | 
					
						
							|  |  |  |           vm.leave = leave2 | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           vm.ok = false | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-leave-active v-leave-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(leave2 + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							|  |  |  |         }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |           expect(vm.$el.children[0].className).toBe('test v-enter-active v-enter-to') | 
					
						
							| 
									
										
										
										
											2017-02-22 11:19:08 +08:00
										 |  |  |         }).thenWaitFor(enter2 + buffer).then(() => { | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |           expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |         }).then(done) | 
					
						
							| 
									
										
										
										
											2017-02-24 11:43:23 +08:00
										 |  |  |       }, 10000) | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('warn invalid durations', done => { | 
					
						
							|  |  |  |         const vm = new Vue({ | 
					
						
							|  |  |  |           template: `
 | 
					
						
							|  |  |  |             <div> | 
					
						
							|  |  |  |               <transition :duration="{ enter: NaN, leave: 'foo' }"> | 
					
						
							|  |  |  |                 <div v-if="ok" class="test">foo</div> | 
					
						
							|  |  |  |               </transition> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           `,
 | 
					
						
							|  |  |  |           data: { | 
					
						
							|  |  |  |             ok: true | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }).$mount(el) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 11:08:25 +08:00
										 |  |  |         vm.ok = false | 
					
						
							|  |  |  |         waitForUpdate(() => { | 
					
						
							|  |  |  |           expect(`<transition> explicit leave duration is not a valid number - got "foo"`).toHaveBeenWarned() | 
					
						
							|  |  |  |         }).thenWaitFor(duration + buffer).then(() => { | 
					
						
							|  |  |  |           vm.ok = true | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           expect(`<transition> explicit enter duration is NaN`).toHaveBeenWarned() | 
					
						
							|  |  |  |         }).then(done) | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-02-16 07:37:09 +08:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |   }) | 
					
						
							|  |  |  | } |