<!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.putObject");

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

            for (let {value, expected} of tests)
                await InspectorTest.ObjectStore.putObject(new InspectorTest.ObjectStore.TestObject(value), expected);
        });
    }

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

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

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

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

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

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

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

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

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

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

    testPutObject("WI.ObjectStore.prototype.putObject.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},
        ],
    });

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

    testPutObject("WI.ObjectStore.prototype.putObject.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.putObject.</p>
</body>
</html>
