options_spec.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. var _ = require('../../../../src/util')
  2. var Vue = require('../../../../src/vue')
  3. var merge = _.mergeOptions
  4. describe('Util - Option merging', function () {
  5. beforeEach(function () {
  6. spyOn(_, 'warn')
  7. })
  8. it('default strat', function () {
  9. // child undefined
  10. var res = merge({replace: true}, {}).replace
  11. expect(res).toBe(true)
  12. // child overwrite
  13. res = merge({replace: true}, {replace: false}).replace
  14. expect(res).toBe(false)
  15. })
  16. it('hooks & props', function () {
  17. var fn1 = function () {}
  18. var fn2 = function () {}
  19. var res
  20. // parent undefined
  21. res = merge({}, {created: fn1}).created
  22. expect(Array.isArray(res)).toBe(true)
  23. expect(res.length).toBe(1)
  24. expect(res[0]).toBe(fn1)
  25. // child undefined
  26. res = merge({created: [fn1]}, {}).created
  27. expect(Array.isArray(res)).toBe(true)
  28. expect(res.length).toBe(1)
  29. expect(res[0]).toBe(fn1)
  30. // both defined
  31. res = merge({created: [fn1]}, {created: fn2}).created
  32. expect(Array.isArray(res)).toBe(true)
  33. expect(res.length).toBe(2)
  34. expect(res[0]).toBe(fn1)
  35. expect(res[1]).toBe(fn2)
  36. // both arrays
  37. res = merge({props: [1]}, {props: [2]}).props
  38. expect(Array.isArray(res)).toBe(true)
  39. expect(res.length).toBe(2)
  40. expect(res[0]).toBe(1)
  41. expect(res[1]).toBe(2)
  42. })
  43. it('events', function () {
  44. // no parent
  45. res = merge({}, {events: 1})
  46. expect(res.events).toBe(1)
  47. // no child
  48. res = merge({events: 1}, {})
  49. expect(res.events).toBe(1)
  50. var fn1 = function () {}
  51. var fn2 = function () {}
  52. var fn3 = function () {}
  53. var parent = {
  54. events: {
  55. 'fn1': [fn1, fn2],
  56. 'fn2': fn2
  57. }
  58. }
  59. var child = {
  60. events: {
  61. 'fn1': fn3,
  62. 'fn2': fn3,
  63. 'fn3': fn3
  64. }
  65. }
  66. var res = merge(parent, child).events
  67. assertRes(res.fn1, [fn1, fn2, fn3])
  68. assertRes(res.fn2, [fn2, fn3])
  69. assertRes(res.fn3, [fn3])
  70. function assertRes (res, expected) {
  71. expect(Array.isArray(res)).toBe(true)
  72. expect(res.length).toBe(expected.length)
  73. var i = expected.length
  74. while (i--) {
  75. expect(res[i]).toBe(expected[i])
  76. }
  77. }
  78. })
  79. it('normal object hashes', function () {
  80. var fn1 = function () {}
  81. var fn2 = function () {}
  82. var res
  83. // parent undefined
  84. res = merge({}, {methods: {test: fn1}}).methods
  85. expect(res.test).toBe(fn1)
  86. // child undefined
  87. res = merge({methods: {test: fn1}}, {}).methods
  88. expect(res.test).toBe(fn1)
  89. // both defined
  90. var parent = {methods: {test: fn1}}
  91. res = merge(parent, {methods: {test2: fn2}}).methods
  92. expect(res.test).toBe(fn1)
  93. expect(res.test2).toBe(fn2)
  94. })
  95. it('assets', function () {
  96. var asset1 = {}
  97. var asset2 = {}
  98. var res = merge(
  99. { directives: { a: asset1 }},
  100. { directives: { b: asset2 }}
  101. ).directives
  102. expect(res.a).toBe(asset1)
  103. expect(res.b).toBe(asset2)
  104. })
  105. it('guard components', function () {
  106. var res = merge({
  107. components: null
  108. }, {
  109. components: {
  110. test: { template: 'hi' }
  111. }
  112. })
  113. expect(typeof res.components.test).toBe('function')
  114. expect(res.components.test.options.name).toBe('test')
  115. expect(res.components.test.super).toBe(Vue)
  116. })
  117. it('guard components warn built-in elements', function () {
  118. merge({
  119. components: null
  120. }, {
  121. components: {
  122. a: { template: 'hi' }
  123. }
  124. })
  125. expect(hasWarned(_, 'Do not use built-in HTML elements')).toBe(true)
  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 el merge', function () {
  133. function fn1 () {}
  134. function fn2 () {}
  135. var res = merge({el: fn1}, {el: fn2})
  136. expect(res.el).toBe(fn2)
  137. })
  138. it('class data merge', function () {
  139. function fn1 () {
  140. return { a: 1, c: 4, d: { e: 1 }}
  141. }
  142. function fn2 () {
  143. return { a: 2, b: 3, d: { f: 2 }}
  144. }
  145. // both present
  146. var res = merge({data: fn1}, {data: fn2}).data()
  147. expect(res.a).toBe(2)
  148. expect(res.b).toBe(3)
  149. expect(res.c).toBe(4)
  150. expect(res.d.e).toBe(1)
  151. expect(res.d.f).toBe(2)
  152. // only parent
  153. res = merge({data: fn1}, {}).data()
  154. expect(res.a).toBe(1)
  155. expect(res.b).toBeUndefined()
  156. expect(res.c).toBe(4)
  157. expect(res.d.e).toBe(1)
  158. expect(res.d.f).toBeUndefined()
  159. })
  160. it('instanace el merge', function () {
  161. var vm = {} // mock vm presence
  162. function fn1 () {
  163. expect(this).toBe(vm)
  164. return 1
  165. }
  166. function fn2 () {
  167. expect(this).toBe(vm)
  168. return 2
  169. }
  170. // both functions
  171. var res = merge({el: fn1}, {el: fn2}, vm)
  172. expect(res.el).toBe(2)
  173. // direct instance el
  174. res = merge({el: fn1}, {el: 2}, vm)
  175. expect(res.el).toBe(2)
  176. // no parent
  177. res = merge({}, {el: 2}, vm)
  178. expect(res.el).toBe(2)
  179. // no child
  180. res = merge({el: fn1}, {}, vm)
  181. expect(res.el).toBe(1)
  182. })
  183. it('instance data merge with no instance data', function () {
  184. var res = merge(
  185. {data: function () {
  186. return { a: 1}
  187. }},
  188. {}, // no instance data
  189. {} // mock vm presence
  190. )
  191. expect(res.data().a).toBe(1)
  192. })
  193. it('instance data merge with default data function', function () {
  194. var vm = {} // mock vm presence
  195. var res = merge(
  196. // component default
  197. { data: function () {
  198. expect(this).toBe(vm)
  199. return {
  200. a: 1,
  201. b: 2
  202. }
  203. }},
  204. { data: { a: 2 }}, // instance data
  205. vm
  206. )
  207. var data = res.data()
  208. expect(data.a).toBe(2)
  209. expect(data.b).toBe(2)
  210. })
  211. it('already observed instance data merge with default data', function () {
  212. var Observer = require('../../../../src/observer')
  213. var instanceData = { a: 123 }
  214. // observe it
  215. Observer.create(instanceData)
  216. var res = merge(
  217. {
  218. data: function () { return { b: 234} }
  219. },
  220. {
  221. data: instanceData
  222. },
  223. {}
  224. )
  225. var data = res.data()
  226. expect(data.a).toBe(123)
  227. expect(data.b).toBe(234)
  228. expect(Object.getOwnPropertyDescriptor(data, 'b').get).toBeTruthy()
  229. })
  230. it('mixins', function () {
  231. var a = {}
  232. var b = {}
  233. var c = {}
  234. var d = {}
  235. var f1 = function () {}
  236. var f2 = function () {}
  237. var f3 = function () {}
  238. var f4 = function () {}
  239. var mixinA = { a: 1, directives: { a: a }, created: f2 }
  240. var mixinB = { b: 1, directives: { b: b }, created: f3 }
  241. var res = merge(
  242. { a: 2, directives: { c: c }, created: [f1] },
  243. { directives: { d: d }, mixins: [mixinA, mixinB], created: f4 }
  244. )
  245. expect(res.a).toBe(1)
  246. expect(res.b).toBe(1)
  247. expect(res.directives.a).toBe(a)
  248. expect(res.directives.b).toBe(b)
  249. expect(res.directives.c).toBe(c)
  250. expect(res.directives.d).toBe(d)
  251. expect(res.created[0]).toBe(f1)
  252. expect(res.created[1]).toBe(f2)
  253. expect(res.created[2]).toBe(f3)
  254. expect(res.created[3]).toBe(f4)
  255. })
  256. })