/** @vitest-environment jsdom */ import { describe, it, expect, beforeEach } from 'vitest'; import { useTabs } from '../../apps/desktop/src/renderer/features/tabs/tab-store'; beforeEach(() => { localStorage.clear(); useTabs.setState({ tabs: [], activeId: null }); }); describe('M8 多标签与会话恢复 (FR-T)', () => { it('openTab 新建标签,重复路径激活已有', () => { useTabs.getState().openTab('a.md'); useTabs.getState().openTab('b.md'); expect(useTabs.getState().tabs.length).toBe(2); const aId = useTabs.getState().tabs[0].id; useTabs.getState().openTab('a.md'); expect(useTabs.getState().tabs.length).toBe(2); // 不重复 expect(useTabs.getState().activeId).toBe(aId); }); it('togglePin 固定标签排前', () => { useTabs.getState().openTab('a.md'); useTabs.getState().openTab('b.md'); useTabs.getState().togglePin(useTabs.getState().tabs[1].id); // 固定 b expect(useTabs.getState().tabs[0].path).toBe('b.md'); expect(useTabs.getState().tabs[0].pinned).toBe(true); }); it('closeTab 切到相邻', () => { useTabs.getState().openTab('a.md'); useTabs.getState().openTab('b.md'); useTabs.getState().openTab('c.md'); const bId = useTabs.getState().tabs[1].id; useTabs.getState().setActive(bId); useTabs.getState().closeTab(bId); expect(useTabs.getState().tabs.length).toBe(2); expect(useTabs.getState().activeId).not.toBe(bId); }); it('会话恢复:persist 后 restore 恢复标签列表与激活页', () => { useTabs.getState().openTab('x.md'); useTabs.getState().openTab('y.md'); useTabs.getState().persist(); // 模拟重启:清空后 restore useTabs.setState({ tabs: [], activeId: null }); useTabs.getState().restore(); expect(useTabs.getState().tabs.length).toBe(2); expect(useTabs.getState().tabs.some(t => t.path === 'x.md')).toBe(true); }); });