<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/debugger-test.js"></script>
<script src="../../http/tests/inspector/workspace-test.js"></script>
<script>
function test()
{
    WebInspector.showPanel("scripts");
    InspectorTest.createWorkspace(true);

    function createContentProvider(url)
    {
        var contentProvider = new WebInspector.StaticContentProvider(WebInspector.resourceTypes.Script, "", "text/javascript");
        contentProvider.requestContent = function(callback)
        {
            InspectorTest.addResult("Source requested for " + url);
            callback("");
        };
        return contentProvider;
    }

    function createMockWorkspace()
    {
        InspectorTest.createWorkspace(true);
        InspectorTest.testDebuggerWorkspaceProvider = new WebInspector.SimpleWorkspaceProvider(InspectorTest.testWorkspace, WebInspector.projectTypes.Debugger);
        return InspectorTest.testWorkspace;
    }

    function addNetworkFile(workspace, url)
    {
        return InspectorTest.testNetworkWorkspaceProvider.addFileForURL(url, createContentProvider(url), false);
    }

    function addDebuggerFile(workspace, url)
    {
        return InspectorTest.testDebuggerWorkspaceProvider.addFileForURL(url, createContentProvider(url), false);
    }

    InspectorTest.runTestSuite([
        function testInitialLoad(next)
        {
            var workspace = createMockWorkspace();

            addNetworkFile(workspace, "foobar.js");

            var panel = new WebInspector.ScriptsPanel(workspace);
            panel.show();

            addNetworkFile(workspace, "foo.js");
            addNetworkFile(workspace, "bar.js");
            var uiSourceCode = addNetworkFile(workspace, "baz.js");
            panel._navigator.revealUISourceCode(uiSourceCode);

            InspectorTest.dumpScriptsNavigator(panel._navigator);

            // Select "baz.js".
            panel._showFile(workspace.uiSourceCodeForOriginURL("baz.js"));
            panel.detach();

            next();
        },

        function testReset(next)
        {
            var workspace = createMockWorkspace();
            var workspaceController = new WebInspector.WorkspaceController(workspace);
            var panel = new WebInspector.ScriptsPanel(workspace);
            panel.show();

            addNetworkFile(workspace, "foo.js");
            addNetworkFile(workspace, "bar.js");
            addNetworkFile(workspace, "baz.js");

            InspectorTest.dumpScriptsNavigator(panel._navigator);

            InspectorTest.testNetworkWorkspaceProvider.reset();
            InspectorTest.dumpScriptsNavigator(panel._navigator);
            var uiSourceCode = addNetworkFile(workspace, "bar.js");
            panel._navigator.revealUISourceCode(uiSourceCode);
            InspectorTest.dumpScriptsNavigator(panel._navigator);

            panel.detach();
            next();
        },

        function testDebuggerUISourceCodeAddedAndRemoved(next)
        {
            var workspace = createMockWorkspace();
            var panel = new WebInspector.ScriptsPanel(workspace);
            panel.show();

            var uiSourceCode = addNetworkFile(workspace, "foo.js");
            var debuggerUISourceCode = addDebuggerFile(workspace, "compiled.js");
            panel._navigator.revealUISourceCode(uiSourceCode);
            panel._navigator.revealUISourceCode(debuggerUISourceCode);
            InspectorTest.dumpScriptsNavigator(panel._navigator);

            // Plug compiler source mapping.
            addNetworkFile(workspace, "source.js");

            InspectorTest.dumpScriptsNavigator(panel._navigator);
            next();
        }
    ]);
};
</script>
</head>
<body onload="runTest()">
<p>Tests that scripts panel UI elements work as intended.</p>
</body>
</html>
