diff --git a/addons/xterm-addon-web-links/test/WebLinksAddon.api.ts b/addons/xterm-addon-web-links/test/WebLinksAddon.api.ts index 9bcda0a5..44d09c95 100644 --- a/addons/xterm-addon-web-links/test/WebLinksAddon.api.ts +++ b/addons/xterm-addon-web-links/test/WebLinksAddon.api.ts @@ -36,8 +36,41 @@ describe('WebLinksAddon', () => { await testHostName('foo.io'); }); - it.skip('correct buffer offsets', async () => { - // TODO: test strings in test_weblinks.sh automatically + describe('correct buffer offsets & uri', () => { + it('all half width', async () => { + setupCustom(); + await writeSync(page, 'aaa http://example.com aaa http://example.com aaa'); + await resetAndHover(5, 1); + await evalData('http://example.com', { start: { x: 5, y: 1 }, end: { x: 22, y: 1 } }); + await resetAndHover(1, 2); + await evalData('http://example.com', { start: { x: 28, y: 1 }, end: { x: 5, y: 2 } }); + }); + it('url after full width', async () => { + setupCustom(); + await writeSync(page, '¥¥¥ http://example.com ¥¥¥ http://example.com aaa'); + await resetAndHover(8, 1); + await evalData('http://example.com', { start: { x: 8, y: 1 }, end: { x: 25, y: 1 } }); + await resetAndHover(1, 2); + await evalData('http://example.com', { start: { x: 34, y: 1 }, end: { x: 11, y: 2 } }); + }); + it('full width within url and before', async () => { + setupCustom(); + await writeSync(page, '¥¥¥ https://ko.wikipedia.org/wiki/위키백과:대문 aaa https://ko.wikipedia.org/wiki/위키백과:대문 ¥¥¥'); + await resetAndHover(8, 1); + await evalData('https://ko.wikipedia.org/wiki/위키백과:대문', { start: { x: 8, y: 1 }, end: { x: 11, y: 2 } }); + await resetAndHover(1, 2); + await evalData('https://ko.wikipedia.org/wiki/위키백과:대문', { start: { x: 8, y: 1 }, end: { x: 11, y: 2 } }); + await resetAndHover(17, 2); + await evalData('https://ko.wikipedia.org/wiki/위키백과:대문', { start: { x: 17, y: 2 }, end: { x: 19, y: 3 } }); + }); + it('name + password url after full width and combining', async () => { + setupCustom(); + await writeSync(page, '¥¥¥cafe\u0301 http://test:password@example.com/some_path'); + await resetAndHover(12, 1); + await evalData('http://test:password@example.com/some_path', { start: { x: 12, y: 1 }, end: { x: 13, y: 2 } }); + await resetAndHover(13, 2); + await evalData('http://test:password@example.com/some_path', { start: { x: 12, y: 1 }, end: { x: 13, y: 2 } }); + }); }); }); @@ -68,3 +101,23 @@ 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 setupCustom(): Promise { + await openTerminal(page, { cols: 40 }); + await page.evaluate(`window._customLinkData = []; +window._linkaddon = new window.WebLinksAddon(); +window._linkaddon._options.hover = (event, uri, range) => { window._customLinkData.push([uri, range]); }; +window.term.loadAddon(window._linkaddon);`); +} + +async function resetAndHover(col: number, row: number): Promise { + await page.evaluate(`window._customLinkData = [];`); + const rowSelector = `.xterm-rows > :nth-child(${row})`; + await page.hover(`${rowSelector} > :nth-child(${col})`); +} + +async function evalData(uri: string, range: any): Promise { + const data: any[] = await page.evaluate(`window._customLinkData[0]`); + assert.equal(data[0], uri); + assert.deepEqual(data[1], range); +}