From eb7b2f468373d724dd44e7fdc273bc6eb3dffa2c Mon Sep 17 00:00:00 2001 From: Jon Bockhorst Date: Tue, 11 Feb 2020 11:39:36 -0600 Subject: [PATCH] Make addons use common test functions --- .../xterm-addon-attach/src/AttachAddon.api.ts | 26 +---- addons/xterm-addon-attach/src/tsconfig.json | 6 +- addons/xterm-addon-fit/src/FitAddon.api.ts | 14 +-- addons/xterm-addon-fit/src/tsconfig.json | 6 +- .../xterm-addon-search/src/SearchAddon.api.ts | 46 +++----- addons/xterm-addon-search/src/tsconfig.json | 6 +- .../src/SerializeAddon.api.ts | 34 +----- .../xterm-addon-serialize/src/tsconfig.json | 14 ++- .../src/Unicode11Addon.api.ts | 14 +-- .../xterm-addon-unicode11/src/tsconfig.json | 12 +- .../src/WebLinksAddon.api.ts | 44 ++------ .../xterm-addon-web-links/src/tsconfig.json | 6 +- .../src/WebglRenderer.api.ts | 106 +++++++----------- addons/xterm-addon-webgl/src/tsconfig.json | 22 +++- test/api/tsconfig.json | 4 +- 15 files changed, 133 insertions(+), 227 deletions(-) diff --git a/addons/xterm-addon-attach/src/AttachAddon.api.ts b/addons/xterm-addon-attach/src/AttachAddon.api.ts index 264b32ee..f71debec 100644 --- a/addons/xterm-addon-attach/src/AttachAddon.api.ts +++ b/addons/xterm-addon-attach/src/AttachAddon.api.ts @@ -4,9 +4,8 @@ */ import * as puppeteer from 'puppeteer'; -import { assert } from 'chai'; -import { ITerminalOptions } from 'xterm'; import WebSocket = require('ws'); +import { openTerminal, pollFor } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -37,7 +36,7 @@ describe('AttachAddon', () => { it('string', async function(): Promise { this.timeout(20000); - await openTerminal({ rendererType: 'dom' }); + await openTerminal(page, { rendererType: 'dom' }); const port = 8080; const server = new WebSocket.Server({ port }); server.on('connection', socket => socket.send('foo')); @@ -48,7 +47,7 @@ describe('AttachAddon', () => { it('utf8', async function(): Promise { this.timeout(20000); - await openTerminal({ rendererType: 'dom' }); + await openTerminal(page, { rendererType: 'dom' }); const port = 8080; const server = new WebSocket.Server({ port }); const data = new Uint8Array([102, 111, 111]); @@ -58,22 +57,3 @@ describe('AttachAddon', () => { server.close(); }); }); - -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} - -async function pollFor(page: puppeteer.Page, fn: string, val: any): Promise { - const result = await page.evaluate(fn); - if (result !== val) { - return new Promise(r => { - setTimeout(() => r(pollFor(page, fn, val)), 10); - }); - } -} diff --git a/addons/xterm-addon-attach/src/tsconfig.json b/addons/xterm-addon-attach/src/tsconfig.json index 5539aa56..caed69d9 100644 --- a/addons/xterm-addon-attach/src/tsconfig.json +++ b/addons/xterm-addon-attach/src/tsconfig.json @@ -10,7 +10,11 @@ "outDir": "../out", "sourceMap": true, "removeComments": true, - "strict": true + "strict": true, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", diff --git a/addons/xterm-addon-fit/src/FitAddon.api.ts b/addons/xterm-addon-fit/src/FitAddon.api.ts index aa73a9b6..3f3a7d80 100644 --- a/addons/xterm-addon-fit/src/FitAddon.api.ts +++ b/addons/xterm-addon-fit/src/FitAddon.api.ts @@ -5,7 +5,7 @@ import * as puppeteer from 'puppeteer'; import { assert } from 'chai'; -import { ITerminalOptions } from 'xterm'; +import { openTerminal } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -24,7 +24,7 @@ describe('FitAddon', () => { page = (await browser.pages())[0]; await page.setViewport({ width, height }); await page.goto(APP); - await openTerminal(); + await openTerminal(page); }); after(async () => { @@ -106,13 +106,3 @@ async function loadFit(width: number = 800, height: number = 450): Promise async function unloadFit(): Promise { await page.evaluate(`window.fit.dispose();`); } - -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} diff --git a/addons/xterm-addon-fit/src/tsconfig.json b/addons/xterm-addon-fit/src/tsconfig.json index 5539aa56..caed69d9 100644 --- a/addons/xterm-addon-fit/src/tsconfig.json +++ b/addons/xterm-addon-fit/src/tsconfig.json @@ -10,7 +10,11 @@ "outDir": "../out", "sourceMap": true, "removeComments": true, - "strict": true + "strict": true, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", diff --git a/addons/xterm-addon-search/src/SearchAddon.api.ts b/addons/xterm-addon-search/src/SearchAddon.api.ts index 72a69b5f..6e40eebf 100644 --- a/addons/xterm-addon-search/src/SearchAddon.api.ts +++ b/addons/xterm-addon-search/src/SearchAddon.api.ts @@ -5,9 +5,9 @@ import * as puppeteer from 'puppeteer'; import { assert } from 'chai'; -import { ITerminalOptions } from 'xterm'; import { readFile } from 'fs'; import { resolve } from 'path'; +import { openTerminal, writeSync } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -16,10 +16,10 @@ let page: puppeteer.Page; const width = 800; const height = 600; -describe('Search Tests', function (): void { +describe('Search Tests', function(): void { this.timeout(20000); - before(async function (): Promise { + before(async function(): Promise { browser = await puppeteer.launch({ headless: process.argv.indexOf('--headless') !== -1, args: [`--window-size=${width},${height}`, `--no-sandbox`] @@ -27,7 +27,7 @@ describe('Search Tests', function (): void { page = (await browser.pages())[0]; await page.setViewport({ width, height }); await page.goto(APP); - await openTerminal(); + await openTerminal(page); await page.evaluate(`window.search = new SearchAddon();`); await page.evaluate(`window.term.loadAddon(window.search);`); }); @@ -41,7 +41,7 @@ describe('Search Tests', function (): void { }); it('Simple Search', async () => { - await writeSync('dafhdjfldshafhldsahfkjhldhjkftestlhfdsakjfhdjhlfdsjkafhjdlk'); + await writeSync(page, 'dafhdjfldshafhldsahfkjhldhjkftestlhfdsakjfhdjhlfdsjkafhjdlk'); assert.deepEqual(await page.evaluate(`window.search.findNext('test')`), true); assert.deepEqual(await page.evaluate(`window.term.getSelection()`), 'test'); }); @@ -54,16 +54,16 @@ describe('Search Tests', function (): void { } dataString += makeData(50); } - await writeSync(dataString); + await writeSync(page, dataString); assert.deepEqual(await page.evaluate(`window.search.findNext('$^1_3{}test$#')`), true); assert.deepEqual(await page.evaluate(`window.term.getSelection()`), '$^1_3{}test$#'); }); - it ('Incremental Find Previous', async () => { + it('Incremental Find Previous', async () => { await page.evaluate(`window.term.writeln('package.jsonc\\n')`); - await writeSync('package.json pack package.lock'); + await writeSync(page, 'package.json pack package.lock'); await page.evaluate(`window.search.findPrevious('pack', {incremental: true})`); let line: string = await page.evaluate(`window.term.buffer.getLine(window.term.getSelectionPosition().startRow).translateToString()`); - let selectionPosition: {startColumn: number, startRow: number, endColumn: number, endRow: number} = await page.evaluate(`window.term.getSelectionPosition()`); + let selectionPosition: { startColumn: number, startRow: number, endColumn: number, endRow: number } = await page.evaluate(`window.term.getSelectionPosition()`); // We look further ahead in the line to ensure that pack was selected from package.lock assert.deepEqual(line.substring(selectionPosition.startColumn, selectionPosition.endColumn + 8), 'package.lock'); await page.evaluate(`window.search.findPrevious('package.j', {incremental: true})`); @@ -75,12 +75,12 @@ describe('Search Tests', function (): void { selectionPosition = await page.evaluate(`window.term.getSelectionPosition()`); assert.deepEqual(line.substring(selectionPosition.startColumn, selectionPosition.endColumn), 'package.jsonc'); }); - it ('Incremental Find Next', async () => { + it('Incremental Find Next', async () => { await page.evaluate(`window.term.writeln('package.lock pack package.json package.ups\\n')`); - await writeSync('package.jsonc'); + await writeSync(page, 'package.jsonc'); await page.evaluate(`window.search.findNext('pack', {incremental: true})`); let line: string = await page.evaluate(`window.term.buffer.getLine(window.term.getSelectionPosition().startRow).translateToString()`); - let selectionPosition: {startColumn: number, startRow: number, endColumn: number, endRow: number} = await page.evaluate(`window.term.getSelectionPosition()`); + let selectionPosition: { startColumn: number, startRow: number, endColumn: number, endRow: number } = await page.evaluate(`window.term.getSelectionPosition()`); // We look further ahead in the line to ensure that pack was selected from package.lock assert.deepEqual(line.substring(selectionPosition.startColumn, selectionPosition.endColumn + 8), 'package.lock'); await page.evaluate(`window.search.findNext('package.j', {incremental: true})`); @@ -93,7 +93,7 @@ describe('Search Tests', function (): void { assert.deepEqual(line.substring(selectionPosition.startColumn, selectionPosition.endColumn), 'package.jsonc'); }); it('Simple Regex', async () => { - await writeSync('abc123defABCD'); + await writeSync(page, 'abc123defABCD'); await page.evaluate(`window.search.findNext('[a-z]+', {regex: true})`); assert.deepEqual(await page.evaluate(`window.term.getSelection()`), 'abc'); await page.evaluate(`window.search.findNext('[A-Z]+', {regex: true, caseSensitive: true})`); @@ -101,7 +101,7 @@ describe('Search Tests', function (): void { }); it('Search for single result twice should not unselect it', async () => { - await writeSync('abc def'); + await writeSync(page, 'abc def'); assert.deepEqual(await page.evaluate(`window.search.findNext('abc')`), true); assert.deepEqual(await page.evaluate(`window.term.getSelection()`), 'abc'); assert.deepEqual(await page.evaluate(`window.search.findNext('abc')`), true); @@ -118,7 +118,7 @@ describe('Search Tests', function (): void { .replace(/'/g, '\\\''); }); it('should find all occurrences using findNext', async () => { - await writeSync(fixture); + await writeSync(page, fixture); assert.deepEqual(await page.evaluate(`window.search.findNext('opencv')`), true); let selectionPosition = await page.evaluate(`window.term.getSelectionPosition()`); assert.deepEqual(selectionPosition, { startColumn: 24, startRow: 53, endColumn: 30, endRow: 53 }); @@ -152,7 +152,7 @@ describe('Search Tests', function (): void { assert.deepEqual(selectionPosition, { startColumn: 24, startRow: 53, endColumn: 30, endRow: 53 }); }); it('should find all occurrences using findPrevious', async () => { - await writeSync(fixture); + await writeSync(page, fixture); assert.deepEqual(await page.evaluate(`window.search.findPrevious('opencv')`), true); let selectionPosition = await page.evaluate(`window.term.getSelectionPosition()`); assert.deepEqual(selectionPosition, { startColumn: 11, startRow: 136, endColumn: 17, endRow: 136 }); @@ -189,20 +189,6 @@ describe('Search Tests', function (): void { }); }); -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} - -async function writeSync(data: string): Promise { - return page.evaluate(`new Promise(resolve => window.term.write('${data}', resolve))`); -} - function makeData(length: number): string { let result = ''; const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; diff --git a/addons/xterm-addon-search/src/tsconfig.json b/addons/xterm-addon-search/src/tsconfig.json index 1cb6d4d7..620b14e3 100644 --- a/addons/xterm-addon-search/src/tsconfig.json +++ b/addons/xterm-addon-search/src/tsconfig.json @@ -10,7 +10,11 @@ "outDir": "../out", "sourceMap": true, "removeComments": true, - "strict": true + "strict": true, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.api.ts b/addons/xterm-addon-serialize/src/SerializeAddon.api.ts index a34aa0bd..fab5d7f3 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.api.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.api.ts @@ -5,7 +5,7 @@ import * as puppeteer from 'puppeteer'; import { assert } from 'chai'; -import { ITerminalOptions } from 'xterm'; +import { openTerminal, writeSync } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -23,7 +23,7 @@ describe('SerializeAddon', () => { page = (await browser.pages())[0]; await page.setViewport({ width, height }); await page.goto(APP); - await openTerminal({ rows: 10, cols: 10, rendererType: 'dom' }); + await openTerminal(page, { rows: 10, cols: 10, rendererType: 'dom' }); await page.evaluate(` window.serializeAddon = new SerializeAddon(); window.term.loadAddon(window.serializeAddon); @@ -272,16 +272,6 @@ describe('SerializeAddon', () => { }); }); -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} - function newArray(initial: T | ((index: number) => T), count: number): T[] { const array: T[] = new Array(count); for (let i = 0; i < array.length; i++) { @@ -348,23 +338,3 @@ const DIM = '2'; const NO_ITALIC = '23'; const NO_DIM = '22'; - -async function writeSync(page: puppeteer.Page, data: string): Promise { - await page.evaluate(` - window.ready = false; - window.term.write('${data}', () => window.ready = true); - `); - await pollFor(page, 'window.ready', true); -} - -async function pollFor(page: puppeteer.Page, fn: string, val: any, preFn?: () => Promise): Promise { - if (preFn) { - await preFn(); - } - const result = await page.evaluate(fn); - if (result !== val) { - return new Promise(r => { - setTimeout(() => r(pollFor(page, fn, val, preFn)), 10); - }); - } -} diff --git a/addons/xterm-addon-serialize/src/tsconfig.json b/addons/xterm-addon-serialize/src/tsconfig.json index 57f3d6ed..19ade3c9 100644 --- a/addons/xterm-addon-serialize/src/tsconfig.json +++ b/addons/xterm-addon-serialize/src/tsconfig.json @@ -12,15 +12,23 @@ "removeComments": true, "baseUrl": ".", "paths": { - "common/*": [ "../../../src/common/*" ] + "common/*": [ + "../../../src/common/*" + ] }, - "strict": true + "strict": true, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", "../../../typings/xterm.d.ts" ], "references": [ - { "path": "../../../src/common" } + { + "path": "../../../src/common" + } ] } diff --git a/addons/xterm-addon-unicode11/src/Unicode11Addon.api.ts b/addons/xterm-addon-unicode11/src/Unicode11Addon.api.ts index fb721b47..872ecb8a 100644 --- a/addons/xterm-addon-unicode11/src/Unicode11Addon.api.ts +++ b/addons/xterm-addon-unicode11/src/Unicode11Addon.api.ts @@ -4,8 +4,8 @@ */ import * as puppeteer from 'puppeteer'; -import { ITerminalOptions } from 'xterm'; import { assert } from 'chai'; +import { openTerminal } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -32,7 +32,7 @@ describe('Unicode11Addon', () => { beforeEach(async function(): Promise { this.timeout(20000); await page.goto(APP); - await openTerminal(); + await openTerminal(page); }); it('wcwidth V11 emoji test', async () => { @@ -49,13 +49,3 @@ describe('Unicode11Addon', () => { assert.deepEqual(await page.evaluate(`window.term._core.unicodeService.getStringCellWidth('🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣')`), 20); }); }); - -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} diff --git a/addons/xterm-addon-unicode11/src/tsconfig.json b/addons/xterm-addon-unicode11/src/tsconfig.json index 1681e668..f9d0ab5f 100644 --- a/addons/xterm-addon-unicode11/src/tsconfig.json +++ b/addons/xterm-addon-unicode11/src/tsconfig.json @@ -13,14 +13,22 @@ "strict": true, "baseUrl": ".", "paths": { - "common/*": [ "../../../src/common/*" ] + "common/*": [ + "../../../src/common/*" + ] }, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", "../../../typings/xterm.d.ts" ], "references": [ - { "path": "../../../src/common" } + { + "path": "../../../src/common" + } ] } diff --git a/addons/xterm-addon-web-links/src/WebLinksAddon.api.ts b/addons/xterm-addon-web-links/src/WebLinksAddon.api.ts index d2644e83..7db63911 100644 --- a/addons/xterm-addon-web-links/src/WebLinksAddon.api.ts +++ b/addons/xterm-addon-web-links/src/WebLinksAddon.api.ts @@ -5,7 +5,7 @@ import * as puppeteer from 'puppeteer'; import { assert } from 'chai'; -import { ITerminalOptions } from 'xterm'; +import { openTerminal, pollFor, writeSync } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -15,7 +15,7 @@ const width = 800; const height = 600; describe('WebLinksAddon', () => { - before(async function (): Promise { + before(async function(): Promise { this.timeout(10000); browser = await puppeteer.launch({ headless: process.argv.indexOf('--headless') !== -1, @@ -29,29 +29,29 @@ describe('WebLinksAddon', () => { await browser.close(); }); - beforeEach(async function (): Promise { + beforeEach(async function(): Promise { this.timeout(5000); await page.goto(APP); }); - it('.com', async function (): Promise { + it('.com', async function(): Promise { this.timeout(20000); await testHostName('foo.com'); }); - it('.com.au', async function (): Promise { + it('.com.au', async function(): Promise { this.timeout(20000); await testHostName('foo.com.au'); }); - it('.io', async function (): Promise { + it('.io', async function(): Promise { this.timeout(20000); await testHostName('foo.io'); }); }); async function testHostName(hostname: string): Promise { - await openTerminal({ rendererType: 'dom', cols: 40 }); + await openTerminal(page, { rendererType: 'dom', cols: 40 }); await page.evaluate(`window.term.loadAddon(new window.WebLinksAddon())`); const data = ` http://${hostname} \\r\\n` + ` http://${hostname}/a~b#c~d?e~f \\r\\n` + @@ -70,16 +70,6 @@ async function testHostName(hostname: string): Promise { await pollForLinkAtCell(1, 7, `http://${hostname}/subpath/+/id`); } -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} - async function pollForLinkAtCell(col: number, row: number, value: string): Promise { const rowSelector = `.xterm-rows > :nth-child(${row})`; // Ensure the hover element exists before trying to hover it @@ -87,23 +77,3 @@ async function pollForLinkAtCell(col: number, row: number, value: string): Promi await pollFor(page, `document.querySelectorAll('${rowSelector} > span[style]').length >= ${value.length}`, true, async () => page.hover(`${rowSelector} > :nth-child(${col})`)); assert.equal(await page.evaluate(`Array.prototype.reduce.call(document.querySelectorAll('${rowSelector} > span[style]'), (a, b) => a + b.textContent, '');`), value); } - -async function pollFor(page: puppeteer.Page, fn: string, val: any, preFn?: () => Promise): Promise { - if (preFn) { - await preFn(); - } - const result = await page.evaluate(fn); - if (result !== val) { - return new Promise(r => { - setTimeout(() => r(pollFor(page, fn, val, preFn)), 10); - }); - } -} - -async function writeSync(page: puppeteer.Page, data: string): Promise { - await page.evaluate(` - window.ready = false; - window.term.write('${data}', () => window.ready = true); - `); - await pollFor(page, 'window.ready', true); -} diff --git a/addons/xterm-addon-web-links/src/tsconfig.json b/addons/xterm-addon-web-links/src/tsconfig.json index 5539aa56..caed69d9 100644 --- a/addons/xterm-addon-web-links/src/tsconfig.json +++ b/addons/xterm-addon-web-links/src/tsconfig.json @@ -10,7 +10,11 @@ "outDir": "../out", "sourceMap": true, "removeComments": true, - "strict": true + "strict": true, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.api.ts b/addons/xterm-addon-webgl/src/WebglRenderer.api.ts index 8b9c84bf..3d4a05d8 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.api.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.api.ts @@ -7,7 +7,7 @@ import * as puppeteer from 'puppeteer'; import { ITerminalOptions } from '../../../src/Types'; import { ITheme } from 'xterm'; import { assert } from 'chai'; -import deepEqual = require('deep-equal'); +import { openTerminal, pollFor, writeSync } from '../../../out-test/api/TestUtils'; const APP = 'http://127.0.0.1:3000/test'; @@ -42,7 +42,7 @@ describe('WebGL Renderer Integration Tests', function(): void { white: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[30m█\\x1b[31m█\\x1b[32m█\\x1b[33m█\\x1b[34m█\\x1b[35m█\\x1b[36m█\\x1b[37m█`); + await writeSync(page, `\\x1b[30m█\\x1b[31m█\\x1b[32m█\\x1b[33m█\\x1b[34m█\\x1b[35m█\\x1b[36m█\\x1b[37m█`); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -68,7 +68,7 @@ describe('WebGL Renderer Integration Tests', function(): void { window.term.setOption('theme', ${JSON.stringify(theme)}); window.term.setOption('drawBoldTextInBrightColors', true); `); - await writeSync(`\\x1b[1;30m█\\x1b[1;31m█\\x1b[1;32m█\\x1b[1;33m█\\x1b[1;34m█\\x1b[1;35m█\\x1b[1;36m█\\x1b[1;37m█`); + await writeSync(page, `\\x1b[1;30m█\\x1b[1;31m█\\x1b[1;32m█\\x1b[1;33m█\\x1b[1;34m█\\x1b[1;35m█\\x1b[1;36m█\\x1b[1;37m█`); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -91,7 +91,7 @@ describe('WebGL Renderer Integration Tests', function(): void { white: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[40m \\x1b[41m \\x1b[42m \\x1b[43m \\x1b[44m \\x1b[45m \\x1b[46m \\x1b[47m `); + await writeSync(page, `\\x1b[40m \\x1b[41m \\x1b[42m \\x1b[43m \\x1b[44m \\x1b[45m \\x1b[46m \\x1b[47m `); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -114,7 +114,7 @@ describe('WebGL Renderer Integration Tests', function(): void { white: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[7;30m \\x1b[7;31m \\x1b[7;32m \\x1b[7;33m \\x1b[7;34m \\x1b[7;35m \\x1b[7;36m \\x1b[7;37m `); + await writeSync(page, `\\x1b[7;30m \\x1b[7;31m \\x1b[7;32m \\x1b[7;33m \\x1b[7;34m \\x1b[7;35m \\x1b[7;36m \\x1b[7;37m `); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -137,7 +137,7 @@ describe('WebGL Renderer Integration Tests', function(): void { white: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[7;40m█\\x1b[7;41m█\\x1b[7;42m█\\x1b[7;43m█\\x1b[7;44m█\\x1b[7;45m█\\x1b[7;46m█\\x1b[7;47m█`); + await writeSync(page, `\\x1b[7;40m█\\x1b[7;41m█\\x1b[7;42m█\\x1b[7;43m█\\x1b[7;44m█\\x1b[7;45m█\\x1b[7;46m█\\x1b[7;47m█`); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -160,7 +160,7 @@ describe('WebGL Renderer Integration Tests', function(): void { white: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[8;30m \\x1b[8;31m \\x1b[8;32m \\x1b[8;33m \\x1b[8;34m \\x1b[8;35m \\x1b[8;36m \\x1b[8;37m `); + await writeSync(page, `\\x1b[8;30m \\x1b[8;31m \\x1b[8;32m \\x1b[8;33m \\x1b[8;34m \\x1b[8;35m \\x1b[8;36m \\x1b[8;37m `); await pollFor(page, () => getCellColor(1, 1), [0, 0, 0, 255]); await pollFor(page, () => getCellColor(2, 1), [0, 0, 0, 255]); await pollFor(page, () => getCellColor(3, 1), [0, 0, 0, 255]); @@ -183,7 +183,7 @@ describe('WebGL Renderer Integration Tests', function(): void { white: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[8;40m█\\x1b[8;41m█\\x1b[8;42m█\\x1b[8;43m█\\x1b[8;44m█\\x1b[8;45m█\\x1b[8;46m█\\x1b[8;47m█`); + await writeSync(page, `\\x1b[8;40m█\\x1b[8;41m█\\x1b[8;42m█\\x1b[8;43m█\\x1b[8;44m█\\x1b[8;45m█\\x1b[8;46m█\\x1b[8;47m█`); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -206,7 +206,7 @@ describe('WebGL Renderer Integration Tests', function(): void { brightWhite: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[90m█\\x1b[91m█\\x1b[92m█\\x1b[93m█\\x1b[94m█\\x1b[95m█\\x1b[96m█\\x1b[97m█`); + await writeSync(page, `\\x1b[90m█\\x1b[91m█\\x1b[92m█\\x1b[93m█\\x1b[94m█\\x1b[95m█\\x1b[96m█\\x1b[97m█`); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -229,7 +229,7 @@ describe('WebGL Renderer Integration Tests', function(): void { brightWhite: '#161718' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(`\\x1b[100m \\x1b[101m \\x1b[102m \\x1b[103m \\x1b[104m \\x1b[105m \\x1b[106m \\x1b[107m `); + await writeSync(page, `\\x1b[100m \\x1b[101m \\x1b[102m \\x1b[103m \\x1b[104m \\x1b[105m \\x1b[106m \\x1b[107m `); await pollFor(page, () => getCellColor(1, 1), [1, 2, 3, 255]); await pollFor(page, () => getCellColor(2, 1), [4, 5, 6, 255]); await pollFor(page, () => getCellColor(3, 1), [7, 8, 9, 255]); @@ -248,7 +248,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { const cssColor = COLORS_16_TO_255[y * 16 + x]; @@ -268,7 +268,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { const cssColor = COLORS_16_TO_255[y * 16 + x]; @@ -288,7 +288,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { const cssColor = COLORS_16_TO_255[y * 16 + x]; @@ -308,7 +308,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { const cssColor = COLORS_16_TO_255[y * 16 + x]; @@ -328,7 +328,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { const cssColor = COLORS_16_TO_255[y * 16 + x]; @@ -348,7 +348,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 240 / 16; y++) { for (let x = 0; x < 16; x++) { const cssColor = COLORS_16_TO_255[y * 16 + x]; @@ -369,7 +369,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -387,7 +387,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -405,7 +405,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -423,7 +423,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -441,7 +441,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -459,7 +459,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -477,7 +477,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -495,7 +495,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -513,7 +513,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -531,7 +531,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -549,7 +549,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -567,7 +567,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -585,7 +585,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -603,7 +603,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -621,7 +621,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -639,7 +639,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -657,7 +657,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -675,7 +675,7 @@ describe('WebGL Renderer Integration Tests', function(): void { } data += '\\r\\n'; } - await writeSync(data); + await writeSync(page, data); for (let y = 0; y < 16; y++) { for (let x = 0; x < 16; x++) { const i = y * 16 + x; @@ -713,7 +713,7 @@ describe('WebGL Renderer Integration Tests', function(): void { window.term.setOption('theme', ${JSON.stringify(theme)}); window.term.setOption('minimumContrastRatio', 1); `); - await writeSync( + await writeSync(page, `\\x1b[30m█\\x1b[31m█\\x1b[32m█\\x1b[33m█\\x1b[34m█\\x1b[35m█\\x1b[36m█\\x1b[37m█\\r\\n` + `\\x1b[90m█\\x1b[91m█\\x1b[92m█\\x1b[93m█\\x1b[94m█\\x1b[95m█\\x1b[96m█\\x1b[97m█` ); @@ -781,7 +781,7 @@ describe('WebGL Renderer Integration Tests', function(): void { window.term.setOption('theme', ${JSON.stringify(theme)}); window.term.setOption('minimumContrastRatio', 1); `); - await writeSync( + await writeSync(page, `\\x1b[30m█\\x1b[31m█\\x1b[32m█\\x1b[33m█\\x1b[34m█\\x1b[35m█\\x1b[36m█\\x1b[37m█\\r\\n` + `\\x1b[90m█\\x1b[91m█\\x1b[92m█\\x1b[93m█\\x1b[94m█\\x1b[95m█\\x1b[96m█\\x1b[97m█` ); @@ -837,7 +837,7 @@ describe('WebGL Renderer Integration Tests', function(): void { selection: '#0000FF' }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); - await writeSync(` █\\x1b[7m█\\x1b[0m`); + await writeSync(page, ` █\\x1b[7m█\\x1b[0m`); await pollFor(page, () => getCellColor(1, 1), [0, 255, 0, 255]); await pollFor(page, () => getCellColor(2, 1), [255, 0, 0, 255]); await pollFor(page, () => getCellColor(3, 1), [0, 255, 0, 255]); @@ -850,7 +850,7 @@ describe('WebGL Renderer Integration Tests', function(): void { }); describe('allowTransparency', async () => { - before(async () => setupBrowser({ rendererType: 'dom', allowTransparency: true})); + before(async () => setupBrowser({ rendererType: 'dom', allowTransparency: true })); after(async () => browser.close()); beforeEach(async () => page.evaluate(`window.term.reset()`)); it('transparent background inverse', async () => { @@ -859,27 +859,13 @@ describe('WebGL Renderer Integration Tests', function(): void { }; await page.evaluate(`window.term.setOption('theme', ${JSON.stringify(theme)});`); const data = `\\x1b[7m█\x1b[0m`; - await writeSync(data); + await writeSync(page, data); // Inverse background should be opaque await pollFor(page, () => getCellColor(1, 1), [255, 0, 0, 255]); }); }); }); -async function openTerminal(options: ITerminalOptions = {}): Promise { - await page.evaluate(`window.term = new Terminal(${JSON.stringify(options)})`); - await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); - if (options.rendererType === 'dom') { - await page.waitForSelector('.xterm-rows'); - } else { - await page.waitForSelector('.xterm-text-layer'); - } -} - -async function writeSync(data: string): Promise { - return page.evaluate(`new Promise(resolve => window.term.write('${data}', resolve))`); -} - async function getCellColor(col: number, row: number): Promise { await page.evaluate(` window.gl = window.term._core._renderService._renderer._gl; @@ -902,25 +888,13 @@ async function setupBrowser(options: ITerminalOptions = { rendererType: 'dom' }) page = (await browser.pages())[0]; await page.setViewport({ width, height }); await page.goto(APP); - await openTerminal(options); + await openTerminal(page, options); await page.evaluate(` window.addon = new WebglAddon(true); window.term.loadAddon(window.addon); `); } -export async function pollFor(page: puppeteer.Page, evalOrFn: string | (() => Promise), val: T, preFn?: () => Promise): Promise { - if (preFn) { - await preFn(); - } - const result = typeof evalOrFn === 'string' ? await page.evaluate(evalOrFn) : await evalOrFn(); - if (!deepEqual(result, val)) { - return new Promise(r => { - setTimeout(() => r(pollFor(page, evalOrFn, val, preFn)), 1); - }); - } -} - const COLORS_16_TO_255 = [ '#000000', '#00005f', '#000087', '#0000af', '#0000d7', '#0000ff', '#005f00', '#005f5f', '#005f87', '#005faf', '#005fd7', '#005fff', '#008700', '#00875f', '#008787', '#0087af', '#0087d7', '#0087ff', '#00af00', '#00af5f', '#00af87', '#00afaf', '#00afd7', '#00afff', '#00d700', '#00d75f', '#00d787', '#00d7af', '#00d7d7', '#00d7ff', '#00ff00', '#00ff5f', diff --git a/addons/xterm-addon-webgl/src/tsconfig.json b/addons/xterm-addon-webgl/src/tsconfig.json index 00134015..27ce9ec9 100644 --- a/addons/xterm-addon-webgl/src/tsconfig.json +++ b/addons/xterm-addon-webgl/src/tsconfig.json @@ -12,17 +12,29 @@ "removeComments": true, "baseUrl": ".", "paths": { - "common/*": [ "../../../src/common/*" ], - "browser/*": [ "../../../src/browser/*" ] + "common/*": [ + "../../../src/common/*" + ], + "browser/*": [ + "../../../src/browser/*" + ] }, - "strict": true + "strict": true, + "types": [ + "../../../node_modules/@types/mocha", + "../../../out-test/api/TestUtils" + ] }, "include": [ "./**/*", "../../../typings/xterm.d.ts" ], "references": [ - { "path": "../../../src/common" }, - { "path": "../../../src/browser" } + { + "path": "../../../src/common" + }, + { + "path": "../../../src/browser" + } ] } diff --git a/test/api/tsconfig.json b/test/api/tsconfig.json index 2bd0a92b..a3a31e9f 100644 --- a/test/api/tsconfig.json +++ b/test/api/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "lib": [ "dom", - "es6", + "es6" ], "rootDir": ".", "outDir": "../../out-test/api", @@ -12,6 +12,8 @@ "sourceMap": true, "removeComments": true, "pretty": true, + "declaration": true, + "composite": true, "strict": true }, "include": [