merge-option_spec.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. var _ = require('../../../../src/util')
  2. var Vue = require('../../../../src/vue')
  3. var merge = require('../../../../src/util/merge-option')
  4. describe('Util - Option merging', function () {
  5. it('default strat', function () {
  6. // child undefined
  7. var res = merge({replace:true}, {}).replace
  8. expect(res).toBe(true)
  9. // child overwrite
  10. res = merge({replace:true}, {replace:false}).replace
  11. expect(res).toBe(false)
  12. })
  13. it('hooks & paramAttributes', function () {
  14. var fn1 = function () {}
  15. var fn2 = function () {}
  16. var res
  17. // parent undefined
  18. res = merge({}, {created: fn1}).created
  19. expect(Array.isArray(res)).toBe(true)
  20. expect(res.length).toBe(1)
  21. expect(res[0]).toBe(fn1)
  22. // child undefined
  23. res = merge({created: [fn1]}, {}).created
  24. expect(Array.isArray(res)).toBe(true)
  25. expect(res.length).toBe(1)
  26. expect(res[0]).toBe(fn1)
  27. // both defined
  28. res = merge({created: [fn1]}, {created: fn2}).created
  29. expect(Array.isArray(res)).toBe(true)
  30. expect(res.length).toBe(2)
  31. expect(res[0]).toBe(fn1)
  32. expect(res[1]).toBe(fn2)
  33. // both arrays
  34. res = merge({paramAttributes: [1]}, {paramAttributes: [2]}).paramAttributes
  35. expect(Array.isArray(res)).toBe(true)
  36. expect(res.length).toBe(2)
  37. expect(res[0]).toBe(1)
  38. expect(res[1]).toBe(2)
  39. })
  40. it('events', function () {
  41. // no parent
  42. res = merge({}, {events:1})
  43. expect(res.events).toBe(1)
  44. // no child
  45. res = merge({events:1}, {})
  46. expect(res.events).toBe(1)
  47. var fn1 = function () {}
  48. var fn2 = function () {}
  49. var fn3 = function () {}
  50. var parent = {
  51. events: {
  52. 'fn1': [fn1, fn2],
  53. 'fn2': [fn2]
  54. }
  55. }
  56. var child = {
  57. events: {
  58. 'fn1': fn3,
  59. 'fn3': fn3
  60. }
  61. }
  62. var res = merge(parent, child).events
  63. assertRes(res.fn1, [fn1, fn2, fn3])
  64. assertRes(res.fn2, [fn2])
  65. assertRes(res.fn3, [fn3])
  66. function assertRes (res, expected) {
  67. expect(Array.isArray(res)).toBe(true)
  68. expect(res.length).toBe(expected.length)
  69. var i = expected.length
  70. while (i--) {
  71. expect(res[i]).toBe(expected[i])
  72. }
  73. }
  74. })
  75. it('normal object hashes', function () {
  76. var fn1 = function () {}
  77. var fn2 = function () {}
  78. var res
  79. // parent undefined
  80. res = merge({}, {methods: {test: fn1}}).methods
  81. expect(res.test).toBe(fn1)
  82. // child undefined
  83. res = merge({methods: {test: fn1}}, {}).methods
  84. expect(res.test).toBe(fn1)
  85. // both defined
  86. var parent = {methods: {test: fn1}}
  87. res = merge(parent, {methods: {test2: fn2}}).methods
  88. expect(res.test).toBe(fn1)
  89. expect(res.test2).toBe(fn2)
  90. })
  91. it('assets', function () {
  92. var asset1 = {}
  93. var asset2 = {}
  94. var asset3 = {}
  95. var res = merge(
  96. { directives: { a: asset1 }},
  97. { directives: { b: asset2 }}
  98. ).directives
  99. expect(res.a).toBe(asset1)
  100. expect(res.b).toBe(asset2)
  101. // vm asset merge should do tree-way merge
  102. res = merge(
  103. { directives: { a: asset1 }},
  104. { directives: { b: asset2 }},
  105. {
  106. $parent: {
  107. $options: {
  108. directives: { c: asset3 }
  109. }
  110. }
  111. },
  112. 'directives'
  113. ).directives
  114. expect(res.a).toBe(asset1)
  115. expect(res.b).toBe(asset2)
  116. expect(res.c).toBe(asset3)
  117. })
  118. it('guard components', function () {
  119. var res = merge({}, {
  120. components: {
  121. a: { template: 'hi' }
  122. }
  123. })
  124. expect(typeof res.components.a).toBe('function')
  125. expect(res.components.a.super).toBe(Vue)
  126. })
  127. it('should ignore non-function el & data in class merge', function () {
  128. var res = merge({}, {el:1, data:2})
  129. expect(res.el).toBeUndefined()
  130. expect(res.data).toBeUndefined()
  131. })
  132. it('class data/el merge', function () {
  133. function fn1 () {}
  134. function fn2 () {}
  135. var res = merge({data:fn1, el:fn1}, {data:fn2})
  136. expect(res.data).toBe(fn2)
  137. expect(res.el).toBe(fn1)
  138. })
  139. it('instanace el merge', function () {
  140. function fn1 () {
  141. return 1
  142. }
  143. function fn2 () {
  144. return 2
  145. }
  146. // both functions
  147. var res = merge({el:fn1}, {el:fn2}, {})
  148. expect(res.el).toBe(2)
  149. // direct instance el
  150. res = merge({el:fn1}, {el:2}, {})
  151. expect(res.el).toBe(2)
  152. // no parent
  153. res = merge({}, {el:2}, {})
  154. expect(res.el).toBe(2)
  155. // no child
  156. res = merge({el:fn1}, {}, {})
  157. expect(res.el).toBe(1)
  158. })
  159. it('instance data merge with no instance data', function () {
  160. var res = merge(
  161. {data: function () {
  162. return { a: 1}
  163. }},
  164. {}, // no instance data
  165. {} // mock vm presence
  166. )
  167. expect(res.data.a).toBe(1)
  168. })
  169. it('instance data merge with default data function', function () {
  170. var res = merge(
  171. // component default
  172. { data: function () {
  173. return {
  174. a: 1,
  175. b: 2
  176. }
  177. }},
  178. { data: { a: 2 }}, // instance data
  179. {} // mock vm presence
  180. )
  181. expect(res.data.a).toBe(2)
  182. expect(res.data.b).toBe(2)
  183. })
  184. it('mixins', function () {
  185. var a = {}, b = {}, c = {}, d = {}
  186. var mixinA = { a: 1, directives: { a: a } }
  187. var mixinB = { b: 1, directives: { b: b } }
  188. var res = merge(
  189. { a: 2, directives: { c: c } },
  190. { directives: { d: d }, mixins: [mixinA, mixinB] }
  191. )
  192. expect(res.a).toBe(1)
  193. expect(res.b).toBe(1)
  194. expect(res.directives.a).toBe(a)
  195. expect(res.directives.b).toBe(b)
  196. expect(res.directives.c).toBe(c)
  197. expect(res.directives.d).toBe(d)
  198. })
  199. })