// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(async function() {
  TestRunner.addResult(`Test that link to snippet works.\n`);

  await TestRunner.loadModule('sources_test_runner');
  await TestRunner.loadModule('console_test_runner');
  await TestRunner.showPanel('console');

  TestRunner.addSniffer(Workspace.UISourceCode.prototype, 'addLineMessage', dumpLineMessage, true);

  TestRunner.runTestSuite([
    function testConsoleLogAndReturnMessageLocation(next) {
      ConsoleTestRunner.waitUntilNthMessageReceivedPromise(2)
        .then(() => ConsoleTestRunner.dumpConsoleMessages())
        .then(() => Console.ConsoleView.clearConsole())
        .then(() => next());

      createSnippetPromise('console.log(239);42')
        .then(uiSourceCode => selectSourceCode(uiSourceCode))
        .then(uiSourceCode => renameSourceCodePromise('name1', uiSourceCode))
        .then(() => runSelectedSnippet());
    },

    function testSnippetSyntaxError(next) {
      ConsoleTestRunner.waitUntilNthMessageReceivedPromise(1)
        .then(() => ConsoleTestRunner.dumpConsoleMessages())
        .then(() => Console.ConsoleView.clearConsole())
        .then(() => next());

      createSnippetPromise('\n }')
        .then(uiSourceCode => selectSourceCode(uiSourceCode))
        .then(uiSourceCode => renameSourceCodePromise('name2', uiSourceCode))
        .then(() => runSelectedSnippet());
    },

    function testConsoleErrorHighlight(next) {
      ConsoleTestRunner.waitUntilNthMessageReceivedPromise(4)
        .then(() => ConsoleTestRunner.dumpConsoleMessages())
        .then(() => Console.ConsoleView.clearConsole())
        .then(() => next());

      createSnippetPromise(`
console.error(42);
console.error(-0);
console.error(false);
console.error(null)`)
        .then(uiSourceCode => selectSourceCode(uiSourceCode))
        .then(uiSourceCode => renameSourceCodePromise('name3', uiSourceCode))
        .then(() => runSelectedSnippet());
    }
  ]);

  async function createSnippetPromise(content) {
    const projects = Workspace.workspace.projectsForType(Workspace.projectTypes.FileSystem);
    const snippetsProject = projects.find(project => Persistence.FileSystemWorkspaceBinding.fileSystemType(project) === 'snippets');
    const uiSourceCode = await snippetsProject.createFile('');
    uiSourceCode.setContent(content);
    return uiSourceCode;
  }

  function renameSourceCodePromise(newName, uiSourceCode) {
    var callback;
    var promise = new Promise(fullfill => (callback = fullfill));
    uiSourceCode.rename(newName).then(() => callback(uiSourceCode));
    return promise;
  }

  function selectSourceCode(uiSourceCode) {
    return Common.Revealer.reveal(uiSourceCode).then(() => uiSourceCode);
  }

  function dumpLineMessage(level, text, lineNumber, columnNumber) {
    TestRunner.addResult(`Line Message was added: ${this.url()} ${level} '${text}':${lineNumber}:${columnNumber}`);
  }

  function runSelectedSnippet() {
    Sources.SourcesPanel.instance()._runSnippet();
  }
})();
