UNPKG

7.33 kBJavaScriptView Raw
1"use strict";
2// *****************************************************************************
3// Copyright (C) 2019 TypeFox and others.
4//
5// This program and the accompanying materials are made available under the
6// terms of the Eclipse Public License v. 2.0 which is available at
7// http://www.eclipse.org/legal/epl-2.0.
8//
9// This Source Code may also be made available under the following Secondary
10// Licenses when the conditions for such availability set forth in the Eclipse
11// Public License v. 2.0 are satisfied: GNU General Public License, version 2
12// with the GNU Classpath Exception which is available at
13// https://www.gnu.org/software/classpath/license.html.
14//
15// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16// *****************************************************************************
17Object.defineProperty(exports, "__esModule", { value: true });
18const tslib_1 = require("tslib");
19const jsdom_1 = require("../test/jsdom");
20let disableJSDOM = (0, jsdom_1.enableJSDOM)();
21const inversify_1 = require("inversify");
22const chai = require("chai");
23const sinon = require("sinon");
24const os = require("../../common/os");
25const logger_1 = require("../../common/logger");
26const storage_service_1 = require("../storage-service");
27const message_service_1 = require("../../common/message-service");
28const window_service_1 = require("../window/window-service");
29const browser_keyboard_layout_provider_1 = require("./browser-keyboard-layout-provider");
30const keys_1 = require("./keys");
31disableJSDOM();
32describe('browser keyboard layout provider', function () {
33 let stubOSX;
34 let stubWindows;
35 before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
36 after(() => disableJSDOM());
37 const setup = (system) => {
38 switch (system) {
39 case 'mac':
40 stubOSX = sinon.stub(os, 'isOSX').value(true);
41 stubWindows = sinon.stub(os, 'isWindows').value(false);
42 break;
43 case 'win':
44 stubOSX = sinon.stub(os, 'isOSX').value(false);
45 stubWindows = sinon.stub(os, 'isWindows').value(true);
46 break;
47 default:
48 stubOSX = sinon.stub(os, 'isOSX').value(false);
49 stubWindows = sinon.stub(os, 'isWindows').value(false);
50 }
51 // eslint-disable-next-line @typescript-eslint/no-explicit-any
52 const container = new inversify_1.Container();
53 container.bind(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider).toSelf();
54 container.bind(logger_1.ILogger).to(MockLogger);
55 container.bind(storage_service_1.LocalStorageService).toSelf().inSingletonScope();
56 container.bind(message_service_1.MessageService).toConstantValue({});
57 container.bind(window_service_1.WindowService).toConstantValue({});
58 const service = container.get(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider);
59 return { service, container };
60 };
61 afterEach(() => {
62 stubOSX.restore();
63 stubWindows.restore();
64 });
65 it('detects German Mac layout', async () => {
66 const { service } = setup('mac');
67 let currentLayout = await service.getNativeLayout();
68 service.onDidChangeNativeLayout(l => {
69 currentLayout = l;
70 });
71 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.US');
72 service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'ö' });
73 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.German');
74 });
75 it('detects French Mac layout', async () => {
76 const { service } = setup('mac');
77 let currentLayout = await service.getNativeLayout();
78 service.onDidChangeNativeLayout(l => {
79 currentLayout = l;
80 });
81 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.German');
82 service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' });
83 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French');
84 });
85 it('detects keyboard layout change', async () => {
86 const { service } = setup('mac');
87 let currentLayout = await service.getNativeLayout();
88 service.onDidChangeNativeLayout(l => {
89 currentLayout = l;
90 });
91 service.validateKey({ code: keys_1.Key.QUOTE.code, character: 'ä' });
92 service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'ö' });
93 service.validateKey({ code: keys_1.Key.BRACKET_LEFT.code, character: 'ü' });
94 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.German');
95 service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' });
96 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French');
97 });
98 it('applies layout chosen by the user', async () => {
99 const { service } = setup('mac');
100 let currentLayout = await service.getNativeLayout();
101 service.onDidChangeNativeLayout(l => {
102 currentLayout = l;
103 });
104 service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' });
105 const spanishLayout = service.allLayoutData.find(data => data.name === 'Spanish' && data.hardware === 'mac');
106 await service.setLayoutData(spanishLayout);
107 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.Spanish');
108 await service.setLayoutData('autodetect');
109 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French');
110 });
111 it('restores pressed keys from last session', async () => {
112 const { service, container } = setup('mac');
113 service.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' });
114 const service2 = container.get(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider);
115 chai.expect(service2).to.not.equal(service);
116 const currentLayout = await service2.getNativeLayout();
117 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.French');
118 });
119 it('restores user selection from last session', async () => {
120 const { service, container } = setup('mac');
121 const spanishLayout = service.allLayoutData.find(data => data.name === 'Spanish' && data.hardware === 'mac');
122 await service.setLayoutData(spanishLayout);
123 const service2 = container.get(browser_keyboard_layout_provider_1.BrowserKeyboardLayoutProvider);
124 chai.expect(service2).to.not.equal(service);
125 service2.validateKey({ code: keys_1.Key.SEMICOLON.code, character: 'm' });
126 const currentLayout = await service2.getNativeLayout();
127 chai.expect(currentLayout.info.id).to.equal('com.apple.keylayout.Spanish');
128 });
129});
130let MockLogger = class MockLogger {
131 trace(loggable) {
132 return Promise.resolve();
133 }
134 debug(loggable) {
135 return Promise.resolve();
136 }
137 info(loggable) {
138 return Promise.resolve();
139 }
140 warn(loggable) {
141 return Promise.resolve();
142 }
143 error(loggable) {
144 return Promise.resolve();
145 }
146 fatal(loggable) {
147 return Promise.resolve();
148 }
149};
150MockLogger = (0, tslib_1.__decorate)([
151 (0, inversify_1.injectable)()
152], MockLogger);
153//# sourceMappingURL=browser-keyboard-layout-provider.spec.js.map
\No newline at end of file