hololake-system-architecture/product-source/hololake-platform/src/utils/sheetExternalReferences.test.ts

54 lines
2.4 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
extractSheetExternalCellReferences,
extractSheetExternalFrontmatterReferences,
extractSheetExternalReferenceTargets,
hasSheetExternalFrontmatterReferences,
isExternalFormulaInput,
shiftExternalFormulaReferences,
} from './sheetExternalReferences'
describe('sheetExternalReferences', () => {
it('detects formula inputs with sheet wikilink cell references', () => {
expect(isExternalFormulaInput('=[[revenue]].B2')).toBe(true)
expect(isExternalFormulaInput('=[[device]].power.watts')).toBe(true)
expect(isExternalFormulaInput(' [[revenue]].B2')).toBe(false)
expect(isExternalFormulaInput('[[revenue]].B2')).toBe(false)
})
it('extracts canonical targets and A1 addresses', () => {
expect(extractSheetExternalCellReferences('=[[folder/revenue|Revenue]].$B$12+[[costs]].C3')).toEqual([
{ address: 'B12', target: 'folder/revenue' },
{ address: 'C3', target: 'costs' },
])
})
it('extracts canonical targets and frontmatter property paths', () => {
expect(extractSheetExternalFrontmatterReferences('=[[device.md]].power.watts+[[project-alpha|Project]].status')).toEqual([
{ path: ['power', 'watts'], propertyPath: 'power.watts', target: 'device.md' },
{ path: ['status'], propertyPath: 'status', target: 'project-alpha' },
])
})
it('keeps cell references out of frontmatter property extraction', () => {
expect(hasSheetExternalFrontmatterReferences({ value: '=[[revenue]].B2+[[revenue]].$B$2' })).toBe(false)
expect(extractSheetExternalReferenceTargets('=[[device]].power.watts+[[revenue]].B2')).toEqual([
'revenue',
'device',
])
})
it('shifts relative references while preserving absolute row and column markers', () => {
expect(shiftExternalFormulaReferences('=[[revenue]].B2+[[revenue]].$C$3+[[revenue]].D$4+[[revenue]].$E5', 2, 1))
.toBe('=[[revenue]].C4+[[revenue]].$C$3+[[revenue]].E$4+[[revenue]].$E7')
})
it('leaves frontmatter property references unchanged when shifting formulas', () => {
expect(shiftExternalFormulaReferences('=[[device]].power.watts+[[revenue]].B2', 2, 1))
.toBe('=[[device]].power.watts+[[revenue]].C4')
})
it('leaves references unchanged when a relative shift would leave the sheet bounds', () => {
expect(shiftExternalFormulaReferences('=[[revenue]].A1', -1, 0)).toBe('=[[revenue]].A1')
})
})