// 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(`Tests that persistence syncs network and filesystem UISourceCodes.\n`);
  await TestRunner.loadModule('sources_test_runner');
  await TestRunner.loadModule('bindings_test_runner');
  await TestRunner.addScriptTag('resources/foo.js');

  var testMapping = BindingsTestRunner.initializeTestMapping();
  var fs = new BindingsTestRunner.TestFileSystem('file:///var/www');
  var fsEntry = BindingsTestRunner.addFooJSFile(fs);

  var networkCode, fileSystemCode;

  TestRunner.runTestSuite([
    function addFileSystem(next) {
      fs.reportCreated(next);
    },

    function addFileMapping(next) {
      testMapping.addBinding('foo.js');
      BindingsTestRunner.waitForBinding('foo.js').then(onBindingCreated);

      function onBindingCreated(binding) {
        TestRunner.addResult('Binding created: ' + binding);
        networkCode = binding.network;
        fileSystemCode = binding.fileSystem;
        next();
      }
    },

    function addFileSystemRevision(next) {
      TestRunner.addSniffer(
          Persistence.Persistence.prototype, '_contentSyncedForTest', dumpWorkingCopiesAndNext.bind(null, next));
      fsEntry.setContent('window.foo3 = 3;');
    },

    function addFileSystemWorkingCopy(next) {
      TestRunner.addSniffer(
          Persistence.Persistence.prototype, '_contentSyncedForTest', dumpWorkingCopiesAndNext.bind(null, next));
      fileSystemCode.setWorkingCopy('window.foo4 = 4;');
    },

    function resetFileSystemWorkingCopy(next) {
      TestRunner.addSniffer(
          Persistence.Persistence.prototype, '_contentSyncedForTest', dumpWorkingCopiesAndNext.bind(null, next));
      fileSystemCode.resetWorkingCopy();
    },

    function setNetworkRevision(next) {
      TestRunner.addSniffer(
          Persistence.Persistence.prototype, '_contentSyncedForTest', dumpWorkingCopiesAndNext.bind(null, next));
      networkCode.addRevision('window.foo2 = 2;');
    },

    function setNetworkWorkingCopy(next) {
      TestRunner.addSniffer(
          Persistence.Persistence.prototype, '_contentSyncedForTest', dumpWorkingCopiesAndNext.bind(null, next));
      networkCode.setWorkingCopy('window.foo5 = 5;');
    },
  ]);

  function dumpWorkingCopiesAndNext(next) {
    TestRunner.addResult(`network code: '${networkCode.workingCopy()}'`);
    TestRunner.addResult(`fileSystem code: '${fileSystemCode.workingCopy()}'`);
    next();
  }
})();
