diff --git a/src/Buffer.test.ts b/src/Buffer.test.ts index 2ad86b22..153b6f15 100644 --- a/src/Buffer.test.ts +++ b/src/Buffer.test.ts @@ -7,20 +7,12 @@ import { assert } from 'chai'; import { ITerminal } from './Types'; import { Buffer, DEFAULT_ATTR, CHAR_DATA_CHAR_INDEX } from './Buffer'; import { CircularList } from './common/CircularList'; -import { MockTerminal } from './utils/TestUtils.test'; +import { MockTerminal, TestTerminal } from './utils/TestUtils.test'; import { BufferLine } from './BufferLine'; -import { Terminal } from './Terminal'; const INIT_COLS = 80; const INIT_ROWS = 24; -class TestTerminal extends Terminal { - writeSync(data: string): void { - this.writeBuffer.push(data); - this._innerWrite(); - } -} - describe('Buffer', () => { let terminal: ITerminal; let buffer: Buffer; @@ -355,12 +347,14 @@ describe('Buffer', () => { assert.equal(str3, '😁a'); }); }); - describe('stringIndexToBufferIndex', function(): void { + describe('stringIndexToBufferIndex', () => { let terminal: TestTerminal; - beforeEach(function(): void { + + beforeEach(() => { terminal = new TestTerminal({rows: 5, cols: 10}); }); - it('multiline ascii', function(): void { + + it('multiline ascii', () => { const input = 'This is ASCII text spanning multiple lines.'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -370,7 +364,8 @@ describe('Buffer', () => { assert.deepEqual([(i / terminal.cols) | 0, i % terminal.cols], bufferIndex); } }); - it('combining e\u0301 in a sentence', function(): void { + + it('combining e\u0301 in a sentence', () => { const input = 'Sitting in the cafe\u0301 drinking coffee.'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -389,7 +384,8 @@ describe('Buffer', () => { assert.deepEqual([((i - 1) / terminal.cols) | 0, (i - 1) % terminal.cols], bufferIndex); } }); - it('multiline combining e\u0301', function(): void { + + it('multiline combining e\u0301', () => { const input = 'e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -400,7 +396,8 @@ describe('Buffer', () => { assert.deepEqual([((i >> 1) / terminal.cols) | 0, (i >> 1) % terminal.cols], bufferIndex); } }); - it('surrogate char in a sentence', function(): void { + + it('surrogate char in a sentence', () => { const input = 'The 𝄞 is a clef widely used in modern notation.'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -419,7 +416,8 @@ describe('Buffer', () => { assert.deepEqual([((i - 1) / terminal.cols) | 0, (i - 1) % terminal.cols], bufferIndex); } }); - it('multiline surrogate char', function(): void { + + it('multiline surrogate char', () => { const input = '𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -430,7 +428,8 @@ describe('Buffer', () => { assert.deepEqual([((i >> 1) / terminal.cols) | 0, (i >> 1) % terminal.cols], bufferIndex); } }); - it('surrogate char with combining', function(): void { + + it('surrogate char with combining', () => { // eye of Ra with acute accent - string length of 3 const input = '𓂀\u0301 - the eye hiroglyph with an acute accent.'; terminal.writeSync(input); @@ -444,7 +443,8 @@ describe('Buffer', () => { assert.deepEqual([((i - 2) / terminal.cols) | 0, (i - 2) % terminal.cols], bufferIndex); } }); - it('multiline surrogate with combining', function(): void { + + it('multiline surrogate with combining', () => { const input = '𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -455,7 +455,8 @@ describe('Buffer', () => { assert.deepEqual([(((i / 3) | 0) / terminal.cols) | 0, ((i / 3) | 0) % terminal.cols], bufferIndex); } }); - it('fullwidth chars', function(): void { + + it('fullwidth chars', () => { const input = 'These 123 are some fat numbers.'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -473,7 +474,8 @@ describe('Buffer', () => { assert.deepEqual([((i + 3) / terminal.cols) | 0, (i + 3) % terminal.cols], bufferIndex); } }); - it('multiline fullwidth chars', function(): void { + + it('multiline fullwidth chars', () => { const input = '12345678901234567890'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -483,7 +485,8 @@ describe('Buffer', () => { assert.deepEqual([((i << 1) / terminal.cols) | 0, (i << 1) % terminal.cols], bufferIndex); } }); - it('fullwidth combining with emoji - match emoji cell', function(): void { + + it('fullwidth combining with emoji - match emoji cell', () => { const input = 'Lots of ¥\u0301 make me 😃.'; terminal.writeSync(input); const s = terminal.buffer.contents(true).toArray()[0]; @@ -492,7 +495,8 @@ describe('Buffer', () => { const bufferIndex = terminal.buffer.stringIndexToBufferIndex(0, stringIndex); assert(terminal.buffer.lines.get(bufferIndex[0]).get(bufferIndex[1])[CHAR_DATA_CHAR_INDEX], '😃'); }); - it('multiline fullwidth chars with offset 1 (currently tests for broken behavior)', function(): void { + + it('multiline fullwidth chars with offset 1 (currently tests for broken behavior)', () => { const input = 'a12345678901234567890'; // the 'a' at the beginning moves all fullwidth chars one to the right // now the end of the line contains a dangling empty cell since diff --git a/src/Linkifier.test.ts b/src/Linkifier.test.ts index 32b4ee3b..35610acb 100644 --- a/src/Linkifier.test.ts +++ b/src/Linkifier.test.ts @@ -7,10 +7,9 @@ import { assert } from 'chai'; import { IMouseZoneManager, IMouseZone } from './ui/Types'; import { ILinkMatcher, ITerminal, IBufferLine } from './Types'; import { Linkifier } from './Linkifier'; -import { MockBuffer, MockTerminal } from './utils/TestUtils.test'; +import { MockBuffer, MockTerminal, TestTerminal } from './utils/TestUtils.test'; import { CircularList } from './common/CircularList'; import { BufferLine } from './BufferLine'; -import { Terminal } from './Terminal'; class TestLinkifier extends Linkifier { constructor(terminal: ITerminal) { @@ -239,23 +238,20 @@ describe('Linkifier', () => { }); }); }); - describe('unicode handling', function(): void { + describe('unicode handling', () => { + let terminal: TestTerminal; + // other than the tests above unicode testing needs the full terminal instance // to get the special handling of fullwidth, surrogate and combining chars in the input handler - beforeEach(function(): void { - terminal = new Terminal({cols: 10, rows: 5}); - const oldWrite: any = terminal.write.bind(terminal); - terminal.write = (s: string): void => { - oldWrite(s); - (terminal as any)._innerWrite(); - }; + beforeEach(() => { + terminal = new TestTerminal({cols: 10, rows: 5}); linkifier = new TestLinkifier(terminal); mouseZoneManager = new TestMouseZoneManager(); linkifier.attachToDom(mouseZoneManager); }); function assertLinkifiesInTerminal(rowText: string, linkMatcherRegex: RegExp, links: {x1: number, y1: number, x2: number, y2: number}[], done: MochaDone): void { - terminal.write(rowText); + terminal.writeSync(rowText); linkifier.registerLinkMatcher(linkMatcherRegex, () => {}); linkifier.linkifyRows(); // Allow linkify to happen @@ -271,7 +267,7 @@ describe('Linkifier', () => { }, 0); } - describe('unicode before the match', function(): void { + describe('unicode before the match', () => { it('combining - match within one line', function(done: () => void): void { assertLinkifiesInTerminal('e\u0301e\u0301e\u0301 foo', /foo/, [{x1: 4, x2: 7, y1: 0, y2: 0}], done); }); @@ -303,7 +299,7 @@ describe('Linkifier', () => { assertLinkifiesInTerminal('¥\u0301¥\u0301 foo', /foo/, [{x1: 8, x2: 1, y1: 0, y2: 1}], done); }); }); - describe('unicode within the match', function(): void { + describe('unicode within the match', () => { it('combining - match within one line', function(done: () => void): void { assertLinkifiesInTerminal('test cafe\u0301', /cafe\u0301/, [{x1: 5, x2: 9, y1: 0, y2: 0}], done); }); diff --git a/src/Types.ts b/src/Types.ts index 5652f135..5782f2c9 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -271,6 +271,7 @@ export interface ITerminalOptions extends IPublicTerminalOptions { export interface IBufferStringIterator { hasNext(): boolean; next(withRanges: boolean): string | [{first: number, last: number}, string]; + toArray(): string[]; } export interface IBuffer { diff --git a/src/utils/TestUtils.test.ts b/src/utils/TestUtils.test.ts index 6fa0c87a..40a93ded 100644 --- a/src/utils/TestUtils.test.ts +++ b/src/utils/TestUtils.test.ts @@ -9,6 +9,14 @@ import { ICircularList, XtermListener } from '../common/Types'; import { Buffer } from '../Buffer'; import * as Browser from '../shared/utils/Browser'; import { ITheme, IDisposable, IMarker } from 'xterm'; +import { Terminal } from '../Terminal'; + +export class TestTerminal extends Terminal { + writeSync(data: string): void { + this.writeBuffer.push(data); + this._innerWrite(); + } +} export class MockTerminal implements ITerminal { markers: IMarker[];