<!DOCTYPE html>
<html>
<head>
<script src="../../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/objectStore-utilities.js"></script>
<script>
function test()
{
    let suite = InspectorTest.ObjectStore.createSuite("WI.ObjectStore.prototype.deleteObject");

    function testDeleteObject(name, {options, tests}) {
        InspectorTest.ObjectStore.wrapTest(name, async function() {
            InspectorTest.ObjectStore.createObjectStore(options);

            let objects = []
            for (let {value, expected} of tests) {
                let object = new InspectorTest.ObjectStore.TestObject(value);
                await InspectorTest.ObjectStore.putObject(object, expected);
                objects.push(object);
            }

            for (let object of objects)
                await InspectorTest.ObjectStore.deleteObject(object);
        });
    }

    InspectorTest.ObjectStore.wrapTest("WI.ObjectStore.prototype.deleteObject.NoParameters", async function() {
        const options = {
            autoIncrement: true,
        };
        let objectStore = InspectorTest.ObjectStore.createObjectStore(options);

        let object = new InspectorTest.ObjectStore.TestObject(InspectorTest.ObjectStore.basicObject2);

        try {
            // This call may fail on WK1
            await InspectorTest.ObjectStore.put(object, 1);
        } catch { }

        await InspectorTest.expectException(async () => {
            await objectStore.deleteObject();
            await objectStore.deleteObject(object);
        });
    });

    InspectorTest.ObjectStore.wrapTest("WI.ObjectStore.prototype.deleteObject.MissingObject", async function() {
        const options = {
            autoIncrement: true,
        };
        let objectStore = InspectorTest.ObjectStore.createObjectStore(options);

        await InspectorTest.ObjectStore.put(new InspectorTest.ObjectStore.TestObject(InspectorTest.ObjectStore.basicObject2), 1);

        await InspectorTest.expectException(async () => {
            await objectStore.deleteObject(new InspectorTest.ObjectStore.TestObject(InspectorTest.ObjectStore.basicObject1));
            await objectStore.deleteObject(new InspectorTest.ObjectStore.TestObject(InspectorTest.ObjectStore.basicObject2));
        });
    });

    InspectorTest.ObjectStore.wrapTest("WI.ObjectStore.prototype.deleteObject.KeyPathMissingOnObjectWithoutAutoIncrement", async function() {
        const options = {
            keyPath: "KeyPathMissingOnObjectWithoutAutoIncrement",
        };
        let objectStore = InspectorTest.ObjectStore.createObjectStore(options);

        await InspectorTest.expectException(async function() {
            await objectStore.deleteObject(new InspectorTest.ObjectStore.TestObject(InspectorTest.ObjectStore.basicObject1));
            await objectStore.deleteObject(new InspectorTest.ObjectStore.TestObject(InspectorTest.ObjectStore.basicObject2));
        });
    });

    InspectorTest.ObjectStore.wrapTest("WI.ObjectStore.prototype.deleteObject.WithoutKeyPathOrAutoIncrement", async function() {
        let objectStore = InspectorTest.ObjectStore.createObjectStore();

        await InspectorTest.expectException(async function() {
            await objectStore.put(InspectorTest.ObjectStore.basicObject1);
            await objectStore.put(InspectorTest.ObjectStore.basicObject2);
        });
    });

    InspectorTest.ObjectStore.wrapTest("WI.ObjectStore.prototype.deleteObject.KeyPathMissingOnObjectWithoutAutoIncrement", async function() {
        const options = {
            keyPath: "KeyPathMissingOnObjectWithoutAutoIncrement",
        };
        let objectStore = InspectorTest.ObjectStore.createObjectStore(options);

        await InspectorTest.expectException(async function() {
            await objectStore.put(InspectorTest.ObjectStore.basicObject1);
            await objectStore.put(InspectorTest.ObjectStore.basicObject2);
        });
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.KeyPathSetOnObjectWithoutAutoIncrement", {
        options: {keyPath: "KeyPathSetOnObjectWithoutAutoIncrement"},
        tests: [
            {value: {KeyPathSetOnObjectWithoutAutoIncrement: 42, ...InspectorTest.ObjectStore.basicObject1}, expected: 42},
            {value: {KeyPathSetOnObjectWithoutAutoIncrement: 99, ...InspectorTest.ObjectStore.basicObject2}, expected: 99},
        ],
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.KeyPathMissingOnObjectWithAutoIncrement", {
        options: {keyPath: "KeyPathMissingOnObjectWithAutoIncrement", autoIncrement: true},
        tests: [
            {value: InspectorTest.ObjectStore.basicObject1, expected: 1},
            {value: InspectorTest.ObjectStore.basicObject2, expected: 2},
        ],
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.KeyPathSetOnObjectWithAutoIncrement", {
        options: {keyPath: "KeyPathSetOnObjectWithAutoIncrement", autoIncrement: true},
        tests: [
            {value: {KeyPathSetOnObjectWithAutoIncrement: 42, ...InspectorTest.ObjectStore.basicObject1}, expected: 42},
            {value: {KeyPathSetOnObjectWithAutoIncrement: 99, ...InspectorTest.ObjectStore.basicObject2}, expected: 99},
        ],
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.AutoIncrementWithoutKeyPath", {
        options: {autoIncrement: true},
        tests: [
            {value: InspectorTest.ObjectStore.basicObject1, expected: 1},
            {value: InspectorTest.ObjectStore.basicObject2, expected: 2},
        ],
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.KeyPathSetOnObjectWithoutAutoIncrement.Sub", {
        options: {keyPath: "KeyPathSetOnObjectWithoutAutoIncrement.Sub"},
        tests: [
            {value: {KeyPathSetOnObjectWithoutAutoIncrement: {Sub: 42}, ...InspectorTest.ObjectStore.basicObject1}, expected: 42},
            {value: {KeyPathSetOnObjectWithoutAutoIncrement: {Sub: 99}, ...InspectorTest.ObjectStore.basicObject2}, expected: 99},
        ],
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.KeyPathMissingOnObjectWithAutoIncrement.Sub", {
        options: {keyPath: "KeyPathMissingOnObjectWithAutoIncrement.Sub", autoIncrement: true},
        tests: [
            {value: InspectorTest.ObjectStore.basicObject1, expected: 1},
            {value: InspectorTest.ObjectStore.basicObject2, expected: 2},
        ],
    });

    testDeleteObject("WI.ObjectStore.prototype.deleteObject.KeyPathSetOnObjectWithAutoIncrement.Sub", {
        options: {keyPath: "KeyPathSetOnObjectWithAutoIncrement.Sub", autoIncrement: true},
        tests: [
            {value: {KeyPathSetOnObjectWithAutoIncrement: {Sub: 42}, ...InspectorTest.ObjectStore.basicObject1}, expected: 42},
            {value: {KeyPathSetOnObjectWithAutoIncrement: {Sub: 99}, ...InspectorTest.ObjectStore.basicObject2}, expected: 99},
        ],
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Tests WI.ObjectStore.prototype.deleteObject.</p>
</body>
</html>
