+ function assertHookCalls(component, callCounts) {
+ expect([
+ component.created.mock.calls.length,
+ component.mounted.mock.calls.length,
+ component.activated.mock.calls.length,
+ component.deactivated.mock.calls.length,
+ component.destroyed.mock.calls.length
+ ]).toEqual(callCounts)
+ }
+
+ it('with transition-mode out-in', (done) => {
+ let next
+ const vm = new Vue({
+ template: `
`,
- data: {
- view: 'one'
- },
- components,
- methods: {
- afterLeave() {
- next()
- }
+ data: {
+ view: 'one'
+ },
+ components,
+ methods: {
+ afterLeave() {
+ next()
}
- }).$mount(el)
- expect(vm.$el.textContent).toBe('one')
- assertHookCalls(one, [1, 1, 1, 0, 0])
+ }
+ }).$mount(el)
+ expect(vm.$el.textContent).toBe('one')
+ assertHookCalls(one, [1, 1, 1, 0, 0])
+ assertHookCalls(two, [0, 0, 0, 0, 0])
+ vm.view = 'two'
+ waitForUpdate(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
+ )
+ assertHookCalls(one, [1, 1, 1, 1, 0])
assertHookCalls(two, [0, 0, 0, 0, 0])
- vm.view = 'two'
- waitForUpdate(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.innerHTML).toBe(
- '
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('')
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
)
assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [0, 0, 0, 0, 0])
+ assertHookCalls(two, [1, 1, 1, 0, 0])
})
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe('')
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 1, 0, 0])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
')
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 1, 0, 0])
- })
- .then(() => {
- vm.view = 'one'
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 1, 1, 0])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe('')
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- assertHookCalls(one, [1, 1, 2, 1, 0])
- assertHookCalls(two, [1, 1, 1, 1, 0])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
')
- assertHookCalls(one, [1, 1, 2, 1, 0])
- assertHookCalls(two, [1, 1, 1, 1, 0])
- })
- .then(done)
- })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
')
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 0, 0])
+ })
+ .then(() => {
+ vm.view = 'one'
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
+ )
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 1, 0])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('')
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
+ )
+ assertHookCalls(one, [1, 1, 2, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 1, 0])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
')
+ assertHookCalls(one, [1, 1, 2, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 1, 0])
+ })
+ .then(done)
+ })
- it('with transition-mode out-in + include', (done) => {
- let next
- const vm = new Vue({
- template: `
+ it('with transition-mode out-in + include', (done) => {
+ let next
+ const vm = new Vue({
+ template: `
`,
- data: {
- view: 'one'
- },
- components,
- methods: {
- afterLeave() {
- next()
- }
+ data: {
+ view: 'one'
+ },
+ components,
+ methods: {
+ afterLeave() {
+ next()
}
- }).$mount(el)
- expect(vm.$el.textContent).toBe('one')
- assertHookCalls(one, [1, 1, 1, 0, 0])
+ }
+ }).$mount(el)
+ expect(vm.$el.textContent).toBe('one')
+ assertHookCalls(one, [1, 1, 1, 0, 0])
+ assertHookCalls(two, [0, 0, 0, 0, 0])
+ vm.view = 'two'
+ waitForUpdate(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
'
+ )
+ assertHookCalls(one, [1, 1, 1, 1, 0])
assertHookCalls(two, [0, 0, 0, 0, 0])
- vm.view = 'two'
- waitForUpdate(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.innerHTML).toBe(
- '
one
'
+ '
one
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('')
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
'
)
assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [0, 0, 0, 0, 0])
+ assertHookCalls(two, [1, 1, 0, 0, 0])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
two
')
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [1, 1, 0, 0, 0])
+ })
+ .then(() => {
+ vm.view = 'one'
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
'
+ )
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [1, 1, 0, 0, 1])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('')
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
'
+ )
+ assertHookCalls(one, [1, 1, 2, 1, 0])
+ assertHookCalls(two, [1, 1, 0, 0, 1])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
one
')
+ assertHookCalls(one, [1, 1, 2, 1, 0])
+ assertHookCalls(two, [1, 1, 0, 0, 1])
+ })
+ .then(done)
+ })
+
+ it('with transition-mode in-out', (done) => {
+ let next
+ const vm = new Vue({
+ template: `
+
+
+
+
+
+
`,
+ data: {
+ view: 'one'
+ },
+ components,
+ methods: {
+ afterEnter() {
+ next()
+ }
+ }
+ }).$mount(el)
+ expect(vm.$el.textContent).toBe('one')
+ assertHookCalls(one, [1, 1, 1, 0, 0])
+ assertHookCalls(two, [0, 0, 0, 0, 0])
+ vm.view = 'two'
+ waitForUpdate(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' +
+ '
two
'
+ )
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 0, 0])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' +
+ '
two
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' + '
two
'
+ )
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' +
+ '
two
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' +
+ '
two
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
two
')
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 0, 0])
+ })
+ .then(() => {
+ vm.view = 'one'
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ assertHookCalls(one, [1, 1, 2, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 1, 0])
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' + '
one
'
+ )
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
one
')
+ assertHookCalls(one, [1, 1, 2, 1, 0])
+ assertHookCalls(two, [1, 1, 1, 1, 0])
+ })
+ .then(done)
+ })
+
+ it('dynamic components, in-out with early cancel', (done) => {
+ let next
+ const vm = new Vue({
+ template: `
+
+
+
+
+
+
`,
+ data: { view: 'one' },
+ components,
+ methods: {
+ afterEnter() {
+ next()
+ }
+ }
+ }).$mount(el)
+ expect(vm.$el.textContent).toBe('one')
+ vm.view = 'two'
+ waitForUpdate(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' +
+ '
two
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
' +
+ '
two
'
+ )
+ // switch again before enter finishes,
+ // this cancels both enter and leave.
+ vm.view = 'one'
+ })
+ .then(() => {
+ // 1. the pending leaving "one" should be removed instantly.
+ // 2. the entering "two" should be placed into its final state instantly.
+ // 3. a new "one" is created and entering
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' + '
one
'
+ )
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
two
' +
+ '
one
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
one
')
+ })
+ .then(done)
+ })
+
+ // #4339
+ it('component with inner transition', (done) => {
+ const vm = new Vue({
+ template: `
+
+
+
+
+
+ `,
+ data: { view: 'foo' },
+ components: {
+ foo: {
+ template: '
foo
'
+ },
+ bar: {
+ template:
+ '
bar
'
+ }
+ }
+ }).$mount(el)
+
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.view = 'bar'
+ waitForUpdate(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
foo
' +
+ '
bar
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
foo
' +
+ '
bar
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
bar
')
+ vm.view = 'foo'
+ })
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
bar
' +
+ '
foo
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
bar
' +
+ '
foo
'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ })
+ .then(done)
+ })
+
+ it('async components with transition-mode out-in', (done) => {
+ const barResolve = vi.fn()
+ let next
+ const foo = (resolve) => {
+ setTimeout(() => {
+ resolve(one)
+ Vue.nextTick(next)
+ }, duration / 2)
+ }
+ const bar = (resolve) => {
+ setTimeout(() => {
+ resolve(two)
+ barResolve()
+ }, duration / 2)
+ }
+ components = {
+ foo,
+ bar
+ }
+ const vm = new Vue({
+ template: `
+
+
+
+
+
+
`,
+ data: {
+ view: 'foo'
+ },
+ components,
+ methods: {
+ afterEnter() {
+ next()
+ },
+ afterLeave() {
+ next()
+ }
+ }
+ }).$mount(el)
+ expect(vm.$el.textContent).toBe('')
+ next = () => {
+ assertHookCalls(one, [1, 1, 1, 0, 0])
+ assertHookCalls(two, [0, 0, 0, 0, 0])
+ waitForUpdate(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
'
+ )
})
.thenWaitFor(nextFrame)
.then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
one
'
+ )
+ })
+ .thenWaitFor((_next) => {
+ next = _next
+ })
+ .then(() => {
+ // foo afterEnter get called
+ expect(vm.$el.innerHTML).toBe('
one
')
+ vm.view = 'bar'
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ assertHookCalls(one, [1, 1, 1, 1, 0])
+ assertHookCalls(two, [0, 0, 0, 0, 0])
expect(vm.$el.innerHTML).toBe(
'
one
'
)
@@ -192,6 +589,9 @@ if (!isIE9) {
next = _next
})
.then(() => {
+ // foo afterLeave get called
+ // and bar has already been resolved before afterLeave get called
+ expect(barResolve.mock.calls.length).toBe(1)
expect(vm.$el.innerHTML).toBe('')
})
.thenWaitFor(nextFrame)
@@ -200,7 +600,7 @@ if (!isIE9) {
'
two
'
)
assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 0, 0, 0])
+ assertHookCalls(two, [1, 1, 1, 0, 0])
})
.thenWaitFor(nextFrame)
.then(() => {
@@ -208,451 +608,48 @@ if (!isIE9) {
'
two
'
)
})
- .thenWaitFor(duration + buffer)
+ .thenWaitFor((_next) => {
+ next = _next
+ })
.then(() => {
+ // bar afterEnter get called
expect(vm.$el.innerHTML).toBe('
two
')
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 0, 0, 0])
- })
- .then(() => {
- vm.view = 'one'
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
'
- )
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 0, 0, 1])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe('')
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
'
- )
- assertHookCalls(one, [1, 1, 2, 1, 0])
- assertHookCalls(two, [1, 1, 0, 0, 1])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
one
')
- assertHookCalls(one, [1, 1, 2, 1, 0])
- assertHookCalls(two, [1, 1, 0, 0, 1])
})
.then(done)
- })
+ }
+ })
- it('with transition-mode in-out', (done) => {
- let next
- const vm = new Vue({
- template: `
-
-
-
-
-
-
`,
- data: {
- view: 'one'
- },
- components,
- methods: {
- afterEnter() {
- next()
- }
- }
- }).$mount(el)
- expect(vm.$el.textContent).toBe('one')
- assertHookCalls(one, [1, 1, 1, 0, 0])
- assertHookCalls(two, [0, 0, 0, 0, 0])
- vm.view = 'two'
- waitForUpdate(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' +
- '
two
'
- )
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 1, 0, 0])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' +
- '
two
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' + '
two
'
- )
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' +
- '
two
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' +
- '
two
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
two
')
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 1, 0, 0])
- })
- .then(() => {
- vm.view = 'one'
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- assertHookCalls(one, [1, 1, 2, 1, 0])
- assertHookCalls(two, [1, 1, 1, 1, 0])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' + '
one
'
- )
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
one
')
- assertHookCalls(one, [1, 1, 2, 1, 0])
- assertHookCalls(two, [1, 1, 1, 1, 0])
- })
- .then(done)
- })
-
- it('dynamic components, in-out with early cancel', (done) => {
- let next
- const vm = new Vue({
- template: `
-
-
-
-
-
-
`,
- data: { view: 'one' },
- components,
- methods: {
- afterEnter() {
- next()
- }
- }
- }).$mount(el)
- expect(vm.$el.textContent).toBe('one')
- vm.view = 'two'
- waitForUpdate(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' +
- '
two
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
' +
- '
two
'
- )
- // switch again before enter finishes,
- // this cancels both enter and leave.
- vm.view = 'one'
- })
- .then(() => {
- // 1. the pending leaving "one" should be removed instantly.
- // 2. the entering "two" should be placed into its final state instantly.
- // 3. a new "one" is created and entering
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' + '
one
'
- )
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
' +
- '
one
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
one
')
- })
- .then(done)
- })
-
- // #4339
- it('component with inner transition', (done) => {
- const vm = new Vue({
- template: `
-
-
-
-
-
- `,
- data: { view: 'foo' },
- components: {
- foo: {
- template: '
foo
'
- },
- bar: {
- template:
- '
bar
'
- }
- }
- }).$mount(el)
-
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.view = 'bar'
- waitForUpdate(() => {
- expect(vm.$el.innerHTML).toBe(
- '
foo
' +
- '
bar
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
foo
' +
- '
bar
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
bar
')
- vm.view = 'foo'
- })
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
bar
' +
- '
foo
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
bar
' +
- '
foo
'
- )
- })
- .thenWaitFor(duration + buffer)
- .then(() => {
- expect(vm.$el.innerHTML).toBe('
foo
')
- })
- .then(done)
- })
-
- it('async components with transition-mode out-in', (done) => {
- const barResolve = vi.fn()
- let next
- const foo = (resolve) => {
- setTimeout(() => {
- resolve(one)
- Vue.nextTick(next)
- }, duration / 2)
- }
- const bar = (resolve) => {
- setTimeout(() => {
- resolve(two)
- barResolve()
- }, duration / 2)
- }
- components = {
- foo,
- bar
- }
- const vm = new Vue({
- template: `
-
-
-
-
-
-
`,
- data: {
- view: 'foo'
- },
- components,
- methods: {
- afterEnter() {
- next()
- },
- afterLeave() {
- next()
- }
- }
- }).$mount(el)
- expect(vm.$el.textContent).toBe('')
- next = () => {
- assertHookCalls(one, [1, 1, 1, 0, 0])
- assertHookCalls(two, [0, 0, 0, 0, 0])
- waitForUpdate(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
'
- )
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
one
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- // foo afterEnter get called
- expect(vm.$el.innerHTML).toBe('
one
')
- vm.view = 'bar'
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [0, 0, 0, 0, 0])
- expect(vm.$el.innerHTML).toBe(
- '
one
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- // foo afterLeave get called
- // and bar has already been resolved before afterLeave get called
- expect(barResolve.mock.calls.length).toBe(1)
- expect(vm.$el.innerHTML).toBe('')
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
'
- )
- assertHookCalls(one, [1, 1, 1, 1, 0])
- assertHookCalls(two, [1, 1, 1, 0, 0])
- })
- .thenWaitFor(nextFrame)
- .then(() => {
- expect(vm.$el.innerHTML).toBe(
- '
two
'
- )
- })
- .thenWaitFor((_next) => {
- next = _next
- })
- .then(() => {
- // bar afterEnter get called
- expect(vm.$el.innerHTML).toBe('
two
')
- })
- .then(done)
- }
- })
-
- // #10083
- it('should not attach event handler repeatedly', (done) => {
- const vm = new Vue({
- template: `
+ // #10083
+ it('should not attach event handler repeatedly', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { showBtn: true, n: 0 },
- methods: {
- add() {
- this.n++
- }
- },
- components: {
- btn: { template: '
add 1 ' }
+ data: { showBtn: true, n: 0 },
+ methods: {
+ add() {
+ this.n++
}
- }).$mount()
+ },
+ components: {
+ btn: { template: '
add 1 ' }
+ }
+ }).$mount()
- const btn = vm.$el
- expect(vm.n).toBe(0)
- btn.click()
- expect(vm.n).toBe(1)
- vm.showBtn = false
- waitForUpdate(() => {
- vm.showBtn = true
- })
- .then(() => {
- btn.click()
- expect(vm.n).toBe(2)
- })
- .then(done)
+ const btn = vm.$el
+ expect(vm.n).toBe(0)
+ btn.click()
+ expect(vm.n).toBe(1)
+ vm.showBtn = false
+ waitForUpdate(() => {
+ vm.showBtn = true
})
+ .then(() => {
+ btn.click()
+ expect(vm.n).toBe(2)
+ })
+ .then(done)
})
-}
+})
diff --git a/test/unit/features/transition/transition.spec.ts b/test/unit/features/transition/transition.spec.ts
index 8646a2d09..534e06d1a 100644
--- a/test/unit/features/transition/transition.spec.ts
+++ b/test/unit/features/transition/transition.spec.ts
@@ -1,72 +1,107 @@
import Vue from 'vue'
import injectStyles from './inject-styles'
-import { isIE9 } from 'core/util/env'
import { nextFrame } from 'web/runtime/transition-util'
-if (!isIE9) {
- describe('Transition basic', () => {
- const { duration, buffer } = injectStyles() as { duration: number, buffer: number }
- const explicitDuration = duration * 2
+describe.skip('Transition basic', () => {
+ const { duration, buffer } = injectStyles() as {
+ duration: number
+ buffer: number
+ }
+ const explicitDuration = duration * 2
- let el
- beforeEach(() => {
- el = document.createElement('div')
- document.body.appendChild(el)
+ let el
+ beforeEach(() => {
+ el = document.createElement('div')
+ document.body.appendChild(el)
+ })
+
+ it('basic transition', (done) => {
+ const vm = new Vue({
+ template:
+ '
',
+ data: { ok: true }
+ }).$mount(el)
+
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.children[0].className).toBe('test v-leave v-leave-active')
})
-
- it('basic transition', done => {
- const vm = new Vue({
- template: '
',
- data: { ok: true }
- }).$mount(el)
-
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- 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')
- }).thenWaitFor(duration + buffer).then(() => {
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test v-leave-active v-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .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')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test v-enter-active v-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
+ })
+ .then(done)
+ })
+
+ it('named transition', (done) => {
+ const vm = new Vue({
+ template:
+ '
',
+ data: { ok: true }
+ }).$mount(el)
+
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave test-leave-active'
+ )
})
-
- it('named transition', done => {
- const vm = new Vue({
- template: '
',
- data: { ok: true }
- }).$mount(el)
-
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave-active test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .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 test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('custom transition classes', done => {
- const vm = new Vue({
- template: `
+ it('custom transition classes', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- waitForUpdate(() => {
- expect(vm.$el.children[0].className).toBe('test bye byebye active more')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test byebye active more bye-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.children[0].className).toBe('test bye byebye active more')
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test byebye active more bye-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test hello hello-active')
- }).thenWaitFor(nextFrame).then(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test hello-active hello-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('dynamic transition', done => {
- const vm = new Vue({
- template: `
+ it('dynamic transition', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: {
- ok: true,
- trans: 'test'
- }
- }).$mount(el)
+ data: {
+ ok: true,
+ trans: 'test'
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
vm.trans = 'changed'
- }).then(() => {
- expect(vm.$el.children[0].className).toBe('test changed-enter changed-enter-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test changed-enter-active changed-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test changed-enter changed-enter-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test changed-enter-active changed-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('inline transition object', done => {
- const enter = vi.fn()
- const leave = vi.fn()
- const vm = new Vue({
- render (h) {
- return h('div', null, [
- h('transition', {
+ it('inline transition object', (done) => {
+ const enter = vi.fn()
+ const leave = vi.fn()
+ const vm = new Vue({
+ render(h) {
+ return h('div', null, [
+ h(
+ 'transition',
+ {
props: {
name: 'inline',
enterClass: 'hello',
@@ -156,43 +223,55 @@ if (!isIE9) {
enter,
leave
}
- }, this.ok ? [h('div', { class: 'test' }, 'foo')] : undefined)
- ])
- },
- data: { ok: true }
- }).$mount(el)
+ },
+ this.ok ? [h('div', { class: 'test' }, 'foo')] : undefined
+ )
+ ])
+ },
+ data: { ok: true }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- waitForUpdate(() => {
- expect(vm.$el.children[0].className).toBe('test bye byebye active')
- expect(leave).toHaveBeenCalled()
- }).thenWaitFor(nextFrame).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.children[0].className).toBe('test bye byebye active')
+ expect(leave).toHaveBeenCalled()
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test byebye active bye-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test hello hello-active')
expect(enter).toHaveBeenCalled()
- }).thenWaitFor(nextFrame).then(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test hello-active hello-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition events', done => {
- const onLeaveSpy = vi.fn()
- const onEnterSpy = vi.fn()
- const beforeLeaveSpy = vi.fn()
- const beforeEnterSpy = vi.fn()
- const afterLeaveSpy = vi.fn()
- const afterEnterSpy = vi.fn()
+ it('transition events', (done) => {
+ const onLeaveSpy = vi.fn()
+ const onEnterSpy = vi.fn()
+ const beforeLeaveSpy = vi.fn()
+ const beforeEnterSpy = vi.fn()
+ const afterLeaveSpy = vi.fn()
+ const afterEnterSpy = vi.fn()
- const vm = new Vue({
- template: `
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- methods: {
- beforeLeave: (el) => {
- expect(el).toBe(vm.$el.children[0])
- expect(el.className).toBe('test')
- beforeLeaveSpy(el)
- },
- leave: (el) => onLeaveSpy(el),
- afterLeave: (el) => afterLeaveSpy(el),
- beforeEnter: (el) => {
- expect(vm.$el.contains(el)).toBe(false)
- expect(el.className).toBe('test')
- beforeEnterSpy(el)
- },
- enter: (el) => {
- expect(vm.$el.contains(el)).toBe(true)
- onEnterSpy(el)
- },
- afterEnter: (el) => afterEnterSpy(el)
- }
- }).$mount(el)
+ data: { ok: true },
+ methods: {
+ beforeLeave: (el) => {
+ expect(el).toBe(vm.$el.children[0])
+ expect(el.className).toBe('test')
+ beforeLeaveSpy(el)
+ },
+ leave: (el) => onLeaveSpy(el),
+ afterLeave: (el) => afterLeaveSpy(el),
+ beforeEnter: (el) => {
+ expect(vm.$el.contains(el)).toBe(false)
+ expect(el.className).toBe('test')
+ beforeEnterSpy(el)
+ },
+ enter: (el) => {
+ expect(vm.$el.contains(el)).toBe(true)
+ onEnterSpy(el)
+ },
+ afterEnter: (el) => afterEnterSpy(el)
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
- let _el = vm.$el.children[0]
- vm.ok = false
- waitForUpdate(() => {
- expect(beforeLeaveSpy).toHaveBeenCalledWith(_el)
- expect(onLeaveSpy).toHaveBeenCalledWith(_el)
- expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
- }).thenWaitFor(nextFrame).then(() => {
+ let _el = vm.$el.children[0]
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(beforeLeaveSpy).toHaveBeenCalledWith(_el)
+ expect(onLeaveSpy).toHaveBeenCalledWith(_el)
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave test-leave-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(afterLeaveSpy).not.toHaveBeenCalled()
- expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave-active test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(afterLeaveSpy).toHaveBeenCalledWith(_el)
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
_el = vm.$el.children[0]
expect(beforeEnterSpy).toHaveBeenCalledWith(_el)
expect(onEnterSpy).toHaveBeenCalledWith(_el)
- 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 test-enter-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(afterEnterSpy).not.toHaveBeenCalled()
- expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-enter-active test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(afterEnterSpy).toHaveBeenCalledWith(_el)
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition events (v-show)', done => {
- const onLeaveSpy = vi.fn()
- const onEnterSpy = vi.fn()
- const beforeLeaveSpy = vi.fn()
- const beforeEnterSpy = vi.fn()
- const afterLeaveSpy = vi.fn()
- const afterEnterSpy = vi.fn()
+ it('transition events (v-show)', (done) => {
+ const onLeaveSpy = vi.fn()
+ const onEnterSpy = vi.fn()
+ const beforeLeaveSpy = vi.fn()
+ const beforeEnterSpy = vi.fn()
+ const afterLeaveSpy = vi.fn()
+ const afterEnterSpy = vi.fn()
- const vm = new Vue({
- template: `
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- methods: {
- beforeLeave: (el) => {
- expect(el.style.display).toBe('')
- expect(el).toBe(vm.$el.children[0])
- expect(el.className).toBe('test')
- beforeLeaveSpy(el)
- },
- leave: (el) => {
- expect(el.style.display).toBe('')
- onLeaveSpy(el)
- },
- afterLeave: (el) => {
- expect(el.style.display).toBe('none')
- afterLeaveSpy(el)
- },
- beforeEnter: (el) => {
- expect(el.className).toBe('test')
- expect(el.style.display).toBe('none')
- beforeEnterSpy(el)
- },
- enter: (el) => {
- expect(el.style.display).toBe('')
- onEnterSpy(el)
- },
- afterEnter: (el) => {
- expect(el.style.display).toBe('')
- afterEnterSpy(el)
- }
+ data: { ok: true },
+ methods: {
+ beforeLeave: (el) => {
+ expect(el.style.display).toBe('')
+ expect(el).toBe(vm.$el.children[0])
+ expect(el.className).toBe('test')
+ beforeLeaveSpy(el)
+ },
+ leave: (el) => {
+ expect(el.style.display).toBe('')
+ onLeaveSpy(el)
+ },
+ afterLeave: (el) => {
+ expect(el.style.display).toBe('none')
+ afterLeaveSpy(el)
+ },
+ beforeEnter: (el) => {
+ expect(el.className).toBe('test')
+ expect(el.style.display).toBe('none')
+ beforeEnterSpy(el)
+ },
+ enter: (el) => {
+ expect(el.style.display).toBe('')
+ onEnterSpy(el)
+ },
+ afterEnter: (el) => {
+ expect(el.style.display).toBe('')
+ afterEnterSpy(el)
}
- }).$mount(el)
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
- let _el = vm.$el.children[0]
- vm.ok = false
- waitForUpdate(() => {
- expect(beforeLeaveSpy).toHaveBeenCalledWith(_el)
- expect(onLeaveSpy).toHaveBeenCalledWith(_el)
- expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
- }).thenWaitFor(nextFrame).then(() => {
+ let _el = vm.$el.children[0]
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(beforeLeaveSpy).toHaveBeenCalledWith(_el)
+ expect(onLeaveSpy).toHaveBeenCalledWith(_el)
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave test-leave-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(afterLeaveSpy).not.toHaveBeenCalled()
- expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave-active test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(afterLeaveSpy).toHaveBeenCalledWith(_el)
expect(vm.$el.children[0].style.display).toBe('none')
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
_el = vm.$el.children[0]
expect(beforeEnterSpy).toHaveBeenCalledWith(_el)
expect(onEnterSpy).toHaveBeenCalledWith(_el)
- 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 test-enter-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(afterEnterSpy).not.toHaveBeenCalled()
- expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-enter-active test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(afterEnterSpy).toHaveBeenCalledWith(_el)
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('explicit user callback in JavaScript hooks', done => {
- let next
- const vm = new Vue({
- template: `
+ it('explicit user callback in JavaScript hooks', (done) => {
+ let next
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- methods: {
- enter: (el, cb) => {
- next = cb
- },
- leave: (el, cb) => {
- next = cb
- }
+ data: { ok: true },
+ methods: {
+ enter: (el, cb) => {
+ next = cb
+ },
+ leave: (el, cb) => {
+ next = cb
}
- }).$mount(el)
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
+ }
+ }).$mount(el)
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave-active test-leave-to'
+ )
expect(next).toBeTruthy()
next()
expect(vm.$el.children.length).toBe(0)
- }).then(() => {
+ })
+ .then(() => {
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 test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
+ })
+ .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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-enter-active test-enter-to'
+ )
expect(next).toBeTruthy()
next()
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('css: false', done => {
- const enterSpy = vi.fn()
- const leaveSpy = vi.fn()
- const vm = new Vue({
- template: `
+ it('css: false', (done) => {
+ const enterSpy = vi.fn()
+ const leaveSpy = vi.fn()
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- methods: {
- enter: enterSpy,
- leave: leaveSpy
- }
- }).$mount(el)
+ data: { ok: true },
+ methods: {
+ enter: enterSpy,
+ leave: leaveSpy
+ }
+ }).$mount(el)
- vm.ok = false
- waitForUpdate(() => {
- expect(leaveSpy).toHaveBeenCalled()
- expect(vm.$el.innerHTML).toBe('')
- vm.ok = true
- }).then(() => {
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(leaveSpy).toHaveBeenCalled()
+ expect(vm.$el.innerHTML).toBe('')
+ vm.ok = true
+ })
+ .then(() => {
expect(enterSpy).toHaveBeenCalled()
expect(vm.$el.innerHTML).toBe('
foo
')
- }).then(done)
+ })
+ .then(done)
+ })
+
+ it('no transition detected', (done) => {
+ const enterSpy = vi.fn()
+ const leaveSpy = vi.fn()
+ const vm = new Vue({
+ template:
+ '
',
+ data: { ok: true },
+ methods: {
+ enter: enterSpy,
+ leave: leaveSpy
+ }
+ }).$mount(el)
+
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(leaveSpy).toHaveBeenCalled()
+ expect(vm.$el.innerHTML).toBe(
+ '
foo
'
+ )
})
-
- it('no transition detected', done => {
- const enterSpy = vi.fn()
- const leaveSpy = vi.fn()
- const vm = new Vue({
- template: '
',
- data: { ok: true },
- methods: {
- enter: enterSpy,
- leave: leaveSpy
- }
- }).$mount(el)
-
- vm.ok = false
- waitForUpdate(() => {
- expect(leaveSpy).toHaveBeenCalled()
- expect(vm.$el.innerHTML).toBe('
foo
')
- }).thenWaitFor(nextFrame).then(() => {
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.innerHTML).toBe('')
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(enterSpy).toHaveBeenCalled()
- expect(vm.$el.innerHTML).toBe('
foo
')
- }).thenWaitFor(nextFrame).then(() => {
+ expect(vm.$el.innerHTML).toBe(
+ '
foo
'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
expect(vm.$el.innerHTML).toBe('
foo
')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('enterCancelled', done => {
- const spy = vi.fn()
- const vm = new Vue({
- template: `
+ it('enterCancelled', (done) => {
+ const spy = vi.fn()
+ const vm = new Vue({
+ template: `
`,
- data: { ok: false },
- methods: {
- enterCancelled: spy
- }
- }).$mount(el)
+ data: { ok: false },
+ methods: {
+ enterCancelled: spy
+ }
+ }).$mount(el)
- expect(vm.$el.innerHTML).toBe('')
- vm.ok = true
- waitForUpdate(() => {
- 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 test-enter-to')
- }).thenWaitFor(duration / 2).then(() => {
- vm.ok = false
- }).then(() => {
- expect(spy).toHaveBeenCalled()
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children.length).toBe(0)
- }).then(done)
+ expect(vm.$el.innerHTML).toBe('')
+ vm.ok = true
+ waitForUpdate(() => {
+ 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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration / 2)
+ .then(() => {
+ vm.ok = false
+ })
+ .then(() => {
+ expect(spy).toHaveBeenCalled()
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children.length).toBe(0)
+ })
+ .then(done)
+ })
- it('should remove stale leaving elements', done => {
- const spy = vi.fn()
- const vm = new Vue({
- template: `
+ it('should remove stale leaving elements', (done) => {
+ const spy = vi.fn()
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- methods: {
- afterLeave: spy
- }
- }).$mount(el)
+ data: { ok: true },
+ methods: {
+ afterLeave: spy
+ }
+ }).$mount(el)
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- waitForUpdate(() => {
- expect(vm.$el.children[0].className).toBe('test test-leave test-leave-active')
- }).thenWaitFor(duration / 2).then(() => {
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ 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(() => {
+ })
+ .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 test-enter-to')
- }).thenWaitFor(duration + buffer).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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.innerHTML).toBe('
foo
')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition with v-show', done => {
- const vm = new Vue({
- template: `
+ it('transition with v-show', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$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('')
- expect(vm.$el.children[0].className).toBe('test')
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.textContent).toBe('foo')
+ expect(vm.$el.children[0].style.display).toBe('')
+ expect(vm.$el.children[0].className).toBe('test')
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].style.display).toBe('none')
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(vm.$el.children[0].style.display).toBe('')
- 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 test-enter-to')
- }).thenWaitFor(duration + buffer).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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition with v-show, inside child component', done => {
- const vm = new Vue({
- template: `
+ it('transition with v-show, inside child component', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- components: {
- test: {
- template: `
foo
`
- }
+ data: { ok: true },
+ components: {
+ test: {
+ template: `
foo
`
}
- }).$mount(el)
+ }
+ }).$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(() => {
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // 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(() => {
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].style.display).toBe('none')
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(vm.$el.children[0].style.display).toBe('')
- 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 test-enter-to')
- }).thenWaitFor(duration + buffer).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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('leaveCancelled (v-show only)', done => {
- const spy = vi.fn()
- const vm = new Vue({
- template: `
+ it('leaveCancelled (v-show only)', (done) => {
+ const spy = vi.fn()
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- methods: {
- leaveCancelled: spy
- }
- }).$mount(el)
+ data: { ok: true },
+ methods: {
+ leaveCancelled: spy
+ }
+ }).$mount(el)
- expect(vm.$el.children[0].style.display).toBe('')
- 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 test-leave-to')
- }).thenWaitFor(10).then(() => {
+ expect(vm.$el.children[0].style.display).toBe('')
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(10)
+ .then(() => {
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(spy).toHaveBeenCalled()
- 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 test-enter-to')
- }).thenWaitFor(duration + buffer).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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].style.display).toBe('')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('leave transition with v-show: cancelled on next frame', done => {
- const vm = new Vue({
- template: `
+ it('leave transition with v-show: cancelled on next frame', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
-
- vm.ok = false
- waitForUpdate(() => {
- vm.ok = true
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-enter-active test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
-
- it('enter transition with v-show: cancelled on next frame', done => {
- const vm = new Vue({
- template: `
-
- `,
- data: { ok: false }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
+ vm.ok = false
+ waitForUpdate(() => {
vm.ok = true
- waitForUpdate(() => {
- vm.ok = false
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-leave-active test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
})
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-enter-active test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe('test')
+ })
+ .then(done)
+ })
- it('animations', done => {
- const vm = new Vue({
- template: `
+ it('enter transition with v-show: cancelled on next frame', (done) => {
+ const vm = new Vue({
+ template: `
+
+ `,
+ data: { ok: false }
+ }).$mount(el)
+
+ vm.ok = true
+ waitForUpdate(() => {
+ vm.ok = false
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-leave-active test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe('test')
+ })
+ .then(done)
+ })
+
+ it('animations', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- waitForUpdate(() => {
- expect(vm.$el.children[0].className).toBe('test-anim-leave test-anim-leave-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test-anim-leave-active test-anim-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test-anim-leave test-anim-leave-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test-anim-leave-active test-anim-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
- expect(vm.$el.children[0].className).toBe('test-anim-enter test-anim-enter-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test-anim-enter-active test-anim-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test-anim-enter test-anim-enter-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test-anim-enter-active test-anim-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('explicit transition type', done => {
- const vm = new Vue({
- template: `
+ it('explicit transition type', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- waitForUpdate(() => {
- expect(vm.$el.children[0].className).toBe('test test-anim-long-leave test-anim-long-leave-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-anim-long-leave-active test-anim-long-leave-to')
- }).thenWaitFor(duration + 5).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-anim-long-leave test-anim-long-leave-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-anim-long-leave-active test-anim-long-leave-to'
+ )
+ })
+ .thenWaitFor(duration + 5)
+ .then(() => {
// should not end early due to transition presence
- expect(vm.$el.children[0].className).toBe('test test-anim-long-leave-active test-anim-long-leave-to')
- }).thenWaitFor(duration + 5).then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-anim-long-leave-active test-anim-long-leave-to'
+ )
+ })
+ .thenWaitFor(duration + 5)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-anim-long-enter test-anim-long-enter-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-anim-long-enter-active test-anim-long-enter-to')
- }).thenWaitFor(duration + 5).then(() => {
- expect(vm.$el.children[0].className).toBe('test test-anim-long-enter-active test-anim-long-enter-to')
- }).thenWaitFor(duration + 5).then(() => {
+ })
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-anim-long-enter test-anim-long-enter-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-anim-long-enter-active test-anim-long-enter-to'
+ )
+ })
+ .thenWaitFor(duration + 5)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test test-anim-long-enter-active test-anim-long-enter-to'
+ )
+ })
+ .thenWaitFor(duration + 5)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition on appear', done => {
- const vm = new Vue({
- template: `
+ it('transition on appear', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
- 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 test-appear-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
+ 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 test-appear-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe('test')
+ })
+ .then(done)
+ })
- it('transition on appear with v-show', done => {
- const vm = new Vue({
- template: `
+ it('transition on appear with v-show', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
- waitForUpdate(() => {
- 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 test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
- expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
+ waitForUpdate(() => {
+ 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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe('test')
+ })
+ .then(done)
+ })
- it('transition on SVG elements', done => {
- const vm = new Vue({
- template: `
+ it('transition on SVG elements', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true }
- }).$mount(el)
+ data: { ok: true }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
- vm.ok = false
- waitForUpdate(() => {
- expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave v-leave-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-leave-active v-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
+ vm.ok = false
+ waitForUpdate(() => {
+ expect(vm.$el.childNodes[0].getAttribute('class')).toBe(
+ 'test v-leave v-leave-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.childNodes[0].getAttribute('class')).toBe(
+ 'test v-leave-active v-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.childNodes.length).toBe(1)
expect(vm.$el.childNodes[0].nodeType).toBe(8) // should be an empty comment node
expect(vm.$el.childNodes[0].textContent).toBe('')
vm.ok = true
- }).then(() => {
- expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter v-enter-active')
- }).thenWaitFor(nextFrame).then(() => {
- expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test v-enter-active v-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .then(() => {
+ expect(vm.$el.childNodes[0].getAttribute('class')).toBe(
+ 'test v-enter v-enter-active'
+ )
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.childNodes[0].getAttribute('class')).toBe(
+ 'test v-enter-active v-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.childNodes[0].getAttribute('class')).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition on child components', done => {
- const vm = new Vue({
- template: `
+ it('transition on child components', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- components: {
- test: {
- template: `
+ data: { ok: true },
+ components: {
+ test: {
+ template: `
foo
` // test transition override from parent
- }
}
- }).$mount(el)
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- 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')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ 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'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .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')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test v-enter-active v-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition inside child component with v-if', done => {
- const vm = new Vue({
- template: `
+ it('transition inside child component with v-if', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- components: {
- test: {
- template: `
+ data: { ok: true },
+ components: {
+ test: {
+ template: `
foo
`
- }
}
- }).$mount(el)
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- 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')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ 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'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition with appear inside child component with v-if', done => {
- const vm = new Vue({
- template: `
+ it('transition with appear inside child component with v-if', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- components: {
- test: {
- template: `
+ data: { ok: true },
+ components: {
+ test: {
+ template: `
foo
`
- }
}
- }).$mount(el)
+ }
+ }).$mount(el)
- 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 test-appear-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ 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 test-appear-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
vm.ok = false
- }).then(() => {
+ })
+ .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')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test v-leave-active v-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition inside nested child component with v-if', done => {
- const vm = new Vue({
- template: `
+ it('transition inside nested child component with v-if', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- components: {
- foo: {
- template: '
',
- components: {
- bar: {
- template: '
foo
'
- }
+ data: { ok: true },
+ components: {
+ foo: {
+ template: '
',
+ components: {
+ bar: {
+ template: '
foo
'
}
}
}
- }).$mount(el)
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
foo
')
- vm.ok = false
- 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')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
foo
')
+ vm.ok = false
+ 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'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
vm.ok = true
- }).then(() => {
+ })
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('transition with appear inside nested child component with v-if', done => {
- const vm = new Vue({
- template: `
+ it('transition with appear inside nested child component with v-if', (done) => {
+ const vm = new Vue({
+ template: `
`,
- data: { ok: true },
- components: {
- foo: {
- template: '
',
- components: {
- bar: {
- template: `
+ data: { ok: true },
+ components: {
+ foo: {
+ template: '
',
+ components: {
+ bar: {
+ template: `
foo
`
- }
}
}
}
- }).$mount(el)
+ }
+ }).$mount(el)
- 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 test-appear-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ 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 test-appear-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
vm.ok = false
- }).then(() => {
+ })
+ .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')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .thenWaitFor(nextFrame)
+ .then(() => {
+ expect(vm.$el.children[0].className).toBe(
+ 'test v-leave-active v-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children.length).toBe(0)
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('custom transition higher-order component', done => {
- const vm = new Vue({
- template: '
',
- data: { ok: true },
- components: {
- 'my-transition': {
- functional: true,
- render (h, { data, children }) {
- (data.props || (data.props = {})).name = 'test'
- return h('transition', data, children)
- }
+ it('custom transition higher-order component', (done) => {
+ const vm = new Vue({
+ template:
+ '
',
+ 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)
+ }
+ }).$mount(el)
- // should not apply transition on initial render by default
- expect(vm.$el.innerHTML).toBe('
')
- 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 test-leave-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ // should not apply transition on initial render by default
+ expect(vm.$el.innerHTML).toBe('
')
+ 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 test-leave-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .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 test-enter-to')
- }).thenWaitFor(duration + buffer).then(() => {
+ })
+ .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 test-enter-to'
+ )
+ })
+ .thenWaitFor(duration + buffer)
+ .then(() => {
expect(vm.$el.children[0].className).toBe('test')
- }).then(done)
- })
+ })
+ .then(done)
+ })
- it('warn when used on multiple elements', () => {
- new Vue({
- template: `