import assert from 'node:assert/strict' import { planPipeEnhancement } from '../../../src/modules/cockpit/domain/pipeEnhancement.js' import { mountPipeEnhancement } from '../../../src/modules/cockpit/services/threePipeEnhancement.js' import { createPinia, setActivePinia } from 'pinia' import { usePipeEnhancementStore } from '../../../src/modules/cockpit/stores/pipeEnhancementStore.js' const ll = (x, y) => [110 + x / (111320 * Math.cos(28 * Math.PI / 180)), 28 + y / 111320] const main = { code: 'main', industry: 'WATER_SUPPLY', networkId: 'true-id', sourceId: 'source-id', positions: [ll(-100, 0), ll(100, 0)] } const cross = { code: 'cross', industry: 'DRAINAGE', networkLevel: 1, positions: [ll(0, -200), ll(0, 200)] } const nearEnd = { code: 'end', industry: 'GAS', positions: [ll(120, -10), ll(120, 10)] } const far = { code: 'far', industry: 'GAS', positions: [ll(-100, 130), ll(100, 130)] } const frozen = JSON.stringify([main, cross, nearEnd, far]) const input = { selected: { kind: 'pipe', code: 'main' }, visiblePipes: [main, cross, nearEnd, far] } const plan = planPipeEnhancement(input) assert.equal(plan.radiusM, 50) assert.equal(plan.objects.length, 3) assert.equal(plan.objects[0].code, 'main') assert.equal(plan.objects[0].path.length, 2) assert.equal(plan.objects[0].networkId, 'true-id') assert.equal(plan.objects[0].sourceId, 'source-id') const clipped = plan.objects.find((p) => p.code === 'cross') assert.ok(clipped.clipped) assert.ok(Math.abs((clipped.path[0][1] - 28) * 111320 + 50) < 0.01) assert.ok(Math.abs((clipped.path.at(-1)[1] - 28) * 111320 - 50) < 0.01) assert.ok(plan.objects.some((p) => p.code === 'end'), '沿整条管段取邻域,而不是中点圆') assert.equal(JSON.stringify([main, cross, nearEnd, far]), frozen) console.log('PASS 默认50米整条路径邻域、穿越裁切、真实ID与源不变') const small = planPipeEnhancement({ ...input, radiusM: 25 }) assert.equal(small.radiusM, 25) assert.ok(Math.abs((small.objects.find((p) => p.code === 'cross').path[0][1] - 28) * 111320 + 25) < 0.01) assert.equal(planPipeEnhancement({ ...input, radiusM: -1 }).radiusM, 50) const filtered = planPipeEnhancement({ ...input, visiblePipes: [main] }) assert.equal(filtered.objects.length, 1) assert.equal(planPipeEnhancement({ ...input, visiblePipes: [] }).visible, false) console.log('PASS 范围切换、非法范围回默认与筛选移除') const reenter = { code: 'reenter', industry: 'GAS', positions: [ll(-60, 0), ll(-60, 100), ll(60, 100), ll(60, 0)] } const many = planPipeEnhancement({ ...input, visiblePipes: [main, reenter] }) assert.equal(many.objects.filter((p) => p.code === 'reenter').length, 2, '离开再进入必须拆两条,不跨空白连接') console.log('PASS 多段裁切不跨越邻域外空白') const canvas = new EventTarget() const host = { clientWidth: 900, clientHeight: 500, appendChild(node) { node.parentNode = this }, removeChild(node) { node.parentNode = null } } let scene const viewer = mountPipeEnhancement(host, plan, { rendererFactory: () => ({ domElement: canvas, setSize() {}, render(s) { scene = s }, dispose() {} }) }) const root = scene.children.find((n) => n.name === 'pipe-enhancement:main') assert.equal(root.children.length, 3) assert.ok(root.children.find((n) => n.userData.code === 'cross').position.y < 0, '雨水虚拟层位于供水以下') assert.ok(root.children.find((n) => n.userData.code === 'end').position.y > 0, '燃气虚拟层位于供水以上') viewer.destroy() setActivePinia(createPinia()) const store = usePipeEnhancementStore() store.select('pipe', 'main') store.setRadius(100) assert.equal(store.radiusM, 100) store.setRadius('25') assert.equal(store.radiusM, 25) store.clear() assert.equal(store.radiusM, 50) assert.equal(store.selected, null) console.log('PASS 邻域真实渲染对象、虚拟深度层次及Pinia范围切换/清理')