2
0

directive_spec.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. var Vue = require('src')
  2. var Directive = require('src/directive')
  3. var nextTick = Vue.nextTick
  4. describe('Directive', function () {
  5. var el, vm, def
  6. beforeEach(function () {
  7. el = document.createElement('div')
  8. def = {
  9. params: ['foo'],
  10. paramWatchers: {
  11. foo: jasmine.createSpy('foo')
  12. },
  13. bind: jasmine.createSpy('bind'),
  14. update: jasmine.createSpy('update'),
  15. unbind: jasmine.createSpy('unbind')
  16. }
  17. vm = new Vue({
  18. data: {
  19. a: 1,
  20. b: { c: { d: 2 }}
  21. },
  22. filters: {
  23. test: function (v) {
  24. return v * 2
  25. }
  26. },
  27. directives: {
  28. test: def
  29. }
  30. })
  31. })
  32. it('normal', function (done) {
  33. var d = new Directive({
  34. name: 'test',
  35. def: def,
  36. expression: 'a',
  37. modifiers: {
  38. literal: false
  39. },
  40. filters: [{ name: 'test' }]
  41. }, vm, el)
  42. d._bind()
  43. // properties
  44. expect(d.el).toBe(el)
  45. expect(d.name).toBe('test')
  46. expect(d.vm).toBe(vm)
  47. expect(d.expression).toBe('a')
  48. expect(d.literal).toBe(false)
  49. // init calls
  50. expect(def.bind).toHaveBeenCalled()
  51. expect(def.update).toHaveBeenCalledWith(2)
  52. expect(d._bound).toBe(true)
  53. vm.a = 2
  54. nextTick(function () {
  55. expect(def.update).toHaveBeenCalledWith(4, 2)
  56. // teardown
  57. d._teardown()
  58. expect(def.unbind).toHaveBeenCalled()
  59. expect(d._bound).toBe(false)
  60. expect(d._watcher).toBe(null)
  61. done()
  62. })
  63. })
  64. it('literal', function () {
  65. var d = new Directive({
  66. name: 'test',
  67. expression: 'a',
  68. raw: 'a',
  69. def: def,
  70. modifiers: {
  71. literal: true
  72. }
  73. }, vm, el)
  74. d._bind()
  75. expect(d._watcher).toBeUndefined()
  76. expect(d.expression).toBe('a')
  77. expect(d.bind).toHaveBeenCalled()
  78. expect(d.update).toHaveBeenCalledWith('a')
  79. })
  80. it('inline statement', function () {
  81. def.acceptStatement = true
  82. var spy = jasmine.createSpy()
  83. vm.$options.filters.test = function (fn) {
  84. spy()
  85. return function () {
  86. // call it twice
  87. fn()
  88. fn()
  89. }
  90. }
  91. var d = new Directive({
  92. name: 'test',
  93. expression: 'a++',
  94. filters: [{name: 'test'}],
  95. def: def
  96. }, vm, el)
  97. d._bind()
  98. expect(d._watcher).toBeUndefined()
  99. expect(d.bind).toHaveBeenCalled()
  100. var wrappedFn = d.update.calls.argsFor(0)[0]
  101. expect(typeof wrappedFn).toBe('function')
  102. // test invoke the wrapped fn
  103. wrappedFn()
  104. expect(vm.a).toBe(3)
  105. })
  106. it('two-way', function (done) {
  107. def.twoWay = true
  108. vm.$options.filters.test = {
  109. write: function (v) {
  110. return v * 3
  111. }
  112. }
  113. var d = new Directive({
  114. name: 'test',
  115. expression: 'a',
  116. filters: [{name: 'test'}],
  117. def: def
  118. }, vm, el)
  119. d._bind()
  120. d.set(2)
  121. expect(vm.a).toBe(6)
  122. nextTick(function () {
  123. // should have no update calls
  124. expect(def.update.calls.count()).toBe(1)
  125. done()
  126. })
  127. })
  128. it('deep', function (done) {
  129. def.deep = true
  130. var d = new Directive({
  131. name: 'test',
  132. expression: 'b',
  133. def: def
  134. }, vm, el)
  135. d._bind()
  136. vm.b.c.d = 3
  137. nextTick(function () {
  138. expect(def.update.calls.count()).toBe(2)
  139. done()
  140. })
  141. })
  142. it('function def', function () {
  143. var d = new Directive({
  144. name: 'test',
  145. expression: 'a',
  146. def: def.update
  147. }, vm, el)
  148. d._bind()
  149. expect(d.update).toBe(def.update)
  150. expect(def.update).toHaveBeenCalled()
  151. })
  152. it('static params', function () {
  153. el.setAttribute('foo', 'hello')
  154. var d = new Directive({
  155. name: 'test',
  156. def: def,
  157. expression: 'a'
  158. }, vm, el)
  159. d._bind()
  160. expect(d.params.foo).toBe('hello')
  161. })
  162. it('dynamic params', function (done) {
  163. el.setAttribute(':foo', 'a')
  164. var d = new Directive({
  165. name: 'test',
  166. def: def,
  167. expression: 'a'
  168. }, vm, el)
  169. d._bind()
  170. expect(d.params.foo).toBe(vm.a)
  171. vm.a = 2
  172. nextTick(function () {
  173. expect(def.paramWatchers.foo).toHaveBeenCalledWith(2, 1)
  174. expect(d.params.foo).toBe(vm.a)
  175. done()
  176. })
  177. })
  178. })