Skip to content

Commit 6311076

Browse files
authored
Merge pull request #2483 from leomoty/fit-tests
Introduce FitAddon tests
2 parents 33d58ec + f8a62a2 commit 6311076

File tree

2 files changed

+124
-2
lines changed

2 files changed

+124
-2
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/**
2+
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
3+
* @license MIT
4+
*/
5+
6+
import * as puppeteer from 'puppeteer';
7+
import { assert } from 'chai';
8+
import { ITerminalOptions } from 'xterm';
9+
10+
const APP = 'http://127.0.0.1:3000/test';
11+
12+
let browser: puppeteer.Browser;
13+
let page: puppeteer.Page;
14+
const width = 1024;
15+
const height = 768;
16+
17+
describe.only('FitAddon', () => {
18+
before(async function(): Promise<any> {
19+
this.timeout(20000);
20+
browser = await puppeteer.launch({
21+
headless: process.argv.indexOf('--headless') !== -1,
22+
slowMo: 80,
23+
args: [`--window-size=${width},${height}`, `--no-sandbox`]
24+
});
25+
page = (await browser.pages())[0];
26+
await page.setViewport({ width, height });
27+
await page.goto(APP);
28+
await openTerminal();
29+
});
30+
31+
after(async () => {
32+
await browser.close();
33+
});
34+
35+
it('no terminal', async function(): Promise<any> {
36+
await page.evaluate(`window.fit = new FitAddon();`);
37+
assert.equal(await page.evaluate(`window.fit.proposeDimensions()`), undefined);
38+
});
39+
40+
describe('proposeDimensions', () => {
41+
afterEach(async () => {
42+
return unloadFit();
43+
});
44+
45+
it('default', async function(): Promise<any> {
46+
await loadFit();
47+
assert.deepEqual(await page.evaluate(`window.fit.proposeDimensions()`), {
48+
cols: 87,
49+
rows: 26
50+
});
51+
});
52+
53+
it('width', async function(): Promise<any> {
54+
await loadFit(1008);
55+
assert.deepEqual(await page.evaluate(`window.fit.proposeDimensions()`), {
56+
cols: 110,
57+
rows: 26
58+
});
59+
});
60+
61+
it('small', async function(): Promise<any> {
62+
await loadFit(1, 1);
63+
assert.deepEqual(await page.evaluate(`window.fit.proposeDimensions()`), {
64+
cols: 2,
65+
rows: 1
66+
});
67+
});
68+
});
69+
70+
describe('fit', () => {
71+
afterEach(async () => {
72+
return unloadFit();
73+
});
74+
75+
it('default', async function(): Promise<any> {
76+
await loadFit();
77+
await page.evaluate(`window.fit.fit()`);
78+
assert.equal(await page.evaluate(`window.term.cols`), 87);
79+
assert.equal(await page.evaluate(`window.term.rows`), 26);
80+
});
81+
82+
it('width', async function(): Promise<any> {
83+
await loadFit(1008);
84+
await page.evaluate(`window.fit.fit()`);
85+
assert.equal(await page.evaluate(`window.term.cols`), 110);
86+
assert.equal(await page.evaluate(`window.term.rows`), 26);
87+
});
88+
89+
it('small', async function(): Promise<any> {
90+
await loadFit(1, 1);
91+
await page.evaluate(`window.fit.fit()`);
92+
assert.equal(await page.evaluate(`window.term.cols`), 2);
93+
assert.equal(await page.evaluate(`window.term.rows`), 1);
94+
});
95+
});
96+
});
97+
98+
async function loadFit(width: number = 800, height: number = 450): Promise<void> {
99+
await page.evaluate(`
100+
window.fit = new FitAddon();
101+
window.term.loadAddon(window.fit);
102+
document.querySelector('#terminal-container').style.width='${width}px';
103+
document.querySelector('#terminal-container').style.height='${height}px';
104+
`);
105+
}
106+
107+
async function unloadFit(): Promise<void> {
108+
await page.evaluate(`window.fit.dispose();`);
109+
}
110+
111+
async function openTerminal(options: ITerminalOptions = {}): Promise<void> {
112+
await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`);
113+
await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`);
114+
if (options.rendererType === 'dom') {
115+
await page.waitForSelector('.xterm-rows');
116+
} else {
117+
await page.waitForSelector('.xterm-text-layer');
118+
}
119+
}

addons/xterm-addon-fit/src/FitAddon.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ interface ITerminalDimensions {
1717
cols: number;
1818
}
1919

20+
const MINIMUM_COLS = 2;
21+
const MINIMUM_ROWS = 1;
22+
2023
export class FitAddon implements ITerminalAddon {
2124
private _terminal: Terminal | undefined;
2225

@@ -71,8 +74,8 @@ export class FitAddon implements ITerminalAddon {
7174
const availableHeight = parentElementHeight - elementPaddingVer;
7275
const availableWidth = parentElementWidth - elementPaddingHor - core.viewport.scrollBarWidth;
7376
const geometry = {
74-
cols: Math.floor(availableWidth / core._renderService.dimensions.actualCellWidth),
75-
rows: Math.floor(availableHeight / core._renderService.dimensions.actualCellHeight)
77+
cols: Math.max(MINIMUM_COLS, Math.floor(availableWidth / core._renderService.dimensions.actualCellWidth)),
78+
rows: Math.max(MINIMUM_ROWS, Math.floor(availableHeight / core._renderService.dimensions.actualCellHeight))
7679
};
7780
return geometry;
7881
}

0 commit comments

Comments
 (0)