import type { Model } from '@ironcalc/workbook' import { describe, expect, it, vi } from 'vitest' import { buildTolariaSheetClipboardPayload, shiftedClipboardCellInput, writeTolariaSheetClipboard, } from './sheetClipboard' import { SHEET_INDEX } from './sheetWorkbook' function makeClipboardData(): DataTransfer { const values = new Map() return { clearData: vi.fn((type?: string) => { if (type) { values.delete(type) } else { values.clear() } }), dropEffect: 'none', effectAllowed: 'uninitialized', files: [] as unknown as FileList, getData: vi.fn((type: string) => values.get(type) ?? ''), items: [] as unknown as DataTransferItemList, setData: vi.fn((type: string, value: string) => values.set(type, value)), setDragImage: vi.fn(), types: [] as unknown as readonly string[], } } function makeModel(cells: Record): Model { return { getCellContent: (_sheet: number, row: number, column: number) => cells[`${row}:${column}`] ?? '', getSelectedView: () => ({ column: 1, left_column: 1, range: [1, 1, 1, 1], row: 1, sheet: SHEET_INDEX, top_row: 1, }), } as unknown as Model } describe('sheet clipboard', () => { it('copies regular formulas as formula text in plain clipboard formats', () => { const payload = buildTolariaSheetClipboardPayload( makeModel({ '1:1': '=B2+C2' }), '/vault/budget.md', 'copy', new Map(), ) expect(payload?.cells).toEqual([['=B2+C2']]) if (!payload) throw new Error('Expected formula copy to build a clipboard payload') const clipboardData = makeClipboardData() writeTolariaSheetClipboard(clipboardData, payload) expect(clipboardData.getData('text/plain')).toBe('=B2+C2') expect(clipboardData.getData('text/csv')).toBe('=B2+C2') }) it('copies external formula sources even when the workbook cell contains the evaluated value', () => { const formula = '=C15*[[refactoring-newsletter-model-assumptions]].C19' const payload = buildTolariaSheetClipboardPayload( makeModel({ '1:1': '$23,527' }), '/vault/business-plan.md', 'copy', new Map([['A1', { evaluated: '$23,527', source: formula }]]), ) expect(payload?.cells).toEqual([[formula]]) if (!payload) throw new Error('Expected external formula copy to build a clipboard payload') const clipboardData = makeClipboardData() writeTolariaSheetClipboard(clipboardData, payload) expect(clipboardData.getData('text/plain')).toBe(formula) }) it('shifts local and external formula references when pasting copied formulas', () => { const payload = { action: 'copy' as const, cells: [['=C15*[[assumptions]].C19+A$1+$B2+$C$3']], source: { column: 3, height: 1, path: '/vault/model.md', row: 10, width: 1, }, type: 'tolaria-sheet-clipboard' as const, version: 1, } expect(shiftedClipboardCellInput(payload.cells[0]![0]!, { columnOffset: 0, destinationColumn: 4, destinationRow: 11, payload, rowOffset: 0, })).toBe('=D16*[[assumptions]].D20+B$1+$B3+$C$3') }) })