UNPKG

@theia/core

Version:

Theia is a cloud & desktop IDE framework implemented in TypeScript.

158 lines 7.85 kB
"use strict"; // ***************************************************************************** // Copyright (C) 2019 TypeFox and others. // // This program and the accompanying materials are made available under the // terms of the Eclipse Public License v. 2.0 which is available at // http://www.eclipse.org/legal/epl-2.0. // // This Source Code may also be made available under the following Secondary // Licenses when the conditions for such availability set forth in the Eclipse // Public License v. 2.0 are satisfied: GNU General Public License, version 2 // with the GNU Classpath Exception which is available at // https://www.gnu.org/software/classpath/license.html. // // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const jsdom_1 = require("../test/jsdom"); let disableJSDOM = (0, jsdom_1.enableJSDOM)(); const inversify_1 = require("inversify"); const chai = require("chai"); const sinon = require("sinon"); const os = require("../../common/os"); const logger_1 = require("../../common/logger"); const storage_service_1 = require("../storage-service"); const message_service_1 = require("../../common/message-service"); const window_service_1 = require("../window/window-service"); const browser_keyboard_layout_provider_1 = require("./browser-keyboard-layout-provider"); const keys_1 = require("./keys"); disableJSDOM(); describe('browser keyboard layout provider', function () { let stubOSX; let stubWindows; before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)()); after(() => disableJSDOM()); const setup = (system) => { switch (system) { case 'mac': stubOSX = sinon.stub(os, 'isOSX').value(true); stubWindows = sinon.stub(os, 'isWindows').value(false); break; case 'win': stubOSX = sinon.stub(os, 'isOSX').value(false); stubWindows = sinon.stub(os, 'isWindows').value(true); break; default: stubOSX = sinon.stub(os, 'isOSX').value(false); stubWindows = sinon.stub(os, 'isWindows').value(false); } // eslint-disable-next-line @typescript-eslint/no-explicit-any const container = new inversify_1.Container(); container.bind(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider).toSelf(); container.bind(logger_1.ILogger).to(MockLogger); container.bind(storage_service_1.LocalStorageService).toSelf().inSingletonScope(); container.bind(message_service_1.MessageService).toConstantValue({}); container.bind(window_service_1.WindowService).toConstantValue({}); const service = container.get(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider); return { service, container }; }; afterEach(() => { stubOSX.restore(); stubWindows.restore(); }); it('detects German Mac layout', async () => { const { service } = setup('mac'); let currentLayout = await service.getNativeLayout(); service.onDidChangeNativeLayout(l => { currentLayout = l; }); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.US'); service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'ö' }); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.German'); }); it('detects French Mac layout', async () => { const { service } = setup('mac'); let currentLayout = await service.getNativeLayout(); service.onDidChangeNativeLayout(l => { currentLayout = l; }); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.German'); service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' }); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French'); }); it('detects keyboard layout change', async () => { const { service } = setup('mac'); let currentLayout = await service.getNativeLayout(); service.onDidChangeNativeLayout(l => { currentLayout = l; }); service.validateKey({ code: keys_1.Key.QUOTE.code, character: 'ä' }); service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'ö' }); service.validateKey({ code: keys_1.Key.BRACKET_LEFT.code, character: 'ü' }); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.German'); service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' }); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French'); }); it('applies layout chosen by the user', async () => { const { service } = setup('mac'); let currentLayout = await service.getNativeLayout(); service.onDidChangeNativeLayout(l => { currentLayout = l; }); service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' }); const spanishLayout = service.allLayoutData.find(data => data.name === 'Spanish' && data.hardware === 'mac'); await service.setLayoutData(spanishLayout); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.Spanish'); await service.setLayoutData('autodetect'); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French'); }); it('restores pressed keys from last session', async () => { const { service, container } = setup('mac'); service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' }); const service2 = container.get(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider); chai.expect(service2).to.not.equal(service); const currentLayout = await service2.getNativeLayout(); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French'); }); it('restores user selection from last session', async () => { const { service, container } = setup('mac'); const spanishLayout = service.allLayoutData.find(data => data.name === 'Spanish' && data.hardware === 'mac'); await service.setLayoutData(spanishLayout); const service2 = container.get(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider); chai.expect(service2).to.not.equal(service); service2.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' }); const currentLayout = await service2.getNativeLayout(); chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.Spanish'); }); }); let MockLogger = class MockLogger { trace(loggable) { return Promise.resolve(); } debug(loggable) { return Promise.resolve(); } info(loggable) { return Promise.resolve(); } warn(loggable) { return Promise.resolve(); } error(loggable) { return Promise.resolve(); } fatal(loggable) { return Promise.resolve(); } }; MockLogger = __decorate([ (0, inversify_1.injectable)() ], MockLogger); //# sourceMappingURL=browser-keyboard-layout-provider.spec.js.map