import { MockInstance } from '@vitest/spy'; import { storeToRefs } from 'pinia'; import { useMcadStore } from '@/stores/mcad.store'; import { useMcadMoveTool } from '@/tools/mcad-move.tool'; import { McadObjectInteractionFaker } from '@test/fakers/mcad-object-interaction.faker'; import { InteractionType } from '@3cr/types-ts'; import { flushPromises } from '@vue/test-utils'; import { DataOverlayMcadFaker } from '@test/fakers/data-overlay-mcad.faker'; import { useViewer3cr } from '@/composables/useViewer3cr'; describe('mcad move tool', () => { const viewer3cr = useViewer3cr(); const { event: mcadEvent } = storeToRefs(useMcadStore()); let moveSpy: MockInstance; beforeEach(() => { moveSpy = vi.spyOn(viewer3cr, 'moveMcadObject'); }); afterEach(() => { moveSpy.mockRestore(); }); it('should move via 3cr event', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; mcadEvent.value = McadObjectInteractionFaker.randomRaw( InteractionType.POINTER_UP, ); await flushPromises(); expect(moveSpy).toHaveBeenCalled(); expect(mcadMoveTool.selected.value).not.toBe(null); }); it('should not move via 3cr event', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; mcadEvent.value = McadObjectInteractionFaker.randomRaw( InteractionType.NONE, ); await flushPromises(); expect(moveSpy).not.toHaveBeenCalled(); expect(mcadMoveTool.selected.value).toBe(null); }); it('should move programmatically', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; mcadMoveTool.selected.value = DataOverlayMcadFaker.random(); await flushPromises(); expect(moveSpy).toHaveBeenCalled(); }); it('should deactivate move', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; mcadMoveTool.selected.value = DataOverlayMcadFaker.random(); await flushPromises(); mcadMoveTool.isActive.value = false; await flushPromises(); expect(moveSpy).toHaveBeenCalled(); expect(mcadMoveTool.selected.value).toBeNull(); }); it('should do next prev', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; mcadMoveTool.selected.value = DataOverlayMcadFaker.random(); await flushPromises(); expect(moveSpy).toHaveBeenCalledTimes(1); mcadMoveTool.selected.value = null; await flushPromises(); expect(moveSpy).toHaveBeenCalledTimes(2); }); it('should not do next prev', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; mcadMoveTool.selected.value = DataOverlayMcadFaker.random(); await flushPromises(); expect(moveSpy).toHaveBeenCalledTimes(1); mcadMoveTool.selected.value = null; await flushPromises(); expect(moveSpy).toHaveBeenCalledTimes(2); }); it('should not do next prev', async () => { const mcadMoveTool = useMcadMoveTool(); mcadMoveTool.isActive.value = true; const set = DataOverlayMcadFaker.random(); const set2 = DataOverlayMcadFaker.random(); set2.Id = set.Id; mcadMoveTool.selected.value = set; await flushPromises(); expect(moveSpy).toHaveBeenCalledTimes(1); mcadMoveTool.selected.value = set2; await flushPromises(); expect(moveSpy).toHaveBeenCalledTimes(1); }); });