<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/debugger-test.js"></script>
<script>
function test()
{
    function resetSnippetsSettings()
    {
        WebInspector.scriptSnippetModel._snippetStorage.reset();
        WebInspector.scriptSnippetModel._lastSnippetEvaluationIndexSetting.set(0);
    }

    // FIXME: Remove once snippets are taken out of experiments.
    WebInspector.experimentsSettings.snippetsSupport = {};
    WebInspector.experimentsSettings.snippetsSupport.isEnabled = function() { return true; };
    var workspace = new WebInspector.Workspace();
    var snippetWorkspaceProvider = new WebInspector.SimpleWorkspaceProvider(workspace, WebInspector.projectTypes.Snippets);
    var workspaceController = new WebInspector.WorkspaceController(workspace);
    WebInspector.scriptSnippetModel = new WebInspector.ScriptSnippetModel(workspace, snippetWorkspaceProvider);
    InspectorTest.runDebuggerTestSuite([
        function testCreateAndRename(next)
        {
            resetSnippetsSettings();
            var uiSourceCode = WebInspector.scriptSnippetModel.createScriptSnippet();
            var snippetName = "TestSnippet" + Math.random();
            InspectorTest.addResult("Snippet created.");
            WebInspector.scriptSnippetModel.renameScriptSnippet(uiSourceCode, snippetName);
            uiSourceCode.rename(snippetName);
            InspectorTest.assertEquals(1, workspace.uiSourceCodes().length, "Only one snippet uiSourceCode should be present.");
            var uiSourceCode = workspace.uiSourceCodes()[0];
            if (uiSourceCode.originURL().indexOf(snippetName) === -1)
                return;
            InspectorTest.addResult("Snippet uiSourceCode url is correct.");
            next();
        },

        function testEvaluate(next)
        {
            resetSnippetsSettings();

            var uiSourceCode1 = WebInspector.scriptSnippetModel.createScriptSnippet();
            WebInspector.scriptSnippetModel.renameScriptSnippet(uiSourceCode1, "Snippet1");
            uiSourceCode1.rename("Snippet1");
            var content = "";
            content += "// This snippet does nothing.\n";
            content += "var i = 2+2;\n";
            uiSourceCode1.setWorkingCopy(content);

            var uiSourceCode2 = WebInspector.scriptSnippetModel.createScriptSnippet();
            WebInspector.scriptSnippetModel.renameScriptSnippet(uiSourceCode2, "Snippet2");
            uiSourceCode2.rename("Snippet2");
            content = "";
            content += "// This snippet creates a function that does nothing and returns it.\n";
            content += "function doesNothing() {\n";
            content += "    var  i = 2+2;\n";
            content += "};\n";
            content += "doesNothing;\n";
            uiSourceCode2.setWorkingCopy(content);

            function evaluateSnippetAndDumpEvaluationDetails(uiSourceCode, callback)
            {
                InspectorTest.addSniffer(WebInspector.SnippetScriptMapping.prototype, "addScript", dumpScript);
                // JSC does not support compile-and-run for snippet evaluation, so different platforms have slightly different codeflow here, hence two sniffers.
                InspectorTest.addSniffer(WebInspector.ConsoleView.prototype, "_printResult", dumpResult);
                InspectorTest.addSniffer(WebInspector.ScriptSnippetModel.prototype, "_printRunScriptResult", dumpResult);
                WebInspector.scriptSnippetModel.evaluateScriptSnippet(uiSourceCode);
                var evaluationSourceURL = WebInspector.scriptSnippetModel._evaluationSourceURL(uiSourceCode);
                var snippetId = WebInspector.scriptSnippetModel._snippetIdForUISourceCode.get(uiSourceCode);
                InspectorTest.addResult("Last evaluation source url for snippet: " + evaluationSourceURL);
                InspectorTest.assertEquals(snippetId, WebInspector.scriptSnippetModel._snippetIdForSourceURL(evaluationSourceURL), "Snippet can not be identified by its evaluation sourceURL.");

                function dumpScript(script)
                {
                    InspectorTest.addResult("Snippet script added, sourceURL = " + script.sourceURL);
                }

                function dumpResult(result, wasThrown)
                {
                    InspectorTest.addResult("Snippet execution result: " + result.description);
                    callback();
                }
            }

            evaluateSnippetAndDumpEvaluationDetails(uiSourceCode1, step2);

            function step2()
            {
                evaluateSnippetAndDumpEvaluationDetails(uiSourceCode2, step3);
            }

            function step3()
            {
                evaluateSnippetAndDumpEvaluationDetails(uiSourceCode1, next);
            }
        }
    ]);
};
</script>
</head>
<body onload="runTest()">
<p>Tests script snippet model.</p>
</body>
</html>
