Fix most of Terminal.api timing issues

This commit is contained in:
Daniel Imms
2019-11-09 17:29:32 -08:00
parent 17677568f9
commit 34e703e472
6 changed files with 156 additions and 125 deletions
+2
View File
@@ -30,6 +30,7 @@
},
"devDependencies": {
"@types/chai": "^3.4.34",
"@types/deep-equal": "^1.0.1",
"@types/glob": "^5.0.35",
"@types/jsdom": "11.0.1",
"@types/mocha": "^2.2.33",
@@ -39,6 +40,7 @@
"@types/webpack": "^4.4.11",
"@types/ws": "^6.0.1",
"chai": "3.5.0",
"deep-equal": "^1.1.0",
"express": "^4.17.1",
"express-ws": "^4.0.0",
"glob": "^7.0.5",
+2 -2
View File
@@ -198,8 +198,8 @@ function parseReport(encoding: string, msg: number[]): {state: any; row: number;
/**
* Mouse tracking tests.
*/
describe('Mouse Tracking Tests', function(): void {
before(async function(): Promise<any> {
describe('Mouse Tracking Tests', () => {
before(async () => {
browser = await puppeteer.launch({
headless: process.argv.indexOf('--headless') !== -1,
args: [`--window-size=${width},${height}`, `--no-sandbox`]
+1 -6
View File
@@ -15,12 +15,9 @@ const width = 800;
const height = 600;
describe('Parser Integration Tests', function(): void {
this.timeout(20000);
before(async function(): Promise<any> {
browser = await puppeteer.launch({
headless: process.argv.indexOf('--headless') !== -1,
slowMo: 0,
args: [`--window-size=${width},${height}`, `--no-sandbox`]
});
page = (await browser.pages())[0];
@@ -29,9 +26,7 @@ describe('Parser Integration Tests', function(): void {
await openTerminal();
});
after(() => {
browser.close();
});
after(async () => browser.close());
describe('addCsiHandler', () => {
it('should call custom CSI handler with js array params', async () => {
+106 -109
View File
@@ -6,6 +6,7 @@
import * as puppeteer from 'puppeteer';
import { assert } from 'chai';
import { ITerminalOptions } from 'xterm';
import { pollFor, writeSync } from './TestUtils';
const APP = 'http://127.0.0.1:3000/test';
@@ -14,55 +15,47 @@ let page: puppeteer.Page;
const width = 800;
const height = 600;
describe('API Integration Tests', function(): void {
this.timeout(20000);
before(async function(): Promise<any> {
describe.only('API Integration Tests', function(): void {
before(async () => {
browser = await puppeteer.launch({
headless: process.argv.indexOf('--headless') !== -1,
slowMo: 0,
args: [`--window-size=${width},${height}`, `--no-sandbox`]
});
page = (await browser.pages())[0];
await page.setViewport({ width, height });
});
after(() => {
browser.close();
});
after(async () => browser.close());
beforeEach(async () => page.goto(APP));
beforeEach(async () => {
await page.goto(APP);
});
it('Default options', async function(): Promise<any> {
it('Default options', async () => {
await openTerminal();
assert.equal(await page.evaluate(`window.term.cols`), 80);
assert.equal(await page.evaluate(`window.term.rows`), 24);
});
it('write', async function(): Promise<any> {
it('write', async () => {
await openTerminal();
await page.evaluate(`
window.term.write('foo');
window.term.write('bar');
window.term.write('文');
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foobar文');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foobar文');
});
it('write with callback', async function(): Promise<any> {
it('write with callback', async () => {
await openTerminal();
await page.evaluate(`
window.term.write('foo', () => { window.__x = 'a'; });
window.term.write('bar', () => { window.__x += 'b'; });
window.term.write('文', () => { window.__x += 'c'; });
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foobar文');
assert.equal(await page.evaluate(`window.__x`), 'abc');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foobar文');
await pollFor(page, `window.__x`, 'abc');
});
it('write - bytes (UTF8)', async function(): Promise<any> {
it('write - bytes (UTF8)', async () => {
await openTerminal();
await page.evaluate(`
// foo
@@ -72,10 +65,10 @@ describe('API Integration Tests', function(): void {
// 文
window.term.write(new Uint8Array([230, 150, 135]));
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foobar文');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foobar文');
});
it('write - bytes (UTF8) with callback', async function(): Promise<any> {
it('write - bytes (UTF8) with callback', async () => {
await openTerminal();
await page.evaluate(`
// foo
@@ -85,48 +78,48 @@ describe('API Integration Tests', function(): void {
// 文
window.term.write(new Uint8Array([230, 150, 135]), () => { window.__x += 'C'; });
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foobar文');
assert.equal(await page.evaluate(`window.__x`), 'ABC');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foobar文');
await pollFor(page, `window.__x`, 'ABC');
});
it('writeln', async function(): Promise<any> {
it('writeln', async () => {
await openTerminal();
await page.evaluate(`
window.term.writeln('foo');
window.term.writeln('bar');
window.term.writeln('文');
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foo');
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).translateToString(true)`), 'bar');
assert.equal(await page.evaluate(`window.term.buffer.getLine(2).translateToString(true)`), '文');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foo');
await pollFor(page, `window.term.buffer.getLine(1).translateToString(true)`, 'bar');
await pollFor(page, `window.term.buffer.getLine(2).translateToString(true)`, '文');
});
it('writeln with callback', async function(): Promise<any> {
it('writeln with callback', async () => {
await openTerminal();
await page.evaluate(`
window.term.writeln('foo', () => { window.__x = '1'; });
window.term.writeln('bar', () => { window.__x += '2'; });
window.term.writeln('文', () => { window.__x += '3'; });
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foo');
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).translateToString(true)`), 'bar');
assert.equal(await page.evaluate(`window.term.buffer.getLine(2).translateToString(true)`), '文');
assert.equal(await page.evaluate(`window.__x`), '123');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foo');
await pollFor(page, `window.term.buffer.getLine(1).translateToString(true)`, 'bar');
await pollFor(page, `window.term.buffer.getLine(2).translateToString(true)`, '文');
await pollFor(page, `window.__x`, '123');
});
it('writeln - bytes (UTF8)', async function(): Promise<any> {
it('writeln - bytes (UTF8)', async () => {
await openTerminal();
await page.evaluate(`
window.term.writeln(new Uint8Array([102, 111, 111]));
window.term.writeln(new Uint8Array([98, 97, 114]));
window.term.writeln(new Uint8Array([230, 150, 135]));
`);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foo');
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).translateToString(true)`), 'bar');
assert.equal(await page.evaluate(`window.term.buffer.getLine(2).translateToString(true)`), '文');
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'foo');
await pollFor(page, `window.term.buffer.getLine(1).translateToString(true)`, 'bar');
await pollFor(page, `window.term.buffer.getLine(2).translateToString(true)`, '文');
});
it('paste', async function(): Promise<any> {
it('paste', async () => {
await openTerminal();
await page.evaluate(`
window.calls = [];
@@ -137,26 +130,28 @@ describe('API Integration Tests', function(): void {
window.term.paste('foo');
});
`);
assert.deepEqual(await page.evaluate(`window.calls`), ['foo', '\rfoo\rbar\r', '\x1b[200~foo\x1b[201~']);
await pollFor(page, `window.calls`, ['foo', '\rfoo\rbar\r', '\x1b[200~foo\x1b[201~']);
});
it('clear', async function(): Promise<any> {
it('clear', async () => {
await openTerminal({ rows: 5 });
await page.evaluate(`
window.term.write('test0');
window.parsed = 0;
for (let i = 1; i < 10; i++) {
window.term.write('\\n\\rtest' + i);
window.term.write('\\n\\rtest' + i, () => window.parsed++);
}
`);
await pollFor(page, `window.parsed`, 9);
await page.evaluate(`window.term.clear()`);
assert.equal(await page.evaluate(`window.term.buffer.length`), '5');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'test9');
await pollFor(page, `window.term.buffer.length`, 5);
await pollFor(page, `window.term.buffer.getLine(0).translateToString(true)`, 'test9');
for (let i = 1; i < 5; i++) {
assert.equal(await page.evaluate(`window.term.buffer.getLine(${i}).translateToString(true)`), '');
await pollFor(page, `window.term.buffer.getLine(${i}).translateToString(true)`, '');
}
});
it('getOption, setOption', async function(): Promise<any> {
it('getOption, setOption', async () => {
await openTerminal();
assert.equal(await page.evaluate(`window.term.getOption('rendererType')`), 'canvas');
await page.evaluate(`window.term.setOption('rendererType', 'dom')`);
@@ -164,9 +159,10 @@ describe('API Integration Tests', function(): void {
});
describe('renderer', () => {
it('foreground', async function(): Promise<any> {
it('foreground', async () => {
await openTerminal({ rendererType: 'dom' });
await page.evaluate(`window.term.write('\\x1b[30m0\\x1b[31m1\\x1b[32m2\\x1b[33m3\\x1b[34m4\\x1b[35m5\\x1b[36m6\\x1b[37m7')`);
await writeSync(page, '\\x1b[30m0\\x1b[31m1\\x1b[32m2\\x1b[33m3\\x1b[34m4\\x1b[35m5\\x1b[36m6\\x1b[37m7');
await pollFor(page, `!!document.querySelector('.xterm-rows > :nth-child(1) > :nth-child(1)')`, true);
assert.deepEqual(await page.evaluate(`
[
document.querySelector('.xterm-rows > :nth-child(1) > :nth-child(1)').className,
@@ -188,9 +184,10 @@ describe('API Integration Tests', function(): void {
]);
});
it('background', async function(): Promise<any> {
it('background', async () => {
await openTerminal({ rendererType: 'dom' });
await page.evaluate(`window.term.write('\\x1b[40m0\\x1b[41m1\\x1b[42m2\\x1b[43m3\\x1b[44m4\\x1b[45m5\\x1b[46m6\\x1b[47m7')`);
await writeSync(page, '\\x1b[40m0\\x1b[41m1\\x1b[42m2\\x1b[43m3\\x1b[44m4\\x1b[45m5\\x1b[46m6\\x1b[47m7');
await pollFor(page, `!!document.querySelector('.xterm-rows > :nth-child(1) > :nth-child(1)')`, true);
assert.deepEqual(await page.evaluate(`
[
document.querySelector('.xterm-rows > :nth-child(1) > :nth-child(1)').className,
@@ -213,7 +210,7 @@ describe('API Integration Tests', function(): void {
});
});
it('selection', async function(): Promise<any> {
it('selection', async () => {
await openTerminal({ rows: 5, cols: 5 });
await page.evaluate(`window.term.write('\\n\\nfoo\\n\\n\\rbar\\n\\n\\rbaz')`);
assert.equal(await page.evaluate(`window.term.hasSelection()`), false);
@@ -233,7 +230,7 @@ describe('API Integration Tests', function(): void {
assert.deepEqual(await page.evaluate(`window.term.getSelectionPosition()`), { startColumn: 1, startRow: 2, endColumn: 3, endRow: 2 });
});
it('focus, blur', async function(): Promise<any> {
it('focus, blur', async () => {
await openTerminal();
assert.equal(await page.evaluate(`document.activeElement.className`), '');
await page.evaluate(`window.term.focus()`);
@@ -243,7 +240,7 @@ describe('API Integration Tests', function(): void {
});
describe('loadAddon', () => {
it('constructor', async function(): Promise<any> {
it('constructor', async () => {
await openTerminal({ cols: 5 });
await page.evaluate(`
window.cols = 0;
@@ -255,7 +252,7 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.cols`), 5);
});
it('dispose (addon)', async function(): Promise<any> {
it('dispose (addon)', async () => {
await openTerminal();
await page.evaluate(`
window.disposeCalled = false
@@ -270,7 +267,7 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.disposeCalled`), true);
});
it('dispose (terminal)', async function(): Promise<any> {
it('dispose (terminal)', async () => {
await openTerminal();
await page.evaluate(`
window.disposeCalled = false
@@ -286,19 +283,19 @@ describe('API Integration Tests', function(): void {
});
describe('Events', () => {
it('onCursorMove', async function(): Promise<any> {
it('onCursorMove', async () => {
await openTerminal();
await page.evaluate(`
window.callCount = 0;
window.term.onCursorMove(e => window.callCount++);
window.term.write('foo');
`);
assert.equal(await page.evaluate(`window.callCount`), 1);
await pollFor(page, `window.callCount`, 1);
await page.evaluate(`window.term.write('bar')`);
assert.equal(await page.evaluate(`window.callCount`), 2);
await pollFor(page, `window.callCount`, 2);
});
it('onData', async function(): Promise<any> {
it('onData', async () => {
await openTerminal();
await page.evaluate(`
window.calls = [];
@@ -308,7 +305,7 @@ describe('API Integration Tests', function(): void {
assert.deepEqual(await page.evaluate(`window.calls`), ['f', 'o', 'o']);
});
it('onKey', async function(): Promise<any> {
it('onKey', async () => {
await openTerminal();
await page.evaluate(`
window.calls = [];
@@ -318,19 +315,19 @@ describe('API Integration Tests', function(): void {
assert.deepEqual(await page.evaluate(`window.calls`), ['f', 'o', 'o']);
});
it('onLineFeed', async function(): Promise<any> {
it('onLineFeed', async () => {
await openTerminal();
await page.evaluate(`
window.callCount = 0;
window.term.onLineFeed(() => callCount++);
window.term.writeln('foo');
`);
assert.equal(await page.evaluate(`window.callCount`), 1);
await pollFor(page, `window.callCount`, 1);
await page.evaluate(`window.term.writeln('bar')`);
assert.equal(await page.evaluate(`window.callCount`), 2);
await pollFor(page, `window.callCount`, 2);
});
it('onScroll', async function(): Promise<any> {
it('onScroll', async () => {
await openTerminal({ rows: 5 });
await page.evaluate(`
window.calls = [];
@@ -339,94 +336,94 @@ describe('API Integration Tests', function(): void {
window.term.writeln('foo');
}
`);
assert.deepEqual(await page.evaluate(`window.calls`), []);
await pollFor(page, `window.calls`, []);
await page.evaluate(`window.term.writeln('bar')`);
assert.deepEqual(await page.evaluate(`window.calls`), [1]);
await pollFor(page, `window.calls`, [1]);
await page.evaluate(`window.term.writeln('baz')`);
assert.deepEqual(await page.evaluate(`window.calls`), [1, 2]);
await pollFor(page, `window.calls`, [1, 2]);
});
it('onSelectionChange', async function(): Promise<any> {
it('onSelectionChange', async () => {
await openTerminal();
await page.evaluate(`
window.callCount = 0;
window.term.onSelectionChange(() => window.callCount++);
`);
assert.equal(await page.evaluate(`window.callCount`), 0);
await pollFor(page, `window.callCount`, 0);
await page.evaluate(`window.term.selectAll()`);
assert.equal(await page.evaluate(`window.callCount`), 1);
await pollFor(page, `window.callCount`, 1);
await page.evaluate(`window.term.clearSelection()`);
assert.equal(await page.evaluate(`window.callCount`), 2);
await pollFor(page, `window.callCount`, 2);
});
it('onRender', async function(): Promise<any> {
it('onRender', async () => {
await openTerminal();
await page.evaluate(`
window.calls = [];
window.term.onRender(e => window.calls.push([e.start, e.end]));
`);
assert.deepEqual(await page.evaluate(`window.calls`), []);
await pollFor(page, `window.calls`, []);
await page.evaluate(`window.term.write('foo')`);
assert.deepEqual(await page.evaluate(`window.calls`), [[0, 0]]);
await pollFor(page, `window.calls`, [[0, 0]]);
await page.evaluate(`window.term.write('bar\\n\\nbaz')`);
assert.deepEqual(await page.evaluate(`window.calls`), [[0, 0], [0, 2]]);
await pollFor(page, `window.calls`, [[0, 0], [0, 2]]);
});
it('onResize', async function(): Promise<any> {
it('onResize', async () => {
await openTerminal();
await page.evaluate(`
window.calls = [];
window.term.onResize(e => window.calls.push([e.cols, e.rows]));
`);
assert.deepEqual(await page.evaluate(`window.calls`), []);
await pollFor(page, `window.calls`, []);
await page.evaluate(`window.term.resize(10, 5)`);
assert.deepEqual(await page.evaluate(`window.calls`), [[10, 5]]);
await pollFor(page, `window.calls`, [[10, 5]]);
await page.evaluate(`window.term.resize(20, 15)`);
assert.deepEqual(await page.evaluate(`window.calls`), [[10, 5], [20, 15]]);
await pollFor(page, `window.calls`, [[10, 5], [20, 15]]);
});
it('onTitleChange', async function(): Promise<any> {
it('onTitleChange', async () => {
await openTerminal();
await page.evaluate(`
window.calls = [];
window.term.onTitleChange(e => window.calls.push(e));
`);
assert.deepEqual(await page.evaluate(`window.calls`), []);
await pollFor(page, `window.calls`, []);
await page.evaluate(`window.term.write('\\x1b]2;foo\\x9c')`);
assert.deepEqual(await page.evaluate(`window.calls`), ['foo']);
await pollFor(page, `window.calls`, ['foo']);
});
});
describe('buffer', () => {
it('cursorX, cursorY', async function(): Promise<any> {
it('cursorX, cursorY', async () => {
await openTerminal({ rows: 5, cols: 5 });
assert.equal(await page.evaluate(`window.term.buffer.cursorX`), 0);
assert.equal(await page.evaluate(`window.term.buffer.cursorY`), 0);
await page.evaluate(`window.term.write('foo')`);
await writeSync(page, 'foo');
assert.equal(await page.evaluate(`window.term.buffer.cursorX`), 3);
assert.equal(await page.evaluate(`window.term.buffer.cursorY`), 0);
await page.evaluate(`window.term.write('\\n')`);
await writeSync(page, '\\n');
assert.equal(await page.evaluate(`window.term.buffer.cursorX`), 3);
assert.equal(await page.evaluate(`window.term.buffer.cursorY`), 1);
await page.evaluate(`window.term.write('\\r')`);
await writeSync(page, '\\r');
assert.equal(await page.evaluate(`window.term.buffer.cursorX`), 0);
assert.equal(await page.evaluate(`window.term.buffer.cursorY`), 1);
await page.evaluate(`window.term.write('abcde')`);
await writeSync(page, 'abcde');
assert.equal(await page.evaluate(`window.term.buffer.cursorX`), 5);
assert.equal(await page.evaluate(`window.term.buffer.cursorY`), 1);
await page.evaluate(`window.term.write('\\n\\r\\n\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\r\\n\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.cursorX`), 0);
assert.equal(await page.evaluate(`window.term.buffer.cursorY`), 4);
});
it('viewportY', async function(): Promise<any> {
it('viewportY', async () => {
await openTerminal({ rows: 5 });
assert.equal(await page.evaluate(`window.term.buffer.viewportY`), 0);
await page.evaluate(`window.term.write('\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.viewportY`), 0);
await page.evaluate(`window.term.write('\\n')`);
await writeSync(page, '\\n');
assert.equal(await page.evaluate(`window.term.buffer.viewportY`), 1);
await page.evaluate(`window.term.write('\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.viewportY`), 5);
await page.evaluate(`window.term.scrollLines(-1)`);
assert.equal(await page.evaluate(`window.term.buffer.viewportY`), 4);
@@ -434,14 +431,14 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.term.buffer.viewportY`), 0);
});
it('baseY', async function(): Promise<any> {
it('baseY', async () => {
await openTerminal({ rows: 5 });
assert.equal(await page.evaluate(`window.term.buffer.baseY`), 0);
await page.evaluate(`window.term.write('\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.baseY`), 0);
await page.evaluate(`window.term.write('\\n')`);
await writeSync(page, '\\n');
assert.equal(await page.evaluate(`window.term.buffer.baseY`), 1);
await page.evaluate(`window.term.write('\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.baseY`), 5);
await page.evaluate(`window.term.scrollLines(-1)`);
assert.equal(await page.evaluate(`window.term.buffer.baseY`), 5);
@@ -449,44 +446,44 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.term.buffer.baseY`), 5);
});
it('length', async function(): Promise<any> {
it('length', async () => {
await openTerminal({ rows: 5 });
assert.equal(await page.evaluate(`window.term.buffer.length`), 5);
await page.evaluate(`window.term.write('\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.length`), 5);
await page.evaluate(`window.term.write('\\n')`);
await writeSync(page, '\\n');
assert.equal(await page.evaluate(`window.term.buffer.length`), 6);
await page.evaluate(`window.term.write('\\n\\n\\n\\n')`);
await writeSync(page, '\\n\\n\\n\\n');
assert.equal(await page.evaluate(`window.term.buffer.length`), 10);
});
describe('getLine', () => {
it('invalid index', async function(): Promise<any> {
it('invalid index', async () => {
await openTerminal({ rows: 5 });
assert.equal(await page.evaluate(`window.term.buffer.getLine(-1)`), undefined);
assert.equal(await page.evaluate(`window.term.buffer.getLine(5)`), undefined);
});
it('isWrapped', async function(): Promise<any> {
it('isWrapped', async () => {
await openTerminal({ cols: 5 });
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).isWrapped`), false);
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).isWrapped`), false);
await page.evaluate(`window.term.write('abcde')`);
await writeSync(page, 'abcde');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).isWrapped`), false);
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).isWrapped`), false);
await page.evaluate(`window.term.write('f')`);
await writeSync(page, 'f');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).isWrapped`), false);
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).isWrapped`), true);
});
it('translateToString', async function(): Promise<any> {
it('translateToString', async () => {
await openTerminal({ cols: 5 });
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString()`), ' ');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), '');
await page.evaluate(`window.term.write('foo')`);
await writeSync(page, 'foo');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString()`), 'foo ');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'foo');
await page.evaluate(`window.term.write('bar')`);
await writeSync(page, 'bar');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString()`), 'fooba');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(true)`), 'fooba');
assert.equal(await page.evaluate(`window.term.buffer.getLine(1).translateToString(true)`), 'r');
@@ -494,13 +491,13 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).translateToString(false, 1, 3)`), 'oo');
});
it('getCell', async function(): Promise<any> {
it('getCell', async () => {
await openTerminal({ cols: 5 });
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(-1)`), undefined);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(5)`), undefined);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(0).char`), '');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(0).width`), 1);
await page.evaluate(`window.term.write('a文')`);
await writeSync(page, 'a文');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(0).char`), 'a');
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(0).width`), 1);
assert.equal(await page.evaluate(`window.term.buffer.getLine(0).getCell(1).char`), '文');
@@ -511,7 +508,7 @@ describe('API Integration Tests', function(): void {
});
});
it('dispose', async function(): Promise<any> {
it('dispose', async () => {
await page.evaluate(`
window.term = new Terminal();
window.term.dispose();
@@ -519,7 +516,7 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.term._core._isDisposed`), true);
});
it('dispose (opened)', async function(): Promise<any> {
it('dispose (opened)', async () => {
await openTerminal();
await page.evaluate(`window.term.dispose()`);
assert.equal(await page.evaluate(`window.term._core._isDisposed`), true);
+10 -7
View File
@@ -4,21 +4,24 @@
*/
import * as puppeteer from 'puppeteer';
import deepEqual = require('deep-equal');
export async function pollFor<T>(page: puppeteer.Page, evalOrFn: string | (() => Promise<T>), val: T, preFn?: () => Promise<void>): Promise<void> {
if (preFn) {
await preFn();
}
const result = typeof evalOrFn === 'string' ? await page.evaluate(evalOrFn) : await evalOrFn();
let equal = false;
if (typeof result === 'object') {
equal = Object.keys(result).every(e => result[e] === (val as any)[e]);
} else {
equal = result === val;
}
if (!equal) {
if (!deepEqual(result, val)) {
return new Promise<void>(r => {
setTimeout(() => r(pollFor(page, evalOrFn, val, preFn)), 10);
});
}
}
export async function writeSync(page: puppeteer.Page, data: string): Promise<void> {
await page.evaluate(`
window.ready = false;
window.term.write('${data}', () => window.ready = true);
`);
await pollFor(page, 'window.ready', true);
}
+35 -1
View File
@@ -130,6 +130,11 @@
resolved "https://registry.yarnpkg.com/@types/cli-table/-/cli-table-0.3.0.tgz#f1857156bf5fd115c6a2db260ba0be1f8fc5671c"
integrity sha512-QnZUISJJXyhyD6L1e5QwXDV/A5i2W1/gl6D6YMc8u0ncPepbv/B4w3S+izVvtAg60m6h+JP09+Y/0zF2mojlFQ==
"@types/deep-equal@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
integrity sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==
"@types/events@*":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
@@ -1454,6 +1459,18 @@ deep-eql@^0.1.3:
dependencies:
type-detect "0.1.1"
deep-equal@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745"
integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==
dependencies:
is-arguments "^1.0.4"
is-date-object "^1.0.1"
is-regex "^1.0.4"
object-is "^1.0.1"
object-keys "^1.1.1"
regexp.prototype.flags "^1.2.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -2567,6 +2584,11 @@ is-accessor-descriptor@^1.0.0:
dependencies:
kind-of "^6.0.0"
is-arguments@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -3634,7 +3656,12 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
object-keys@^1.0.11, object-keys@^1.0.12:
object-is@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6"
integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -4238,6 +4265,13 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
regexp.prototype.flags@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c"
integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==
dependencies:
define-properties "^1.1.2"
release-zalgo@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730"