返回 ViMax
lineMapping.test.ts
根目录 / ui / src / lineMapping.test.ts
1 import assert from 'node:assert/strict';
2 import {applyStreamEvent, createMappingState} from './lineMapping.js';
3 import type {MappingState, WorkspaceLine} from './types.js';
4
5 let lines: WorkspaceLine[] = [];
6 let state: MappingState = createMappingState();
7
8 lines = [...lines, {kind: 'user', text: 'start'}];
9 assert.deepEqual(lines[0], {kind: 'user', text: 'start'});
10
11 ({lines, state} = applyStreamEvent(lines, state, {type: 'token', delta: 'hello'}));
12 ({lines, state} = applyStreamEvent(lines, state, {type: 'token', delta: ' world'}));
13 assert.equal(lines.length, 2);
14 assert.deepEqual(lines[1], {kind: 'assistant', text: 'hello world'});
15
16 ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_start', tool: {name: 'vimax_narrative_planning'}}));
17 ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_progress', tool: {name: 'vimax_narrative_planning'}, progress: {stage: 'running', message: 'planning'}}));
18 ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_result', tool_result: {name: 'vimax_narrative_planning', ok: true}}));
19 assert.equal(lines.at(-3)?.kind, 'tool');
20 assert.equal(lines.at(-2)?.kind, 'tool');
21 assert.deepEqual(lines.at(-1), {kind: 'tool', status: 'done', text: 'tool vimax_narrative_planning done'});
22
23 ({lines, state} = applyStreamEvent(lines, state, {type: 'tool_result', tool_result: {name: 'vimax_narrative_planning', ok: false, content: 'Developing story failed: Request timed out.'}}));
24 assert.deepEqual(lines.at(-1), {kind: 'tool', status: 'error', text: 'tool vimax_narrative_planning error: Developing story failed: Request timed out.'});
25
26 ({lines, state} = applyStreamEvent(lines, state, {type: 'terminal', stream: 'stdout', line: 'render log'}));
27 assert.deepEqual(lines.at(-1), {kind: 'terminal', text: '[stdout]: render log'});
28
29 const lengthBeforeInternalEvents = lines.length;
30 ({lines, state} = applyStreamEvent(lines, state, {type: 'turn', turn_id: 'turn-1'}));
31 ({lines, state} = applyStreamEvent(lines, state, {type: 'status', phase: 'sampling_assistant', message: 'Sampling assistant'}));
32 ({lines, state} = applyStreamEvent(lines, state, {type: 'session', session: {active_session_id: 's1', session: {session_id: 's1', stage: 'narrative_planned', working_dir: '.working_dir/s1'}}}));
33 assert.equal(lines.length, lengthBeforeInternalEvents);
34
35 ({lines, state} = applyStreamEvent(lines, state, {type: 'error', message: 'bad'}));
36 assert.deepEqual(lines.at(-1), {kind: 'error', text: 'bad'});
37
38 ({lines, state} = applyStreamEvent(lines, state, {type: 'done', assistant: 'hello world'}));
39 assert.equal(state.assistantStreaming, false);
40
41 console.log('lineMapping tests passed');
42
42 lines TYPESCRIPT