WuYongJie 5821d73291 初始提交:3D家具安装展示系统
包含:
- furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画)
- autocad-plugin:AutoCAD 家具导出插件源码
- 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:00:19 +08:00

74 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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