import { act, renderHook } from '@testing-library/react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { useWorkbenchChrome } from './useWorkbenchChrome'; beforeEach(() => localStorage.clear()); describe('工作台界面状态组合', () => { it('布局预设保持侧栏状态,控制预设打开控制工具', () => { const root = { current: document.createElement('div') }; const { result } = renderHook(() => useWorkbenchChrome(root)); act(() => result.current.applyLayoutPreset('viewport')); expect([result.current.leftOpen, result.current.rightOpen]).toEqual([false, false]); act(() => result.current.applyLayoutPreset('project')); expect([result.current.leftOpen, result.current.rightOpen]).toEqual([true, false]); act(() => result.current.applyLayoutPreset('control')); expect([result.current.leftOpen, result.current.rightOpen]).toEqual([false, true]); expect(result.current.workspaceTool).toBe('controls'); act(() => result.current.applyLayoutPreset('default')); expect([result.current.leftOpen, result.current.rightOpen]).toEqual([true, true]); }); it('显示工具自动打开右栏,沿用传感器相机、力与角度的初始值', () => { const root = { current: document.createElement('div') }; const { result } = renderHook(() => useWorkbenchChrome(root)); act(() => result.current.applyLayoutPreset('viewport')); act(() => result.current.showWorkspaceTool('data')); expect(result.current.workspaceTool).toBe('data'); expect(result.current.rightOpen).toBe(true); expect(result.current.showSensorCamera).toBe(true); expect(result.current.forceScale).toBe(50); expect(result.current.angleUnit).toBe('rad'); }); it('全屏请求失败不冒泡,卸载移除全屏监听', async () => { const root = { current: document.createElement('div') }; root.current.requestFullscreen = vi.fn(() => Promise.reject(new Error('浏览器拒绝'))); const remove = vi.spyOn(document, 'removeEventListener'); const { result, unmount } = renderHook(() => useWorkbenchChrome(root)); await act(async () => result.current.toggleFullscreen()); expect(root.current.requestFullscreen).toHaveBeenCalledOnce(); unmount(); expect(remove).toHaveBeenCalledWith('fullscreenchange', expect.any(Function)); remove.mockRestore(); }); });