util_spec.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  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('after with sibling', function () {
  141. var sibling = div()
  142. parent.appendChild(sibling)
  143. _.after(target, child)
  144. expect(target.parentNode).toBe(parent)
  145. expect(child.nextSibling).toBe(target)
  146. })
  147. it('remove', function () {
  148. _.remove(child)
  149. expect(child.parentNode).toBeNull()
  150. expect(parent.childNodes.length).toBe(0)
  151. })
  152. it('prepend', function () {
  153. _.prepend(target, parent)
  154. expect(target.parentNode).toBe(parent)
  155. expect(parent.firstChild).toBe(target)
  156. })
  157. it('prepend to empty node', function () {
  158. parent.removeChild(child)
  159. _.prepend(target, parent)
  160. expect(target.parentNode).toBe(parent)
  161. expect(parent.firstChild).toBe(target)
  162. })
  163. it('copyAttributes', function () {
  164. parent.setAttribute('test1', 1)
  165. parent.setAttribute('test2', 2)
  166. _.copyAttributes(parent, target)
  167. expect(target.attributes.length).toBe(2)
  168. expect(target.getAttribute('test1')).toBe('1')
  169. expect(target.getAttribute('test2')).toBe('2')
  170. })
  171. })
  172. }
  173. if (typeof console !== undefined) {
  174. describe('Debug', function () {
  175. beforeEach(function () {
  176. spyOn(console, 'log')
  177. spyOn(console, 'warn')
  178. if (console.trace) {
  179. spyOn(console, 'trace')
  180. }
  181. })
  182. it('log when debug is true', function () {
  183. config.debug = true
  184. _.log('hello', 'world')
  185. expect(console.log).toHaveBeenCalledWith('hello', 'world')
  186. })
  187. it('not log when debug is false', function () {
  188. config.debug = false
  189. _.log('bye', 'world')
  190. expect(console.log.callCount).toBe(0)
  191. })
  192. it('warn when silent is false', function () {
  193. config.silent = false
  194. _.warn('oops', 'ops')
  195. expect(console.warn).toHaveBeenCalledWith('oops', 'ops')
  196. })
  197. it('not warn when silent is ture', function () {
  198. config.silent = true
  199. _.warn('oops', 'ops')
  200. expect(console.warn.callCount).toBe(0)
  201. })
  202. if (console.trace) {
  203. it('trace when not silent and debugging', function () {
  204. config.debug = true
  205. config.silent = false
  206. _.warn('haha')
  207. expect(console.trace).toHaveBeenCalled()
  208. config.debug = false
  209. config.silent = true
  210. })
  211. }
  212. })
  213. }
  214. describe('Option merging', function () {
  215. var merge = _.mergeOptions
  216. it('default strat', function () {
  217. // child undefined
  218. var res = merge({replace:true}, {}).replace
  219. expect(res).toBe(true)
  220. // child overwrite
  221. var res = merge({replace:true}, {replace:false}).replace
  222. expect(res).toBe(false)
  223. })
  224. it('hooks & paramAttributes', function () {
  225. var fn1 = function () {}
  226. var fn2 = function () {}
  227. var res
  228. // parent undefined
  229. res = merge({}, {created: fn1}).created
  230. expect(Array.isArray(res)).toBe(true)
  231. expect(res.length).toBe(1)
  232. expect(res[0]).toBe(fn1)
  233. // child undefined
  234. res = merge({created: [fn1]}, {}).created
  235. expect(Array.isArray(res)).toBe(true)
  236. expect(res.length).toBe(1)
  237. expect(res[0]).toBe(fn1)
  238. // both defined
  239. res = merge({created: [fn1]}, {created: fn2}).created
  240. expect(Array.isArray(res)).toBe(true)
  241. expect(res.length).toBe(2)
  242. expect(res[0]).toBe(fn1)
  243. expect(res[1]).toBe(fn2)
  244. })
  245. it('events', function () {
  246. var fn1 = function () {}
  247. var fn2 = function () {}
  248. var fn3 = function () {}
  249. var parent = {
  250. events: {
  251. 'fn1': [fn1, fn2],
  252. 'fn2': [fn2]
  253. }
  254. }
  255. var child = {
  256. events: {
  257. 'fn1': fn3,
  258. 'fn3': fn3
  259. }
  260. }
  261. var res = merge(parent, child).events
  262. assertRes(res.fn1, [fn1, fn2, fn3])
  263. assertRes(res.fn2, [fn2])
  264. assertRes(res.fn3, [fn3])
  265. function assertRes (res, expected) {
  266. expect(Array.isArray(res)).toBe(true)
  267. expect(res.length).toBe(expected.length)
  268. var i = expected.length
  269. while (i--) {
  270. expect(res[i]).toBe(expected[i])
  271. }
  272. }
  273. })
  274. it('normal object hashes', function () {
  275. var fn1 = function () {}
  276. var fn2 = function () {}
  277. var res
  278. // parent undefined
  279. res = merge({}, {methods: {test: fn1}}).methods
  280. expect(res.test).toBe(fn1)
  281. // child undefined
  282. res = merge({methods: {test: fn1}}, {}).methods
  283. expect(res.test).toBe(fn1)
  284. // both defined
  285. var parent = {methods: {test: fn1}}
  286. res = merge(parent, {methods: {test2: fn2}}).methods
  287. expect(res.test).toBe(fn1)
  288. expect(res.test2).toBe(fn2)
  289. })
  290. it('assets', function () {
  291. var asset1 = {}
  292. var asset2 = {}
  293. var asset3 = {}
  294. // mock vm
  295. var vm = {
  296. $parent: {
  297. $options: {
  298. directives: {
  299. c: asset3
  300. }
  301. }
  302. }
  303. }
  304. var res = merge(
  305. { directives: { a: asset1 }},
  306. { directives: { b: asset2 }},
  307. vm
  308. ).directives
  309. expect(res.a).toBe(asset1)
  310. expect(res.b).toBe(asset2)
  311. expect(res.c).toBe(asset3)
  312. // test prototypal inheritance
  313. var asset4 = vm.$parent.$options.directives.d = {}
  314. expect(res.d).toBe(asset4)
  315. })
  316. it('ignore el, data & parent when inheriting', function () {
  317. var res = merge({}, {el:1, data:2, parent:3})
  318. expect(res.el).toBeUndefined()
  319. expect(res.data).toBeUndefined()
  320. expect(res.parent).toBeUndefined()
  321. res = merge({}, {el:1, data:2, parent:3}, {})
  322. expect(res.el).toBe(1)
  323. expect(res.data).toBe(2)
  324. expect(res.parent).toBe(3)
  325. })
  326. })
  327. })