Replace the legacy terminal flow with a shared authenticated WebSocket runtime used across web, desktop, relay, and mobile surfaces. - introduce the v3 terminal protocol with scoped attachments, snapshots, ordered output, bounded replay history, reconnects, and explicit lifecycle - harden PTY creation, restart, resize, close, force-kill, idle cleanup, shell selection, login mode, environment sanitization, and appearance sync - add runtime-aware terminal APIs with relay authentication and Electron parity - add a fullscreen mobile terminal workspace with touch scrolling, long-press selection, safe-area controls, quick keys, and Ctrl/Alt input - add terminal selection attachments, preview detection, project actions, shell settings, and localized UI - harden Ghostty rendering, resize recovery, Unicode handling, block characters, line height, and stale-row behavior - remove the obsolete terminal SSE path and update reverse-proxy guidance - expand terminal runtime, transport, input, selection, and store coverage - avoid duplicate web builds when preparing mobile assets in root CI builds
24 lines
936 B
TypeScript
24 lines
936 B
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
import {
|
|
getTerminalCellFromPoint,
|
|
getTerminalWordRange,
|
|
} from './terminalTouchSelection';
|
|
|
|
describe('terminal touch selection', () => {
|
|
test('maps touch points to clamped terminal cells', () => {
|
|
const bounds = { left: 20, top: 40, width: 800, height: 240 };
|
|
|
|
expect(getTerminalCellFromPoint(425, 165, bounds, 80, 24)).toEqual({ column: 40, row: 12 });
|
|
expect(getTerminalCellFromPoint(-100, 500, bounds, 80, 24)).toEqual({ column: 0, row: 23 });
|
|
expect(getTerminalCellFromPoint(20, 40, { ...bounds, width: 0 }, 80, 24)).toBeNull();
|
|
});
|
|
|
|
test('selects the non-whitespace token around a long press', () => {
|
|
expect(getTerminalWordRange(Array.from(' /projects/openchamber '), 10)).toEqual({
|
|
startColumn: 2,
|
|
endColumn: 22,
|
|
});
|
|
expect(getTerminalWordRange(Array.from('foo bar'), 3)).toEqual({ startColumn: 3, endColumn: 3 });
|
|
});
|
|
});
|