summaryrefslogtreecommitdiffstats
path: root/dom/indexedDB/test/unit/test_multientry.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/indexedDB/test/unit/test_multientry.js')
-rw-r--r--dom/indexedDB/test/unit/test_multientry.js271
1 files changed, 271 insertions, 0 deletions
diff --git a/dom/indexedDB/test/unit/test_multientry.js b/dom/indexedDB/test/unit/test_multientry.js
new file mode 100644
index 0000000000..7641da7712
--- /dev/null
+++ b/dom/indexedDB/test/unit/test_multientry.js
@@ -0,0 +1,271 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/* exported testGenerator */
+var testGenerator = testSteps();
+
+function* testSteps() {
+ // Test object stores
+
+ let name = this.window ? window.location.pathname : "Splendid Test";
+ let openRequest = indexedDB.open(name, 1);
+ openRequest.onerror = errorHandler;
+ openRequest.onupgradeneeded = grabEventAndContinueHandler;
+ openRequest.onsuccess = unexpectedSuccessHandler;
+ let event = yield undefined;
+ let db = event.target.result;
+ db.onerror = errorHandler;
+ let tests = [
+ { add: { x: 1, id: 1 }, indexes: [{ v: 1, k: 1 }] },
+ {
+ add: { x: [2, 3], id: 2 },
+ indexes: [
+ { v: 1, k: 1 },
+ { v: 2, k: 2 },
+ { v: 3, k: 2 },
+ ],
+ },
+ {
+ put: { x: [2, 4], id: 1 },
+ indexes: [
+ { v: 2, k: 1 },
+ { v: 2, k: 2 },
+ { v: 3, k: 2 },
+ { v: 4, k: 1 },
+ ],
+ },
+ {
+ add: { x: [5, 6, 5, -2, 3], id: 3 },
+ indexes: [
+ { v: -2, k: 3 },
+ { v: 2, k: 1 },
+ { v: 2, k: 2 },
+ { v: 3, k: 2 },
+ { v: 3, k: 3 },
+ { v: 4, k: 1 },
+ { v: 5, k: 3 },
+ { v: 6, k: 3 },
+ ],
+ },
+ { delete: IDBKeyRange.bound(1, 3), indexes: [] },
+ {
+ put: { x: ["food", {}, false, undefined, /x/, [73, false]], id: 2 },
+ indexes: [{ v: "food", k: 2 }],
+ },
+ {
+ add: { x: [{}, /x/, -12, "food", null, [false], undefined], id: 3 },
+ indexes: [
+ { v: -12, k: 3 },
+ { v: "food", k: 2 },
+ { v: "food", k: 3 },
+ ],
+ },
+ {
+ put: { x: [], id: 2 },
+ indexes: [
+ { v: -12, k: 3 },
+ { v: "food", k: 3 },
+ ],
+ },
+ { put: { x: { y: 3 }, id: 3 }, indexes: [] },
+ { add: { x: false, id: 7 }, indexes: [] },
+ { delete: IDBKeyRange.lowerBound(0), indexes: [] },
+ ];
+
+ let store = db.createObjectStore("mystore", { keyPath: "id" });
+ let index = store.createIndex("myindex", "x", { multiEntry: true });
+ is(index.multiEntry, true, "index created with multiEntry");
+
+ let i;
+ for (i = 0; i < tests.length; ++i) {
+ let test = tests[i];
+ let testName = " for " + JSON.stringify(test);
+ let req;
+ if (test.add) {
+ req = store.add(test.add);
+ } else if (test.put) {
+ req = store.put(test.put);
+ } else if (test.delete) {
+ req = store.delete(test.delete);
+ } else {
+ ok(false, "borked test");
+ }
+ req.onsuccess = grabEventAndContinueHandler;
+ yield undefined;
+
+ req = index.openKeyCursor();
+ req.onsuccess = grabEventAndContinueHandler;
+ for (let j = 0; j < test.indexes.length; ++j) {
+ yield undefined;
+ is(
+ req.result.key,
+ test.indexes[j].v,
+ "found expected index key at index " + j + testName
+ );
+ is(
+ req.result.primaryKey,
+ test.indexes[j].k,
+ "found expected index primary key at index " + j + testName
+ );
+ req.result.continue();
+ }
+ yield undefined;
+ ok(req.result == null, "exhausted indexes");
+
+ let tempIndex = store.createIndex("temp index", "x", { multiEntry: true });
+ req = tempIndex.openKeyCursor();
+ req.onsuccess = grabEventAndContinueHandler;
+ for (let j = 0; j < test.indexes.length; ++j) {
+ yield undefined;
+ is(
+ req.result.key,
+ test.indexes[j].v,
+ "found expected temp index key at index " + j + testName
+ );
+ is(
+ req.result.primaryKey,
+ test.indexes[j].k,
+ "found expected temp index primary key at index " + j + testName
+ );
+ req.result.continue();
+ }
+ yield undefined;
+ ok(req.result == null, "exhausted temp index");
+ store.deleteIndex("temp index");
+ }
+
+ // Unique indexes
+ tests = [
+ { add: { x: 1, id: 1 }, indexes: [{ v: 1, k: 1 }] },
+ {
+ add: { x: [2, 3], id: 2 },
+ indexes: [
+ { v: 1, k: 1 },
+ { v: 2, k: 2 },
+ { v: 3, k: 2 },
+ ],
+ },
+ { put: { x: [2, 4], id: 3 }, fail: true },
+ {
+ put: { x: [1, 4], id: 1 },
+ indexes: [
+ { v: 1, k: 1 },
+ { v: 2, k: 2 },
+ { v: 3, k: 2 },
+ { v: 4, k: 1 },
+ ],
+ },
+ {
+ add: { x: [5, 0, 5, 5, 5], id: 3 },
+ indexes: [
+ { v: 0, k: 3 },
+ { v: 1, k: 1 },
+ { v: 2, k: 2 },
+ { v: 3, k: 2 },
+ { v: 4, k: 1 },
+ { v: 5, k: 3 },
+ ],
+ },
+ {
+ delete: IDBKeyRange.bound(1, 2),
+ indexes: [
+ { v: 0, k: 3 },
+ { v: 5, k: 3 },
+ ],
+ },
+ { add: { x: [0, 6], id: 8 }, fail: true },
+ { add: { x: 5, id: 8 }, fail: true },
+ { put: { x: 0, id: 8 }, fail: true },
+ ];
+
+ store.deleteIndex("myindex");
+ index = store.createIndex("myindex", "x", { multiEntry: true, unique: true });
+ is(index.multiEntry, true, "index created with multiEntry");
+
+ let indexes;
+ for (i = 0; i < tests.length; ++i) {
+ let test = tests[i];
+ let testName = " for " + JSON.stringify(test);
+ let req;
+ if (test.add) {
+ req = store.add(test.add);
+ } else if (test.put) {
+ req = store.put(test.put);
+ } else if (test.delete) {
+ req = store.delete(test.delete);
+ } else {
+ ok(false, "borked test");
+ }
+
+ if (!test.fail) {
+ req.onsuccess = grabEventAndContinueHandler;
+ yield undefined;
+ indexes = test.indexes;
+ } else {
+ req.onsuccess = unexpectedSuccessHandler;
+ req.onerror = grabEventAndContinueHandler;
+ ok(true, "waiting for error");
+ let e = yield undefined;
+ ok(true, "got error: " + e.type);
+ e.preventDefault();
+ e.stopPropagation();
+ }
+
+ req = index.openKeyCursor();
+ req.onsuccess = grabEventAndContinueHandler;
+ for (let j = 0; j < indexes.length; ++j) {
+ yield undefined;
+ is(
+ req.result.key,
+ indexes[j].v,
+ "found expected index key at index " + j + testName
+ );
+ is(
+ req.result.primaryKey,
+ indexes[j].k,
+ "found expected index primary key at index " + j + testName
+ );
+ req.result.continue();
+ }
+ yield undefined;
+ ok(req.result == null, "exhausted indexes");
+
+ let tempIndex = store.createIndex("temp index", "x", {
+ multiEntry: true,
+ unique: true,
+ });
+ req = tempIndex.openKeyCursor();
+ req.onsuccess = grabEventAndContinueHandler;
+ for (let j = 0; j < indexes.length; ++j) {
+ yield undefined;
+ is(
+ req.result.key,
+ indexes[j].v,
+ "found expected temp index key at index " + j + testName
+ );
+ is(
+ req.result.primaryKey,
+ indexes[j].k,
+ "found expected temp index primary key at index " + j + testName
+ );
+ req.result.continue();
+ }
+ yield undefined;
+ ok(req.result == null, "exhausted temp index");
+ store.deleteIndex("temp index");
+ }
+
+ openRequest.onsuccess = grabEventAndContinueHandler;
+ yield undefined;
+
+ let trans = db.transaction(["mystore"], "readwrite");
+ store = trans.objectStore("mystore");
+ index = store.index("myindex");
+ is(index.multiEntry, true, "index still is multiEntry");
+ trans.oncomplete = grabEventAndContinueHandler;
+ yield undefined;
+
+ finishTest();
+}