// 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 inspector's composite progress bar.\n`);


  var MockProgressIndicator = function() {};

  MockProgressIndicator.prototype = {
    // Implementation of Common.Progress interface.
    isCanceled: function() {
      return this._isCanceled;
    },

    done: function() {
      TestRunner.addResult('progress indicator: done');
    },

    setTotalWork: function(totalWork) {
      this._totalWork = totalWork;
    },

    setWorked: function(worked, title) {
      this._worked = worked;
      if (typeof title !== 'undefined')
        this._title = title;
    },

    setTitle: function(title) {
      this._title = title;
    },

    // Test methods.
    cancel: function() {
      this._isCanceled = true;
    },

    dump: function() {
      const roundFactor = 10000;

      var worked = this._worked;
      var totalWork = this._totalWork;

      if (typeof worked === 'number')
        worked = Math.round(worked * roundFactor) / roundFactor;
      if (typeof totalWork === 'number')
        totalWork = Math.round(totalWork * roundFactor) / roundFactor;

      TestRunner.addResult('progress: `' + this._title + '\' ' + worked + ' out of ' + totalWork + ' done.');
    }
  };

  TestRunner.runTestSuite([
    function testOneSubProgress(next) {
      var indicator = new MockProgressIndicator();
      var composite = new Common.CompositeProgress(indicator);
      var subProgress = composite.createSubProgress();

      TestRunner.addResult('Testing CompositeProgress with a single subprogress:');
      indicator.dump();
      subProgress.setTitle('cuckooing');
      subProgress.setWorked(10);
      indicator.dump();
      subProgress.setTotalWork(100);
      indicator.dump();
      subProgress.setWorked(20, 'meowing');
      indicator.dump();
      subProgress.done();
      indicator.dump();
      next();
    },

    function testMultipleSubProgresses(next) {
      var indicator = new MockProgressIndicator();
      var composite = new Common.CompositeProgress(indicator);
      var subProgress1 = composite.createSubProgress();
      var subProgress2 = composite.createSubProgress(3);

      TestRunner.addResult('Testing CompositeProgress with multiple subprogresses:');
      indicator.dump();

      subProgress1.setTitle('cuckooing');
      subProgress1.setTotalWork(100);
      subProgress1.setWorked(20);
      indicator.dump();

      subProgress2.setWorked(10);
      indicator.dump();

      subProgress2.setTotalWork(10);
      subProgress2.setWorked(3, 'barking');
      indicator.dump();

      subProgress1.setWorked(50, 'meowing');
      subProgress2.setWorked(5);
      indicator.dump();

      subProgress2.done();
      indicator.dump();

      subProgress1.done();
      indicator.dump();
      next();
    },

    function testCancel(next) {
      var indicator = new MockProgressIndicator();
      var composite = new Common.CompositeProgress(indicator);
      var subProgress = composite.createSubProgress();

      TestRunner.addResult('Testing isCanceled:');
      TestRunner.assertTrue(!subProgress.isCanceled(), 'progress should not be canceled');
      indicator.cancel();
      TestRunner.assertTrue(subProgress.isCanceled(), 'progress should be canceled');
      next();
    },

    function testNested(next) {
      var indicator = new MockProgressIndicator();
      var composite0 = new Common.CompositeProgress(indicator);
      var subProgress01 = composite0.createSubProgress();
      var composite1 = new Common.CompositeProgress(subProgress01);
      var subProgress11 = composite1.createSubProgress(10);  // Weight should have no effect.

      TestRunner.addResult('Testing nested subprogresses:');
      indicator.dump();

      subProgress11.setWorked(10);
      indicator.dump();

      subProgress11.setTotalWork(100);
      indicator.dump();

      subProgress11.setWorked(50, 'meowing');
      indicator.dump();

      TestRunner.assertTrue(!subProgress11.isCanceled());
      indicator.cancel();
      TestRunner.assertTrue(subProgress11.isCanceled());

      subProgress11.done();
      indicator.dump();
      next();
    }
  ]);
})();
