<!doctype html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>

function runFor(func, millis) {
    let start = Date.now();
    do {
        func();
    } while (Date.now() - start < millis);
}

function foo() {
    {
        let o = {};
        for (let i = 0; i < 10000; i++) {
            o["s" + i] = i; // line 19, column 14("[")
        }
    }
    {
        let o = {};
        for (let i = 0; i < 10000; i++) {
            o["s" + i] = i; // line 25, column 14("[")
        }
    }
}
noInline(foo);

function test()
{
    let suite = ProtocolTest.createAsyncSuite("ScriptProfiler.Samples.ExpressionLocation");

    suite.addTestCase({
        name: "Sampling Profiler Expression Location",
        description: "Make sure we properly collect location information.",
        test(resolve, reject) {
            InspectorProtocol.awaitEvent({event: "ScriptProfiler.trackingComplete"}).then((messageObject) => {
                let tree = WI.CallingContextTree.__test_makeTreeFromProtocolMessageObject(messageObject);
                let foundLine19Column14 = false;
                let foundLine25Column14 = false;
                tree.forEachNode((node) => {
                    if (node.name !== "foo")
                        return;

                    for (let lineColumnHashedString of Object.getOwnPropertyNames(node._expressionLocations)) {
                        let [lineNumber, columnNumber] = lineColumnHashedString.split(":").map(Number);
                        if (lineNumber === 19 && columnNumber === 14)
                            foundLine19Column14 = true;
                        if (lineNumber === 25 && columnNumber === 14)
                            foundLine25Column14 = true;
                    }
                });

                ProtocolTest.expectThat(foundLine19Column14, "Should have seen line 19, column 14.");
                ProtocolTest.expectThat(foundLine25Column14, "Should have seen line 25, column 14.");
                resolve();
            });

            InspectorProtocol.sendCommand("ScriptProfiler.startTracking", {includeSamples: true});
            ProtocolTest.evaluateInPage("runFor(foo, 100)");
            InspectorProtocol.sendCommand('ScriptProfiler.stopTracking', {});
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
</body>
</html>
