From f9df95ded5ba1d6a6edadd24615c5e175ea5bac8 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 16 Feb 2021 16:45:15 +0100 Subject: more WPTs --- .../src/idb-wpt-ported/idbcursor-reused.test.ts | 76 ++++ .../src/idb-wpt-ported/idbcursor-reused.ts | 76 ---- .../src/idb-wpt-ported/idbfactory-cmp.test.ts | 63 +++ .../src/idb-wpt-ported/idbfactory-open.test.ts | 76 ++++ .../src/idb-wpt-ported/idbindex-get.test.ts | 233 ++++++++++ .../src/idb-wpt-ported/idbindex_get.test.ts | 233 ---------- .../src/idb-wpt-ported/idbobjectstore-add.test.ts | 486 +++++++++++++++++++++ .../src/idb-wpt-ported/idbobjectstore_add.test.ts | 486 --------------------- .../transaction-requestqueue.test.ts | 104 +++++ .../src/idb-wpt-ported/transaction-requestqueue.ts | 104 ----- .../idb-bridge/src/idb-wpt-ported/wptsupport.ts | 2 +- 11 files changed, 1039 insertions(+), 900 deletions(-) create mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts delete mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.ts create mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbfactory-cmp.test.ts create mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbfactory-open.test.ts create mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbindex-get.test.ts delete mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts create mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts delete mode 100644 packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts create mode 100644 packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.test.ts delete mode 100644 packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.ts diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts new file mode 100644 index 000000000..44a647dc8 --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts @@ -0,0 +1,76 @@ +import test from "ava"; +import { createdb } from "./wptsupport"; + +test("WPT idbcursor-reused.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + var open_rq = createdb(t); + + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var os = db.createObjectStore("test"); + + os.add("data", "k"); + os.add("data2", "k2"); + }; + + open_rq.onsuccess = function (e) { + var cursor: any; + var count = 0; + var rq = db.transaction("test").objectStore("test").openCursor(); + + rq.onsuccess = function (e: any) { + switch (count) { + case 0: + cursor = e.target.result; + + t.deepEqual(cursor.value, "data", "prequisite cursor.value"); + cursor.custom_cursor_value = 1; + e.target.custom_request_value = 2; + + cursor.continue(); + break; + + case 1: + t.deepEqual(cursor.value, "data2", "prequisite cursor.value"); + t.deepEqual(cursor.custom_cursor_value, 1, "custom cursor value"); + t.deepEqual( + e.target.custom_request_value, + 2, + "custom request value", + ); + + cursor.advance(1); + break; + + case 2: + t.false(!!e.target.result, "got cursor"); + t.deepEqual(cursor.custom_cursor_value, 1, "custom cursor value"); + t.deepEqual( + e.target.custom_request_value, + 2, + "custom request value", + ); + break; + } + count++; + }; + + rq.transaction.oncomplete = function () { + t.deepEqual(count, 3, "cursor callback runs"); + t.deepEqual( + rq.custom_request_value, + 2, + "variable placed on old IDBRequest", + ); + t.deepEqual( + cursor.custom_cursor_value, + 1, + "custom cursor value (transaction.complete)", + ); + resolve(); + }; + }; + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.ts b/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.ts deleted file mode 100644 index 44a647dc8..000000000 --- a/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.ts +++ /dev/null @@ -1,76 +0,0 @@ -import test from "ava"; -import { createdb } from "./wptsupport"; - -test("WPT idbcursor-reused.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - var open_rq = createdb(t); - - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var os = db.createObjectStore("test"); - - os.add("data", "k"); - os.add("data2", "k2"); - }; - - open_rq.onsuccess = function (e) { - var cursor: any; - var count = 0; - var rq = db.transaction("test").objectStore("test").openCursor(); - - rq.onsuccess = function (e: any) { - switch (count) { - case 0: - cursor = e.target.result; - - t.deepEqual(cursor.value, "data", "prequisite cursor.value"); - cursor.custom_cursor_value = 1; - e.target.custom_request_value = 2; - - cursor.continue(); - break; - - case 1: - t.deepEqual(cursor.value, "data2", "prequisite cursor.value"); - t.deepEqual(cursor.custom_cursor_value, 1, "custom cursor value"); - t.deepEqual( - e.target.custom_request_value, - 2, - "custom request value", - ); - - cursor.advance(1); - break; - - case 2: - t.false(!!e.target.result, "got cursor"); - t.deepEqual(cursor.custom_cursor_value, 1, "custom cursor value"); - t.deepEqual( - e.target.custom_request_value, - 2, - "custom request value", - ); - break; - } - count++; - }; - - rq.transaction.oncomplete = function () { - t.deepEqual(count, 3, "cursor callback runs"); - t.deepEqual( - rq.custom_request_value, - 2, - "variable placed on old IDBRequest", - ); - t.deepEqual( - cursor.custom_cursor_value, - 1, - "custom cursor value (transaction.complete)", - ); - resolve(); - }; - }; - }); - t.pass(); -}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbfactory-cmp.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbfactory-cmp.test.ts new file mode 100644 index 000000000..c7a25a46b --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbfactory-cmp.test.ts @@ -0,0 +1,63 @@ +import test from "ava"; +import { createdb, idbFactory } from "./wptsupport"; + +test("WPT idbfactory-cmp*.html", async (t) => { + const indexedDB = idbFactory; + var greater = indexedDB.cmp(2, 1); + var equal = indexedDB.cmp(2, 2); + var less = indexedDB.cmp(1, 2); + + t.deepEqual(greater, 1, "greater"); + t.deepEqual(equal, 0, "equal"); + t.deepEqual(less, -1, "less"); + + t.throws( + () => { + // @ts-expect-error + indexedDB.cmp(); + }, + { instanceOf: TypeError }, + ); + + t.throws( + () => { + indexedDB.cmp(null, null); + }, + { name: "DataError" }, + ); + + t.throws( + () => { + indexedDB.cmp(1, null); + }, + { name: "DataError" }, + ); + + t.throws( + () => { + indexedDB.cmp(null, 1); + }, + { name: "DataError" }, + ); + + t.throws( + () => { + indexedDB.cmp(NaN, NaN); + }, + { name: "DataError" }, + ); + + t.throws( + () => { + indexedDB.cmp(1, NaN); + }, + { name: "DataError" }, + ); + + t.throws( + () => { + indexedDB.cmp(NaN, 1); + }, + { name: "DataError" }, + ); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbfactory-open.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbfactory-open.test.ts new file mode 100644 index 000000000..68d58a162 --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbfactory-open.test.ts @@ -0,0 +1,76 @@ +import test from "ava"; +import { createdb, idbFactory } from "./wptsupport"; + +// IDBFactory.open() - request has no source +test("WPT idbfactory-open.htm", async (t) => { + await new Promise((resolve, reject) => { + var open_rq = createdb(t, undefined, 9); + + open_rq.onupgradeneeded = function (e) {}; + open_rq.onsuccess = function (e: any) { + t.deepEqual(e.target.source, null, "source"); + resolve(); + }; + }); + t.pass(); +}); + +// IDBFactory.open() - database 'name' and 'version' are correctly set +test("WPT idbfactory-open2.htm", async (t) => { + await new Promise((resolve, reject) => { + var database_name = __filename + "-database_name"; + var open_rq = createdb(t, database_name, 13); + + open_rq.onupgradeneeded = function (e) {}; + open_rq.onsuccess = function (e: any) { + var db = e.target.result; + t.deepEqual(db.name, database_name, "db.name"); + t.deepEqual(db.version, 13, "db.version"); + resolve; + }; + }); + t.pass(); +}); + +// IDBFactory.open() - no version opens current database +test("WPT idbfactory-open3.htm", async (t) => { + const indexedDB = idbFactory; + await new Promise((resolve, reject) => { + var open_rq = createdb(t, undefined, 13); + var did_upgrade = false; + + open_rq.onupgradeneeded = function () {}; + open_rq.onsuccess = function (e: any) { + var db = e.target.result; + db.close(); + + var open_rq2 = indexedDB.open(db.name); + open_rq2.onsuccess = function (e: any) { + t.deepEqual(e.target.result.version, 13, "db.version"); + e.target.result.close(); + resolve(); + }; + open_rq2.onupgradeneeded = () => t.fail("Unexpected upgradeneeded"); + open_rq2.onerror = () => t.fail("Unexpected error"); + }; + }); + t.pass(); +}); + + +// IDBFactory.open() - new database has default version +test("WPT idbfactory-open4.htm", async (t) => { + const indexedDB = idbFactory; + await new Promise((resolve, reject) => { + var open_rq = createdb(t, __filename + '-database_name'); + + open_rq.onupgradeneeded = function(e: any) { + t.deepEqual(e.target.result.version, 1, "db.version"); + }; + open_rq.onsuccess = function(e: any) { + t.deepEqual(e.target.result.version, 1, "db.version"); + resolve(); + }; + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbindex-get.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbindex-get.test.ts new file mode 100644 index 000000000..7601faada --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbindex-get.test.ts @@ -0,0 +1,233 @@ +import test from "ava"; +import { BridgeIDBKeyRange, BridgeIDBRequest } from ".."; +import { IDBDatabase } from "../idbtypes"; +import { createdb } from "./wptsupport"; + +// IDBIndex.get() - returns the record +test("WPT idbindex_get.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any, index: any; + const record = { key: 1, indexedProperty: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { keyPath: "key" }); + index = objStore.createIndex("index", "indexedProperty"); + + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var rq = db + .transaction("store") + .objectStore("store") + .index("index") + .get(record.indexedProperty); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.key, record.key); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - returns the record where the index contains duplicate values +test("WPT idbindex_get2.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const records = [ + { key: 1, indexedProperty: "data" }, + { key: 2, indexedProperty: "data" }, + { key: 3, indexedProperty: "data" }, + ]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("test", { keyPath: "key" }); + objStore.createIndex("index", "indexedProperty"); + + for (var i = 0; i < records.length; i++) objStore.add(records[i]); + }; + + open_rq.onsuccess = function (e) { + var rq = db + .transaction("test") + .objectStore("test") + .index("index") + .get("data"); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.key, records[0].key); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - attempt to retrieve a record that doesn't exist +test("WPT idbindex_get3.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var rq = db + .createObjectStore("test", { keyPath: "key" }) + .createIndex("index", "indexedProperty") + .get(1); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result, undefined); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - returns the record with the first key in the range +test("WPT idbindex_get4.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var store = db.createObjectStore("store", { keyPath: "key" }); + store.createIndex("index", "indexedProperty"); + + for (var i = 0; i < 10; i++) { + store.add({ key: i, indexedProperty: "data" + i }); + } + }; + + open_rq.onsuccess = function (e) { + var rq = db + .transaction("store") + .objectStore("store") + .index("index") + .get(BridgeIDBKeyRange.bound("data4", "data7")); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.key, 4); + t.deepEqual(e.target.result.indexedProperty, "data4"); + setTimeout(function () { + resolve(); + }, 4); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - throw DataError when using invalid key +test("WPT idbindex_get5.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var index = db + .createObjectStore("test", { keyPath: "key" }) + .createIndex("index", "indexedProperty"); + t.throws( + function () { + index.get(NaN); + }, + { name: "DataError" }, + ); + resolve(); + }; + }); + t.pass(); +}); + +// IDBIndex.get() - throw InvalidStateError when the index is deleted +test("WPT idbindex_get6.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var store = db.createObjectStore("store", { keyPath: "key" }); + var index = store.createIndex("index", "indexedProperty"); + + store.add({ key: 1, indexedProperty: "data" }); + store.deleteIndex("index"); + + t.throws( + function () { + index.get("data"); + }, + { name: "InvalidStateError" }, + ); + resolve(); + }; + }); + t.pass(); +}); + +// IDBIndex.get() - throw TransactionInactiveError on aborted transaction +test("WPT idbindex_get7.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + const db = e.target.result as IDBDatabase; + var store = db.createObjectStore("store", { keyPath: "key" }); + var index = store.createIndex("index", "indexedProperty"); + store.add({ key: 1, indexedProperty: "data" }); + }; + open_rq.onsuccess = function (e: any) { + const db = e.target.result as IDBDatabase; + var tx = db.transaction("store"); + var index = tx.objectStore("store").index("index"); + tx.abort(); + + t.throws( + function () { + index.get("data"); + }, + { name: "TransactionInactiveError" }, + ); + resolve(); + }; + }); + t.pass(); +}); + +// IDBIndex.get() - throw InvalidStateError on index deleted by aborted upgrade +test("WPT idbindex_get8.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var store = db.createObjectStore("store", { keyPath: "key" }); + var index = store.createIndex("index", "indexedProperty"); + store.add({ key: 1, indexedProperty: "data" }); + + e.target.transaction.abort(); + + t.throws( + function () { + index.get("data"); + }, + { name: "InvalidStateError" }, + ); + resolve(); + }; + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts deleted file mode 100644 index 7601faada..000000000 --- a/packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts +++ /dev/null @@ -1,233 +0,0 @@ -import test from "ava"; -import { BridgeIDBKeyRange, BridgeIDBRequest } from ".."; -import { IDBDatabase } from "../idbtypes"; -import { createdb } from "./wptsupport"; - -// IDBIndex.get() - returns the record -test("WPT idbindex_get.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any, index: any; - const record = { key: 1, indexedProperty: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { keyPath: "key" }); - index = objStore.createIndex("index", "indexedProperty"); - - objStore.add(record); - }; - - open_rq.onsuccess = function (e) { - var rq = db - .transaction("store") - .objectStore("store") - .index("index") - .get(record.indexedProperty); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result.key, record.key); - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBIndex.get() - returns the record where the index contains duplicate values -test("WPT idbindex_get2.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const records = [ - { key: 1, indexedProperty: "data" }, - { key: 2, indexedProperty: "data" }, - { key: 3, indexedProperty: "data" }, - ]; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("test", { keyPath: "key" }); - objStore.createIndex("index", "indexedProperty"); - - for (var i = 0; i < records.length; i++) objStore.add(records[i]); - }; - - open_rq.onsuccess = function (e) { - var rq = db - .transaction("test") - .objectStore("test") - .index("index") - .get("data"); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result.key, records[0].key); - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBIndex.get() - attempt to retrieve a record that doesn't exist -test("WPT idbindex_get3.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var rq = db - .createObjectStore("test", { keyPath: "key" }) - .createIndex("index", "indexedProperty") - .get(1); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result, undefined); - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBIndex.get() - returns the record with the first key in the range -test("WPT idbindex_get4.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - - var open_rq = createdb(t); - - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var store = db.createObjectStore("store", { keyPath: "key" }); - store.createIndex("index", "indexedProperty"); - - for (var i = 0; i < 10; i++) { - store.add({ key: i, indexedProperty: "data" + i }); - } - }; - - open_rq.onsuccess = function (e) { - var rq = db - .transaction("store") - .objectStore("store") - .index("index") - .get(BridgeIDBKeyRange.bound("data4", "data7")); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result.key, 4); - t.deepEqual(e.target.result.indexedProperty, "data4"); - setTimeout(function () { - resolve(); - }, 4); - }; - }; - }); - t.pass(); -}); - -// IDBIndex.get() - throw DataError when using invalid key -test("WPT idbindex_get5.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - - var index = db - .createObjectStore("test", { keyPath: "key" }) - .createIndex("index", "indexedProperty"); - t.throws( - function () { - index.get(NaN); - }, - { name: "DataError" }, - ); - resolve(); - }; - }); - t.pass(); -}); - -// IDBIndex.get() - throw InvalidStateError when the index is deleted -test("WPT idbindex_get6.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var store = db.createObjectStore("store", { keyPath: "key" }); - var index = store.createIndex("index", "indexedProperty"); - - store.add({ key: 1, indexedProperty: "data" }); - store.deleteIndex("index"); - - t.throws( - function () { - index.get("data"); - }, - { name: "InvalidStateError" }, - ); - resolve(); - }; - }); - t.pass(); -}); - -// IDBIndex.get() - throw TransactionInactiveError on aborted transaction -test("WPT idbindex_get7.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - const db = e.target.result as IDBDatabase; - var store = db.createObjectStore("store", { keyPath: "key" }); - var index = store.createIndex("index", "indexedProperty"); - store.add({ key: 1, indexedProperty: "data" }); - }; - open_rq.onsuccess = function (e: any) { - const db = e.target.result as IDBDatabase; - var tx = db.transaction("store"); - var index = tx.objectStore("store").index("index"); - tx.abort(); - - t.throws( - function () { - index.get("data"); - }, - { name: "TransactionInactiveError" }, - ); - resolve(); - }; - }); - t.pass(); -}); - -// IDBIndex.get() - throw InvalidStateError on index deleted by aborted upgrade -test("WPT idbindex_get8.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var store = db.createObjectStore("store", { keyPath: "key" }); - var index = store.createIndex("index", "indexedProperty"); - store.add({ key: 1, indexedProperty: "data" }); - - e.target.transaction.abort(); - - t.throws( - function () { - index.get("data"); - }, - { name: "InvalidStateError" }, - ); - resolve(); - }; - }); - t.pass(); -}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts new file mode 100644 index 000000000..b8fdb5ac3 --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts @@ -0,0 +1,486 @@ +import test from "ava"; +import { BridgeIDBRequest } from ".."; +import { IDBDatabase } from "../idbtypes"; +import { createdb } from "./wptsupport"; + +// IDBObjectStore.add() - add with an inline key +test("WPT idbobjectstore_add.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: IDBDatabase | undefined; + const record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db!.createObjectStore("store", { keyPath: "key" }); + + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var rq = db!.transaction("store").objectStore("store").get(record.key); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.property, record.property); + t.deepEqual(e.target.result.key, record.key); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - add with an out-of-line key +test("WPT idbobjectstore_add2.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const key = 1; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store"); + + objStore.add(record, key); + }; + + open_rq.onsuccess = function (e) { + var rq = db.transaction("store").objectStore("store").get(key); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.property, record.property); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - record with same key already exists +test("WPT idbobjectstore_add3.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { keyPath: "key" }); + objStore.add(record); + + var rq = objStore.add(record); + rq.onsuccess = () => t.fail("success on adding duplicate record"); + + rq.onerror = function (e: any) { + t.deepEqual(e.target.error.name, "ConstraintError"); + t.deepEqual(rq.error.name, "ConstraintError"); + t.deepEqual(e.type, "error"); + e.preventDefault(); + e.stopPropagation(); + }; + }; + + // Defer done, giving rq.onsuccess a chance to run + open_rq.onsuccess = function (e) { + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - add where an index has unique:true specified +test("WPT idbobjectstore_add4.htm", async (t) => { + await new Promise((resolve, reject) => { + let db: any; + let record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { autoIncrement: true }); + objStore.createIndex("i1", "property", { unique: true }); + objStore.add(record); + + var rq = objStore.add(record); + rq.onsuccess = () => t.fail("success on adding duplicate indexed record"); + + rq.onerror = function (e: any) { + t.deepEqual(rq.error.name, "ConstraintError"); + t.deepEqual(e.target.error.name, "ConstraintError"); + t.deepEqual(e.type, "error"); + e.preventDefault(); + e.stopPropagation(); + }; + }; + + // Defer done, giving a spurious rq.onsuccess a chance to run + open_rq.onsuccess = function (e) { + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - object store's key path is an object attribute +test("WPT idbobjectstore_add5.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { test: { obj: { key: 1 } }, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { keyPath: "test.obj.key" }); + objStore.add(record); + }; + + open_rq.onsuccess = function (e: any) { + var rq = db + .transaction("store") + .objectStore("store") + .get(record.test.obj.key); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.property, record.property); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - autoIncrement and inline keys +test("WPT idbobjectstore_add6.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { property: "data" }; + const expected_keys = [1, 2, 3, 4]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { + keyPath: "key", + autoIncrement: true, + }); + + objStore.add(record); + objStore.add(record); + objStore.add(record); + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var actual_keys: any[] = [], + rq = db.transaction("store").objectStore("store").openCursor(); + + rq.onsuccess = function (e: any) { + var cursor = e.target.result; + + if (cursor) { + actual_keys.push(cursor.value.key); + cursor.continue(); + } else { + t.deepEqual(actual_keys, expected_keys); + resolve(); + } + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - autoIncrement and out-of-line keys +test("WPT idbobjectstore_add7.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { property: "data" }; + const expected_keys = [1, 2, 3, 4]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { autoIncrement: true }); + + objStore.add(record); + objStore.add(record); + objStore.add(record); + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var actual_keys: any[] = [], + rq = db.transaction("store").objectStore("store").openCursor(); + + rq.onsuccess = function (e: any) { + var cursor = e.target.result; + + if (cursor) { + actual_keys.push(cursor.key); + cursor.continue(); + } else { + t.deepEqual(actual_keys, expected_keys); + resolve(); + } + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - object store has autoIncrement:true and the key path +// is an object attribute +test("WPT idbobjectstore_add8.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { property: "data" }; + const expected_keys = [1, 2, 3, 4]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { + keyPath: "test.obj.key", + autoIncrement: true, + }); + + objStore.add(record); + objStore.add(record); + objStore.add(record); + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var actual_keys: any[] = [], + rq = db.transaction("store").objectStore("store").openCursor(); + + rq.onsuccess = function (e: any) { + var cursor = e.target.result; + + if (cursor) { + actual_keys.push(cursor.value.test.obj.key); + cursor.continue(); + } else { + t.deepEqual(actual_keys, expected_keys); + resolve(); + } + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record that does not meet the +// constraints of an object store's inline key requirements +test("WPT idbobjectstore_add9.htm", async (t) => { + await new Promise((resolve, reject) => { + const record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + var rq, + db = e.target.result, + objStore = db.createObjectStore("store", { keyPath: "key" }); + + t.throws( + function () { + rq = objStore.add(record, 1); + }, + { name: "DataError" }, + ); + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the +// object store uses out-of-line keys. +test("WPT idbobjectstore_add10.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store"); + + t.throws( + function () { + rq = objStore.add(record); + }, + { name: "DataError" }, + ); + + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record where the record's key +// does not meet the constraints of a valid key +test("WPT idbobjectstore_add11.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { key: { value: 1 }, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store", { keyPath: "key" }); + + t.throws( + function () { + rq = objStore.add(record); + }, + { name: "DataError" }, + ); + + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record where the +// record's in-line key is not defined +test("WPT idbobjectstore_add12.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store", { keyPath: "key" }); + t.throws( + function () { + rq = objStore.add(record); + }, + { name: "DataError" }, + ); + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record where the out of line +// key provided does not meet the constraints of a valid key +test("WPT idbobjectstore_add13.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store"); + + t.throws( + function () { + rq = objStore.add(record, { value: 1 }); + }, + { name: "DataError" }, + ); + + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Add a record where a value +// being indexed does not meet the constraints of a valid key +test("WPT idbobjectstore_add14.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + const record = { key: 1, indexedProperty: { property: "data" } }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store", { keyPath: "key" }); + + objStore.createIndex("index", "indexedProperty"); + + rq = objStore.add(record); + + t.assert(rq instanceof BridgeIDBRequest); + rq.onsuccess = function () { + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - If the transaction this IDBObjectStore belongs +// to has its mode set to readonly, throw ReadOnlyError +test("WPT idbobjectstore_add15.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (event: any) { + db = event.target.result; + db.createObjectStore("store", { keyPath: "pKey" }); + }; + + open_rq.onsuccess = function (event) { + var txn = db.transaction("store"); + var ostore = txn.objectStore("store"); + t.throws( + function () { + ostore.add({ pKey: "primaryKey_0" }); + }, + { name: "ReadOnlyError" }, + ); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - If the object store has been +// deleted, the implementation must throw a DOMException of type InvalidStateError +test("WPT idbobjectstore_add16.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + let ostore: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (event: any) { + db = event.target.result; + ostore = db.createObjectStore("store", { keyPath: "pKey" }); + db.deleteObjectStore("store"); + + t.throws( + function () { + ostore.add({ pKey: "primaryKey_0" }); + }, + { name: "InvalidStateError" }, + ); + resolve(); + }; + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts deleted file mode 100644 index b8fdb5ac3..000000000 --- a/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts +++ /dev/null @@ -1,486 +0,0 @@ -import test from "ava"; -import { BridgeIDBRequest } from ".."; -import { IDBDatabase } from "../idbtypes"; -import { createdb } from "./wptsupport"; - -// IDBObjectStore.add() - add with an inline key -test("WPT idbobjectstore_add.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: IDBDatabase | undefined; - const record = { key: 1, property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db!.createObjectStore("store", { keyPath: "key" }); - - objStore.add(record); - }; - - open_rq.onsuccess = function (e) { - var rq = db!.transaction("store").objectStore("store").get(record.key); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result.property, record.property); - t.deepEqual(e.target.result.key, record.key); - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - add with an out-of-line key -test("WPT idbobjectstore_add2.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const key = 1; - const record = { property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store"); - - objStore.add(record, key); - }; - - open_rq.onsuccess = function (e) { - var rq = db.transaction("store").objectStore("store").get(key); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result.property, record.property); - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - record with same key already exists -test("WPT idbobjectstore_add3.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { key: 1, property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { keyPath: "key" }); - objStore.add(record); - - var rq = objStore.add(record); - rq.onsuccess = () => t.fail("success on adding duplicate record"); - - rq.onerror = function (e: any) { - t.deepEqual(e.target.error.name, "ConstraintError"); - t.deepEqual(rq.error.name, "ConstraintError"); - t.deepEqual(e.type, "error"); - e.preventDefault(); - e.stopPropagation(); - }; - }; - - // Defer done, giving rq.onsuccess a chance to run - open_rq.onsuccess = function (e) { - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - add where an index has unique:true specified -test("WPT idbobjectstore_add4.htm", async (t) => { - await new Promise((resolve, reject) => { - let db: any; - let record = { key: 1, property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { autoIncrement: true }); - objStore.createIndex("i1", "property", { unique: true }); - objStore.add(record); - - var rq = objStore.add(record); - rq.onsuccess = () => t.fail("success on adding duplicate indexed record"); - - rq.onerror = function (e: any) { - t.deepEqual(rq.error.name, "ConstraintError"); - t.deepEqual(e.target.error.name, "ConstraintError"); - t.deepEqual(e.type, "error"); - e.preventDefault(); - e.stopPropagation(); - }; - }; - - // Defer done, giving a spurious rq.onsuccess a chance to run - open_rq.onsuccess = function (e) { - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - object store's key path is an object attribute -test("WPT idbobjectstore_add5.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { test: { obj: { key: 1 } }, property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { keyPath: "test.obj.key" }); - objStore.add(record); - }; - - open_rq.onsuccess = function (e: any) { - var rq = db - .transaction("store") - .objectStore("store") - .get(record.test.obj.key); - - rq.onsuccess = function (e: any) { - t.deepEqual(e.target.result.property, record.property); - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - autoIncrement and inline keys -test("WPT idbobjectstore_add6.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { property: "data" }; - const expected_keys = [1, 2, 3, 4]; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { - keyPath: "key", - autoIncrement: true, - }); - - objStore.add(record); - objStore.add(record); - objStore.add(record); - objStore.add(record); - }; - - open_rq.onsuccess = function (e) { - var actual_keys: any[] = [], - rq = db.transaction("store").objectStore("store").openCursor(); - - rq.onsuccess = function (e: any) { - var cursor = e.target.result; - - if (cursor) { - actual_keys.push(cursor.value.key); - cursor.continue(); - } else { - t.deepEqual(actual_keys, expected_keys); - resolve(); - } - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - autoIncrement and out-of-line keys -test("WPT idbobjectstore_add7.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { property: "data" }; - const expected_keys = [1, 2, 3, 4]; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { autoIncrement: true }); - - objStore.add(record); - objStore.add(record); - objStore.add(record); - objStore.add(record); - }; - - open_rq.onsuccess = function (e) { - var actual_keys: any[] = [], - rq = db.transaction("store").objectStore("store").openCursor(); - - rq.onsuccess = function (e: any) { - var cursor = e.target.result; - - if (cursor) { - actual_keys.push(cursor.key); - cursor.continue(); - } else { - t.deepEqual(actual_keys, expected_keys); - resolve(); - } - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - object store has autoIncrement:true and the key path -// is an object attribute -test("WPT idbobjectstore_add8.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { property: "data" }; - const expected_keys = [1, 2, 3, 4]; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - var objStore = db.createObjectStore("store", { - keyPath: "test.obj.key", - autoIncrement: true, - }); - - objStore.add(record); - objStore.add(record); - objStore.add(record); - objStore.add(record); - }; - - open_rq.onsuccess = function (e) { - var actual_keys: any[] = [], - rq = db.transaction("store").objectStore("store").openCursor(); - - rq.onsuccess = function (e: any) { - var cursor = e.target.result; - - if (cursor) { - actual_keys.push(cursor.value.test.obj.key); - cursor.continue(); - } else { - t.deepEqual(actual_keys, expected_keys); - resolve(); - } - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - Attempt to add a record that does not meet the -// constraints of an object store's inline key requirements -test("WPT idbobjectstore_add9.htm", async (t) => { - await new Promise((resolve, reject) => { - const record = { key: 1, property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - var rq, - db = e.target.result, - objStore = db.createObjectStore("store", { keyPath: "key" }); - - t.throws( - function () { - rq = objStore.add(record, 1); - }, - { name: "DataError" }, - ); - t.deepEqual(rq, undefined); - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the -// object store uses out-of-line keys. -test("WPT idbobjectstore_add10.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - - var rq, - objStore = db.createObjectStore("store"); - - t.throws( - function () { - rq = objStore.add(record); - }, - { name: "DataError" }, - ); - - t.deepEqual(rq, undefined); - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - Attempt to add a record where the record's key -// does not meet the constraints of a valid key -test("WPT idbobjectstore_add11.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { key: { value: 1 }, property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - - var rq, - objStore = db.createObjectStore("store", { keyPath: "key" }); - - t.throws( - function () { - rq = objStore.add(record); - }, - { name: "DataError" }, - ); - - t.deepEqual(rq, undefined); - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - Attempt to add a record where the -// record's in-line key is not defined -test("WPT idbobjectstore_add12.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - - var rq, - objStore = db.createObjectStore("store", { keyPath: "key" }); - t.throws( - function () { - rq = objStore.add(record); - }, - { name: "DataError" }, - ); - t.deepEqual(rq, undefined); - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - Attempt to add a record where the out of line -// key provided does not meet the constraints of a valid key -test("WPT idbobjectstore_add13.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { property: "data" }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - - var rq, - objStore = db.createObjectStore("store"); - - t.throws( - function () { - rq = objStore.add(record, { value: 1 }); - }, - { name: "DataError" }, - ); - - t.deepEqual(rq, undefined); - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - Add a record where a value -// being indexed does not meet the constraints of a valid key -test("WPT idbobjectstore_add14.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - const record = { key: 1, indexedProperty: { property: "data" } }; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (e: any) { - db = e.target.result; - - var rq, - objStore = db.createObjectStore("store", { keyPath: "key" }); - - objStore.createIndex("index", "indexedProperty"); - - rq = objStore.add(record); - - t.assert(rq instanceof BridgeIDBRequest); - rq.onsuccess = function () { - resolve(); - }; - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - If the transaction this IDBObjectStore belongs -// to has its mode set to readonly, throw ReadOnlyError -test("WPT idbobjectstore_add15.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (event: any) { - db = event.target.result; - db.createObjectStore("store", { keyPath: "pKey" }); - }; - - open_rq.onsuccess = function (event) { - var txn = db.transaction("store"); - var ostore = txn.objectStore("store"); - t.throws( - function () { - ostore.add({ pKey: "primaryKey_0" }); - }, - { name: "ReadOnlyError" }, - ); - resolve(); - }; - }); - t.pass(); -}); - -// IDBObjectStore.add() - If the object store has been -// deleted, the implementation must throw a DOMException of type InvalidStateError -test("WPT idbobjectstore_add16.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - let ostore: any; - - var open_rq = createdb(t); - open_rq.onupgradeneeded = function (event: any) { - db = event.target.result; - ostore = db.createObjectStore("store", { keyPath: "pKey" }); - db.deleteObjectStore("store"); - - t.throws( - function () { - ostore.add({ pKey: "primaryKey_0" }); - }, - { name: "InvalidStateError" }, - ); - resolve(); - }; - }); - t.pass(); -}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.test.ts b/packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.test.ts new file mode 100644 index 000000000..edf98eb54 --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.test.ts @@ -0,0 +1,104 @@ +import test from "ava"; +import { createdb } from "./wptsupport"; + +// Transactions have a request queue +test("transaction-requestqueue.htm", async (t) => { + await new Promise((resolve, reject) => { + var db: any; + let keys = { txn: [], txn2: [] }; + let open_rq = createdb(t); + + open_rq.onupgradeneeded = function (e: any) { + var i, os; + db = e.target.result; + + for (i = 1; i < 6; i++) { + os = db.createObjectStore("os" + i, { + autoIncrement: true, + keyPath: "k", + }); + os.add({ os: "os" + i }); + os.put({ os: "os" + i, k: i }); + os.add({ os: "os" + i }); + } + }; + + open_rq.onsuccess = function (e) { + var txn = db.transaction(["os2", "os1", "os3", "os5"]); + txn.objectStore("os1").openCursor().onsuccess = reg("txn"); + txn.objectStore("os3").openCursor().onsuccess = reg("txn"); + txn.objectStore("os1").get(2).onsuccess = reg("txn"); + txn.objectStore("os2").get(3).onsuccess = reg("txn"); + + var txn2 = db.transaction(["os4", "os3", "os1", "os5"]); + var os4 = txn2.objectStore("os4"); + + for (var i = 0; i < 3; i++) { + os4.openCursor().onsuccess = reg("txn2"); + os4.get(5).onsuccess = reg("txn2"); + os4.get(4).onsuccess = reg("txn2"); + txn.objectStore("os2").get(1).onsuccess = reg("txn"); + txn2.objectStore("os3").get(1).onsuccess = reg("txn2"); + } + + txn2.objectStore("os1").get(2).onsuccess = reg("txn2"); + txn.objectStore("os1").openCursor(null, "prev").onsuccess = reg("txn"); + os4.openCursor(null, "prev").onsuccess = reg("txn2"); + + txn.oncomplete = finish; + txn2.oncomplete = finish; + }; + + function reg(n: string) { + return function (e: any) { + var v = e.target.result; + if (v.value) v = v.value; + (keys as any)[n].push(v.os + ": " + v.k); + }; + } + + var finish_to_go = 2; + function finish() { + if (--finish_to_go) return; + + t.deepEqual( + keys["txn"], + [ + "os1: 1", + "os3: 1", + "os1: 2", + "os2: 3", + "os2: 1", + "os2: 1", + "os2: 1", + "os1: 2", + ], + "transaction keys", + ); + + t.deepEqual( + keys["txn2"], + [ + "os4: 1", + "os4: 5", + "os4: 4", + "os3: 1", + "os4: 1", + "os4: 5", + "os4: 4", + "os3: 1", + "os4: 1", + "os4: 5", + "os4: 4", + "os3: 1", + "os1: 2", + "os4: 5", + ], + "transaction 2 keys", + ); + + resolve(); + } + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.ts b/packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.ts deleted file mode 100644 index edf98eb54..000000000 --- a/packages/idb-bridge/src/idb-wpt-ported/transaction-requestqueue.ts +++ /dev/null @@ -1,104 +0,0 @@ -import test from "ava"; -import { createdb } from "./wptsupport"; - -// Transactions have a request queue -test("transaction-requestqueue.htm", async (t) => { - await new Promise((resolve, reject) => { - var db: any; - let keys = { txn: [], txn2: [] }; - let open_rq = createdb(t); - - open_rq.onupgradeneeded = function (e: any) { - var i, os; - db = e.target.result; - - for (i = 1; i < 6; i++) { - os = db.createObjectStore("os" + i, { - autoIncrement: true, - keyPath: "k", - }); - os.add({ os: "os" + i }); - os.put({ os: "os" + i, k: i }); - os.add({ os: "os" + i }); - } - }; - - open_rq.onsuccess = function (e) { - var txn = db.transaction(["os2", "os1", "os3", "os5"]); - txn.objectStore("os1").openCursor().onsuccess = reg("txn"); - txn.objectStore("os3").openCursor().onsuccess = reg("txn"); - txn.objectStore("os1").get(2).onsuccess = reg("txn"); - txn.objectStore("os2").get(3).onsuccess = reg("txn"); - - var txn2 = db.transaction(["os4", "os3", "os1", "os5"]); - var os4 = txn2.objectStore("os4"); - - for (var i = 0; i < 3; i++) { - os4.openCursor().onsuccess = reg("txn2"); - os4.get(5).onsuccess = reg("txn2"); - os4.get(4).onsuccess = reg("txn2"); - txn.objectStore("os2").get(1).onsuccess = reg("txn"); - txn2.objectStore("os3").get(1).onsuccess = reg("txn2"); - } - - txn2.objectStore("os1").get(2).onsuccess = reg("txn2"); - txn.objectStore("os1").openCursor(null, "prev").onsuccess = reg("txn"); - os4.openCursor(null, "prev").onsuccess = reg("txn2"); - - txn.oncomplete = finish; - txn2.oncomplete = finish; - }; - - function reg(n: string) { - return function (e: any) { - var v = e.target.result; - if (v.value) v = v.value; - (keys as any)[n].push(v.os + ": " + v.k); - }; - } - - var finish_to_go = 2; - function finish() { - if (--finish_to_go) return; - - t.deepEqual( - keys["txn"], - [ - "os1: 1", - "os3: 1", - "os1: 2", - "os2: 3", - "os2: 1", - "os2: 1", - "os2: 1", - "os1: 2", - ], - "transaction keys", - ); - - t.deepEqual( - keys["txn2"], - [ - "os4: 1", - "os4: 5", - "os4: 4", - "os3: 1", - "os4: 1", - "os4: 5", - "os4: 4", - "os3: 1", - "os4: 1", - "os4: 5", - "os4: 4", - "os3: 1", - "os1: 2", - "os4: 5", - ], - "transaction 2 keys", - ); - - resolve(); - } - }); - t.pass(); -}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts b/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts index 1c25bb8e3..2d52ea074 100644 --- a/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts +++ b/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts @@ -15,7 +15,7 @@ import { compareKeys } from "../util/cmp"; BridgeIDBFactory.enableTracing = true; const backend = new MemoryBackend(); backend.enableTracing = true; -const idbFactory = new BridgeIDBFactory(backend); +export const idbFactory = new BridgeIDBFactory(backend); const self = { indexedDB: idbFactory, -- cgit v1.2.3