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', ]) }) })