| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  | import Vue from 'vue' | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  | import injectStyles from './inject-styles' | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  | import { isIE9 } from 'web/util/index' | 
					
						
							| 
									
										
										
										
											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-06-06 03:26:45 +08:00
										 |  |  |     const duration = injectStyles() | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     let el | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       el = document.createElement('div') | 
					
						
							|  |  |  |       document.body.appendChild(el) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |     it('basic transition', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('named transition', done => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('custom transition classes', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition | 
					
						
							|  |  |  |               enter-class="hello" | 
					
						
							|  |  |  |               enter-active-class="hello-active" | 
					
						
							|  |  |  |               leave-class="bye" | 
					
						
							|  |  |  |               leave-active-class="byebye active"> | 
					
						
							|  |  |  |               <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(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test bye byebye active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test byebye active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test hello hello-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test hello-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('dynamic transition', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |         vm.trans = 'changed' | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test changed-enter changed-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test changed-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('inline transition object', done => { | 
					
						
							| 
									
										
										
										
											2016-06-30 09:37:31 +08:00
										 |  |  |       const enter = jasmine.createSpy('enter') | 
					
						
							|  |  |  |       const leave = jasmine.createSpy('leave') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         render (h) { | 
					
						
							|  |  |  |           return h('div', null, [ | 
					
						
							|  |  |  |             h('transition', { | 
					
						
							|  |  |  |               props: { | 
					
						
							|  |  |  |                 name: 'inline', | 
					
						
							|  |  |  |                 enterClass: 'hello', | 
					
						
							|  |  |  |                 enterActiveClass: 'hello-active', | 
					
						
							|  |  |  |                 leaveClass: 'bye', | 
					
						
							|  |  |  |                 leaveActiveClass: 'byebye active' | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |               on: { | 
					
						
							|  |  |  |                 enter, | 
					
						
							|  |  |  |                 leave | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }, () => [this.ok ? h('div', { class: 'test' }, 'foo') : undefined]) | 
					
						
							|  |  |  |           ]) | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test bye byebye active') | 
					
						
							| 
									
										
										
										
											2016-06-30 09:37:31 +08:00
										 |  |  |         expect(leave).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test byebye active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test hello hello-active') | 
					
						
							| 
									
										
										
										
											2016-06-30 09:37:31 +08:00
										 |  |  |         expect(enter).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test hello-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-28 03:11:40 +08:00
										 |  |  |         expect(afterLeaveSpy).not.toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-28 03:11:40 +08:00
										 |  |  |         expect(afterEnterSpy).not.toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							|  |  |  |         expect(next).toBeTruthy() | 
					
						
							|  |  |  |         next() | 
					
						
							|  |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							|  |  |  |         expect(next).toBeTruthy() | 
					
						
							|  |  |  |         next() | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('css: false', done => { | 
					
						
							|  |  |  |       const enterSpy = jasmine.createSpy('enter') | 
					
						
							|  |  |  |       const leaveSpy = jasmine.createSpy('leave') | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							|  |  |  |         expect(vm.$el.innerHTML).toBe('') | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(enterSpy).toHaveBeenCalled() | 
					
						
							|  |  |  |         expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |     it('no transition detected', done => { | 
					
						
							|  |  |  |       const enterSpy = jasmine.createSpy('enter') | 
					
						
							|  |  |  |       const leaveSpy = jasmine.createSpy('leave') | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.innerHTML).toBe('<div class="nope-leave nope-leave-active">foo</div>') | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.innerHTML).toBe('') | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(enterSpy).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.innerHTML).toBe('<div class="nope-enter nope-enter-active">foo</div>') | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.innerHTML).toMatch(/<div( class="")?>foo<\/div>/) | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |     it('enterCancelled', done => { | 
					
						
							|  |  |  |       const spy = jasmine.createSpy('enterCancelled') | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(vm.$el.innerHTML).toBe('') | 
					
						
							|  |  |  |       vm.ok = true | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration / 2).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         vm.ok = false | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(spy).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-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(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							|  |  |  |       }).thenWaitFor(duration / 2).then(() => { | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(spy).toHaveBeenCalled() | 
					
						
							|  |  |  |         expect(vm.$el.children.length).toBe(1) // should have removed leaving element
 | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							|  |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							|  |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							|  |  |  |         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('') | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         expect(vm.$el.children[0].style.display).toBe('none') | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].style.display).toBe('') | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |     it('leaveCancelled (v-show only)', done => { | 
					
						
							|  |  |  |       const spy = jasmine.createSpy('leaveCancelled') | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-14 05:51:22 +08:00
										 |  |  |       }).thenWaitFor(10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(spy).toHaveBeenCalled() | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  |         expect(vm.$el.children[0].style.display).toBe('') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('animations', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-07-13 23:33:57 +08:00
										 |  |  |         template: `
 | 
					
						
							|  |  |  |           <div> | 
					
						
							|  |  |  |             <transition name="test-anim"> | 
					
						
							|  |  |  |               <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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-leave test-anim-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-enter test-anim-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-anim-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-06-01 08:55:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-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" | 
					
						
							|  |  |  |               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(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-appear test-appear-active') | 
					
						
							|  |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-appear-active') | 
					
						
							|  |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-01 23:17:37 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-03 10:29:54 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-01 23:17:37 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |     it('transition on SVG elements', done => { | 
					
						
							|  |  |  |       const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											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-07-14 02:14:24 +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-07-14 02:14:24 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +08:00
										 |  |  |         expect(vm.$el.childNodes.length).toBe(1) | 
					
						
							|  |  |  |         expect(vm.$el.childNodes[0].nodeType).toBe(3) // should be an empty text node
 | 
					
						
							|  |  |  |         expect(vm.$el.childNodes[0].textContent).toBe('') | 
					
						
							| 
									
										
										
										
											2016-06-01 09:42:33 +08:00
										 |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-07-14 02:14:24 +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-07-14 02:14:24 +08:00
										 |  |  |         expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // should not apply transition on initial render by default
 | 
					
						
							|  |  |  |       expect(vm.$el.innerHTML).toBe('<div class="test">foo</div>') | 
					
						
							|  |  |  |       vm.ok = false | 
					
						
							|  |  |  |       waitForUpdate(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test v-leave-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-23 10:01:11 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter v-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test v-enter-active') | 
					
						
							| 
									
										
										
										
											2016-06-06 03:26:45 +08:00
										 |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							| 
									
										
										
										
											2016-06-02 05:15:25 +08:00
										 |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-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(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active') | 
					
						
							|  |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-leave-active') | 
					
						
							|  |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children.length).toBe(0) | 
					
						
							|  |  |  |         vm.ok = true | 
					
						
							|  |  |  |       }).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter test-enter-active') | 
					
						
							|  |  |  |       }).thenWaitFor(nextFrame).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test test-enter-active') | 
					
						
							|  |  |  |       }).thenWaitFor(duration + 10).then(() => { | 
					
						
							|  |  |  |         expect(vm.$el.children[0].className).toBe('test') | 
					
						
							|  |  |  |       }).then(done) | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2016-06-01 08:36:06 +08:00
										 |  |  |   }) | 
					
						
							|  |  |  | } |