// 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 how split widget saving to settings works.\n`);


  var settingIndex = 0;
  function createAndShowSplitWidget(
      isVertical, secondIsSidebar, settingName, defaultSidebarWidth, defaultSidebarHeight, shouldSaveShowMode) {
    var splitWidget =
        new UI.SplitWidget(isVertical, secondIsSidebar, settingName, defaultSidebarWidth, defaultSidebarHeight);
    splitWidget.setMainWidget(new UI.Widget());
    splitWidget.setSidebarWidget(new UI.Widget());
    if (shouldSaveShowMode)
      splitWidget.enableShowModeSaving();
    splitWidget.element.style.position = 'absolute';
    splitWidget.element.style.top = '0';
    splitWidget.element.style.left = '0';
    splitWidget.element.style.height = '500px';
    splitWidget.element.style.width = '500px';
    splitWidget.markAsRoot();
    splitWidget.show(document.body);
    return splitWidget;
  }

  function dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget) {
    var sidebarSize = splitWidget.isVertical() ? splitWidget.sidebarWidget().element.offsetWidth :
                                                 splitWidget.sidebarWidget().element.offsetHeight;
    var orientation = splitWidget.isVertical() ? 'vertical' : 'horizontal';
    TestRunner.addResult(
        '    Sidebar size = ' + sidebarSize + ', showMode = ' + splitWidget.showMode() + ', ' + orientation);
    TestRunner.addResult(
        '    Setting value: ' + JSON.stringify(Common.settings.settingForTest(splitWidget._setting._name).get()));
  }

  function testSplitWidgetSizes(useFraction, shouldSaveShowMode) {
    var secondIsSidebar = true;
    var settingName = 'splitWidgetStateSettingName' + (++settingIndex);
    var defaultSidebarWidth = useFraction ? 0.23 : 101;
    var defaultSidebarHeight = useFraction ? 0.24 : 102;
    var newWidth = useFraction ? 125 : 201;
    var newHeight = useFraction ? 130 : 202;

    var splitWidget;
    TestRunner.addResult('Create default split widget');
    var params = 'useFraction = ' + useFraction + ', shouldSaveShowMode = ' + shouldSaveShowMode;
    TestRunner.addResult('Running split widget test with the following parameters: ' + params);

    TestRunner.addResult('Creating split widget');
    splitWidget = createAndShowSplitWidget(
        true, secondIsSidebar, settingName, defaultSidebarWidth, defaultSidebarHeight, shouldSaveShowMode);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Hiding sidebar');
    splitWidget.hideSidebar();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Showing sidebar');
    splitWidget.showBoth();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Resizing');
    splitWidget.setSidebarSize(newWidth);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Hiding sidebar');
    splitWidget.hideSidebar();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Showing sidebar');
    splitWidget.showBoth();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Making horizontal');
    splitWidget.setVertical(false);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Resizing');
    splitWidget.setSidebarSize(newHeight);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Hiding sidebar');
    splitWidget.hideSidebar();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    splitWidget.element.remove();

    TestRunner.addResult('Recreating split widget');
    splitWidget = createAndShowSplitWidget(
        true, secondIsSidebar, settingName, defaultSidebarWidth, defaultSidebarHeight, shouldSaveShowMode);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Hiding sidebar');
    splitWidget.hideSidebar();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Making horizontal');
    splitWidget.setVertical(false);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Showing sidebar');
    splitWidget.showBoth();
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    splitWidget.element.remove();

    TestRunner.addResult('Recreating split widget');
    splitWidget = createAndShowSplitWidget(
        true, secondIsSidebar, settingName, defaultSidebarWidth, defaultSidebarHeight, shouldSaveShowMode);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    TestRunner.addResult('Making horizontal');
    splitWidget.setVertical(false);
    dumpSplitWidgetOrientationShowModeAndSidebarSize(splitWidget);

    splitWidget.element.remove();
    TestRunner.addResult('');
  }

  // Test all combinations of useFraction and shouldSaveShowMode flags
  testSplitWidgetSizes(false, false);
  testSplitWidgetSizes(false, true);
  testSplitWidgetSizes(true, false);
  testSplitWidgetSizes(true, true);
  TestRunner.completeTest();
})();
