// 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() {
  'use strict';
  TestRunner.addResult(
      `Verify that a network file tab gets substituted with filesystem tab when persistence binding comes.\n`);
  await TestRunner.loadModule('sources_test_runner');
  await TestRunner.loadModule('bindings_test_runner');
  await TestRunner.showPanel('sources');
  await TestRunner.addScriptTag('resources/foo.js');

  var testMapping = BindingsTestRunner.initializeTestMapping();
  TestRunner.runTestSuite([
    function openNetworkTab(next) {
      TestRunner.waitForUISourceCode('foo.js', Workspace.projectTypes.Network)
          .then(sourceCode => SourcesTestRunner.showUISourceCodePromise(sourceCode))
          .then(onSourceFrame);

      function onSourceFrame(sourceFrame) {
        dumpEditorTabs();
        next();
      }
    },

    function addMapping(next) {
      var fs = new BindingsTestRunner.TestFileSystem('file:///var/www');
      BindingsTestRunner.addFooJSFile(fs);
      fs.reportCreated(function() {});
      testMapping.addBinding('foo.js');
      BindingsTestRunner.waitForBinding('foo.js').then(onBindingCreated);

      function onBindingCreated() {
        dumpEditorTabs();
        next();
      }
    },
  ]);

  function dumpEditorTabs() {
    var editorContainer = UI.panels.sources._sourcesView._editorContainer;
    var openedUISourceCodes = [...editorContainer._tabIds.keys()];
    openedUISourceCodes.sort((a, b) => a.url > b.url ? 1 : b.url > a.url ? -1 : 0);
    TestRunner.addResult('Opened tabs: ');
    for (const code of openedUISourceCodes)
      TestRunner.addResult('    ' + code.url());
  }
})();
