data.html 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
  6. <link rel="stylesheet" href="test.css">
  7. <title>Zepto Data unit tests</title>
  8. <script src="../vendor/evidence.js"></script>
  9. <script src="evidence_runner.js"></script>
  10. <script>
  11. // avoid caching
  12. (function(){
  13. function load(scripts){
  14. scripts.split(' ').forEach(function(script){
  15. document.write('<script src="../src/'+script+'.js?'+(+new Date)+'"></scr'+'ipt>')
  16. })
  17. }
  18. load('zepto data ie')
  19. })()
  20. </script>
  21. </head>
  22. <body>
  23. <h1>Zepto Data unit tests</h1>
  24. <p id="results">
  25. Running… see browser console for results
  26. </p>
  27. <div id="fixtures">
  28. <div id="data_attr"
  29. data-one="uno"
  30. data-two="due"
  31. data-foo-bar="baz"
  32. data-under_score="kuuq"
  33. ></div>
  34. <div id="data_full" data-mode="awesome"></div>
  35. <div id="data_obj" data-mode="awesome"></div>
  36. <ol id="data_list">
  37. <li data-category="arts"></li>
  38. <li data-category="science"></li>
  39. </ol>
  40. <ol id="data_list2">
  41. <li></li>
  42. <li></li>
  43. </ol>
  44. </div>
  45. <script>
  46. Evidence('ZeptoExtendedDataTest', {
  47. testEmptyCollection: function(t){
  48. var el = $('#does_not_exist')
  49. t.assertUndefined(el.data('one'))
  50. },
  51. testAttributeDoesNotExist: function(t){
  52. var el = $('#data_attr')
  53. t.assertUndefined(el.data('missing'))
  54. },
  55. testReadingAttribute: function(t){
  56. var el = $('#data_attr')
  57. t.assertEqual('uno', el.data('one'))
  58. },
  59. testCamelized: function(t){
  60. var el = $('#data_attr')
  61. t.assertEqual('baz', el.data('foo-bar'))
  62. t.assertEqual('baz', el.data('fooBar'))
  63. el.data('fooBar', 'bam')
  64. t.assertEqual('bam', el.data('foo-bar'))
  65. t.assertEqual('bam', el.data('fooBar'))
  66. el.data('a-b', 'c')
  67. t.assertEqual('c', el.data().aB)
  68. t.assertUndefined(el.data()['a-b'])
  69. },
  70. testUnderscore: function(t){
  71. var el = $('#data_attr')
  72. t.assertEqual('kuuq', el.data('under_score'))
  73. t.assertUndefined(el.data('under-score'))
  74. t.assertUndefined(el.data('underScore'))
  75. },
  76. testNotChangingAttribute: function(t){
  77. var el = $('#data_attr')
  78. t.assertEqual('due', el.data('two'))
  79. el.data('two', 'changed')
  80. t.assertEqual('due', el.attr('data-two'))
  81. },
  82. testExtendedData: function(t){
  83. var els = $('#data_attr'),
  84. els2 = $('#data_attr'),
  85. obj = { a: 'A', b: 'B' }
  86. els.data('obj', obj)
  87. t.assertIdentical(obj, els.data('obj'))
  88. t.assertIdentical(obj, els2.data('obj'))
  89. els2.data('els', els)
  90. t.assertIdentical(els, els.data('els'))
  91. },
  92. testMultipleElements: function(t){
  93. var items = $('#data_list li')
  94. items.data('each', 'mark')
  95. var values = items.map(function(){ return $(this).data('each') }).get()
  96. t.assertEqual('mark, mark', values.join(', '))
  97. },
  98. testFunctionArg: function(t){
  99. var els = $('#data_attr')
  100. var data = "hello"
  101. els.data("addio", function () {
  102. data = "goodbye"
  103. })
  104. t.assertEqual('hello', data)
  105. els.data("addio")()
  106. t.assertEqual('goodbye', data)
  107. },
  108. testAllData: function(t){
  109. var el = $('#data_full')
  110. el.data().samurai = 7
  111. el.data('one', 'ichi').data('two', 'ni')
  112. el.data('person', {name: 'Kurosawa'})
  113. var all = el.data()
  114. t.assertEqual(7, all.samurai)
  115. t.assertEqual('ichi', all.one)
  116. t.assertEqual('ni', all.two)
  117. t.assertEqual('Kurosawa', all.person.name)
  118. },
  119. testInitialDataFromAttributes: function(t){
  120. var el = $('<div data-foo=bar data-foo-bar=baz data-empty data-num=42 />'),
  121. store = el.data()
  122. t.assertEqual('bar', store.foo)
  123. t.assertEqual('baz', store.fooBar)
  124. t.assertUndefined(store['foo-bar'])
  125. t.assertIdentical('', store.empty)
  126. t.assertIdentical(42, store.num)
  127. },
  128. testGettingBlanks: function(t){
  129. var el = $('#data_attr'),
  130. store = el.data()
  131. store.nil = null
  132. store.undef = undefined
  133. store.blank = ''
  134. store.bool = false
  135. t.assertNull(el.data('nil'))
  136. t.assertUndefined(el.data('undef'))
  137. t.assertIdentical('', el.data('blank'))
  138. t.assertFalse(el.data('bool'))
  139. },
  140. testRemoveData: function(t){
  141. var el = $('<div data-foo=bar />')
  142. el.data('foo', 'bam').data('bar', 'baz')
  143. el.removeData('foo').removeData('bar')
  144. t.assertEqual('bar', el.data('foo'))
  145. t.assertUndefined(el.data('bar'))
  146. el.data('uno', 'one').data('due', 'two')
  147. el.removeData('uno due')
  148. t.assertUndefined(el.data('uno'))
  149. t.assertUndefined(el.data('due'))
  150. el.data('one', 1).data('twoThree', 23)
  151. el.removeData(['one', 'two-three'])
  152. t.assertUndefined(el.data('one'))
  153. t.assertUndefined(el.data('twoThree'))
  154. },
  155. testRemoveAllData: function(t){
  156. var el = $('<div data-attr-test=val />')
  157. el.data('one', { foo: 'bar' })
  158. el.data('two', 'two').data('three', 3)
  159. el.removeData()
  160. t.assertEqual('val', el.data('attrTest'))
  161. t.assertUndefined(el.data('one'))
  162. t.assertUndefined(el.data('two'))
  163. t.assertUndefined(el.data('three'))
  164. },
  165. testRemoveDataNoop: function(t){
  166. var empty = $(),
  167. vanilla = $('<div />')
  168. t.assertIdentical(empty, empty.removeData('foo'))
  169. t.assertIdentical(vanilla, vanilla.removeData('foo'))
  170. },
  171. testRemoveDataOnElementRemoval: function(t){
  172. var el = $('<div data-attr-test=val />'),
  173. childEl = $('<span />').appendTo(el),
  174. elData = { foo: 'bar' }
  175. el.data('test', elData)
  176. childEl.data('test', 1)
  177. el.remove()
  178. t.assertEqual('val', el.data('attrTest'))
  179. t.assertUndefined(el.data('test'))
  180. t.assertUndefined(childEl.data('test'))
  181. },
  182. testRemoveDataOnElementEmpty: function(t){
  183. var el = $('<div data-attr-test=val />'),
  184. childEl = $('<span />').appendTo(el),
  185. elData = { foo: 'bar' }
  186. el.data('test', elData)
  187. childEl.data('test', 1)
  188. el.empty()
  189. t.assertEqual('val', el.data('attrTest'))
  190. t.assertEqual(elData, el.data('test'))
  191. t.assertUndefined(childEl.data('test'))
  192. },
  193. testRemoveDataOnElementReplacement: function(t){
  194. var el = $('<div data-attr-test=val />'),
  195. childEl = $('<span />').appendTo(el),
  196. elData = { foo: 'bar' }
  197. el.data('test', elData)
  198. childEl.data('test', 1)
  199. el.replaceWith('<div />')
  200. t.assertEqual('val', el.data('attrTest'))
  201. t.assertUndefined(el.data('test'))
  202. t.assertUndefined(childEl.data('test'))
  203. },
  204. testRemoveDataOnElementReplacementHtml: function(t){
  205. var el = $('<div data-attr-test=val />'),
  206. childEl = $('<span />').appendTo(el),
  207. wrapper = $('<div />'),
  208. elData = { foo: 'bar' }
  209. el.wrap(wrapper).data('test', elData)
  210. childEl.data('test', 1)
  211. wrapper.html('<b>New content</b>')
  212. t.assertEqual('val', el.data('attrTest'))
  213. t.assertUndefined(el.data('test'))
  214. t.assertUndefined(childEl.data('test'))
  215. },
  216. testKeepDataOnElementDetach: function(t){
  217. var el = $('<div data-attr-test=val />'),
  218. childEl = $('<span />').appendTo(el),
  219. elData = { foo: 'bar' }
  220. el.data('test', elData)
  221. childEl.data('test', 1)
  222. el.detach()
  223. t.assertEqual('val', el.data('attrTest'))
  224. t.assertEqual(elData, el.data('test'))
  225. t.assertEqual(1, childEl.data('test'))
  226. },
  227. testSettingDataWithObj: function(t){
  228. var el = $('#data_obj')
  229. el.data({
  230. 'foo': 'bar',
  231. 'answer': 42,
  232. 'color': 'blue'
  233. })
  234. var all = el.data()
  235. t.assertEqual(all.answer, 42)
  236. t.assertEqual(all.color, 'blue')
  237. t.assertEqual(all.foo, 'bar')
  238. el.data('foo', 'baz')
  239. t.assertEqual(all.foo, 'baz')
  240. t.assertEqual(all.answer, 42)
  241. },
  242. testSettingDataWithObjOnManyElements: function(t){
  243. var items = $('#data_list2 li')
  244. items.data({
  245. 'foo': 'bar',
  246. 'answer': 42,
  247. 'color': 'purple'
  248. })
  249. var values = items.map(function(){ return $(this).data('foo') }).get()
  250. t.assertEqual('bar, bar', values.join(', '))
  251. var values2 = items.map(function(){ return $(this).data('answer') }).get()
  252. t.assertEqual('42, 42', values2.join(', '))
  253. },
  254. testSettingDataOnObjectWithoutAttributes: function(t) {
  255. var el = $(window)
  256. t.assertUndefined(el.data('foo'))
  257. el.data('foo', 'bar')
  258. t.assertEqual(el.data('foo'), 'bar')
  259. delete window[$.expando]
  260. },
  261. testDollarData: function(t) {
  262. var el = $('<div>')
  263. el.data('hello', 'world')
  264. t.assertEqual($.data(el, 'hello'), 'world')
  265. t.assertEqual($.data(el[0], 'hello'), 'world')
  266. $.data(el[0], 'hello', 'again')
  267. t.assertEqual($.data(el, 'hello'), 'again')
  268. t.assertEqual($.data(el[0], 'hello'), 'again')
  269. },
  270. testDollarHasData: function(t) {
  271. var el = $('<div>')
  272. t.assertFalse($.hasData(el[0]))
  273. el.data('hello', 'world')
  274. t.assertTrue($.hasData(el[0]))
  275. el.removeData()
  276. t.assertFalse($.hasData(el[0]))
  277. var error
  278. try {
  279. $.hasData()
  280. } catch (e) {
  281. error = e
  282. }
  283. t.assert(error)
  284. }
  285. })
  286. </script>
  287. </body>
  288. </html>