import { useViewer3cr } from '@/composables/useViewer3cr'; import { isVisible, useNavigationCube } from '@/composables/useNavigationCube'; import { fullscreenView, isFullscreen, isLayout1x3, isLayout2x2, } from '@/models/scanState'; import { ScanView } from '@3cr/types-ts'; import { flushPromises } from '@vue/test-utils'; import { MockInstance } from '@vitest/spy'; describe('useNavigationCube tests', () => { const viewer3cr = useViewer3cr(); const canvas = document.createElement('canvas'); // jsdom does not implement bounds canvas.getBoundingClientRect = vi.fn( () => ({ x: 0, y: 0, width: 100, height: 100 }) as DOMRect, ); let setNavCubeVisibilitySpy: MockInstance; let setNavCubePositionSizeSpy: MockInstance; beforeEach(() => { setNavCubeVisibilitySpy = vi.spyOn(viewer3cr, 'setNavCubeVisibility'); setNavCubePositionSizeSpy = vi.spyOn(viewer3cr, 'setNavCubePositionSize'); }); afterEach(() => { setNavCubeVisibilitySpy.mockRestore(); setNavCubePositionSizeSpy.mockRestore(); }); it('should position correctly for 2x2', async () => { vi.spyOn(isLayout2x2, 'value', 'get').mockReturnValue(true); vi.spyOn(isLayout1x3, 'value', 'get').mockReturnValue(false); vi.spyOn(isFullscreen, 'value', 'get').mockReturnValue(false); const { bounds } = useNavigationCube(canvas); await flushPromises(); expect(isVisible.value).toBe(true); expect(bounds.value).toEqual({ x: -10, y: -10, width: 10, height: 10 }); expect(setNavCubePositionSizeSpy).toHaveBeenCalled(); }); it('should position correctly for 1x3', async () => { vi.spyOn(isLayout2x2, 'value', 'get').mockReturnValue(false); vi.spyOn(isLayout1x3, 'value', 'get').mockReturnValue(true); vi.spyOn(isFullscreen, 'value', 'get').mockReturnValue(false); const { bounds } = useNavigationCube(canvas); await flushPromises(); expect(isVisible.value).toBe(true); expect(bounds.value).toEqual({ x: -10, y: -10, width: 10, height: 10 }); expect(setNavCubePositionSizeSpy).toHaveBeenCalled(); }); it('should position correctly for 2d fullscreen', async () => { vi.spyOn(isLayout2x2, 'value', 'get').mockReturnValue(false); vi.spyOn(isLayout1x3, 'value', 'get').mockReturnValue(false); vi.spyOn(isFullscreen, 'value', 'get').mockReturnValue(true); vi.spyOn(fullscreenView, 'value', 'get').mockReturnValue(ScanView.Sagittal); const { bounds } = useNavigationCube(canvas); await flushPromises(); isVisible.value = false; await flushPromises(); isVisible.value = true; await flushPromises(); expect(isVisible.value).toBe(true); expect(bounds.value).toEqual({ x: -10, y: -10, width: 10, height: 10 }); expect(setNavCubeVisibilitySpy).toHaveBeenCalled(); }); it('should position correctly for 3d fullscreen', async () => { vi.spyOn(isLayout2x2, 'value', 'get').mockReturnValue(false); vi.spyOn(isLayout1x3, 'value', 'get').mockReturnValue(false); vi.spyOn(isFullscreen, 'value', 'get').mockReturnValue(true); vi.spyOn(fullscreenView, 'value', 'get').mockReturnValue(ScanView.Volume); const { bounds } = useNavigationCube(canvas); await flushPromises(); isVisible.value = false; await flushPromises(); isVisible.value = true; await flushPromises(); expect(isVisible.value).toBe(true); expect(bounds.value).toEqual({ x: -10, y: -10, width: 10, height: 10 }); expect(setNavCubeVisibilitySpy).toHaveBeenCalled(); }); });