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

<script>
function oneLineTestFunction() { return 0; }
</script>

<script>
function oneLineTestFunction2() { return 0; }</script>

<script>

function testFunction()
{
    var x = Math.sqrt(10);
    return x;
}

var test = function()
{
    var currentSourceFrame;
    InspectorTest.setQuiet(true);
    InspectorTest.runDebuggerTestSuite([
        function testSetBreakpoint(next)
        {
            InspectorTest.showScriptSource("set-breakpoint.html", didShowScriptSource);

            function didShowScriptSource(sourceFrame)
            {
                currentSourceFrame = sourceFrame;
                InspectorTest.addResult("Script source was shown.");
                InspectorTest.setBreakpoint(currentSourceFrame, 16, "", true);
                InspectorTest.runTestFunctionAndWaitUntilPaused(didPause);
            }

            function didPause(callFrames)
            {
                InspectorTest.addResult("Script execution paused.");
                InspectorTest.captureStackTrace(callFrames);
                dumpBreakpointSidebarPane();
                InspectorTest.addSniffer(currentSourceFrame, "_removeBreakpointDecoration", breakpointRemoved);
                InspectorTest.removeBreakpoint(currentSourceFrame, 16);
            }

            function breakpointRemoved()
            {
                InspectorTest.resumeExecution(didResume);
            }

            function didResume()
            {
                dumpBreakpointSidebarPane()
                InspectorTest.addResult("Script execution resumed.");
                next();
            }
        },

        function testSetBreakpointOnTheLastLine(next)
        {
            InspectorTest.showScriptSource("set-breakpoint.html", didShowScriptSource);

            function didShowScriptSource(sourceFrame)
            {
                currentSourceFrame = sourceFrame;
                InspectorTest.setBreakpoint(currentSourceFrame, 6, "", true);
                InspectorTest.waitUntilPaused(didPause);
                InspectorTest.evaluateInPage("setTimeout(oneLineTestFunction, 0)");
            }

            function didPause(callFrames)
            {
                InspectorTest.captureStackTrace(callFrames);
                InspectorTest.removeBreakpoint(currentSourceFrame, 6);
                InspectorTest.resumeExecution(next);
            }
        },

        function testSetBreakpointOnTheLastLine2(next)
        {
            InspectorTest.showScriptSource("set-breakpoint.html", didShowScriptSource);

            function didShowScriptSource(sourceFrame)
            {
                currentSourceFrame = sourceFrame;
                InspectorTest.setBreakpoint(currentSourceFrame, 10, "", true);
                InspectorTest.waitUntilPaused(didPause);
                InspectorTest.evaluateInPage("setTimeout(oneLineTestFunction2, 0)");
            }

            function didPause(callFrames)
            {
                InspectorTest.captureStackTrace(callFrames);
                InspectorTest.removeBreakpoint(currentSourceFrame, 10);
                InspectorTest.resumeExecution(next);
            }
        },

        function testSetBreakpointOnTheSameLine(next)
        {
            DebuggerAgent.setBreakpointByUrl(1, "foo.js", undefined, 2, {}, didSetBreakpoint);

            function didSetBreakpoint(error, breakpointId)
            {
                InspectorTest.assertTrue(!error);
                InspectorTest.assertTrue(!!breakpointId);
                DebuggerAgent.setBreakpointByUrl(1, "foo.js", undefined, 2, {}, didSetBreakpointAgain);
            }

            function didSetBreakpointAgain(error, breakpointId)
            {
                InspectorTest.assertTrue(!!error);
                InspectorTest.assertTrue(!breakpointId);
                next();
            }
        }
    ]);

    function dumpBreakpointSidebarPane()
    {
        var paneElement = WebInspector.panels.scripts.sidebarPanes.jsBreakpoints.listElement
        InspectorTest.addResult("");
        InspectorTest.addResult("Dump breakpoint sidebar pane:");
        InspectorTest.addResult(InspectorTest.textContentWithLineBreaks(paneElement));
    }
}

</script>
</head>

<body onload="runTest()">
<p>
Tests setting breakpoints.
</p>

</body>
</html>
