<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script>

var object1 = { foo: 1 };
var object2 = { bar: 2 };

function dumpObject(label)
{
    console.log("===== " + label + " =====");
    console.log(JSON.stringify(object1, replacer));
    console.log("");

    function replacer(key, value)
    {
        if (typeof value === "number" && !isFinite(value))
            return String(value);
        return value;
    }
}

function test()
{
    var obj1, obj2;

    InspectorTest.runTestSuite([
        function testSetUp(next)
        {
            InspectorTest.evaluateInPage("dumpObject('Initial')", step0);

            function step0()
            {
                RuntimeAgent.evaluate("object1", step1);
            }

            function step1(error, result, wasThrown)
            {
                obj1 = WebInspector.RemoteObject.fromPayload(result);
                RuntimeAgent.evaluate("object2", step2);
            }

            function step2(error, result, wasThrown)
            {
                obj2 = WebInspector.RemoteObject.fromPayload(result);
                next();
            }
        },

        function testSetPrimitive(next)
        {
            obj1.setPropertyValue("foo", "2", step1);

            function step1()
            {
                InspectorTest.evaluateInPage("dumpObject('Set primitive')", next);
            }
        },

        function testSetHandle(next)
        {
            obj1.setPropertyValue("foo", "object2", step1);

            function step1()
            {
                InspectorTest.evaluateInPage("dumpObject('Set handle')", next);
            }
        },

        function testSetUndefined(next)
        {
            obj1.setPropertyValue("foo", "undefined", step1);

            function step1()
            {
                InspectorTest.evaluateInPage("dumpObject('Set undefined')", next);
            }
        },

        function testSetZero(next)
        {
            obj1.setPropertyValue("foo", "0", step1);

            function step1()
            {
                InspectorTest.evaluateInPage("dumpObject('Set zero')", next);
            }
        },

        function testSetNull(next)
        {
            obj1.setPropertyValue("foo", "null", step1);

            function step1()
            {
                InspectorTest.evaluateInPage("dumpObject('Set null')", next);
            }
        },

        function testSetEmptyString(next)
        {
            obj1.setPropertyValue("foo", "\"\"", step1);

            function step1()
            {
                InspectorTest.evaluateInPage("dumpObject('Set empty string')", next);
            }
        },

        function testSetException(next)
        {
            obj1.setPropertyValue("foo", "throw 'exception'", step1);

            function step1(error)
            {
                InspectorTest.addResult(error);
                InspectorTest.evaluateInPage("dumpObject('Set exception')", next);
            }
        },

        function testSetNonFiniteNumbers(next)
        {
            obj1.setPropertyValue("foo", "NaN", step1);

            function step1(error)
            {
                obj1.setPropertyValue("foo1", "Infinity", step2);
            }

            function step2(error)
            {
                obj1.setPropertyValue("foo2", "-Infinity", step3);
            }

            function step3(error)
            {
                InspectorTest.evaluateInPage("dumpObject('Set non-finite numbers')", next);
            }
        }
    ]);
}

</script>
</head>

<body onload="runTest()">
<p>
Tests WebInspector.RemoveObject.setPropertyValue implementation.
</p>

</body>
</html>
