74 lines
2.9 KiB
TypeScript
74 lines
2.9 KiB
TypeScript
import { describe, expect, it } from '@jest/globals'
|
||
import { mapPanelsToModelNodes } from '@/lib/panel-node-mapper'
|
||
|
||
function createPanels(gltfNodeNames: string[]) {
|
||
return gltfNodeNames.map((gltfNodeName, index) => ({
|
||
id: `panel-db-${index + 1}`,
|
||
gltfNodeName,
|
||
}))
|
||
}
|
||
|
||
describe('panel-node-mapper', () => {
|
||
it('应识别全局 +1 编号偏移,避免 panel_001 错绑到最后一个节点', () => {
|
||
const panels = createPanels(['panel_000', 'panel_001', 'panel_002', 'panel_003'])
|
||
const modelNodes = ['Board_1', 'Board_2', 'Board_3', 'Board_4']
|
||
|
||
const result = mapPanelsToModelNodes(panels, modelNodes)
|
||
|
||
expect(result.usedNumericOffset).toBe(1)
|
||
expect(result.panelResolvedNodeNameById.get('panel-db-1')).toBe('Board_1')
|
||
expect(result.panelResolvedNodeNameById.get('panel-db-2')).toBe('Board_2')
|
||
expect(result.panelResolvedNodeNameById.get('panel-db-3')).toBe('Board_3')
|
||
expect(result.panelResolvedNodeNameById.get('panel-db-4')).toBe('Board_4')
|
||
expect(result.unresolvedPanelIds).toEqual([])
|
||
expect(result.hasFallbackAssignments).toBe(false)
|
||
})
|
||
|
||
it('应保持一对一映射,不产生重复节点绑定', () => {
|
||
const panels = createPanels(Array.from({ length: 49 }, (_, index) => `panel_${String(index).padStart(3, '0')}`))
|
||
const modelNodes = Array.from({ length: 49 }, (_, index) => `Board_${index + 1}`)
|
||
|
||
const result = mapPanelsToModelNodes(panels, modelNodes)
|
||
const resolvedNodes = Array.from(result.panelResolvedNodeNameById.values())
|
||
|
||
expect(result.panelResolvedNodeNameById.size).toBe(49)
|
||
expect(new Set(resolvedNodes).size).toBe(49)
|
||
expect(result.hasAmbiguousMappings).toBe(false)
|
||
})
|
||
|
||
it('应优先使用精确名称匹配,再处理其余节点', () => {
|
||
const panels = createPanels(['Board_2', 'panel_001'])
|
||
const modelNodes = ['Board_1', 'Board_2']
|
||
|
||
const result = mapPanelsToModelNodes(panels, modelNodes)
|
||
|
||
expect(result.panelResolvedNodeNameById.get('panel-db-1')).toBe('Board_2')
|
||
expect(result.panelResolvedNodeNameById.get('panel-db-2')).toBe('Board_1')
|
||
expect(result.hasFallbackAssignments).toBe(false)
|
||
})
|
||
|
||
it('在节点不足时应标记 unresolved,且只做可确定映射', () => {
|
||
const panels = createPanels(['panel_001', 'panel_002'])
|
||
const modelNodes = ['Board_1']
|
||
|
||
const result = mapPanelsToModelNodes(panels, modelNodes)
|
||
|
||
expect(result.panelResolvedNodeNameById.size).toBe(1)
|
||
expect(result.unresolvedPanelIds.length).toBe(1)
|
||
})
|
||
|
||
it('不应把无法确认的板材顺序兜底映射到轮子或五金节点', () => {
|
||
const panels = createPanels(['panel_001', 'panel_002', 'panel_003'])
|
||
const modelNodes = ['wheel_left', 'caster_01', 'hardware_bracket']
|
||
|
||
const result = mapPanelsToModelNodes(panels, modelNodes)
|
||
|
||
expect(result.panelResolvedNodeNameById.size).toBe(0)
|
||
expect(result.unresolvedPanelIds).toEqual([
|
||
'panel-db-1',
|
||
'panel-db-2',
|
||
'panel-db-3',
|
||
])
|
||
})
|
||
})
|