// META: title=Delete range
// META: script=resources/support.js

"use strict";

let entries = [
    { lower: 3, upper: 8, lowerOpen: false, upperOpen: false, expected: [1, 2, 9, 10]},
    { lower: 3, upper: 8, lowerOpen: true, upperOpen: false, expected: [1, 2, 3, 9, 10]},
    { lower: 3, upper: 8, lowerOpen: false, upperOpen: true, expected: [1, 2, 8, 9, 10]},
    { lower: 3, upper: 8, lowerOpen: true, upperOpen: true, expected: [1, 2, 3, 8, 9, 10]}
];

for (const entry of entries) {
    indexeddb_test(
        function upgrade_func(t, db) {
            db.createObjectStore("store");
        },
        function open_func(t, db) {
            const store = db.transaction("store", "readwrite").objectStore("store");

            for (let i = 1; i <= 10; ++i) {
                store.put(i, i);
            }
            store.delete(IDBKeyRange.bound(entry.lower,
                entry.upper,
                entry.lowerOpen,
                entry.upperOpen));

            let keys = [];
            const cursor_request = store.openCursor();
            cursor_request.onsuccess = t.step_func(function () {
                const cursor = cursor_request.result;
                if (cursor) {
                    keys.push(cursor.key);
                    cursor.continue();
                } else {
                    assert_array_equals(entry.expected, keys, `Expected: ${entry.expected}, got: ${keys}.`);
                    t.done();
                }
            });
            cursor_request.onerror = t.unreached_func("Failed to open cursor for read request.");
        }
    )
}
