transition_spec.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. var _ = require('../../../../../src/util')
  2. var Vue = _.Vue
  3. var Directive = require('../../../../../src/directive')
  4. var def = require('../../../../../src/directives/internal/transition')
  5. if (_.inBrowser) {
  6. describe('transition', function () {
  7. it('should instantiate a transition object with correct args', function () {
  8. var fns = {}
  9. var el = document.createElement('div')
  10. var vm = new Vue({
  11. transitions: {
  12. test: fns
  13. }
  14. })
  15. var dir = new Directive({
  16. name: 'transition',
  17. raw: 'test',
  18. def: def,
  19. literal: true
  20. }, vm, el)
  21. dir._bind()
  22. var transition = dir.el.__v_trans
  23. expect(transition.el).toBe(dir.el)
  24. expect(transition.hooks).toBe(fns)
  25. expect(transition.enterClass).toBe('test-enter')
  26. expect(transition.leaveClass).toBe('test-leave')
  27. expect(dir.el.className === 'test-transition')
  28. dir.update('lol', 'test')
  29. transition = dir.el.__v_trans
  30. expect(transition.enterClass).toBe('lol-enter')
  31. expect(transition.leaveClass).toBe('lol-leave')
  32. expect(transition.fns).toBeUndefined()
  33. expect(dir.el.className === 'lol-transition')
  34. })
  35. it('should bind the transition to closest vm', function () {
  36. var vm1 = new Vue()
  37. var vm2 = new Vue()
  38. var el = document.createElement('div')
  39. var dir = new Directive({
  40. name: 'transition',
  41. raw: 'test',
  42. def: def,
  43. literal: true
  44. }, vm1, el)
  45. dir.el.__vue__ = vm2
  46. dir._bind()
  47. expect(dir.el.__v_trans.vm).toBe(vm2)
  48. })
  49. it('dynamic transitions', function (done) {
  50. var el = document.createElement('div')
  51. document.body.appendChild(el)
  52. var calls = {
  53. a: { enter: 0, leave: 0 },
  54. b: { enter: 0, leave: 0 }
  55. }
  56. var vm = new Vue({
  57. el: el,
  58. template: '<div v-show="show" :transition="trans"></div>',
  59. data: {
  60. show: true,
  61. trans: 'a'
  62. },
  63. transitions: {
  64. a: {
  65. enter: function (el, done) {
  66. calls.a.enter++
  67. done()
  68. },
  69. leave: function (el, done) {
  70. calls.a.leave++
  71. done()
  72. }
  73. },
  74. b: {
  75. enter: function (el, done) {
  76. calls.b.enter++
  77. done()
  78. },
  79. leave: function (el, done) {
  80. calls.b.leave++
  81. done()
  82. }
  83. }
  84. }
  85. })
  86. assertCalls(0, 0, 0, 0)
  87. vm.show = false
  88. _.nextTick(function () {
  89. assertCalls(0, 1, 0, 0)
  90. vm.trans = 'b'
  91. vm.show = true
  92. _.nextTick(function () {
  93. assertCalls(0, 1, 1, 0)
  94. vm.show = false
  95. _.nextTick(function () {
  96. assertCalls(0, 1, 1, 1)
  97. vm.trans = 'a'
  98. vm.show = true
  99. _.nextTick(function () {
  100. assertCalls(1, 1, 1, 1)
  101. done()
  102. })
  103. })
  104. })
  105. })
  106. function assertCalls (a, b, c, d) {
  107. expect(el.firstChild.style.display).toBe(vm.show ? '' : 'none')
  108. expect(calls.a.enter).toBe(a)
  109. expect(calls.a.leave).toBe(b)
  110. expect(calls.b.enter).toBe(c)
  111. expect(calls.b.leave).toBe(d)
  112. }
  113. })
  114. })
  115. }