80 lines
3.0 KiB
TypeScript
80 lines
3.0 KiB
TypeScript
/**
|
|
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
|
|
* @license MIT
|
|
*/
|
|
|
|
import { TestTerminal } from './utils/TestUtils.test';
|
|
import { assert } from 'chai';
|
|
import { getStringCellWidth } from './CharWidth';
|
|
import { IBuffer } from './Types';
|
|
import { CHAR_DATA_WIDTH_INDEX, CHAR_DATA_CHAR_INDEX } from './Buffer';
|
|
|
|
|
|
describe('getStringCellWidth', function(): void {
|
|
let terminal: TestTerminal;
|
|
|
|
beforeEach(() => {
|
|
terminal = new TestTerminal({rows: 5, cols: 30});
|
|
});
|
|
|
|
function sumWidths(buffer: IBuffer, start: number, end: number, sentinel: string): number {
|
|
let result = 0;
|
|
for (let i = start; i < end; ++i) {
|
|
const line = buffer.lines.get(i);
|
|
for (let j = 0; j < line.length; ++j) { // TODO: change to trimBorder with multiline
|
|
const ch = line.get(j);
|
|
result += ch[CHAR_DATA_WIDTH_INDEX];
|
|
// return on sentinel
|
|
if (ch[CHAR_DATA_CHAR_INDEX] === sentinel) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
it('ASCII chars', function(): void {
|
|
const input = 'This is just ASCII text.#';
|
|
terminal.writeSync(input);
|
|
const s = terminal.buffer.iterator(true).next().content;
|
|
assert.equal(input, s);
|
|
assert.equal(getStringCellWidth(s), sumWidths(terminal.buffer, 0, 1, '#'));
|
|
});
|
|
it('combining chars', function(): void {
|
|
const input = 'e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301#';
|
|
terminal.writeSync(input);
|
|
const s = terminal.buffer.iterator(true).next().content;
|
|
assert.equal(input, s);
|
|
assert.equal(getStringCellWidth(s), sumWidths(terminal.buffer, 0, 1, '#'));
|
|
});
|
|
it('surrogate chars', function(): void {
|
|
const input = '𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞#';
|
|
terminal.writeSync(input);
|
|
const s = terminal.buffer.iterator(true).next().content;
|
|
assert.equal(input, s);
|
|
assert.equal(getStringCellWidth(s), sumWidths(terminal.buffer, 0, 1, '#'));
|
|
});
|
|
it('surrogate combining chars', function(): void {
|
|
const input = '𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301#';
|
|
terminal.writeSync(input);
|
|
const s = terminal.buffer.iterator(true).next().content;
|
|
assert.equal(input, s);
|
|
assert.equal(getStringCellWidth(s), sumWidths(terminal.buffer, 0, 1, '#'));
|
|
});
|
|
it('fullwidth chars', function(): void {
|
|
const input = '1234567890#';
|
|
terminal.writeSync(input);
|
|
const s = terminal.buffer.iterator(true).next().content;
|
|
assert.equal(input, s);
|
|
assert.equal(getStringCellWidth(s), sumWidths(terminal.buffer, 0, 1, '#'));
|
|
});
|
|
it('fullwidth chars offset 1', function(): void {
|
|
const input = 'a1234567890#';
|
|
terminal.writeSync(input);
|
|
const s = terminal.buffer.iterator(true).next().content;
|
|
assert.equal(input, s);
|
|
assert.equal(getStringCellWidth(s), sumWidths(terminal.buffer, 0, 1, '#'));
|
|
});
|
|
// TODO: multiline tests once #1685 is resolved
|
|
});
|