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

function performConsoleMessages() {
    // No console message.
    console.timeStamp();

    // Expected to have stack traces.
    console.time("time"); // Nothing until timeEnd.
    console.clear();
    console.group("group");
    console.profile("profile");
    console.log("log");
    console.info("info");
    console.warn("warn");
    console.error("debug");
    console.error("error");
    console.assert(false, "assert");
    console.trace("trace");
    console.dir([1,2,3]);
    console.dirxml(document.body);
    console.count("count");
    console.profileEnd("profile");
    console.timeEnd("time");

    // Not expected to have stack traces.
    console.log("MARKER: EXPECT NO STACK TRACES");
    console.groupEnd("group");

    // End the test
    console.log("MARKER: DONE");
}

function test()
{
    InspectorTest.addSniffer(WebInspector.ConsoleDispatcher.prototype, "messageAdded", messageAdded, true);

    var hadIssue = false;
    var expectStackTraces = true;

    function messageAdded(payload)
    {
        if (payload.level === "log") {
            if (payload.text === "MARKER: DONE") {
                InspectorTest.addResult(hadIssue ? "FAILURE" : "SUCCESS");
                InspectorTest.completeTest();
                return;
            }
            if (payload.text === "MARKER: EXPECT NO STACK TRACES") {
                expectStackTraces = false;
                return;
            }
        }

        var url = payload.url;
        var lastSlashIndex = url.lastIndexOf("/");
        url = url.substring(lastSlashIndex + 1);

        if ("stackTrace" in payload && !expectStackTraces) {
            InspectorTest.addResult("Unexpected stack trace for: " + JSON.stringify(payload));
            hadIssue = true;
        } else if (!("stackTrace" in payload) && expectStackTraces) {
            InspectorTest.addResult("Expected stack trace for: " + JSON.stringify(payload));
            hadIssue = true;
        }
    }

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

</script>
</head>

<body onload="runTest()">
<p>Tests that console-api messages contain stack traces.</p>

</body>
</html>
