diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /dom/indexedDB/test/unit/test_indexes.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/indexedDB/test/unit/test_indexes.js')
-rw-r--r-- | dom/indexedDB/test/unit/test_indexes.js | 1649 |
1 files changed, 1649 insertions, 0 deletions
diff --git a/dom/indexedDB/test/unit/test_indexes.js b/dom/indexedDB/test/unit/test_indexes.js new file mode 100644 index 0000000000..7adb57f77a --- /dev/null +++ b/dom/indexedDB/test/unit/test_indexes.js @@ -0,0 +1,1649 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function* testSteps() { + const name = this.window ? window.location.pathname : "Splendid Test"; + + const objectStoreName = "People"; + + const objectStoreData = [ + { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } }, + { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } }, + { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }, + { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } }, + { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } }, + { key: "237-23-7737", value: { name: "Pat", height: 65 } }, + ]; + + const indexData = [ + { name: "name", keyPath: "name", options: { unique: true } }, + { name: "height", keyPath: "height", options: {} }, + { name: "weight", keyPath: "weight", options: { unique: false } }, + ]; + + const objectStoreDataNameSort = [ + { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } }, + { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } }, + { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } }, + { key: "237-23-7737", value: { name: "Pat", height: 65 } }, + { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }, + { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } }, + ]; + + const objectStoreDataWeightSort = [ + { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } }, + { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } }, + { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } }, + { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } }, + { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }, + ]; + + const objectStoreDataHeightSort = [ + { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } }, + { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } }, + { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } }, + { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } }, + { key: "237-23-7737", value: { name: "Pat", height: 65 } }, + { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } }, + ]; + + let request = indexedDB.open(name, 1); + request.onerror = errorHandler; + request.onupgradeneeded = grabEventAndContinueHandler; + request.onsuccess = grabEventAndContinueHandler; + let event = yield undefined; + let db = event.target.result; + + let objectStore = db.createObjectStore(objectStoreName, { keyPath: null }); + + // First, add all our data to the object store. + let addedData = 0; + for (let i in objectStoreData) { + request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key); + request.onerror = errorHandler; + request.onsuccess = function (event) { + if (++addedData == objectStoreData.length) { + testGenerator.next(event); + } + }; + } + event = yield undefined; + // Now create the indexes. + for (let i in indexData) { + objectStore.createIndex( + indexData[i].name, + indexData[i].keyPath, + indexData[i].options + ); + } + is(objectStore.indexNames.length, indexData.length, "Good index count"); + yield undefined; + objectStore = db.transaction(objectStoreName).objectStore(objectStoreName); + + // Check global properties to make sure they are correct. + is(objectStore.indexNames.length, indexData.length, "Good index count"); + for (let i in indexData) { + let found = false; + for (let j = 0; j < objectStore.indexNames.length; j++) { + if (objectStore.indexNames.item(j) == indexData[i].name) { + found = true; + break; + } + } + is(found, true, "objectStore has our index"); + let index = objectStore.index(indexData[i].name); + is(index.name, indexData[i].name, "Correct name"); + is(index.objectStore.name, objectStore.name, "Correct store name"); + is(index.keyPath, indexData[i].keyPath, "Correct keyPath"); + is(index.unique, !!indexData[i].options.unique, "Correct unique value"); + } + + request = objectStore.index("name").getKey("Bob"); + request.onerror = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + is(event.target.result, "237-23-7732", "Correct key returned!"); + + request = objectStore.index("name").get("Bob"); + request.onerror = errorHandler; + request.onsuccess = grabEventAndContinueHandler; + event = yield undefined; + + is(event.target.result.name, "Bob", "Correct name returned!"); + is(event.target.result.height, 60, "Correct height returned!"); + is(event.target.result.weight, 120, "Correct weight returned!"); + + ok(true, "Test group 1"); + + let keyIndex = 0; + + request = objectStore.index("name").openKeyCursor(); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + ok(!("value" in cursor), "No value"); + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + ok(!("value" in cursor), "No value"); + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreData.length, "Saw all the expected keys"); + + ok(true, "Test group 2"); + + keyIndex = 0; + + request = objectStore.index("weight").openKeyCursor(null, "next"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataWeightSort[keyIndex].value.weight, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataWeightSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + + is( + cursor.key, + objectStoreDataWeightSort[keyIndex].value.weight, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataWeightSort[keyIndex].key, + "Correct value" + ); + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreData.length - 1, "Saw all the expected keys"); + + // Check that the name index enforces its unique constraint. + objectStore = db + .transaction(objectStoreName, "readwrite") + .objectStore(objectStoreName); + request = objectStore.add( + { name: "Bob", height: 62, weight: 170 }, + "237-23-7738" + ); + request.addEventListener("error", new ExpectError("ConstraintError", true)); + request.onsuccess = unexpectedSuccessHandler; + event = yield undefined; + + ok(true, "Test group 3"); + + keyIndex = objectStoreDataNameSort.length - 1; + + request = objectStore.index("name").openKeyCursor(null, "prev"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, -1, "Saw all the expected keys"); + + ok(true, "Test group 4"); + + keyIndex = 1; + let keyRange = IDBKeyRange.bound("Bob", "Ron"); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 5, "Saw all the expected keys"); + + ok(true, "Test group 5"); + + keyIndex = 2; + keyRange = IDBKeyRange.bound("Bob", "Ron", true); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 5, "Saw all the expected keys"); + + ok(true, "Test group 6"); + + keyIndex = 1; + keyRange = IDBKeyRange.bound("Bob", "Ron", false, true); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 7"); + + keyIndex = 2; + keyRange = IDBKeyRange.bound("Bob", "Ron", true, true); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 8"); + + keyIndex = 1; + keyRange = IDBKeyRange.lowerBound("Bob"); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreDataNameSort.length, "Saw all the expected keys"); + + ok(true, "Test group 9"); + + keyIndex = 2; + keyRange = IDBKeyRange.lowerBound("Bob", true); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreDataNameSort.length, "Saw all the expected keys"); + + ok(true, "Test group 10"); + + keyIndex = 0; + keyRange = IDBKeyRange.upperBound("Joe"); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 3, "Saw all the expected keys"); + + ok(true, "Test group 11"); + + keyIndex = 0; + keyRange = IDBKeyRange.upperBound("Joe", true); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 2, "Saw all the expected keys"); + + ok(true, "Test group 12"); + + keyIndex = 3; + keyRange = IDBKeyRange.only("Pat"); + + request = objectStore.index("name").openKeyCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 13"); + + keyIndex = 0; + + request = objectStore.index("name").openCursor(); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreDataNameSort.length, "Saw all the expected keys"); + + ok(true, "Test group 14"); + + keyIndex = objectStoreDataNameSort.length - 1; + + request = objectStore.index("name").openCursor(null, "prev"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, -1, "Saw all the expected keys"); + + ok(true, "Test group 15"); + + keyIndex = 1; + keyRange = IDBKeyRange.bound("Bob", "Ron"); + + request = objectStore.index("name").openCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 5, "Saw all the expected keys"); + + ok(true, "Test group 16"); + + keyIndex = 2; + keyRange = IDBKeyRange.bound("Bob", "Ron", true); + + request = objectStore.index("name").openCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 5, "Saw all the expected keys"); + + ok(true, "Test group 17"); + + keyIndex = 1; + keyRange = IDBKeyRange.bound("Bob", "Ron", false, true); + + request = objectStore.index("name").openCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 18"); + + keyIndex = 2; + keyRange = IDBKeyRange.bound("Bob", "Ron", true, true); + + request = objectStore.index("name").openCursor(keyRange); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 19"); + + keyIndex = 4; + keyRange = IDBKeyRange.bound("Bob", "Ron"); + + request = objectStore.index("name").openCursor(keyRange, "prev"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 0, "Saw all the expected keys"); + + ok(true, "Test group 20"); + + // Test "nextunique" + keyIndex = 3; + keyRange = IDBKeyRange.only(65); + + request = objectStore.index("height").openKeyCursor(keyRange, "next"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 5, "Saw all the expected keys"); + + ok(true, "Test group 21"); + + keyIndex = 3; + keyRange = IDBKeyRange.only(65); + + request = objectStore.index("height").openKeyCursor(keyRange, "nextunique"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 21.5"); + + keyIndex = 5; + + request = objectStore.index("height").openKeyCursor(null, "prev"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, -1, "Saw all the expected keys"); + + ok(true, "Test group 22"); + + keyIndex = 5; + + request = objectStore.index("height").openKeyCursor(null, "prevunique"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct value" + ); + + cursor.continue(); + if (keyIndex == 5) { + keyIndex--; + } + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, -1, "Saw all the expected keys"); + + ok(true, "Test group 23"); + + keyIndex = 3; + keyRange = IDBKeyRange.only(65); + + request = objectStore.index("height").openCursor(keyRange, "next"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataHeightSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataHeightSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 5, "Saw all the expected keys"); + + ok(true, "Test group 24"); + + keyIndex = 3; + keyRange = IDBKeyRange.only(65); + + request = objectStore.index("height").openCursor(keyRange, "nextunique"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataHeightSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataHeightSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + keyIndex++; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, 4, "Saw all the expected keys"); + + ok(true, "Test group 24.5"); + + keyIndex = 5; + + request = objectStore.index("height").openCursor(null, "prev"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataHeightSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataHeightSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, -1, "Saw all the expected keys"); + + ok(true, "Test group 25"); + + keyIndex = 5; + + request = objectStore.index("height").openCursor(null, "prevunique"); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataHeightSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataHeightSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataHeightSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataHeightSort[keyIndex].value.weight, + "Correct weight" + ); + } + + cursor.continue(); + if (keyIndex == 5) { + keyIndex--; + } + keyIndex--; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, -1, "Saw all the expected keys"); + + ok(true, "Test group 26"); + + keyIndex = 0; + + request = objectStore.index("name").openKeyCursor(); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + let nextKey = !keyIndex ? "Pat" : undefined; + + cursor.continue(nextKey); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + if (!keyIndex) { + keyIndex = 3; + } else { + keyIndex++; + } + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreData.length, "Saw all the expected keys"); + + ok(true, "Test group 27"); + + keyIndex = 0; + + request = objectStore.index("name").openKeyCursor(); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + let nextKey = !keyIndex ? "Flo" : undefined; + + cursor.continue(nextKey); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct value" + ); + + keyIndex += keyIndex ? 1 : 2; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreData.length, "Saw all the expected keys"); + + ok(true, "Test group 28"); + + keyIndex = 0; + + request = objectStore.index("name").openCursor(); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + let nextKey = !keyIndex ? "Pat" : undefined; + + cursor.continue(nextKey); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + if (!keyIndex) { + keyIndex = 3; + } else { + keyIndex++; + } + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreDataNameSort.length, "Saw all the expected keys"); + + ok(true, "Test group 29"); + + keyIndex = 0; + + request = objectStore.index("name").openCursor(); + request.onerror = errorHandler; + request.onsuccess = function (event) { + let cursor = event.target.result; + if (cursor) { + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + let nextKey = !keyIndex ? "Flo" : undefined; + + cursor.continue(nextKey); + + is( + cursor.key, + objectStoreDataNameSort[keyIndex].value.name, + "Correct key" + ); + is( + cursor.primaryKey, + objectStoreDataNameSort[keyIndex].key, + "Correct primary key" + ); + is( + cursor.value.name, + objectStoreDataNameSort[keyIndex].value.name, + "Correct name" + ); + is( + cursor.value.height, + objectStoreDataNameSort[keyIndex].value.height, + "Correct height" + ); + if ("weight" in cursor.value) { + is( + cursor.value.weight, + objectStoreDataNameSort[keyIndex].value.weight, + "Correct weight" + ); + } + + keyIndex += keyIndex ? 1 : 2; + } else { + testGenerator.next(); + } + }; + yield undefined; + + is(keyIndex, objectStoreDataNameSort.length, "Saw all the expected keys"); + + finishTest(); +} |