test: make road compiler fixtures self contained
This commit is contained in:
@@ -147,6 +147,11 @@ cp config/examples/template.json config/areas/my-area.json
|
|||||||
| `junctionTemplates.clusters[].cornerRadiusMeters` | `12`(4–25) | 仅 `complex-junction-v1`:相邻进口夹角处路缘圆角的半径。圆角切于两侧最外道路边缘,只补齐夹角处的路面,不改变 connector、信号或停止线。 |
|
| `junctionTemplates.clusters[].cornerRadiusMeters` | `12`(4–25) | 仅 `complex-junction-v1`:相邻进口夹角处路缘圆角的半径。圆角切于两侧最外道路边缘,只补齐夹角处的路面,不改变 connector、信号或停止线。 |
|
||||||
| `junctionTemplates.clusters[].outerRadiusExtraMeters` | `18`(18–35) | 仅 `complex-junction-v1`:路口中心到外部进口交接边界的额外半径。用于让圆角包住角部斑马线;未配置时保持原有 18 m。 |
|
| `junctionTemplates.clusters[].outerRadiusExtraMeters` | `18`(18–35) | 仅 `complex-junction-v1`:路口中心到外部进口交接边界的额外半径。用于让圆角包住角部斑马线;未配置时保持原有 18 m。 |
|
||||||
|
|
||||||
|
`junctionTemplates.references[*].referenceFile` 与
|
||||||
|
`junctionTemplates.clusters[*].referenceFile` 是唯一允许相对写法的路径:相对当前
|
||||||
|
`config/areas/<id>.json` 解析。`readAreaConfig()` 会先将其规范化为绝对路径,再通过
|
||||||
|
`toRoadCompilerInput()` 传入 road compiler;包内不得自行解析相对路径或读取配置文件。
|
||||||
|
|
||||||
### `v2xPreview`
|
### `v2xPreview`
|
||||||
|
|
||||||
这是 Cesium 验证预览的可选实时叠加层,不进入发布的 `package/`。默认值:
|
这是 Cesium 验证预览的可选实时叠加层,不进入发布的 `package/`。默认值:
|
||||||
|
|||||||
@@ -66,14 +66,14 @@
|
|||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] AC1.1 两个有效区域 `road-parity --compare` 对 Phase 0 基线全绿
|
- [x] AC1.1 两个有效区域 `road-parity --compare` 对 Phase 0 基线全绿
|
||||||
- [ ] AC1.2 `npm run test:native-road`、`npm run test:road-workbench` 通过
|
- [x] AC1.2 `npm run test:native-road`、`npm run test:road-workbench` 通过
|
||||||
- [ ] AC1.3 `npm run build:area` 枫树二路完整跑通(含 blender / cesium 阶段)
|
- [x] AC1.3 `npm run build:area` 枫树二路完整跑通(含 blender / cesium 阶段)
|
||||||
- [ ] AC1.4 `grep -rn "area-config\|config/areas" packages/road-compiler/` 无命中
|
- [x] AC1.4 `grep -rn "area-config\|config/areas" packages/road-compiler/` 无命中
|
||||||
- [ ] AC1.5 `packages/road-compiler/` 内 `npm test` 不访问宿主 `inputs/` 或 `outputs/`
|
- [x] AC1.5 `packages/road-compiler/` 内 `npm test` 不访问宿主 `inputs/` 或 `outputs/`
|
||||||
- [ ] AC1.6 `scripts/lib/` 下无搬迁文件的残留副本
|
- [x] AC1.6 `scripts/lib/` 下无搬迁文件的残留副本
|
||||||
- [ ] AC1.7 K1 的「函数 × 使用方」矩阵已产出并归档到 `research/`
|
- [x] AC1.7 K1 的「函数 × 使用方」矩阵已产出并归档到 `research/`
|
||||||
- [ ] AC1.8 `compiled.json` 结构未变(父任务 AC7 / C1)
|
- [x] AC1.8 `compiled.json` 结构未变(父任务 AC7 / C1)
|
||||||
|
|
||||||
## 依赖与顺序
|
## 依赖与顺序
|
||||||
|
|
||||||
|
|||||||
1
packages/road-compiler/test/fixtures/fengshu-junction-reference.geojson
vendored
Normal file
1
packages/road-compiler/test/fixtures/fengshu-junction-reference.geojson
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -164,12 +164,13 @@ assert.equal(clusterApproaches.filter((feature) => feature.properties.kind === "
|
|||||||
assert.ok(clusterApproachGeometry.diagnostics.some((item) => item.rule === "complex-junction-insufficient-nodes"));
|
assert.ok(clusterApproachGeometry.diagnostics.some((item) => item.rule === "complex-junction-insufficient-nodes"));
|
||||||
assert.equal(clusterApproachGeometry.intersectionSurface.features.length, 0);
|
assert.equal(clusterApproachGeometry.intersectionSurface.features.length, 0);
|
||||||
|
|
||||||
const fengshuOsm = fs.readFileSync(path.join(__dirname, "..", "inputs", "osm", "枫树二路.osm"), "utf8");
|
const fixtureDir = path.join(__dirname, "..", "packages", "road-compiler", "test", "fixtures");
|
||||||
|
const fengshuOsm = fs.readFileSync(path.join(fixtureDir, "fengshu-er-road.osm"), "utf8");
|
||||||
const fengshuModel = compileRoadModel(fengshuOsm, empty);
|
const fengshuModel = compileRoadModel(fengshuOsm, empty);
|
||||||
const fengshuCluster = {
|
const fengshuCluster = {
|
||||||
id: "zhushanhu-fengshu-complex",
|
id: "zhushanhu-fengshu-complex",
|
||||||
template: "complex-junction-v1",
|
template: "complex-junction-v1",
|
||||||
referenceFile: path.join(__dirname, "..", "inputs", "osm", "珠山湖大道(枫树二路)口.geojson"),
|
referenceFile: path.join(fixtureDir, "fengshu-junction-reference.geojson"),
|
||||||
approachWidthMultiplier: 1.45,
|
approachWidthMultiplier: 1.45,
|
||||||
approachLengthMeters: 32,
|
approachLengthMeters: 32,
|
||||||
coreRadiusMeters: 28,
|
coreRadiusMeters: 28,
|
||||||
@@ -187,7 +188,7 @@ assert.equal(fengshuConfiguredSidewalks.length, 2, "sidewalk overrides on comple
|
|||||||
const fengshuConfiguredCore = fengshuSidewalkGeometry.roadSurface.features.find((feature) => feature.properties.kind === "complex-core");
|
const fengshuConfiguredCore = fengshuSidewalkGeometry.roadSurface.features.find((feature) => feature.properties.kind === "complex-core");
|
||||||
assert.ok(fengshuConfiguredSidewalks.every((feature) => !ringsOverlap(feature.geometry.coordinates[0], fengshuConfiguredCore.geometry.coordinates[0])), "configured sidewalks stop at the complex-junction handoff instead of entering its core");
|
assert.ok(fengshuConfiguredSidewalks.every((feature) => !ringsOverlap(feature.geometry.coordinates[0], fengshuConfiguredCore.geometry.coordinates[0])), "configured sidewalks stop at the complex-junction handoff instead of entering its core");
|
||||||
assert.equal(fengshuSidewalkGeometry.sidewalkSurface.features.filter((feature) => feature.properties.provenance === "native-road-sidewalk-corner/v1" && fengshuCluster.nodeIds.includes(String(feature.properties.osm_node_id))).length, 0, "ordinary sidewalk corners are not generated at member nodes of a complex junction");
|
assert.equal(fengshuSidewalkGeometry.sidewalkSurface.features.filter((feature) => feature.properties.provenance === "native-road-sidewalk-corner/v1" && fengshuCluster.nodeIds.includes(String(feature.properties.osm_node_id))).length, 0, "ordinary sidewalk corners are not generated at member nodes of a complex junction");
|
||||||
const genericComplexSource = fs.readFileSync(path.join(__dirname, "lib", "complex-junction.js"), "utf8");
|
const genericComplexSource = fs.readFileSync(path.join(__dirname, "..", "packages", "road-compiler", "src", "compile", "complex-junction.js"), "utf8");
|
||||||
assert.doesNotMatch(genericComplexSource, /8005332807|8024512135|8024512145|8024512147|858770823|珠山湖|枫树二路/, "complex junction generator must not contain sample-specific identifiers");
|
assert.doesNotMatch(genericComplexSource, /8005332807|8024512135|8024512145|8024512147|858770823|珠山湖|枫树二路/, "complex junction generator must not contain sample-specific identifiers");
|
||||||
const renamedCluster = { ...fengshuCluster, id: "generic-complex-validation-cluster" };
|
const renamedCluster = { ...fengshuCluster, id: "generic-complex-validation-cluster" };
|
||||||
const renamedGeometry = compileGeometry(fengshuModel, empty, { edgeLines: false, junctionTemplates: { enabled: true, references: [], clusters: [renamedCluster] } });
|
const renamedGeometry = compileGeometry(fengshuModel, empty, { edgeLines: false, junctionTemplates: { enabled: true, references: [], clusters: [renamedCluster] } });
|
||||||
|
|||||||
Reference in New Issue
Block a user