pipe-district-selftest.mjs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import assert from "node:assert/strict"
  2. import { readFileSync } from "node:fs"
  3. const SRC = "../../../../../src/modules/cockpit/"
  4. const { toPipeNetwork, filterPipeNetwork, pipeDistrictOf, PIPE_DISTRICT_PREFIX } = await import(SRC + "domain/pipeNetwork.js")
  5. // ---- 1) 真实载荷:前缀与名称(独立信号)逐条对照
  6. const raw = JSON.parse(readFileSync(new URL("./geom-none.json", import.meta.url), "utf8"))
  7. const network = toPipeNetwork(raw.data)
  8. const all = [...network.pipes, ...network.components]
  9. console.log("pipes:", network.pipes.length, "components:", network.components.length, "blocked:", network.blocked.length)
  10. let checked = 0
  11. const mismatch = []
  12. for (const item of all) {
  13. const word = { 0: "城南", 1: "城北", 2: "太常" }[item.district]
  14. if (!word) continue
  15. checked += 1
  16. if (!String(item.name).includes(word)) mismatch.push(item.code + "/" + item.name + "/" + word)
  17. }
  18. console.log("derived district checked:", checked, "mismatch:", mismatch.length, mismatch.slice(0, 3))
  19. assert.equal(mismatch.length, 0, "编码前缀推出的片区与名称里的片区词不一致")
  20. const unresolved = all.filter((r) => r.district === null).map((r) => r.code)
  21. console.log("unresolved codes:", unresolved)
  22. // ---- 2) 过滤语义
  23. const south = filterPipeNetwork(network, { scope: "south" })
  24. const north = filterPipeNetwork(network, { scope: "north" })
  25. const taichang = filterPipeNetwork(network, { scope: "taichang" })
  26. const unassigned = filterPipeNetwork(network, { scope: "unassigned" })
  27. const everywhere = filterPipeNetwork(network, { scope: "all" })
  28. console.log("south pipes:", south.pipes.length, "taichang pipes:", taichang.pipes.length, "north pipes:", north.pipes.length)
  29. console.log("districtApplied:", { south: south.districtApplied, all: everywhere.districtApplied })
  30. console.log("unresolvedCount south:", south.districtUnresolvedCount, "unassigned objects:",
  31. unassigned.pipes.length + unassigned.components.length)
  32. assert.equal(south.districtApplied, true)
  33. assert.equal(everywhere.districtApplied, false)
  34. assert.equal(south.pipes.length + taichang.pipes.length, network.pipes.length - 0 + 0 + (network.pipes.filter(p => p.district === null).length))
  35. assert.equal(north.pipes.length, 0, "现网编码里没有城北前缀")
  36. assert.equal(unassigned.pipes.length + unassigned.components.length, unresolved.length)
  37. // ---- 3) 行业 × 片区 正交
  38. const gasTc = filterPipeNetwork(network, { industry: "gas", scope: "taichang" })
  39. const onlyGas = filterPipeNetwork(network, { industry: "gas", scope: "all" })
  40. const onlyTc = filterPipeNetwork(network, { scope: "taichang" })
  41. console.log("gas:", onlyGas.pipes.length + onlyGas.components.length, "taichang:", onlyTc.pipes.length + onlyTc.components.length, "gas∩taichang:", gasTc.pipes.length + gasTc.components.length)
  42. assert.ok(gasTc.pipes.every((p) => p.industry === "GAS" && p.district === 2))
  43. console.log("SELFTEST PASS")