test(ime): run the native IBus E2E suite across four input engines

The native suite only ever exercised ibus-hangul, so every non-Korean IME
regression had to be caught by hand. Generalize the runner and spec over an
engine profile and add ibus-libpinyin (Pinyin), ibus-anthy (Romaji/kana) and
ibus-unikey (Telex) as matrix legs, covering the candidate-window, multi-commit
and rule-based rewriting shapes that Hangul alone does not produce.

Session config (apt package, GSettings, `ibus engine` name) and the keystroke
scripts live in separate files because one is loaded by the Node runner and the
other by the Playwright spec. They are joined only by the engine id, so the
contract test asserts the two sets agree and that the workflow matrix covers
exactly them.

Only the hangul expectations have been recorded from a real run. The other three
engines' committed glyphs are predicted from their input rules, so the exact-text
oracle is `expect.soft` for them while the structural oracle stays hard: every
repetition must produce identical bytes, in the engine's script, with xterm's
onData matching what the PTY received. That is the half that actually detects
the duplication and leaked-ASCII bugs, and it holds without knowing the glyphs.
A first green run turns each `expectationsVerified` to true.

fail-fast is off so a drifting libpinyin candidate cannot mask a hangul
regression, and evidence uploads are per-engine because upload-artifact rejects
a duplicate name.
This commit is contained in:
Neil
2026-08-01 21:47:23 -07:00
parent c801b88762
commit 985ec6d74c
7 changed files with 426 additions and 122 deletions
+21 -5
View File
@@ -10,10 +10,26 @@ permissions:
jobs:
linux-x11:
name: Linux X11 terminal IME
name: Linux X11 terminal IME (${{ matrix.engine }})
runs-on: ubuntu-22.04
timeout-minutes: 25
strategy:
# Each engine is its own signal. A libpinyin candidate drifting must not
# hide a hangul regression, which is the one leg with recorded
# expectations.
fail-fast: false
matrix:
include:
- engine: hangul
apt-package: ibus-hangul
- engine: libpinyin
apt-package: ibus-libpinyin
- engine: anthy
apt-package: ibus-anthy
- engine: unikey
apt-package: ibus-unikey
steps:
- name: Checkout
uses: actions/checkout@v6
@@ -28,7 +44,7 @@ jobs:
dbus-x11
dconf-gsettings-backend
ibus
ibus-hangul
${{ matrix.apt-package }}
libglib2.0-bin
python3
xdotool
@@ -64,16 +80,16 @@ jobs:
tests/e2e/terminal-ime-exact-byte.spec.ts
--workers=1
- name: Run native IBus Hangul exact-byte tests
- name: Run native IBus ${{ matrix.engine }} exact-byte tests
env:
SKIP_BUILD: '1'
run: pnpm run test:e2e:terminal-ime-native
run: pnpm run test:e2e:terminal-ime-native -- --engine=${{ matrix.engine }}
- name: Upload terminal IME evidence
if: always()
uses: actions/upload-artifact@v7
with:
name: terminal-ime-evidence
name: terminal-ime-evidence-${{ matrix.engine }}
path: test-results/
retention-days: 7
if-no-files-found: ignore