58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
|
|
import { test } from 'vitest'
|
|
|
|
import { createTerminalOutputGate } from './terminal-output-gate'
|
|
|
|
test('holds the initial shell prompt until the renderer attaches', () => {
|
|
const events: string[] = []
|
|
|
|
const gate = createTerminalOutputGate({
|
|
onExitFlushed: () => events.push('cleanup'),
|
|
sendData: data => events.push(`data:${data}`),
|
|
sendExit: payload => events.push(`exit:${payload.code}`)
|
|
})
|
|
|
|
gate.data('$ ')
|
|
assert.deepEqual(events, [])
|
|
|
|
gate.attach()
|
|
assert.deepEqual(events, ['data:$ '])
|
|
|
|
gate.data('pwd\r\n')
|
|
assert.deepEqual(events, ['data:$ ', 'data:pwd\r\n'])
|
|
})
|
|
|
|
test('flushes buffered output before an early shell exit', () => {
|
|
const events: string[] = []
|
|
|
|
const gate = createTerminalOutputGate({
|
|
onExitFlushed: () => events.push('cleanup'),
|
|
sendData: data => events.push(`data:${data}`),
|
|
sendExit: payload => events.push(`exit:${payload.code}:${payload.signal}`)
|
|
})
|
|
|
|
gate.data('startup failed\r\n')
|
|
gate.exit({ code: 1, signal: null })
|
|
assert.deepEqual(events, [])
|
|
|
|
gate.attach()
|
|
assert.deepEqual(events, ['data:startup failed\r\n', 'exit:1:null', 'cleanup'])
|
|
})
|
|
|
|
test('attach is idempotent and never replays startup output twice', () => {
|
|
const events: string[] = []
|
|
|
|
const gate = createTerminalOutputGate({
|
|
onExitFlushed: () => events.push('cleanup'),
|
|
sendData: data => events.push(`data:${data}`),
|
|
sendExit: payload => events.push(`exit:${payload.code}`)
|
|
})
|
|
|
|
gate.data('$ ')
|
|
gate.attach()
|
|
gate.attach()
|
|
|
|
assert.deepEqual(events, ['data:$ '])
|
|
})
|