blob: 1e3b76404c1b813870f7fc305ba603a91f6f4ac3 [file] [log] [blame]
Jason Linabad7562022-08-22 14:49:05 +10001// Copyright 2022 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * @fileoverview Unit tests for terminal_emulator.js.
7 */
8
9import {sleep} from './terminal_common.js';
Jason Lin5690e752022-08-30 15:36:45 +100010import {encodeKeyCombo, Modifier, XtermTerminal, XtermTerminalTestParams}
11 from './terminal_emulator.js';
12import {MockFunction, MockObject} from './terminal_test_mocks.js';
Jason Linabad7562022-08-22 14:49:05 +100013
14describe('terminal_emulator_tests.js', function() {
15 describe('XtermTerminal', function() {
16 beforeEach(async function() {
17 this.mocks = {
Jason Line9231bc2022-09-01 13:54:02 +100018 term: new MockObject({
19 options: {},
20 parser: {
21 registerOscHandler: () => {},
22 },
23 }),
Jason Linabad7562022-08-22 14:49:05 +100024 fontManager: new MockObject(),
25 fitAddon: new MockObject(),
26 };
27 const testParams = {};
28 for (const prop in this.mocks) {
29 testParams[prop] = this.mocks[prop].proxy;
30 }
31
32 this.terminal = new XtermTerminal({
33 storage: new lib.Storage.Memory(),
34 profileId: 'test',
35 enableWebGL: true,
36 testParams: /** @type {!XtermTerminalTestParams} */(testParams),
37 });
Jason Lin8de3d282022-09-01 21:29:05 +100038 this.terminal.inited_ = true;
Jason Linabad7562022-08-22 14:49:05 +100039 });
40
41 describe('updateFont_()', function() {
42 it('updates font', async function() {
43 const updateFontPromise = this.terminal.updateFont_('font one');
44 assert.deepEqual(
45 await this.mocks.fontManager.whenCalled('loadFont'),
46 [['font one']]);
47 assert.equal(this.mocks.term.baseObj.options.fontFamily, undefined);
48 assert.isNotNull(this.terminal.pendingFont_);
49 assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), []);
50
51 await updateFontPromise;
52 assert.equal(this.mocks.term.baseObj.options.fontFamily, 'font one');
53 assert.isNull(this.terminal.pendingFont_);
54 await sleep(0);
55 assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), [[]]);
56 });
57
58 it('refresh font when the font is the same', async function() {
59 this.mocks.term.baseObj.options.fontFamily = 'font one';
60 const updateFontPromise = this.terminal.updateFont_('font one');
61 assert.deepEqual(
62 await this.mocks.fontManager.whenCalled('loadFont'),
63 [['font one']]);
64 assert.equal(this.mocks.term.baseObj.options.fontFamily, 'font one');
65 assert.isNotNull(this.terminal.pendingFont_);
66 assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), []);
67
68 await updateFontPromise;
69 // Note the extra space at the end.
70 assert.equal(this.mocks.term.baseObj.options.fontFamily, 'font one ');
71 assert.isNull(this.terminal.pendingFont_);
72 await sleep(0);
73 assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), [[]]);
74 });
75
76 it('aborts if pendingFont_ was changed', async function() {
77 const updateFontPromise = this.terminal.updateFont_('font one');
78 assert.deepEqual(
79 await this.mocks.fontManager.whenCalled('loadFont'),
80 [['font one']]);
81 assert.equal(this.mocks.term.baseObj.options.fontFamily, undefined);
82 assert.isNotNull(this.terminal.pendingFont_);
83 assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), []);
84
85 this.terminal.pendingFont_ = 'font two';
86
87 await updateFontPromise;
88 assert.equal(this.mocks.term.baseObj.options.fontFamily, undefined);
89 assert.equal(this.terminal.pendingFont_, 'font two');
90 await sleep(0);
91 assert.deepEqual(this.mocks.fitAddon.getMethodHistory('fit'), []);
92 });
93 });
Jason Lin5690e752022-08-30 15:36:45 +100094
95 it('customKeyEventHandler_', async function() {
96 const mockHandler = new MockFunction();
97 const fakeEvent = {
98 type: 'keydown',
99 keyCode: 65,
100 ctrlKey: true,
101 };
102 this.terminal.keyDownHandlers_.set(encodeKeyCombo(Modifier.Ctrl, 65),
103 mockHandler.proxy);
104 assert.isFalse(this.terminal.customKeyEventHandler_(fakeEvent));
105 const history = mockHandler.popHistory();
106 assert.equal(history.length, 1);
107 assert.equal(history[0][0], fakeEvent);
108
109 assert.isFalse(this.terminal.customKeyEventHandler_({...fakeEvent,
110 type: 'keypress'}));
111 assert.isEmpty(mockHandler.popHistory());
112
113 assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
114 shiftKey: true}));
115 assert.isEmpty(mockHandler.popHistory());
116
117 assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
118 keyCode: 66}));
119 assert.isEmpty(mockHandler.popHistory());
120
121 assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
122 ctrlKey: false}));
123 assert.isEmpty(mockHandler.popHistory());
124 });
Jason Linabad7562022-08-22 14:49:05 +1000125 });
126});