From 04cc4817d29110eb03a5f3bf3db2639936b216d5 Mon Sep 17 00:00:00 2001 From: Le Vivilet Date: Wed, 24 Jun 2026 13:57:03 +0200 Subject: [PATCH 1/3] feature: improve xterm test input --- .../parts/TestFrameWork/ConditionValues.ts | 14 ++++ .../parts/TestFrameWork/KeyBoardActions.ts | 69 ++++++++++++++++++- .../ViewletTerminal2/ViewletTerminal2.ts | 6 ++ .../test/ViewletTerminal2.test.ts | 13 +++- 4 files changed, 99 insertions(+), 3 deletions(-) diff --git a/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts b/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts index 3f5102d4..9901a75e 100644 --- a/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts +++ b/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts @@ -14,6 +14,20 @@ export const toHaveText = (locator) => { } } +export const toContainText = (locator) => { + const element = QuerySelector.querySelectorOne(locator._parsed) + if (!element) { + return { + actual: '', + wasFound: false, + } + } + return { + actual: element.textContent, + wasFound: true, + } +} + export const toHaveAttribute = (locator, { key, value }) => { const element = QuerySelector.querySelectorOne(locator._parsed) if (!element) { diff --git a/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts b/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts index dc087d2c..dac82f94 100644 --- a/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts +++ b/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts @@ -1,8 +1,73 @@ import * as ElementActions from './ElementActions.ts' +const keyCodeMap = { + ' ': { code: 'Space', keyCode: 32 }, + '.': { code: 'Period', keyCode: 190 }, + '>': { code: 'Period', keyCode: 190, shiftKey: true }, + Enter: { code: 'Enter', keyCode: 13 }, + Space: { code: 'Space', key: ' ', keyCode: 32 }, +} + +const getKeyboardOptions = (options) => { + const key = options.key || '' + const normalizedKey = key === 'Space' ? ' ' : key + if (keyCodeMap[key]) { + const mapped = keyCodeMap[key] + const keyCode = mapped.keyCode + return { + ...options, + ...mapped, + key: mapped.key || normalizedKey, + which: keyCode, + } + } + if (normalizedKey.length === 1) { + const upper = normalizedKey.toUpperCase() + const keyCode = upper.charCodeAt(0) + const code = /[A-Z]/.test(upper) ? `Key${upper}` : `Digit${upper}` + return { + ...options, + code, + key: normalizedKey, + keyCode, + which: keyCode, + } + } + return options +} + +const isXtermTextArea = (element) => { + return element instanceof HTMLTextAreaElement && element.classList.contains('xterm-helper-textarea') +} + +const getPrintableKey = (options) => { + if (options.key === 'Space') { + return ' ' + } + if (options.key?.length === 1) { + return options.key + } + return '' +} + export const press = (options) => { const element = document.activeElement + const text = getPrintableKey(options) + if (isXtermTextArea(element) && text) { + element.value = text + element.dispatchEvent( + new InputEvent('input', { + bubbles: true, + cancelable: true, + data: text, + inputType: 'insertText', + }), + ) + element.value = '' + return + } + const keyboardOptions = getKeyboardOptions(options) - ElementActions.keyDown(element, options) - ElementActions.keyUp(element, options) + ElementActions.keyDown(element, keyboardOptions) + ElementActions.keyUp(element, keyboardOptions) } diff --git a/packages/renderer-process/src/parts/ViewletTerminal2/ViewletTerminal2.ts b/packages/renderer-process/src/parts/ViewletTerminal2/ViewletTerminal2.ts index 611bb7a4..3a641830 100644 --- a/packages/renderer-process/src/parts/ViewletTerminal2/ViewletTerminal2.ts +++ b/packages/renderer-process/src/parts/ViewletTerminal2/ViewletTerminal2.ts @@ -64,6 +64,12 @@ export const handleMouseDown = (state) => { focus(state) } +export const attachEvents = (state) => { + state.$Viewlet.addEventListener('mousedown', () => { + handleMouseDown(state) + }) +} + export const dispose = (state) => { for (const disposable of state.disposables) { disposable.dispose() diff --git a/packages/renderer-process/test/ViewletTerminal2.test.ts b/packages/renderer-process/test/ViewletTerminal2.test.ts index 07dc6a1e..40667bff 100644 --- a/packages/renderer-process/test/ViewletTerminal2.test.ts +++ b/packages/renderer-process/test/ViewletTerminal2.test.ts @@ -93,9 +93,20 @@ test('write', () => { expect(terminal.written).toEqual([data]) }) -test('dispose', () => { +test('attachEvents focuses terminal on mousedown', () => { const state = ViewletTerminal2.create() ViewletTerminal2.setTerminal(state, 3) + ViewletTerminal2.attachEvents(state) + const terminal = terminalInstances.at(-1)! + + state.$Viewlet.dispatchEvent(new MouseEvent('mousedown')) + + expect(terminal.focused).toBe(true) +}) + +test('dispose', () => { + const state = ViewletTerminal2.create() + ViewletTerminal2.setTerminal(state, 4) const terminal = terminalInstances.at(-1)! ViewletTerminal2.dispose(state) expect(terminal.disposed).toBe(true) From 3133e2bf938f0f319e2d2c5052f48ddea98b99a7 Mon Sep 17 00:00:00 2001 From: Le Vivilet Date: Wed, 24 Jun 2026 16:23:08 +0200 Subject: [PATCH 2/3] fix keyboard action active element types --- .../src/parts/TestFrameWork/KeyBoardActions.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts b/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts index dac82f94..ee3fc8ae 100644 --- a/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts +++ b/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts @@ -36,7 +36,7 @@ const getKeyboardOptions = (options) => { return options } -const isXtermTextArea = (element) => { +const isXtermTextArea = (element: Element | null): element is HTMLTextAreaElement => { return element instanceof HTMLTextAreaElement && element.classList.contains('xterm-helper-textarea') } @@ -52,6 +52,9 @@ const getPrintableKey = (options) => { export const press = (options) => { const element = document.activeElement + if (!element) { + return + } const text = getPrintableKey(options) if (isXtermTextArea(element) && text) { element.value = text From bd6973e51be5607f73fcd511cbb032d22e8a0ace Mon Sep 17 00:00:00 2001 From: Le Vivilet Date: Thu, 25 Jun 2026 22:09:42 +0200 Subject: [PATCH 3/3] fix: resolve xterm test lint errors --- .../src/parts/TestFrameWork/ConditionValues.ts | 18 ++++++------------ .../src/parts/TestFrameWork/KeyBoardActions.ts | 2 +- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts b/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts index 9901a75e..9a3285c7 100644 --- a/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts +++ b/packages/renderer-process/src/parts/TestFrameWork/ConditionValues.ts @@ -1,6 +1,6 @@ import * as QuerySelector from './QuerySelector.ts' -export const toHaveText = (locator) => { +const getElementText = (locator) => { const element = QuerySelector.querySelectorOne(locator._parsed) if (!element) { return { @@ -14,18 +14,12 @@ export const toHaveText = (locator) => { } } +export const toHaveText = (locator) => { + return getElementText(locator) +} + export const toContainText = (locator) => { - const element = QuerySelector.querySelectorOne(locator._parsed) - if (!element) { - return { - actual: '', - wasFound: false, - } - } - return { - actual: element.textContent, - wasFound: true, - } + return getElementText(locator) } export const toHaveAttribute = (locator, { key, value }) => { diff --git a/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts b/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts index ee3fc8ae..cbc97853 100644 --- a/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts +++ b/packages/renderer-process/src/parts/TestFrameWork/KeyBoardActions.ts @@ -23,7 +23,7 @@ const getKeyboardOptions = (options) => { } if (normalizedKey.length === 1) { const upper = normalizedKey.toUpperCase() - const keyCode = upper.charCodeAt(0) + const keyCode = upper.codePointAt(0) const code = /[A-Z]/.test(upper) ? `Key${upper}` : `Digit${upper}` return { ...options,