/testing/web-platform/tests/IndexedDB/idbindex_getAll.html

https://github.com/rillian/firefox · HTML · 232 lines · 209 code · 23 blank · 0 comment · 0 complexity · 57725b89b2b17cdaf4d17cf32814d768 MD5 · raw file

  1. <!DOCTYPE html>
  2. <title>IndexedDB: Test IDBIndex.getAll.</title>
  3. <script src="/resources/testharness.js"></script>
  4. <script src="/resources/testharnessreport.js"></script>
  5. <script>
  6. setup({explicit_done: true});
  7. var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');
  8. var ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
  9. function doSetup(dbName, dbVersion, onsuccess) {
  10. var delete_request = indexedDB.deleteDatabase(dbName);
  11. delete_request.onerror = function() {
  12. assert_unreached('deleteDatabase should not fail');
  13. };
  14. delete_request.onsuccess = function(e) {
  15. var req = indexedDB.open(dbName, dbVersion);
  16. req.onsuccess = onsuccess;
  17. req.onerror = function() {
  18. assert_unreached('open should not fail');
  19. };
  20. req.onupgradeneeded = function(evt) {
  21. var connection = evt.target.result;
  22. var store = connection.createObjectStore('generated',
  23. {autoIncrement: true, keyPath: 'id'});
  24. var index = store.createIndex('test_idx', 'upper');
  25. alphabet.forEach(function(letter) {
  26. store.put({ch: letter, upper: letter.toUpperCase()});
  27. });
  28. store = connection.createObjectStore('out-of-line', null);
  29. index = store.createIndex('test_idx', 'upper');
  30. alphabet.forEach(function(letter) {
  31. store.put({ch: letter, upper: letter.toUpperCase()}, letter);
  32. });
  33. store = connection.createObjectStore('out-of-line-not-unique', null);
  34. index = store.createIndex('test_idx', 'half');
  35. alphabet.forEach(function(letter) {
  36. if (letter <= 'm')
  37. store.put({ch: letter, half: 'first'}, letter);
  38. else
  39. store.put({ch: letter, half: 'second'}, letter);
  40. });
  41. store = connection.createObjectStore('out-of-line-multi', null);
  42. index = store.createIndex('test_idx', 'attribs', {multiEntry: true});
  43. alphabet.forEach(function(letter) {
  44. attrs = [];
  45. if (['a', 'e', 'i', 'o', 'u'].indexOf(letter) != -1)
  46. attrs.push('vowel');
  47. else
  48. attrs.push('consonant');
  49. if (letter == 'a')
  50. attrs.push('first');
  51. if (letter == 'z')
  52. attrs.push('last');
  53. store.put({ch: letter, attribs: attrs}, letter);
  54. });
  55. store = connection.createObjectStore('empty', null);
  56. index = store.createIndex('test_idx', 'upper');
  57. };
  58. };
  59. }
  60. function createGetAllRequest(t, storeName, connection, range, maxCount) {
  61. var transaction = connection.transaction(storeName, 'readonly');
  62. var store = transaction.objectStore(storeName);
  63. var index = store.index('test_idx');
  64. var req = index.getAll(range, maxCount);
  65. req.onerror = t.unreached_func('getAll request should succeed');
  66. return req;
  67. }
  68. doSetup(location.pathname + '-IDBIndex.getAll', 1, function(evt) {
  69. var connection = evt.target.result;
  70. async_test(function(t) {
  71. var req = createGetAllRequest(t, 'out-of-line', connection, 'C');
  72. req.onsuccess = t.step_func(function(evt) {
  73. var data = evt.target.result;
  74. assert_class_string(data, 'Array', 'result should be an array');
  75. assert_array_equals(data.map(function(e) { return e.ch; }), ['c']);
  76. assert_array_equals(data.map(function(e) { return e.upper; }), ['C']);
  77. t.done();
  78. });
  79. }, 'Single item get');
  80. async_test(function(t) {
  81. var req = createGetAllRequest(t, 'empty', connection);
  82. req.onsuccess = t.step_func(function(evt) {
  83. assert_array_equals(evt.target.result, [],
  84. 'getAll() on empty object store should return an empty array');
  85. t.done();
  86. });
  87. }, 'Empty object store');
  88. async_test(function(t) {
  89. var req = createGetAllRequest(t, 'out-of-line', connection);
  90. req.onsuccess = t.step_func(function(evt) {
  91. var data = evt.target.result;
  92. assert_class_string(data, 'Array', 'result should be an array');
  93. assert_array_equals(data.map(function(e) { return e.ch; }), alphabet);
  94. assert_array_equals(data.map(function(e) { return e.upper; }), ALPHABET);
  95. t.done();
  96. });
  97. }, 'Get all keys');
  98. async_test(function(t) {
  99. var req = createGetAllRequest(t, 'out-of-line', connection, undefined,
  100. 10);
  101. req.onsuccess = t.step_func(function(evt) {
  102. var data = evt.target.result;
  103. assert_class_string(data, 'Array', 'result should be an array');
  104. assert_array_equals(data.map(function(e) { return e.ch; }), 'abcdefghij'.split(''));
  105. assert_array_equals(data.map(function(e) { return e.upper; }), 'ABCDEFGHIJ'.split(''));
  106. t.done();
  107. });
  108. }, 'maxCount=10');
  109. async_test(function(t) {
  110. var req = createGetAllRequest(t, 'out-of-line', connection,
  111. IDBKeyRange.bound('G', 'M'));
  112. req.onsuccess = t.step_func(function(evt) {
  113. var data = evt.target.result;
  114. assert_array_equals(data.map(function(e) { return e.ch; }), 'ghijklm'.split(''));
  115. assert_array_equals(data.map(function(e) { return e.upper; }), 'GHIJKLM'.split(''));
  116. t.done();
  117. });
  118. }, 'Get bound range');
  119. async_test(function(t) {
  120. var req = createGetAllRequest(t, 'out-of-line', connection,
  121. IDBKeyRange.bound('G', 'M'), 3);
  122. req.onsuccess = t.step_func(function(evt) {
  123. var data = evt.target.result;
  124. assert_class_string(data, 'Array', 'result should be an array');
  125. assert_array_equals(data.map(function(e) { return e.ch; }), 'ghi'.split(''));
  126. assert_array_equals(data.map(function(e) { return e.upper; }), 'GHI'.split(''));
  127. t.done();
  128. });
  129. }, 'Get bound range with maxCount');
  130. async_test(function(t) {
  131. var req = createGetAllRequest(t, 'out-of-line', connection,
  132. IDBKeyRange.bound('G', 'K', false, true));
  133. req.onsuccess = t.step_func(function(evt) {
  134. var data = evt.target.result;
  135. assert_class_string(data, 'Array', 'result should be an array');
  136. assert_array_equals(data.map(function(e) { return e.ch; }), 'ghij'.split(''));
  137. assert_array_equals(data.map(function(e) { return e.upper; }), 'GHIJ'.split(''));
  138. t.done();
  139. });
  140. }, 'Get upper excluded');
  141. async_test(function(t) {
  142. var req = createGetAllRequest(t, 'out-of-line', connection,
  143. IDBKeyRange.bound('G', 'K', true, false));
  144. req.onsuccess = t.step_func(function(evt) {
  145. var data = evt.target.result;
  146. assert_class_string(data, 'Array', 'result should be an array');
  147. assert_array_equals(data.map(function(e) { return e.ch; }), 'hijk'.split(''));
  148. assert_array_equals(data.map(function(e) { return e.upper; }), 'HIJK'.split(''));
  149. t.done();
  150. });
  151. }, 'Get lower excluded');
  152. async_test(function(t) {
  153. var req = createGetAllRequest(t, 'generated',
  154. connection, IDBKeyRange.bound(4, 15), 3);
  155. req.onsuccess = t.step_func(function(evt) {
  156. var data = evt.target.result;
  157. assert_true(Array.isArray(data));
  158. assert_equals(data.length, 0);
  159. t.done();
  160. });
  161. }, 'Get bound range (generated) with maxCount');
  162. async_test(function(t) {
  163. var req = createGetAllRequest(t, 'out-of-line',
  164. connection, "Doesn't exist");
  165. req.onsuccess = t.step_func(function(evt) {
  166. assert_array_equals(evt.target.result, [],
  167. 'getAll() using a nonexistent key should return an empty array');
  168. t.done();
  169. req.onerror = t.unreached_func('getAll request should succeed');
  170. });
  171. }, 'Non existent key');
  172. async_test(function(t) {
  173. var req = createGetAllRequest(t, 'out-of-line', connection,
  174. undefined, 0);
  175. req.onsuccess = t.step_func(function(evt) {
  176. var data = evt.target.result;
  177. assert_class_string(data, 'Array', 'result should be an array');
  178. assert_array_equals(data.map(function(e) { return e.ch; }), alphabet);
  179. assert_array_equals(data.map(function(e) { return e.upper; }), ALPHABET);
  180. t.done();
  181. });
  182. }, 'maxCount=0');
  183. async_test(function(t) {
  184. var req = createGetAllRequest(t, 'out-of-line-not-unique', connection,
  185. 'first');
  186. req.onsuccess = t.step_func(function(evt) {
  187. var data = evt.target.result;
  188. assert_class_string(data, 'Array', 'result should be an array');
  189. assert_array_equals(data.map(function(e) { return e.ch; }), 'abcdefghijklm'.split(''));
  190. assert_true(data.every(function(e) { return e.half === 'first'; }));
  191. t.done();
  192. });
  193. }, 'Retrieve multiEntry key');
  194. async_test(function(t) {
  195. var req = createGetAllRequest(t, 'out-of-line-multi', connection,
  196. 'vowel');
  197. req.onsuccess = t.step_func(function(evt) {
  198. var data = evt.target.result;
  199. assert_class_string(data, 'Array', 'result should be an array');
  200. assert_array_equals(data.map(function(e) { return e.ch; }), ['a', 'e', 'i', 'o', 'u']);
  201. assert_array_equals(data[0].attribs, ['vowel', 'first']);
  202. assert_true(data.every(function(e) { return e.attribs[0] === 'vowel'; }));
  203. t.done();
  204. });
  205. }, 'Retrieve one key multiple values');
  206. // Explicit done needed in case async_test body fails synchronously.
  207. done();
  208. });
  209. </script>