зеркало из https://github.com/mozilla/gecko-dev.git
270 строки
5.7 KiB
JavaScript
270 строки
5.7 KiB
JavaScript
/**
|
|
* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
var testGenerator = testSteps();
|
|
|
|
function testSteps()
|
|
{
|
|
const dbname = this.window ? window.location.pathname : "Splendid Test";
|
|
const RW = "readwrite"
|
|
let c1 = 1;
|
|
let c2 = 1;
|
|
|
|
let openRequest = indexedDB.open(dbname, 1);
|
|
openRequest.onerror = errorHandler;
|
|
openRequest.onupgradeneeded = grabEventAndContinueHandler;
|
|
openRequest.onsuccess = unexpectedSuccessHandler;
|
|
let event = yield undefined;
|
|
let db = event.target.result;
|
|
let trans = event.target.transaction;
|
|
|
|
// Create test stores
|
|
let store = db.createObjectStore("store");
|
|
|
|
// Test simple inserts
|
|
var keys = [
|
|
-1/0,
|
|
-1.7e308,
|
|
-10000,
|
|
-2,
|
|
-1.5,
|
|
-1,
|
|
-1.00001e-200,
|
|
-1e-200,
|
|
0,
|
|
1e-200,
|
|
1.00001e-200,
|
|
1,
|
|
2,
|
|
10000,
|
|
1.7e308,
|
|
1/0,
|
|
new Date("1750-01-02"),
|
|
new Date("1800-12-31T12:34:56.001"),
|
|
new Date(-1000),
|
|
new Date(-10),
|
|
new Date(-1),
|
|
new Date(0),
|
|
new Date(1),
|
|
new Date(2),
|
|
new Date(1000),
|
|
new Date("1971-01-01"),
|
|
new Date("1971-01-01T01:01:01Z"),
|
|
new Date("1971-01-01T01:01:01.001Z"),
|
|
new Date("1971-01-01T01:01:01.01Z"),
|
|
new Date("1971-01-01T01:01:01.1Z"),
|
|
new Date("1980-02-02"),
|
|
new Date("3333-03-19T03:33:33.333"),
|
|
"",
|
|
"\x00",
|
|
"\x00\x00",
|
|
"\x00\x01",
|
|
"\x01",
|
|
"\x02",
|
|
"\x03",
|
|
"\x04",
|
|
"\x07",
|
|
"\x08",
|
|
"\x0F",
|
|
"\x10",
|
|
"\x1F",
|
|
"\x20",
|
|
"01234",
|
|
"\x3F",
|
|
"\x40",
|
|
"A",
|
|
"A\x00",
|
|
"A1",
|
|
"ZZZZ",
|
|
"a",
|
|
"a\x00",
|
|
"aa",
|
|
"azz",
|
|
"}",
|
|
"\x7E",
|
|
"\x7F",
|
|
"\x80",
|
|
"\xFF",
|
|
"\u0100",
|
|
"\u01FF",
|
|
"\u0200",
|
|
"\u03FF",
|
|
"\u0400",
|
|
"\u07FF",
|
|
"\u0800",
|
|
"\u0FFF",
|
|
"\u1000",
|
|
"\u1FFF",
|
|
"\u2000",
|
|
"\u3FFF",
|
|
"\u4000",
|
|
"\u7FFF",
|
|
"\u8000",
|
|
"\uD800",
|
|
"\uD800a",
|
|
"\uD800\uDC01",
|
|
"\uDBFF",
|
|
"\uDC00",
|
|
"\uDFFF\uD800",
|
|
"\uFFFE",
|
|
"\uFFFF",
|
|
"\uFFFF\x00",
|
|
"\uFFFFZZZ",
|
|
[],
|
|
[-1/0],
|
|
[-1],
|
|
[0],
|
|
[1],
|
|
[1, "a"],
|
|
[1, []],
|
|
[1, [""]],
|
|
[2, 3],
|
|
[2, 3.0000000000001],
|
|
[12, [[]]],
|
|
[12, [[[]]]],
|
|
[12, [[[""]]]],
|
|
[12, [[["foo"]]]],
|
|
[12, [[[[[3]]]]]],
|
|
[12, [[[[[[3]]]]]]],
|
|
[new Date(-1)],
|
|
[new Date(1)],
|
|
[""],
|
|
["", [[]]],
|
|
["", [[[]]]],
|
|
["abc"],
|
|
["abc", "def"],
|
|
["abc\x00"],
|
|
["abc\x00", "\x00\x01"],
|
|
["abc\x00", "\x00def"],
|
|
["abc\x00\x00def"],
|
|
["x", [[]]],
|
|
["x", [[[]]]],
|
|
[[]],
|
|
[[],"foo"],
|
|
[[],[]],
|
|
[[[]]],
|
|
[[[]], []],
|
|
[[[]], [[]]],
|
|
[[[]], [[1]]],
|
|
[[[]], [[[]]]],
|
|
[[[1]]],
|
|
[[[[]], []]],
|
|
];
|
|
|
|
for (var i = 0; i < keys.length; ++i) {
|
|
let keyI = keys[i];
|
|
is(indexedDB.cmp(keyI, keyI), 0, i + " compared to self");
|
|
|
|
function doCompare(keyI) {
|
|
for (var j = i-1; j >= i-10 && j >= 0; --j) {
|
|
is(indexedDB.cmp(keyI, keys[j]), 1, i + " compared to " + j);
|
|
is(indexedDB.cmp(keys[j], keyI), -1, j + " compared to " + i);
|
|
}
|
|
}
|
|
|
|
doCompare(keyI);
|
|
store.add(i, keyI).onsuccess = function(e) {
|
|
is(indexedDB.cmp(e.target.result, keyI), 0,
|
|
"Returned key should cmp as equal");
|
|
ok(compareKeys(e.target.result, keyI),
|
|
"Returned key should actually be equal");
|
|
};
|
|
|
|
// Test that -0 compares the same as 0
|
|
if (keyI === 0) {
|
|
doCompare(-0);
|
|
let req = store.add(i, -0);
|
|
req.addEventListener("error", new ExpectError("ConstraintError", true));
|
|
req.onsuccess = unexpectedSuccessHandler;
|
|
yield undefined;
|
|
}
|
|
else if (Array.isArray(keyI) && keyI.length === 1 && keyI[0] === 0) {
|
|
doCompare([-0]);
|
|
let req = store.add(i, [-0]);
|
|
req.addEventListener("error", new ExpectError("ConstraintError", true));
|
|
req.onsuccess = unexpectedSuccessHandler;
|
|
yield undefined;
|
|
}
|
|
}
|
|
|
|
store.openCursor().onsuccess = grabEventAndContinueHandler;
|
|
for (i = 0; i < keys.length; ++i) {
|
|
event = yield undefined;
|
|
let cursor = event.target.result;
|
|
is(indexedDB.cmp(cursor.key, keys[i]), 0,
|
|
"Read back key should cmp as equal");
|
|
ok(compareKeys(cursor.key, keys[i]),
|
|
"Read back key should actually be equal");
|
|
is(cursor.value, i, "Stored with right value");
|
|
|
|
cursor.continue();
|
|
}
|
|
event = yield undefined;
|
|
is(event.target.result, null, "no more results expected");
|
|
|
|
var nan = 0/0;
|
|
var invalidKeys = [
|
|
nan,
|
|
undefined,
|
|
null,
|
|
/x/,
|
|
{},
|
|
new Date(NaN),
|
|
new Date("foopy"),
|
|
[nan],
|
|
[undefined],
|
|
[null],
|
|
[/x/],
|
|
[{}],
|
|
[new Date(NaN)],
|
|
[1, nan],
|
|
[1, undefined],
|
|
[1, null],
|
|
[1, /x/],
|
|
[1, {}],
|
|
[1, [nan]],
|
|
[1, [undefined]],
|
|
[1, [null]],
|
|
[1, [/x/]],
|
|
[1, [{}]],
|
|
];
|
|
|
|
for (i = 0; i < invalidKeys.length; ++i) {
|
|
try {
|
|
indexedDB.cmp(invalidKeys[i], 1);
|
|
ok(false, "didn't throw");
|
|
}
|
|
catch(ex) {
|
|
ok(ex instanceof DOMException, "Threw DOMException");
|
|
is(ex.name, "DataError", "Threw right DOMException");
|
|
is(ex.code, 0, "Threw with right code");
|
|
}
|
|
try {
|
|
indexedDB.cmp(1, invalidKeys[i]);
|
|
ok(false, "didn't throw2");
|
|
}
|
|
catch(ex) {
|
|
ok(ex instanceof DOMException, "Threw DOMException2");
|
|
is(ex.name, "DataError", "Threw right DOMException2");
|
|
is(ex.code, 0, "Threw with right code2");
|
|
}
|
|
try {
|
|
store.put(1, invalidKeys[i]);
|
|
ok(false, "didn't throw3");
|
|
}
|
|
catch(ex) {
|
|
ok(ex instanceof DOMException, "Threw DOMException3");
|
|
is(ex.name, "DataError", "Threw right DOMException3");
|
|
is(ex.code, 0, "Threw with right code3");
|
|
}
|
|
}
|
|
|
|
openRequest.onsuccess = grabEventAndContinueHandler;
|
|
yield undefined;
|
|
|
|
finishTest();
|
|
yield undefined;
|
|
}
|