Files
Aislo/resources/tester/test_624_4b_plan_lidar_ui.py
T
eomsangdonandClaude Opus 5.5 92fdf334b2 feat(D03): 예정노선 지형 칩 라이다 · LAS 올리기 — 칩 바꾸면 급경사 · 음영 · 0차곡 · 높이 다시 받음 (PLAN 624-4 화면 · 요구 530 · 531)
- 새 D03_PlanAnalysis_UI_LidarUpload — 공용 칩(안 고침) + 라이다 없으면 [LAS 올리기](부품 단추 · LAS · LAZ · .prj) · 진행 = 위치 칸 서클 「라이다」 · 고른 원천 = 세션 d03-terrain(등록부 한 줄)
- 공용 겹 받기 fetchPlanRaster · fetchPlanZeroOrder 에 terrain 인자(안 넘김 = 옛 그대로 · B05 영향 없음)
- 겹 reterrain = 지형 겹 셋만 비우고 다시 · 높이 = 고른 원천 격자(라이다 범위 밖 = 빈칸)
- 지도는 지형 칸을 넘겨받기만 · 낡은 시험 둘(475 · 624_2)은 글 대조 줄만 새 꼴로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 21:15:14 +09:00

73 lines
3.8 KiB
Python

"""624-4 화면 — 예정노선 지형 칩 라이다 · LAS 올리기(요구 530 · 531).
· 칩 = 예정노선 지형 칸(`UI_LidarUpload`)이 만듦 · 공용 칩 안 그대로 · 지도는 넘겨받기만
· 라이다 없음 = 「라이다」 숨기고 [LAS 올리기](부품 단추 · 파일 고르기) · 진행 = 위치 칸 서클 하나
· 고른 원천 = 세션 등록부 `d03-terrain`(draft · project) · 겹 급경사 · 음영 · 0차곡 = `terrain=` · 높이 = 원천 격자
· 원천 바뀜 = 지형 겹 셋만 비우고 다시
./venv/Scripts/python.exe -m pytest resources/tester/test_624_4b_plan_lidar_ui.py -q
"""
from __future__ import annotations
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
D03 = ROOT / "D03_PlanAnalysis"
def _read(path: Path) -> str:
return path.read_text(encoding="utf-8")
def test_chip_made_by_plan_terrain() -> None:
ui_map = _read(D03 / "D03_PlanAnalysis_UI_Map.ts")
assert "createTerrainChip" not in ui_map and "terrain: events.terrain," in ui_map
lidar = _read(D03 / "D03_PlanAnalysis_UI_LidarUpload.ts")
assert "onChange: (next) => void choose(next)" in lidar
assert 'chip.setHave(ready ? ["sheet", "lidar"] : ["sheet"])' in lidar
chip = _read(ROOT / "A00_Common" / "map" / "map_terrain_chip.ts")
assert "onChange?: (value: TerrainSource) => void;" in chip # 칩 꼴 그대로
def test_upload_uses_parts_and_one_circle() -> None:
lidar = _read(D03 / "D03_PlanAnalysis_UI_LidarUpload.ts")
assert 'label: "LAS 올리기"' in lidar and "createButton({" in lidar
assert 'pickFiles({ accept: ".las,.laz,.prj", multiple: true }' in lidar
assert 'createElement("button")' not in lidar and 'createElement("input")' not in lidar
assert "createProgressCircle" not in lidar # 서클 = 위치 칸 하나(604-3)
assert 'label: "라이다"' in lidar and "work.track(follow())" in lidar
assert 'lidarItem.style.display = !ready && editable ? "none" : ""' in lidar
api = _read(D03 / "D03_PlanAnalysis_Api.ts")
assert "`${API_BASE_URL}${base(projectId)}/lidar`" in api
assert "Promise<{ terrain: PlanJob; lidar: PlanJob }>" in api
def test_source_session_only() -> None:
lidar = _read(D03 / "D03_PlanAnalysis_UI_LidarUpload.ts")
assert 'writeState("d03-terrain", source, projectId)' in lidar
assert "sessionStorage" not in lidar and "localStorage" not in lidar
state = _read(ROOT / "A00_Common" / "b_page_state.ts")
assert '"d03-terrain": { bucket: "draft", scope: "project" },' in state
page = _read(D03 / "D03_PlanAnalysis_UI_Page.ts")
assert "d03-terrain" not in page # 저장 꼴(d03-plan) 그대로
def test_layers_and_heights_follow_source() -> None:
api = _read(ROOT / "A00_Common" / "map" / "map_layer_api.ts")
assert 'terrain ? `&terrain=${terrain}` : ""' in api
assert "/layers/raster?kind=${kind}${terrainQuery(terrain)}" in api
assert "/layers/zero-order?${terrainQuery(terrain).slice(1)}" in api
layers = _read(D03 / "D03_PlanAnalysis_UI_Layers.ts")
assert "fetchPlanRaster(projectId, key, terrain())" in layers
assert 'key === "hillshade" ? terrain() : undefined' in layers # 산사태위험 = 원천 없음
assert "fetchPlanZeroOrder(projectId, terrain())" in layers
body = layers.split("async function reterrain(): Promise<void> {")[1].split("\n }\n")[0]
assert 'for (const key of ["slope", "hillshade", "zeroOrder"] as const)' in body
assert "areaTurn += 1;" in body and "pending.clear();" in body
page = _read(D03 / "D03_PlanAnalysis_UI_Page.ts")
assert "const heights = terrain.surface(surface);" in page
assert "onChange: () => (void backdrop.reterrain(), refresh())," in page
assert "await Promise.all([loadSurface(), terrain.load()]);" in page
assert len(page.splitlines()) < 700 and len(layers.splitlines()) < 683