import { describe, expect, it } from 'vitest' import { findTerminalByTabLabel, focusedTerminal, FocusedTerminalTracker } from './terminalTabs' const t371 = { name: 'issue-371-测试' } const t257 = { name: 'issue-257-实施 (feature/billing)' } const t37 = { name: 'issue-37-测试' } const terminals = [t37, t371, t257] describe('findTerminalByTabLabel', () => { it('精确匹配优先', () => { expect(findTerminalByTabLabel(terminals, 'issue-371-测试')).toBe(t371) }) it('tab label 被 OSC title 追加后缀时按前缀匹配', () => { expect(findTerminalByTabLabel(terminals, 'issue-371-测试 (main)')).toBe(t371) }) it('terminal name 带后缀而 label 是原名时也能匹配', () => { expect(findTerminalByTabLabel(terminals, 'issue-257-实施')).toBe(t257) }) it('issue-37 不会误配 issue-371', () => { expect(findTerminalByTabLabel(terminals, 'issue-37-测试')).toBe(t37) }) it('找不到返回 undefined', () => { expect(findTerminalByTabLabel(terminals, 'Project Dashboard')).toBeUndefined() }) }) describe('focusedTerminal', () => { const isTerminal = (input: unknown): boolean => input === 'terminal' it('活动 tab 是终端 → 解析出对应终端', () => { expect(focusedTerminal({ label: 'issue-371-测试', input: 'terminal' }, isTerminal, terminals)).toBe(t371) }) it('活动 tab 不是终端(看板 webview)→ undefined', () => { expect(focusedTerminal({ label: 'Superpowers Kanban', input: 'webview' }, isTerminal, terminals)).toBeUndefined() }) it('没有活动 tab → undefined', () => { expect(focusedTerminal(undefined, isTerminal, terminals)).toBeUndefined() }) }) describe('focusedTerminalTracker', () => { it('只开一个终端 tab:点回看板再点回该 tab 要再次触发', () => { const tracker = new FocusedTerminalTracker<{ name: string }>() expect(tracker.sync(t371)).toBe(t371) expect(tracker.sync(undefined)).toBeUndefined() expect(tracker.sync(t371)).toBe(t371) }) it('同一终端重复上报(label 改写)不触发', () => { const tracker = new FocusedTerminalTracker<{ name: string }>() expect(tracker.sync(t371)).toBe(t371) expect(tracker.sync(t371)).toBeUndefined() expect(tracker.sync(t371)).toBeUndefined() }) it('在终端之间切换触发新终端', () => { const tracker = new FocusedTerminalTracker<{ name: string }>() expect(tracker.sync(t371)).toBe(t371) expect(tracker.sync(t257)).toBe(t257) expect(tracker.sync(t371)).toBe(t371) }) it('焦点离开终端不触发', () => { const tracker = new FocusedTerminalTracker<{ name: string }>() tracker.sync(t371) expect(tracker.sync(undefined)).toBeUndefined() }) })