blob: bbdc7aee84437ebd0e029556dd1d1fcb9670dc5d [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<title>KV Storage: values() trickier tests</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script type="module">
import { testWithArea } from "./helpers/kvs-tests.js";
import * as iterAssert from "./helpers/iter-assert.js";
import { assertAsyncIteratorEquals } from "./helpers/equality-asserters.js";
testWithArea(async area => {
await area.set(1, "value 1");
await area.set(2, "value 2");
await area.set(3, "value 3");
await assertAsyncIteratorEquals(area.values(), ["value 1", "value 2", "value 3"]);
}, "Using for-await-of to collect the results works");
testWithArea(async area => {
// We're not testing every key type since this isn't a test of IndexedDB.
await area.set(1, "value 1");
await area.set(new Date(500), "value date 500");
await area.set(-1, "value -1");
await area.set(new Date(-20), "value date -20");
await area.set("aaa", "value aaa");
await area.set("a", "value a");
await area.set(-Infinity, "value -Infinity");
await assertAsyncIteratorEquals(
area.values(),
[
"value -Infinity",
"value -1",
"value 1",
"value date -20",
"value date 500",
"value a",
"value aaa"
]
);
}, "Results are returned in IndexedDB key order");
testWithArea(async area => {
await area.set(1, "value 1");
await area.set(2, "value 2");
await area.set(3, "value 3");
const iter = area.values();
const iterResults = [
await iter.next(),
await iter.next(),
await iter.next(),
await iter.next(),
await iter.next(),
await iter.next()
];
iterAssert.iterResults(iterResults, [
["value 1", false],
["value 2", false],
["value 3", false],
[undefined, true],
[undefined, true],
[undefined, true]
]);
}, "Manual testing of .next() calls, with awaiting");
testWithArea(async area => {
area.set(1, "value 1");
area.set(2, "value 2");
area.set(3, "value 3");
const iter = area.values();
const promises = [
iter.next(),
iter.next(),
iter.next(),
iter.next(),
iter.next(),
iter.next()
];
const iterResults = await Promise.all(promises);
iterAssert.iterResults(iterResults, [
["value 1", false],
["value 2", false],
["value 3", false],
[undefined, true],
[undefined, true],
[undefined, true]
]);
}, "Manual testing of .next() calls, no awaiting");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.set(15, "value 15");
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 30", "value 40"]);
}, "Inserting an entry before the current entry must have no effect on iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.set(25, "value 25");
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 25", "value 30", "value 40"]);
}, "Inserting an entry after the current entry must show up in iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.delete(10);
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 30", "value 40"]);
}, "Deleting an entry before the current entry must have no effect on iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.delete(20);
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 30", "value 40"]);
}, "Deleting the current entry must have no effect on iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.delete(30);
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 40"]);
}, "Deleting an entry after the current entry must show up in iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.set(10, "value 10, but changed!!");
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 30", "value 40"]);
}, "Modifying a value before the current entry must have no effect on iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.set(20, "value 20, but changed!!");
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 30", "value 40"]);
}, "Modifying a value at the current entry must have no effect on iteration");
testWithArea(async area => {
await area.set(10, "value 10");
await area.set(20, "value 20");
await area.set(30, "value 30");
await area.set(40, "value 40");
let seen = [];
for await (const value of area.values()) {
seen.push(value);
if (value === "value 20") {
await area.set(30, "value 30, but changed!!");
}
}
assert_array_equals(seen, ["value 10", "value 20", "value 30, but changed!!", "value 40"]);
}, "Modifying a value after the current entry must show up in iteration");
</script>