// Copyright 2018 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.

cr.define('key_event_test', function() {
  /** @enum {string} */
  const TestNames = {
    EnterTriggersPrint: 'enter triggers print',
    NumpadEnterTriggersPrint: 'numpad enter triggers print',
    EnterOnInputTriggersPrint: 'enter on input triggers print',
    EnterOnDropdownDoesNotPrint: 'enter on dropdown does not print',
    EnterOnButtonDoesNotPrint: 'enter on button does not print',
    EnterOnCheckboxDoesNotPrint: 'enter on checkbox does not print',
    EscapeClosesDialogOnMacOnly: 'escape closes dialog on mac only',
    CmdPeriodClosesDialogOnMacOnly: 'cmd period closes dialog on mac only',
    CtrlShiftPOpensSystemDialog: 'ctrl shift p opens system dialog',
  };

  const suiteName = 'KeyEventTest';
  suite(suiteName, function() {
    /** @type {?PrintPreviewAppElement} */
    let page = null;

    /** @type {?PrintPreviewNativeLayer} */
    let nativeLayer = null;

    /** @override */
    setup(function() {
      const initialSettings =
          print_preview_test_utils.getDefaultInitialSettings();
      nativeLayer = new print_preview.NativeLayerStub();
      nativeLayer.setInitialSettings(initialSettings);
      // Use advanced settings so that we can test with the paper-button.
      nativeLayer.setLocalDestinationCapabilities(
          print_preview_test_utils.getCddTemplateWithAdvancedSettings(
              1, initialSettings.printerName));
      nativeLayer.setPageCount(3);
      print_preview.NativeLayer.setInstance(nativeLayer);
      const pluginProxy = new print_preview.PDFPluginStub();
      print_preview_new.PluginProxy.setInstance(pluginProxy);

      PolymerTest.clearBody();
      page = document.createElement('print-preview-app');
      document.body.appendChild(page);
      const previewArea = page.$.previewArea;
      pluginProxy.setLoadCallback(previewArea.onPluginLoad_.bind(previewArea));

      // Wait for initialization to complete.
      return Promise
          .all([
            nativeLayer.whenCalled('getInitialSettings'),
            nativeLayer.whenCalled('getPrinterCapabilities')
          ])
          .then(function() {
            Polymer.dom.flush();
          });
    });

    // Tests that the enter key triggers a call to print.
    test(assert(TestNames.EnterTriggersPrint), function() {
      const whenPrintCalled = nativeLayer.whenCalled('print');
      MockInteractions.keyEventOn(page, 'keydown', 'Enter', [], 'Enter');
      return whenPrintCalled;
    });

    // Tests that the numpad enter key triggers a call to print.
    test(assert(TestNames.NumpadEnterTriggersPrint), function() {
      const whenPrintCalled = nativeLayer.whenCalled('print');
      MockInteractions.keyEventOn(page, 'keydown', 'NumpadEnter', [], 'Enter');
      return whenPrintCalled;
    });

    // Tests that the enter key triggers a call to print if an input is the
    // source of the event.
    test(assert(TestNames.EnterOnInputTriggersPrint), function() {
      const whenPrintCalled = nativeLayer.whenCalled('print');
      MockInteractions.keyEventOn(
          page.$$('print-preview-copies-settings')
              .$$('print-preview-number-settings-section')
              .$$('cr-input')
              .inputElement,
          'keydown', 'Enter', [], 'Enter');
      return whenPrintCalled;
    });

    // Tests that the enter key does not trigger a call to print if the event
    // comes from a dropdown.
    test(assert(TestNames.EnterOnDropdownDoesNotPrint), function() {
      const whenKeyEventFired = test_util.eventToPromise('keydown', page);
      MockInteractions.keyEventOn(
          page.$$('print-preview-layout-settings').$$('.md-select'), 'keydown',
          'Enter', [], 'Enter');
      return whenKeyEventFired.then(
          () => assertEquals(0, nativeLayer.getCallCount('print')));
    });

    // Tests that the enter key does not trigger a call to print if the event
    // comes from a button.
    test(assert(TestNames.EnterOnButtonDoesNotPrint), function() {
      const moreSettingsElement = page.$$('print-preview-more-settings');
      moreSettingsElement.$.label.click();
      const whenKeyEventFired = test_util.eventToPromise('keydown', page);
      MockInteractions.keyEventOn(
          page.$$('print-preview-advanced-options-settings').$$('paper-button'),
          'keydown', 'Enter', [], 'Enter');
      return whenKeyEventFired.then(
          () => assertEquals(0, nativeLayer.getCallCount('print')));
    });

    // Tests that the enter key does not trigger a call to print if the event
    // comes from a checkbox.
    test(assert(TestNames.EnterOnCheckboxDoesNotPrint), function() {
      const moreSettingsElement = page.$$('print-preview-more-settings');
      moreSettingsElement.$.label.click();
      const whenKeyEventFired = test_util.eventToPromise('keydown', page);
      MockInteractions.keyEventOn(
          page.$$('print-preview-other-options-settings').$$('cr-checkbox'),
          'keydown', 'Enter', [], 'Enter');
      return whenKeyEventFired.then(
          () => assertEquals(0, nativeLayer.getCallCount('print')));
    });

    // Tests that escape closes the dialog only on Mac.
    test(assert(TestNames.EscapeClosesDialogOnMacOnly), function() {
      const promise = cr.isMac ?
          nativeLayer.whenCalled('dialogClose') :
          test_util.eventToPromise('keydown', page).then(() => {
            assertEquals(0, nativeLayer.getCallCount('dialogClose'));
          });
      MockInteractions.keyEventOn(page, 'keydown', 'Escape', [], 'Escape');
      return promise;
    });

    // Tests that Cmd + Period closes the dialog only on Mac
    test(assert(TestNames.CmdPeriodClosesDialogOnMacOnly), function() {
      const promise = cr.isMac ?
          nativeLayer.whenCalled('dialogClose') :
          test_util.eventToPromise('keydown', page).then(() => {
            assertEquals(0, nativeLayer.getCallCount('dialogClose'));
          });
      MockInteractions.keyEventOn(
          page, 'keydown', 'Period', ['meta'], 'Period');
      return promise;
    });

    // Tests that Ctrl+Shift+P opens the system dialog.
    test(assert(TestNames.CtrlShiftPOpensSystemDialog), function() {
      let promise = null;
      if (cr.isChromeOS) {
        // Chrome OS doesn't have a system dialog. Just make sure the key event
        // does not trigger a crash.
        promise = Promise.resolve();
      } else if (cr.isWindows) {
        promise = nativeLayer.whenCalled('print').then((printTicket) => {
          assertTrue(JSON.parse(printTicket).showSystemDialog);
        });
      } else {
        promise = nativeLayer.whenCalled('showSystemDialog');
      }
      const modifiers = cr.isMac ? ['meta', 'alt'] : ['ctrl', 'shift'];
      MockInteractions.keyEventOn(page, 'keydown', 'KeyP', modifiers, 'KeyP');
      return promise;
    });
  });

  return {
    suiteName: suiteName,
    TestNames: TestNames,
  };
});
