blob: 7949af0136cb2b91c9406c7f3e29a3dc132a6cc4 [file] [log] [blame]
Mike Frysinger598e8012022-09-07 08:38:34 -04001// Copyright 2022 The ChromiumOS Authors
Jason Linabad7562022-08-22 14:49:05 +10002// 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 },
Jason Linc2504ae2022-09-02 13:03:31 +100023 _core: {
24 _renderService: {
25 dimensions: {
26 actualCellWidth: 10.5,
27 actualCellHeight: 20.5,
28 },
29 },
30 },
Jason Line9231bc2022-09-01 13:54:02 +100031 }),
Jason Linabad7562022-08-22 14:49:05 +100032 fontManager: new MockObject(),
Jason Linabad7562022-08-22 14:49:05 +100033 };
34 const testParams = {};
35 for (const prop in this.mocks) {
36 testParams[prop] = this.mocks[prop].proxy;
37 }
38
39 this.terminal = new XtermTerminal({
40 storage: new lib.Storage.Memory(),
41 profileId: 'test',
42 enableWebGL: true,
43 testParams: /** @type {!XtermTerminalTestParams} */(testParams),
44 });
Jason Linc2504ae2022-09-02 13:03:31 +100045
46 // Some hacking because we don't run the decorate() function. Maybe we
47 // should just run it.
48 this.terminal.container_ = /** @type {!Element} */({
49 offsetWidth: 1000,
50 offsetHeight: 500,
51 });
Jason Lin8de3d282022-09-01 21:29:05 +100052 this.terminal.inited_ = true;
Jason Linabad7562022-08-22 14:49:05 +100053 });
54
55 describe('updateFont_()', function() {
56 it('updates font', async function() {
57 const updateFontPromise = this.terminal.updateFont_('font one');
58 assert.deepEqual(
59 await this.mocks.fontManager.whenCalled('loadFont'),
60 [['font one']]);
61 assert.equal(this.mocks.term.baseObj.options.fontFamily, undefined);
62 assert.isNotNull(this.terminal.pendingFont_);
Jason Linc2504ae2022-09-02 13:03:31 +100063 assert.equal(this.mocks.term.popMethodHistory('resize').length, 0);
Jason Linabad7562022-08-22 14:49:05 +100064
65 await updateFontPromise;
66 assert.equal(this.mocks.term.baseObj.options.fontFamily, 'font one');
67 assert.isNull(this.terminal.pendingFont_);
68 await sleep(0);
Jason Linc2504ae2022-09-02 13:03:31 +100069 assert.equal(this.mocks.term.popMethodHistory('resize').length, 1);
Jason Linabad7562022-08-22 14:49:05 +100070 });
71
72 it('refresh font when the font is the same', async function() {
73 this.mocks.term.baseObj.options.fontFamily = 'font one';
74 const updateFontPromise = this.terminal.updateFont_('font one');
75 assert.deepEqual(
76 await this.mocks.fontManager.whenCalled('loadFont'),
77 [['font one']]);
78 assert.equal(this.mocks.term.baseObj.options.fontFamily, 'font one');
79 assert.isNotNull(this.terminal.pendingFont_);
Jason Linc2504ae2022-09-02 13:03:31 +100080 assert.equal(this.mocks.term.popMethodHistory('resize').length, 0);
Jason Linabad7562022-08-22 14:49:05 +100081
82 await updateFontPromise;
83 // Note the extra space at the end.
84 assert.equal(this.mocks.term.baseObj.options.fontFamily, 'font one ');
85 assert.isNull(this.terminal.pendingFont_);
86 await sleep(0);
Jason Linc2504ae2022-09-02 13:03:31 +100087 assert.equal(this.mocks.term.popMethodHistory('resize').length, 1);
Jason Linabad7562022-08-22 14:49:05 +100088 });
89
90 it('aborts if pendingFont_ was changed', async function() {
91 const updateFontPromise = this.terminal.updateFont_('font one');
92 assert.deepEqual(
93 await this.mocks.fontManager.whenCalled('loadFont'),
94 [['font one']]);
95 assert.equal(this.mocks.term.baseObj.options.fontFamily, undefined);
96 assert.isNotNull(this.terminal.pendingFont_);
Jason Linc2504ae2022-09-02 13:03:31 +100097 assert.equal(this.mocks.term.popMethodHistory('resize').length, 0);
Jason Linabad7562022-08-22 14:49:05 +100098
99 this.terminal.pendingFont_ = 'font two';
100
101 await updateFontPromise;
102 assert.equal(this.mocks.term.baseObj.options.fontFamily, undefined);
103 assert.equal(this.terminal.pendingFont_, 'font two');
104 await sleep(0);
Jason Linc2504ae2022-09-02 13:03:31 +1000105 assert.equal(this.mocks.term.popMethodHistory('resize').length, 0);
Jason Linabad7562022-08-22 14:49:05 +1000106 });
107 });
Jason Lin5690e752022-08-30 15:36:45 +1000108
109 it('customKeyEventHandler_', async function() {
110 const mockHandler = new MockFunction();
111 const fakeEvent = {
112 type: 'keydown',
113 keyCode: 65,
114 ctrlKey: true,
115 };
116 this.terminal.keyDownHandlers_.set(encodeKeyCombo(Modifier.Ctrl, 65),
117 mockHandler.proxy);
118 assert.isFalse(this.terminal.customKeyEventHandler_(fakeEvent));
119 const history = mockHandler.popHistory();
120 assert.equal(history.length, 1);
121 assert.equal(history[0][0], fakeEvent);
122
123 assert.isFalse(this.terminal.customKeyEventHandler_({...fakeEvent,
124 type: 'keypress'}));
125 assert.isEmpty(mockHandler.popHistory());
126
127 assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
128 shiftKey: true}));
129 assert.isEmpty(mockHandler.popHistory());
130
131 assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
132 keyCode: 66}));
133 assert.isEmpty(mockHandler.popHistory());
134
135 assert.isTrue(this.terminal.customKeyEventHandler_({...fakeEvent,
136 ctrlKey: false}));
137 assert.isEmpty(mockHandler.popHistory());
138 });
Jason Linabad7562022-08-22 14:49:05 +1000139 });
140});