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

function failAssertion()
{
    console.assert(false);
}

function handleClick()
{
    failAssertion();
}

var test = function()
{
    InspectorTest.startDebuggerTest(step1);

    function step1()
    {
        DebuggerAgent.setPauseOnExceptions(WebInspector.DebuggerModel.PauseOnExceptionsState.PauseOnUncaughtExceptions);
        InspectorTest.showScriptSource("debugger-pause-on-failed-assertion.html", step2);
    }

    function step2()
    {
        InspectorTest.addResult("Script source was shown.");
        InspectorTest.evaluateInPage("setTimeout(handleClick, 0)");
        InspectorTest.waitUntilPaused(step3);
    }

    function step3(callFrames)
    {
        InspectorTest.captureStackTrace(callFrames);
        InspectorTest.completeDebuggerTest();
    }
}

</script>
</head>

<body onload="runTest()">
<p>
Tests that debugger breaks on failed assertion when pause on exception mode is enabled.
</p>

</body>
</html>
