<!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() {
    for (let i = 0; i < 10000; i++) {
        i++;
        i--;
    }
}
noInline(foo);

function bar() {
    eval("//# sourceURL=eval.js\nfoo();");
}
noInline(bar);

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

    suite.addTestCase({
        name: "Sampling Profiler sourceURL directive.",
        description: "Sample some basic code.",
        test(resolve, reject) {
            InspectorProtocol.awaitEvent({event: "ScriptProfiler.trackingComplete"}).then((messageObject) => {
                let tree = WI.CallingContextTree.__test_makeTreeFromProtocolMessageObject(messageObject);

                let trace = [
                    {name: "foo"},
                    {name: "(program)", url: "eval.js"},
                    {name: "eval"},
                    {name: "bar"},
                    {name: "runFor"}
                ];
                ProtocolTest.expectThat(tree.__test_matchesStackTrace(trace), "Should have seen stacktrace:\n" + JSON.stringify(trace, undefined, 2));
                resolve();
            });

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

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