transition-mode.spec.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import Vue from 'vue'
  2. import injectStyles from './inject-styles'
  3. import { isIE9 } from 'web/util/index'
  4. import { nextFrame } from 'web/runtime/modules/transition'
  5. if (!isIE9) {
  6. describe('Transition mode', () => {
  7. const duration = injectStyles()
  8. const components = {
  9. one: { template: '<div>one</div>' },
  10. two: { template: '<div>two</div>' }
  11. }
  12. let el
  13. beforeEach(() => {
  14. el = document.createElement('div')
  15. document.body.appendChild(el)
  16. })
  17. it('dynamic components, simultaneous', done => {
  18. const vm = new Vue({
  19. template: `<div>
  20. <transition>
  21. <component :is="view" class="test">
  22. </component>
  23. </transition>
  24. </div>`,
  25. data: { view: 'one' },
  26. components
  27. }).$mount(el)
  28. expect(vm.$el.textContent).toBe('one')
  29. vm.view = 'two'
  30. waitForUpdate(() => {
  31. expect(vm.$el.innerHTML).toBe(
  32. '<div class="test v-leave v-leave-active">one</div>' +
  33. '<div class="test v-enter v-enter-active">two</div>'
  34. )
  35. }).thenWaitFor(nextFrame).then(() => {
  36. expect(vm.$el.innerHTML).toBe(
  37. '<div class="test v-leave-active">one</div>' +
  38. '<div class="test v-enter-active">two</div>'
  39. )
  40. }).thenWaitFor(duration + 10).then(() => {
  41. expect(vm.$el.innerHTML).toBe(
  42. '<div class="test">two</div>'
  43. )
  44. }).then(done)
  45. })
  46. it('dynamic components, out-in', done => {
  47. let next
  48. const vm = new Vue({
  49. template: `<div>
  50. <transition name="test" mode="out-in" @after-leave="afterLeave">
  51. <component :is="view" class="test">
  52. </component>
  53. </transition>
  54. </div>`,
  55. data: { view: 'one' },
  56. components,
  57. methods: {
  58. afterLeave () {
  59. next()
  60. }
  61. }
  62. }).$mount(el)
  63. expect(vm.$el.textContent).toBe('one')
  64. vm.view = 'two'
  65. waitForUpdate(() => {
  66. expect(vm.$el.innerHTML).toBe(
  67. '<div class="test test-leave test-leave-active">one</div>'
  68. )
  69. }).thenWaitFor(nextFrame).then(() => {
  70. expect(vm.$el.innerHTML).toBe(
  71. '<div class="test test-leave-active">one</div>'
  72. )
  73. }).thenWaitFor(_next => { next = _next }).then(() => {
  74. expect(vm.$el.innerHTML).toBe('')
  75. }).thenWaitFor(nextFrame).then(() => {
  76. expect(vm.$el.innerHTML).toBe(
  77. '<div class="test test-enter test-enter-active">two</div>'
  78. )
  79. }).thenWaitFor(nextFrame).then(() => {
  80. expect(vm.$el.innerHTML).toBe(
  81. '<div class="test test-enter-active">two</div>'
  82. )
  83. }).thenWaitFor(duration + 10).then(() => {
  84. expect(vm.$el.innerHTML).toBe(
  85. '<div class="test">two</div>'
  86. )
  87. }).then(done)
  88. })
  89. it('dynamic components, in-out', done => {
  90. let next
  91. const vm = new Vue({
  92. template: `<div>
  93. <transition name="test" mode="in-out" @after-enter="afterEnter">
  94. <component :is="view" class="test">
  95. </component>
  96. </transition>
  97. </div>`,
  98. data: { view: 'one' },
  99. components,
  100. methods: {
  101. afterEnter () {
  102. next()
  103. }
  104. }
  105. }).$mount(el)
  106. expect(vm.$el.textContent).toBe('one')
  107. vm.view = 'two'
  108. waitForUpdate(() => {
  109. expect(vm.$el.innerHTML).toBe(
  110. '<div class="test">one</div>' +
  111. '<div class="test test-enter test-enter-active">two</div>'
  112. )
  113. }).thenWaitFor(nextFrame).then(() => {
  114. expect(vm.$el.innerHTML).toBe(
  115. '<div class="test">one</div>' +
  116. '<div class="test test-enter-active">two</div>'
  117. )
  118. }).thenWaitFor(_next => { next = _next }).then(() => {
  119. expect(vm.$el.innerHTML).toBe(
  120. '<div class="test">one</div>' +
  121. '<div class="test">two</div>'
  122. )
  123. }).then(() => {
  124. expect(vm.$el.innerHTML).toBe(
  125. '<div class="test test-leave test-leave-active">one</div>' +
  126. '<div class="test">two</div>'
  127. )
  128. }).thenWaitFor(nextFrame).then(() => {
  129. expect(vm.$el.innerHTML).toBe(
  130. '<div class="test test-leave-active">one</div>' +
  131. '<div class="test">two</div>'
  132. )
  133. }).thenWaitFor(duration + 10).then(() => {
  134. expect(vm.$el.innerHTML).toBe(
  135. '<div class="test">two</div>'
  136. )
  137. }).then(done)
  138. })
  139. it('normal elements with different keys, simultaneous', done => {
  140. const vm = new Vue({
  141. template: `<div>
  142. <transition>
  143. <div :key="view" class="test">{{view}}</div>
  144. </transition>
  145. </div>`,
  146. data: { view: 'one' },
  147. components
  148. }).$mount(el)
  149. expect(vm.$el.textContent).toBe('one')
  150. vm.view = 'two'
  151. waitForUpdate(() => {
  152. expect(vm.$el.innerHTML).toBe(
  153. '<div class="test v-leave v-leave-active">one</div>' +
  154. '<div class="test v-enter v-enter-active">two</div>'
  155. )
  156. }).thenWaitFor(nextFrame).then(() => {
  157. expect(vm.$el.innerHTML).toBe(
  158. '<div class="test v-leave-active">one</div>' +
  159. '<div class="test v-enter-active">two</div>'
  160. )
  161. }).thenWaitFor(duration + 10).then(() => {
  162. expect(vm.$el.innerHTML).toBe(
  163. '<div class="test">two</div>'
  164. )
  165. }).then(done)
  166. })
  167. it('normal elements with different keys, out-in', done => {
  168. let next
  169. const vm = new Vue({
  170. template: `<div>
  171. <transition name="test" mode="out-in" @after-leave="afterLeave">
  172. <div :key="view" class="test">{{view}}</div>
  173. </transition>
  174. </div>`,
  175. data: { view: 'one' },
  176. components,
  177. methods: {
  178. afterLeave () {
  179. next()
  180. }
  181. }
  182. }).$mount(el)
  183. expect(vm.$el.textContent).toBe('one')
  184. vm.view = 'two'
  185. waitForUpdate(() => {
  186. expect(vm.$el.innerHTML).toBe(
  187. '<div class="test test-leave test-leave-active">one</div>'
  188. )
  189. }).thenWaitFor(nextFrame).then(() => {
  190. expect(vm.$el.innerHTML).toBe(
  191. '<div class="test test-leave-active">one</div>'
  192. )
  193. }).thenWaitFor(_next => { next = _next }).then(() => {
  194. expect(vm.$el.innerHTML).toBe('')
  195. }).thenWaitFor(nextFrame).then(() => {
  196. expect(vm.$el.innerHTML).toBe(
  197. '<div class="test test-enter test-enter-active">two</div>'
  198. )
  199. }).thenWaitFor(nextFrame).then(() => {
  200. expect(vm.$el.innerHTML).toBe(
  201. '<div class="test test-enter-active">two</div>'
  202. )
  203. }).thenWaitFor(duration + 10).then(() => {
  204. expect(vm.$el.innerHTML).toBe(
  205. '<div class="test">two</div>'
  206. )
  207. }).then(done)
  208. })
  209. it('normal elements with different keys, in-out', done => {
  210. let next
  211. const vm = new Vue({
  212. template: `<div>
  213. <transition name="test" mode="in-out" @after-enter="afterEnter">
  214. <div :key="view" class="test">{{view}}</div>
  215. </transition>
  216. </div>`,
  217. data: { view: 'one' },
  218. components,
  219. methods: {
  220. afterEnter () {
  221. next()
  222. }
  223. }
  224. }).$mount(el)
  225. expect(vm.$el.textContent).toBe('one')
  226. vm.view = 'two'
  227. waitForUpdate(() => {
  228. expect(vm.$el.innerHTML).toBe(
  229. '<div class="test">one</div>' +
  230. '<div class="test test-enter test-enter-active">two</div>'
  231. )
  232. }).thenWaitFor(nextFrame).then(() => {
  233. expect(vm.$el.innerHTML).toBe(
  234. '<div class="test">one</div>' +
  235. '<div class="test test-enter-active">two</div>'
  236. )
  237. }).thenWaitFor(_next => { next = _next }).then(() => {
  238. expect(vm.$el.innerHTML).toBe(
  239. '<div class="test">one</div>' +
  240. '<div class="test">two</div>'
  241. )
  242. }).then(() => {
  243. expect(vm.$el.innerHTML).toBe(
  244. '<div class="test test-leave test-leave-active">one</div>' +
  245. '<div class="test">two</div>'
  246. )
  247. }).thenWaitFor(nextFrame).then(() => {
  248. expect(vm.$el.innerHTML).toBe(
  249. '<div class="test test-leave-active">one</div>' +
  250. '<div class="test">two</div>'
  251. )
  252. }).thenWaitFor(duration + 10).then(() => {
  253. expect(vm.$el.innerHTML).toBe(
  254. '<div class="test">two</div>'
  255. )
  256. }).then(done)
  257. })
  258. })
  259. }