<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function triggerConsoleMessage() {
    let script = document.createElement("script");
    script.textContent = "//# sourceURL=inline-script.js\neval('function foo() { console.trace(); }; foo();')";
    document.body.appendChild(script);
}

function test()
{
    function logStackTrace(stackTrace) {
        InspectorTest.log(`StackTrace: ${stackTrace.callFrames.length}`);
        for (let i = 0; i < stackTrace.callFrames.length; ++i) {
            let callFrame = stackTrace.callFrames[i];
            let string = `  ${i + 1}: ${callFrame.functionName}`;
            if (callFrame.sourceCodeLocation)
                string += ` (${callFrame.sourceCodeLocation.originalLocationString()})`;
            string += " -";
            string += ` nativeCode (${callFrame.nativeCode})`;
            string += ` programCode (${callFrame.programCode})`;
            InspectorTest.log(string);
        }
    }

    let suite = InspectorTest.createAsyncSuite("WI.StackTrace");

    suite.addTestCase({
        name: "WI.ConsoleMessage.StackTrace",
        description: "Test we can create a StackTrace from console messages (Console.StackTrace).",
        test(resolve, reject) {
            WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.MessageAdded)
            .then((event) => {
                // Trace message should always have a stack trace.
                let consoleMessage = event.data.message;
                let stackTrace = consoleMessage.stackTrace;
                InspectorTest.expectThat(consoleMessage.type === WI.ConsoleMessage.MessageType.Trace, "ConsoleMessage type should be Trace.");
                InspectorTest.expectThat(stackTrace instanceof WI.StackTrace, "ConsoleMessage should have StackTrace.");

                // Console message stack trace call frame's do not have debugging information.
                InspectorTest.expectThat(stackTrace.callFrames[0].id === null, "CallFrame in StackTrace has no identifier.");
                InspectorTest.expectThat(stackTrace.callFrames[0].thisObject === null, "CallFrame in StackTrace has no thisObject.");
                InspectorTest.expectThat(!stackTrace.callFrames[0].scopeChain.length, "CallFrame in StackTrace has no scopeChain.");

                logStackTrace(consoleMessage.stackTrace);
            })
            .then(resolve, reject);

            InspectorTest.evaluateInPage("triggerConsoleMessage()");
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for the WI.StackTrace model object.</p>
</body>
</html>
