util_spec.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. var _ = require('../../src/util')
  2. var config = require('../../src/config')
  3. config.silent = true
  4. describe('Util', function () {
  5. describe('Language Enhancement', function () {
  6. it('bind', function () {
  7. var original = function (a) {
  8. return this.a + a
  9. }
  10. var ctx = { a: 'ctx a ' }
  11. var bound = _.bind(original, ctx)
  12. var res = bound('arg a')
  13. expect(res).toBe('ctx a arg a')
  14. })
  15. it('toArray', function () {
  16. // should make a copy of original array
  17. var arr = [1,2,3]
  18. var res = _.toArray(arr)
  19. expect(Array.isArray(res)).toBe(true)
  20. expect(res.toString()).toEqual('1,2,3')
  21. expect(res).not.toBe(arr)
  22. // should work on arguments
  23. ;(function () {
  24. var res = _.toArray(arguments)
  25. expect(Array.isArray(res)).toBe(true)
  26. expect(res.toString()).toEqual('1,2,3')
  27. })(1,2,3)
  28. })
  29. it('extend', function () {
  30. var from = {a:1,b:2}
  31. var to = {}
  32. _.extend(to, from)
  33. expect(to.a).toBe(from.a)
  34. expect(to.b).toBe(from.b)
  35. })
  36. it('deepMixin', function () {
  37. var from = Object.create({c:123})
  38. var to = {}
  39. Object.defineProperty(from, 'a', {
  40. enumerable: false,
  41. configurable: true,
  42. get: function () {
  43. return 'AAA'
  44. }
  45. })
  46. Object.defineProperty(from, 'b', {
  47. enumerable: true,
  48. configurable: false,
  49. value: 'BBB'
  50. })
  51. _.deepMixin(to, from)
  52. var descA = Object.getOwnPropertyDescriptor(to, 'a')
  53. var descB = Object.getOwnPropertyDescriptor(to, 'b')
  54. expect(descA.enumerable).toBe(false)
  55. expect(descA.configurable).toBe(true)
  56. expect(to.a).toBe('AAA')
  57. expect(descB.enumerable).toBe(true)
  58. expect(descB.configurable).toBe(false)
  59. expect(to.b).toBe('BBB')
  60. expect(to.c).toBeUndefined()
  61. })
  62. it('proxy', function () {
  63. var to = { test2: 'to' }
  64. var from = { test2: 'from' }
  65. var val = '123'
  66. Object.defineProperty(from, 'test', {
  67. get: function () {
  68. return val
  69. },
  70. set: function (v) {
  71. val = v
  72. }
  73. })
  74. _.proxy(to, from, 'test')
  75. expect(to.test).toBe(val)
  76. to.test = '234'
  77. expect(val).toBe('234')
  78. expect(to.test).toBe(val)
  79. // should not overwrite existing property
  80. _.proxy(to, from, 'test2')
  81. expect(to.test2).toBe('to')
  82. })
  83. it('isObject', function () {
  84. expect(_.isObject({})).toBe(true)
  85. expect(_.isObject([])).toBe(false)
  86. expect(_.isObject(null)).toBe(false)
  87. if (_.inBrowser) {
  88. expect(_.isObject(window)).toBe(false)
  89. }
  90. })
  91. it('isArray', function () {
  92. expect(_.isArray([])).toBe(true)
  93. expect(_.isArray({})).toBe(false)
  94. expect(_.isArray(arguments)).toBe(false)
  95. })
  96. it('define', function () {
  97. var obj = {}
  98. _.define(obj, 'test', 123)
  99. expect(obj.test).toBe(123)
  100. var desc = Object.getOwnPropertyDescriptor(obj, 'test')
  101. expect(desc.enumerable).toBe(false)
  102. _.define(obj, 'test2', 123, true)
  103. expect(obj.test2).toBe(123)
  104. var desc = Object.getOwnPropertyDescriptor(obj, 'test2')
  105. expect(desc.enumerable).toBe(true)
  106. })
  107. it('augment', function () {
  108. if ('__proto__' in {}) {
  109. var target = {}
  110. var proto = {}
  111. _.augment(target, proto)
  112. expect(target.__proto__).toBe(proto)
  113. } else {
  114. expect(_.augment).toBe(_.deepMixin)
  115. }
  116. })
  117. })
  118. if (_.inBrowser) {
  119. describe('DOM', function () {
  120. var parent, child, target
  121. function div () {
  122. return document.createElement('div')
  123. }
  124. beforeEach(function () {
  125. parent = div()
  126. child = div()
  127. target = div()
  128. parent.appendChild(child)
  129. })
  130. it('before', function () {
  131. _.before(target, child)
  132. expect(target.parentNode).toBe(parent)
  133. expect(target.nextSibling).toBe(child)
  134. })
  135. it('after', function () {
  136. _.after(target, child)
  137. expect(target.parentNode).toBe(parent)
  138. expect(child.nextSibling).toBe(target)
  139. })
  140. it('remove', function () {
  141. _.remove(child)
  142. expect(child.parentNode).toBeNull()
  143. expect(parent.childNodes.length).toBe(0)
  144. })
  145. it('prepend', function () {
  146. _.prepend(target, parent)
  147. expect(target.parentNode).toBe(parent)
  148. expect(parent.firstChild).toBe(target)
  149. })
  150. it('copyAttributes', function () {
  151. parent.setAttribute('test1', 1)
  152. parent.setAttribute('test2', 2)
  153. _.copyAttributes(parent, target)
  154. expect(target.attributes.length).toBe(2)
  155. expect(target.getAttribute('test1')).toBe('1')
  156. expect(target.getAttribute('test2')).toBe('2')
  157. })
  158. })
  159. }
  160. describe('Option merging', function () {
  161. var merge = _.mergeOptions
  162. it('default strat', function () {
  163. // child undefined
  164. var res = merge({replace:true}, {}).replace
  165. expect(res).toBe(true)
  166. // child overwrite
  167. var res = merge({replace:true}, {replace:false}).replace
  168. expect(res).toBe(false)
  169. })
  170. it('hooks & paramAttributes', function () {
  171. var fn1 = function () {}
  172. var fn2 = function () {}
  173. var res
  174. // parent undefined
  175. res = merge({}, {created: fn1}).created
  176. expect(Array.isArray(res)).toBe(true)
  177. expect(res.length).toBe(1)
  178. expect(res[0]).toBe(fn1)
  179. // child undefined
  180. res = merge({created: [fn1]}, {}).created
  181. expect(Array.isArray(res)).toBe(true)
  182. expect(res.length).toBe(1)
  183. expect(res[0]).toBe(fn1)
  184. // both defined
  185. res = merge({created: [fn1]}, {created: fn2}).created
  186. expect(Array.isArray(res)).toBe(true)
  187. expect(res.length).toBe(2)
  188. expect(res[0]).toBe(fn1)
  189. expect(res[1]).toBe(fn2)
  190. })
  191. it('events', function () {
  192. var fn1 = function () {}
  193. var fn2 = function () {}
  194. var fn3 = function () {}
  195. var parent = {
  196. events: {
  197. 'fn1': [fn1, fn2],
  198. 'fn2': [fn2]
  199. }
  200. }
  201. var child = {
  202. events: {
  203. 'fn1': fn3,
  204. 'fn3': fn3
  205. }
  206. }
  207. var res = merge(parent, child).events
  208. assertRes(res.fn1, [fn1, fn2, fn3])
  209. assertRes(res.fn2, [fn2])
  210. assertRes(res.fn3, [fn3])
  211. function assertRes (res, expected) {
  212. expect(Array.isArray(res)).toBe(true)
  213. expect(res.length).toBe(expected.length)
  214. var i = expected.length
  215. while (i--) {
  216. expect(res[i]).toBe(expected[i])
  217. }
  218. }
  219. })
  220. it('normal object hashes', function () {
  221. var fn1 = function () {}
  222. var fn2 = function () {}
  223. var res
  224. // parent undefined
  225. res = merge({}, {methods: {test: fn1}}).methods
  226. expect(res.test).toBe(fn1)
  227. // child undefined
  228. res = merge({methods: {test: fn1}}, {}).methods
  229. expect(res.test).toBe(fn1)
  230. // both defined
  231. var parent = {methods: {test: fn1}}
  232. res = merge(parent, {methods: {test2: fn2}}).methods
  233. expect(res.test).toBe(fn1)
  234. expect(res.test2).toBe(fn2)
  235. })
  236. it('assets', function () {
  237. var asset1 = {}
  238. var asset2 = {}
  239. var asset3 = {}
  240. // mock vm
  241. var vm = {
  242. $parent: {
  243. $options: {
  244. directives: {
  245. c: asset3
  246. }
  247. }
  248. }
  249. }
  250. var res = merge(
  251. { directives: { a: asset1 }},
  252. { directives: { b: asset2 }},
  253. vm
  254. ).directives
  255. expect(res.a).toBe(asset1)
  256. expect(res.b).toBe(asset2)
  257. expect(res.c).toBe(asset3)
  258. // test prototypal inheritance
  259. var asset4 = vm.$parent.$options.directives.d = {}
  260. expect(res.d).toBe(asset4)
  261. })
  262. it('ignore el, data & parent when inheriting', function () {
  263. var res = merge({}, {el:1, data:2, parent:3})
  264. expect(res.el).toBeUndefined()
  265. expect(res.data).toBeUndefined()
  266. expect(res.parent).toBeUndefined()
  267. res = merge({}, {el:1, data:2, parent:3}, {})
  268. expect(res.el).toBe(1)
  269. expect(res.data).toBe(2)
  270. expect(res.parent).toBe(3)
  271. })
  272. })
  273. })