summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/IndexedDB/idbobjectstore_getAll.html
blob: f81e4caf3d25310e2976eff1f078b097bd71bd07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<!DOCTYPE html>
<title>IndexedDB: Test IDBObjectStore.getAll.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
setup({explicit_done: true});

var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');

function doSetup(dbName, dbVersion, onsuccess) {
  var delete_request = indexedDB.deleteDatabase(dbName);
  delete_request.onerror = function() {
    assert_unreached('deleteDatabase should not fail');
  };
  delete_request.onsuccess = function(e) {
    var req = indexedDB.open(dbName, dbVersion);
    req.onsuccess = onsuccess;
    req.onerror = function() {
      assert_unreached('open should not fail');
    };
    req.onupgradeneeded = function(evt) {
      var connection = evt.target.result;

      var store = connection.createObjectStore('generated',
            {autoIncrement: true, keyPath: 'id'});
      alphabet.forEach(function(letter) {
        store.put({ch: letter});
      });

      store = connection.createObjectStore('out-of-line', null);
      alphabet.forEach(function(letter) {
        store.put('value-' + letter, letter);
      });

      store = connection.createObjectStore('empty', null);
    };
  };
}

function createGetAllRequest(t, storeName, connection, range, maxCount) {
    var transaction = connection.transaction(storeName, 'readonly');
    var store = transaction.objectStore(storeName);
    var req = store.getAll(range, maxCount);
    req.onerror = t.unreached_func('getAll request should succeed');
    return req;
}

doSetup(location.pathname + '-IDBObjectStore.getAll', 1, function(evt) {
    var connection = evt.target.result;
    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection, 'c');
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['value-c']);
          t.done();
      });
    }, 'Single item get');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'generated', connection, 3);
      req.onsuccess = t.step_func(function(evt) {
          var data = evt.target.result;
          assert_true(Array.isArray(data));
          assert_equals(data.length, 1);
          assert_equals(data[0].id, 3);
          assert_equals(data[0].ch, 'c');
          t.done();
      });
    }, 'Single item get (generated key)');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'empty', connection);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, [],
              'getAll() on empty object store should return an empty array');
          t.done();
      });
    }, 'getAll on empty object store');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              alphabet.map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get all values');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection, undefined,
                                    10);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              'abcdefghij'.split('').map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Test maxCount');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'm'));
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              'ghijklm'.split('').map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get bound range');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'm'), 3);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['g', 'h', 'i']
              .map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get bound range with maxCount');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'k', false, true));
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['g', 'h', 'i', 'j']
              .map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get upper excluded');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    IDBKeyRange.bound('g', 'k', true, false));
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, ['h', 'i', 'j', 'k']
              .map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'Get lower excluded');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'generated', connection,
                                    IDBKeyRange.bound(4, 15), 3);
      req.onsuccess = t.step_func(function(evt) {
          var data = evt.target.result;
          assert_true(Array.isArray(data));
          assert_array_equals(data.map(function(e) { return e.ch; }), ['d', 'e', 'f']);
          assert_array_equals(data.map(function(e) { return e.id; }), [4, 5, 6]);
          t.done();
      });
    }, 'Get bound range (generated) with maxCount');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection,
                                    "Doesn't exist");
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result, [],
              'getAll() using a nonexistent key should return an empty array');
          t.done();
      });
      req.onerror = t.unreached_func('getAll request should succeed');
    }, 'Non existent key');

    async_test(function(t) {
      var req = createGetAllRequest(t, 'out-of-line', connection, undefined, 0);
      req.onsuccess = t.step_func(function(evt) {
          assert_array_equals(evt.target.result,
              alphabet.map(function(c) { return 'value-' + c; }));
          t.done();
      });
    }, 'zero maxCount');

    // Explicit done needed in case async_test body fails synchronously.
    done();
});

</script>