1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | Object.defineProperty(exports, "__esModule", { value: true });
|
18 | const tslib_1 = require("tslib");
|
19 | const jsdom_1 = require("../test/jsdom");
|
20 | let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
21 | const inversify_1 = require("inversify");
|
22 | const chai = require("chai");
|
23 | const sinon = require("sinon");
|
24 | const os = require("../../common/os");
|
25 | const logger_1 = require("../../common/logger");
|
26 | const storage_service_1 = require("../storage-service");
|
27 | const message_service_1 = require("../../common/message-service");
|
28 | const window_service_1 = require("../window/window-service");
|
29 | const browser_keyboard_layout_provider_1 = require("./browser-keyboard-layout-provider");
|
30 | const keys_1 = require("./keys");
|
31 | disableJSDOM();
|
32 | describe('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 |
|
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 | });
|
130 | let 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 | };
|
150 | MockLogger = (0, tslib_1.__decorate)([
|
151 | (0, inversify_1.injectable)()
|
152 | ], MockLogger);
|
153 |
|
\ | No newline at end of file |