transition-mode.spec.js 8.4 KB

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