import { describe, expect, it } from 'vitest'; import { deriveDirectProjectTurnStatus } from '../src/view/project-development/chat/controller/useDirectProjectTurnStatus'; import type { DirectChatTurn } from '../src/view/project-development/chat/conversation/directTurnPresentation'; const turn = (key: string, state: DirectChatTurn['state']): DirectChatTurn => ({ key, users: [], process: [], finals: [], state, startedAt: 1_800_000_000_000, endedAt: 0, }); describe('DirectProject 回合状态派生', () => { it('displayBusy 是原生真相与本地命令在飞的并集', () => { expect( deriveDirectProjectTurnStatus({ turnRunning: true, turnBusy: false, turns: [], }).displayBusy, ).toBe(true); expect( deriveDirectProjectTurnStatus({ turnRunning: false, turnBusy: true, turns: [], }).displayBusy, ).toBe(true); expect( deriveDirectProjectTurnStatus({ turnRunning: false, turnBusy: false, turns: [], }).displayBusy, ).toBe(false); }); it('两个来源各自独立暴露,不被并集吃掉', () => { const status = deriveDirectProjectTurnStatus({ turnRunning: true, turnBusy: true, turns: [], }); expect(status.nativeRunning).toBe(true); expect(status.commandInFlight).toBe(true); }); it('latestTurnState 取最新一轮的三态;没有回合时为 null', () => { expect( deriveDirectProjectTurnStatus({ turnRunning: false, turnBusy: false, turns: [turn('u1', 'finished'), turn('u2', 'awaiting-start')], }).latestTurnState, ).toBe('awaiting-start'); expect( deriveDirectProjectTurnStatus({ turnRunning: false, turnBusy: false, turns: [], }).latestTurnState, ).toBeNull(); }); it('本地命令在飞不等于原生在跑', () => { const status = deriveDirectProjectTurnStatus({ turnRunning: false, turnBusy: true, turns: [turn('u1', 'awaiting-start')], }); expect(status.nativeRunning).toBe(false); expect(status.latestTurnState).toBe('awaiting-start'); }); });