1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/unit/test_cursors.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,377 @@ 1.4 +/** 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.7 + */ 1.8 + 1.9 +var testGenerator = testSteps(); 1.10 + 1.11 +function testSteps() 1.12 +{ 1.13 + const name = this.window ? window.location.pathname : "Splendid Test"; 1.14 + const keys = [1, -1, 0, 10, 2000, "q", "z", "two", "b", "a"]; 1.15 + const sortedKeys = [-1, 0, 1, 10, 2000, "a", "b", "q", "two", "z"]; 1.16 + 1.17 + is(keys.length, sortedKeys.length, "Good key setup"); 1.18 + 1.19 + let request = indexedDB.open(name, 1); 1.20 + request.onerror = errorHandler; 1.21 + request.onupgradeneeded = grabEventAndContinueHandler; 1.22 + let event = yield undefined; 1.23 + 1.24 + let db = event.target.result; 1.25 + 1.26 + let objectStore = db.createObjectStore("autoIncrement", 1.27 + { autoIncrement: true }); 1.28 + 1.29 + request = objectStore.openCursor(); 1.30 + request.onerror = errorHandler; 1.31 + request.onsuccess = function (event) { 1.32 + ok(!event.target.result, "No results"); 1.33 + testGenerator.next(); 1.34 + } 1.35 + yield undefined; 1.36 + 1.37 + objectStore = db.createObjectStore("autoIncrementKeyPath", 1.38 + { keyPath: "foo", 1.39 + autoIncrement: true }); 1.40 + 1.41 + request = objectStore.openCursor(); 1.42 + request.onerror = errorHandler; 1.43 + request.onsuccess = function (event) { 1.44 + ok(!event.target.result, "No results"); 1.45 + testGenerator.next(); 1.46 + } 1.47 + yield undefined; 1.48 + 1.49 + objectStore = db.createObjectStore("keyPath", { keyPath: "foo" }); 1.50 + 1.51 + request = objectStore.openCursor(); 1.52 + request.onerror = errorHandler; 1.53 + request.onsuccess = function (event) { 1.54 + ok(!event.target.result, "No results"); 1.55 + testGenerator.next(); 1.56 + } 1.57 + yield undefined; 1.58 + 1.59 + objectStore = db.createObjectStore("foo"); 1.60 + 1.61 + request = objectStore.openCursor(); 1.62 + request.onerror = errorHandler; 1.63 + request.onsuccess = function (event) { 1.64 + ok(!event.target.result, "No results"); 1.65 + testGenerator.next(); 1.66 + } 1.67 + yield undefined; 1.68 + 1.69 + let keyIndex = 0; 1.70 + 1.71 + for (let i in keys) { 1.72 + request = objectStore.add("foo", keys[i]); 1.73 + request.onerror = errorHandler; 1.74 + request.onsuccess = function(event) { 1.75 + if (++keyIndex == keys.length) { 1.76 + testGenerator.next(); 1.77 + } 1.78 + }; 1.79 + } 1.80 + yield undefined; 1.81 + 1.82 + keyIndex = 0; 1.83 + 1.84 + request = objectStore.openCursor(); 1.85 + request.onerror = errorHandler; 1.86 + request.onsuccess = function (event) { 1.87 + let cursor = event.target.result; 1.88 + if (cursor) { 1.89 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.90 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.91 + is(cursor.value, "foo", "Correct value"); 1.92 + 1.93 + cursor.continue(); 1.94 + 1.95 + try { 1.96 + cursor.continue(); 1.97 + ok(false, "continue twice should throw"); 1.98 + } 1.99 + catch (e) { 1.100 + ok(e instanceof DOMException, "got a database exception"); 1.101 + is(e.name, "InvalidStateError", "correct error"); 1.102 + is(e.code, DOMException.INVALID_STATE_ERR, "correct code"); 1.103 + } 1.104 + 1.105 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.106 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.107 + is(cursor.value, "foo", "Correct value"); 1.108 + 1.109 + keyIndex++; 1.110 + } 1.111 + else { 1.112 + testGenerator.next(); 1.113 + } 1.114 + } 1.115 + yield undefined; 1.116 + 1.117 + is(keyIndex, keys.length, "Saw all added items"); 1.118 + 1.119 + keyIndex = 4; 1.120 + 1.121 + let range = IDBKeyRange.bound(2000, "q"); 1.122 + request = objectStore.openCursor(range); 1.123 + request.onerror = errorHandler; 1.124 + request.onsuccess = function (event) { 1.125 + let cursor = event.target.result; 1.126 + if (cursor) { 1.127 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.128 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.129 + is(cursor.value, "foo", "Correct value"); 1.130 + 1.131 + cursor.continue(); 1.132 + 1.133 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.134 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.135 + is(cursor.value, "foo", "Correct value"); 1.136 + 1.137 + keyIndex++; 1.138 + } 1.139 + else { 1.140 + testGenerator.next(); 1.141 + } 1.142 + } 1.143 + yield undefined; 1.144 + 1.145 + is(keyIndex, 8, "Saw all the expected keys"); 1.146 + 1.147 + keyIndex = 0; 1.148 + 1.149 + request = objectStore.openCursor(); 1.150 + request.onerror = errorHandler; 1.151 + request.onsuccess = function (event) { 1.152 + let cursor = event.target.result; 1.153 + if (cursor) { 1.154 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.155 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.156 + is(cursor.value, "foo", "Correct value"); 1.157 + 1.158 + if (keyIndex) { 1.159 + cursor.continue(); 1.160 + } 1.161 + else { 1.162 + cursor.continue("b"); 1.163 + } 1.164 + 1.165 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.166 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.167 + is(cursor.value, "foo", "Correct value"); 1.168 + 1.169 + keyIndex += keyIndex ? 1: 6; 1.170 + } 1.171 + else { 1.172 + testGenerator.next(); 1.173 + } 1.174 + } 1.175 + yield undefined; 1.176 + 1.177 + is(keyIndex, keys.length, "Saw all the expected keys"); 1.178 + 1.179 + keyIndex = 0; 1.180 + 1.181 + request = objectStore.openCursor(); 1.182 + request.onerror = errorHandler; 1.183 + request.onsuccess = function (event) { 1.184 + let cursor = event.target.result; 1.185 + if (cursor) { 1.186 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.187 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.188 + is(cursor.value, "foo", "Correct value"); 1.189 + 1.190 + if (keyIndex) { 1.191 + cursor.continue(); 1.192 + } 1.193 + else { 1.194 + cursor.continue(10); 1.195 + } 1.196 + 1.197 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.198 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.199 + is(cursor.value, "foo", "Correct value"); 1.200 + 1.201 + keyIndex += keyIndex ? 1: 3; 1.202 + } 1.203 + else { 1.204 + testGenerator.next(); 1.205 + } 1.206 + } 1.207 + yield undefined; 1.208 + 1.209 + is(keyIndex, keys.length, "Saw all the expected keys"); 1.210 + 1.211 + keyIndex = 0; 1.212 + 1.213 + request = objectStore.openCursor(); 1.214 + request.onerror = errorHandler; 1.215 + request.onsuccess = function (event) { 1.216 + let cursor = event.target.result; 1.217 + if (cursor) { 1.218 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.219 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.220 + is(cursor.value, "foo", "Correct value"); 1.221 + 1.222 + if (keyIndex) { 1.223 + cursor.continue(); 1.224 + } 1.225 + else { 1.226 + cursor.continue("c"); 1.227 + } 1.228 + 1.229 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.230 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.231 + is(cursor.value, "foo", "Correct value"); 1.232 + 1.233 + keyIndex += keyIndex ? 1 : 7; 1.234 + } 1.235 + else { 1.236 + ok(cursor === null, "The request result should be null."); 1.237 + testGenerator.next(); 1.238 + } 1.239 + } 1.240 + yield undefined; 1.241 + 1.242 + is(keyIndex, keys.length, "Saw all the expected keys"); 1.243 + 1.244 + keyIndex = 0; 1.245 + 1.246 + request = objectStore.openCursor(); 1.247 + request.onerror = errorHandler; 1.248 + let storedCursor = null; 1.249 + request.onsuccess = function (event) { 1.250 + let cursor = event.target.result; 1.251 + if (cursor) { 1.252 + storedCursor = cursor; 1.253 + 1.254 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.255 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.256 + is(cursor.value, "foo", "Correct value"); 1.257 + 1.258 + if (keyIndex == 4) { 1.259 + request = cursor.update("bar"); 1.260 + request.onerror = errorHandler; 1.261 + request.onsuccess = function(event) { 1.262 + keyIndex++; 1.263 + cursor.continue(); 1.264 + }; 1.265 + } 1.266 + else { 1.267 + keyIndex++; 1.268 + cursor.continue(); 1.269 + } 1.270 + } 1.271 + else { 1.272 + ok(cursor === null, "The request result should be null."); 1.273 + ok(storedCursor.value === undefined, "The cursor's value should be undefined."); 1.274 + testGenerator.next(); 1.275 + } 1.276 + } 1.277 + yield undefined; 1.278 + 1.279 + is(keyIndex, keys.length, "Saw all the expected keys"); 1.280 + 1.281 + request = objectStore.get(sortedKeys[4]); 1.282 + request.onerror = errorHandler; 1.283 + request.onsuccess = grabEventAndContinueHandler; 1.284 + event = yield undefined; 1.285 + 1.286 + is(event.target.result, "bar", "Update succeeded"); 1.287 + 1.288 + request = objectStore.put("foo", sortedKeys[4]); 1.289 + request.onerror = errorHandler; 1.290 + request.onsuccess = grabEventAndContinueHandler; 1.291 + event = yield undefined; 1.292 + 1.293 + keyIndex = 0; 1.294 + 1.295 + let gotRemoveEvent = false; 1.296 + let retval = false; 1.297 + 1.298 + request = objectStore.openCursor(null, "next"); 1.299 + request.onerror = errorHandler; 1.300 + storedCursor = null; 1.301 + request.onsuccess = function (event) { 1.302 + let cursor = event.target.result; 1.303 + if (cursor) { 1.304 + storedCursor = cursor; 1.305 + 1.306 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.307 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.308 + is(cursor.value, "foo", "Correct value"); 1.309 + 1.310 + if (keyIndex == 4) { 1.311 + request = cursor.delete(); 1.312 + request.onerror = errorHandler; 1.313 + request.onsuccess = function(event) { 1.314 + ok(event.target.result === undefined, "Should be undefined"); 1.315 + is(keyIndex, 5, "Got result of remove before next continue"); 1.316 + gotRemoveEvent = true; 1.317 + }; 1.318 + } 1.319 + 1.320 + keyIndex++; 1.321 + cursor.continue(); 1.322 + } 1.323 + else { 1.324 + ok(cursor === null, "The request result should be null."); 1.325 + ok(storedCursor.value === undefined, "The cursor's value should be undefined."); 1.326 + testGenerator.next(); 1.327 + } 1.328 + } 1.329 + yield undefined; 1.330 + 1.331 + is(keyIndex, keys.length, "Saw all the expected keys"); 1.332 + is(gotRemoveEvent, true, "Saw the remove event"); 1.333 + 1.334 + request = objectStore.get(sortedKeys[4]); 1.335 + request.onerror = errorHandler; 1.336 + request.onsuccess = grabEventAndContinueHandler; 1.337 + event = yield undefined; 1.338 + 1.339 + is(event.target.result, undefined, "Entry was deleted"); 1.340 + 1.341 + request = objectStore.add("foo", sortedKeys[4]); 1.342 + request.onerror = errorHandler; 1.343 + request.onsuccess = grabEventAndContinueHandler; 1.344 + event = yield undefined; 1.345 + 1.346 + keyIndex = sortedKeys.length - 1; 1.347 + 1.348 + request = objectStore.openCursor(null, "prev"); 1.349 + request.onerror = errorHandler; 1.350 + storedCursor = null; 1.351 + request.onsuccess = function (event) { 1.352 + let cursor = event.target.result; 1.353 + if (cursor) { 1.354 + storedCursor = cursor; 1.355 + 1.356 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.357 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.358 + is(cursor.value, "foo", "Correct value"); 1.359 + 1.360 + cursor.continue(); 1.361 + 1.362 + is(cursor.key, sortedKeys[keyIndex], "Correct key"); 1.363 + is(cursor.primaryKey, sortedKeys[keyIndex], "Correct primary key"); 1.364 + is(cursor.value, "foo", "Correct value"); 1.365 + 1.366 + keyIndex--; 1.367 + } 1.368 + else { 1.369 + ok(cursor === null, "The request result should be null."); 1.370 + ok(storedCursor.value === undefined, "The cursor's value should be undefined."); 1.371 + testGenerator.next(); 1.372 + } 1.373 + } 1.374 + yield undefined; 1.375 + 1.376 + is(keyIndex, -1, "Saw all added items"); 1.377 + 1.378 + finishTest(); 1.379 + yield undefined; 1.380 +}