Files

77 lines
2.5 KiB
TypeScript
Raw Permalink Normal View History

2023-08-27 08:08:42 -07:00
/**
* Copyright (c) 2017 The xterm.js authors. All rights reserved.
* @license MIT
*/
import { test } from '@playwright/test';
import { createTestContext, ITestContext, openTerminal, pollFor } from './TestUtils';
let ctx: ITestContext;
test.beforeAll(async ({ browser }) => {
ctx = await createTestContext(browser);
await openTerminal(ctx);
});
test.afterAll(async () => await ctx.page.close());
test.beforeEach(async () => await ctx.proxy.reset());
2023-09-02 09:11:15 -07:00
test.describe('CharWidth Integration Tests', () => {
2023-08-27 08:08:42 -07:00
test.describe('getStringCellWidth', () => {
test('ASCII chars', async () => {
await ctx.proxy.write('This is just ASCII text.#');
await pollFor(ctx.page, () => sumWidths(0, 1, '#'), 25);
});
test('combining chars', async () => {
await ctx.proxy.write('e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301e\u0301#');
await pollFor(ctx.page, () => sumWidths(0, 1, '#'), 10);
});
test('surrogate chars', async () => {
await ctx.proxy.write('𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞#');
await pollFor(ctx.page, () => sumWidths(0, 1, '#'), 28);
});
test('surrogate combining chars', async () => {
await ctx.proxy.write('𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301𓂀\u0301#');
await pollFor(ctx.page, () => sumWidths(0, 1, '#'), 12);
});
test('fullwidth chars', async () => {
await ctx.proxy.write('1234567890#');
await pollFor(ctx.page, () => sumWidths(0, 1, '#'), 21);
});
test('fullwidth chars offset 1', async () => {
await ctx.proxy.write('a1234567890#');
await pollFor(ctx.page, () => sumWidths(0, 1, '#'), 22);
});
// TODO: multiline tests once #1685 is resolved
});
});
async function sumWidths(start: number, end: number, sentinel: string): Promise<number> {
await ctx.page.evaluate(`
(function() {
window.result = 0;
const buffer = window.term.buffer.active;
for (let i = ${start}; i < ${end}; i++) {
const line = buffer.getLine(i);
let j = 0;
while (true) {
const cell = line.getCell(j++);
if (!cell) {
break;
}
window.result += cell.getWidth();
if (cell.getChars() === '${sentinel}') {
return;
}
}
}
})();
`);
return await ctx.page.evaluate(`window.result`);
}