// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import {checkHotkey, formatHotkey, Hotkey, parseHotkey} from './hotkeys';

test('parseHotkey', () => {
  expect(parseHotkey('A')).toEqual({
    key: 'A',
    allowInEditable: false,
    modifier: '',
  });
  expect(parseHotkey('!A')).toEqual({
    key: 'A',
    allowInEditable: true,
    modifier: '',
  });
  expect(parseHotkey('Shift+A')).toEqual({
    key: 'A',
    allowInEditable: false,
    modifier: 'Shift+',
  });
  expect(parseHotkey('Mod+Shift+A')).toEqual({
    key: 'A',
    allowInEditable: false,
    modifier: 'Mod+Shift+',
  });
  expect(parseHotkey('!Mod+Shift+A')).toEqual({
    key: 'A',
    allowInEditable: true,
    modifier: 'Mod+Shift+',
  });
});

describe('checkHotkey', () => {
  test('A', () => {
    expect(checkHotkey('A', {key: 'a'})).toBe(true);
    expect(checkHotkey('A', {key: 'A', shiftKey: true})).toBe(false);
    expect(checkHotkey('A', {key: 'a', ctrlKey: true})).toBe(false);
    expect(checkHotkey('A', {key: 'a', altKey: true})).toBe(false);
  });

  test('Special', () => {
    expect(checkHotkey('Enter', {key: 'Enter'})).toBe(true);
    expect(checkHotkey('Escape', {key: 'Escape'})).toBe(true);
  });

  test('Shift+A', () => {
    const hotkey: Hotkey = 'Shift+A';
    expect(checkHotkey(hotkey, {key: 'a'})).toBe(false);
    expect(checkHotkey(hotkey, {key: 'A', shiftKey: true})).toBe(true);
    expect(checkHotkey(hotkey, {key: 'a', ctrlKey: true})).toBe(false);
    expect(checkHotkey(hotkey, {key: 'a', altKey: true})).toBe(false);
  });

  test('Mod+A on PC', () => {
    const hotkey: Hotkey = 'Mod+A';
    expect(checkHotkey(hotkey, {key: 'a'}, 'PC')).toBe(false);
    expect(checkHotkey(hotkey, {key: 'A', shiftKey: true}, 'PC')).toBe(false);
    expect(checkHotkey(hotkey, {key: 'a', ctrlKey: true}, 'PC')).toBe(true);
    expect(checkHotkey(hotkey, {key: 'a', metaKey: true}, 'PC')).toBe(false);
  });

  test('Mod+A on Mac', () => {
    const hotkey: Hotkey = 'Mod+A';
    expect(checkHotkey(hotkey, {key: 'a'}, 'Mac')).toBe(false);
    expect(checkHotkey(hotkey, {key: 'A', shiftKey: true}, 'Mac')).toBe(false);
    expect(checkHotkey(hotkey, {key: 'a', ctrlKey: true}, 'Mac')).toBe(false);
    expect(checkHotkey(hotkey, {key: 'a', metaKey: true}, 'Mac')).toBe(true);
  });

  test('allow in editable', () => {
    const el = document.createElement('input');
    el.setAttribute('type', 'text');

    expect(checkHotkey('X', {key: 'x'})).toBe(true);
    expect(checkHotkey('!X', {key: 'x'})).toBe(true);

    expect(checkHotkey('X', {key: 'x', target: el})).toBe(false);
    expect(checkHotkey('!X', {key: 'x', target: el})).toBe(true);
  });
});

test('formatHotkey', () => {
  expect(formatHotkey('Mod+X', 'Mac')).toEqual('⌘X');
  expect(formatHotkey('Mod+Shift+X', 'Mac')).toEqual('⌘⇧X');

  expect(formatHotkey('Mod+X', 'PC')).toEqual('Ctrl+X');
  expect(formatHotkey('Mod+Shift+X', 'PC')).toEqual('Ctrl+Shift+X');
});
