<!DOCTYPE html>
<meta charset="utf-8">
<title>IndexedDB: BigInt keys and values</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
// BigInt and BigInt objects are supported in serialization, per
// https://github.com/whatwg/html/pull/3480
// This support allows them to be used as IndexedDB values.

function value_test(value, predicate, name) {
    async_test(t => {
        t.step(function() {
            assert_true(predicate(value),
                        "Predicate should return true for the initial value.");
        });

        createdb(t).onupgradeneeded = t.step_func(e => {
            e.target.result
                    .createObjectStore("store")
                    .add(value, 1);

            e.target.onsuccess = t.step_func(e => {
                e.target.result
                        .transaction("store")
                        .objectStore("store")
                        .get(1)
                        .onsuccess = t.step_func(e =>
                {
                    assert_true(predicate(e.target.result),
                                "Predicate should return true for the deserialized result.");
                    t.done();
                });
            });
        });
    }, "BigInts as values in IndexedDB - " + name);
}

value_test(1n,
           x => x === 1n,
           "primitive BigInt");
value_test(Object(1n),
           x => typeof x === 'object' &&
                x instanceof BigInt &&
                x.valueOf() === 1n,
           "BigInt object");
value_test({val: 1n},
           x => x.val === 1n,
           "primitive BigInt inside object");
value_test({val: Object(1n)},
           x => x.val.valueOf() === 1n &&
                x.val instanceof BigInt &&
                x.val.valueOf() === 1n,
           "BigInt object inside object");

// However, BigInt is not supported as an IndexedDB key; support
// has been proposed in the following PR, but that change has not
// landed at the time this patch was written
// https://github.com/w3c/IndexedDB/pull/231

function invalidKey(key, name) {
    test(t => {
        assert_throws_dom("DataError", () => indexedDB.cmp(0, key));
    }, "BigInts as keys in IndexedDB - " + name);
}

invalidKey(1n, "primitive BigInt");
// Still an error even if the IndexedDB patch lands
invalidKey(Object(1n), "BigInt object");
</script>
