Files
Aislo/resources/tester/test_crs_identify.py
T
eomsangdonandClaude Opus 5 0ef32b5279 chore(tester): 시험을 resources/tester/ 로 옮김 — 창끼리 건너가게
⚠ **뿌리** — `tmp/` 는 창 사이에 안 건너감(실측 확인: 상대 창이 놓은 `tmp/_sync_probe.txt`
가 시간을 두고 두 번 봐도 안 보임). 그래서 **정본(등록부 스키마)만 건너가고 그것을 읽는
시험은 안 건너가** 오늘 두 번, 같은 시험이 **연 창은 통과·받은 창은 실패**가 됐음.

- `tmp/tests/*` 를 `resources/tester/` 로 **복사**(127 파일). 내용은 **한 줄도 안 고침**
- `tmp/tests` 는 **남겨 둠** — 되돌릴 자리(사용자 지시)
- 실행: `./venv/Scripts/python.exe -m pytest resources/tester/ -q`
  옮기기 전과 **같은 수**: 617 통과 / 22 건너뜀 / 실패 0

⇒ 이제 시험·예외·까닭이 **정본과 함께** 움직임. 오늘 세운 「예외는 정본 스키마에」와 짝임.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 17:12:30 +09:00

74 lines
3.0 KiB
Python

# -*- coding: utf-8 -*-
"""PRJ 좌표계 판별(common_util_crs) — 실제 원청 PRJ로 확인한다.
`0d90595a`가 노린 두 실패 사례를 그대로 태운다.
① COMPD_CS(수직 지오이드 결합) — `CRS.to_epsg()`가 None을 준다.
② EPSG AUTHORITY가 없는 ESRI WKT — 파라미터 지문으로만 가릴 수 있다.
"""
import io
import sys
from pathlib import Path
import pytest
from pyproj import CRS
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT))
from common_util.common_util_crs import crs_input_from_prj, identify_epsg # noqa: E402
COMPOUND_PRJ = next(ROOT.glob("storage/*/*/*/B03_FileInput/input/prj/result.prj"), None)
ESRI_PRJ = next(
ROOT.glob("resources/knowledge/original/실무문서/**/*중심선(EPSG5176).prj"), None
)
def _read(path: Path) -> str:
return io.open(path, encoding="utf-8", errors="replace").read().strip()
@pytest.mark.skipif(COMPOUND_PRJ is None, reason="프로젝트 저장소에 PRJ 표본이 없다")
def test_수직결합_PRJ는_수평성분_EPSG로_판별된다():
"""KGD2002 / East Belt 2010 + KNGeoid24 — to_epsg()는 None이지만 5187로 가려야 한다."""
text = _read(COMPOUND_PRJ)
crs = CRS.from_user_input(text)
assert crs.to_epsg() is None # 판별 사다리가 필요한 이유
assert identify_epsg(crs, text) == 5187
assert crs_input_from_prj(text) == "EPSG:5187"
@pytest.mark.skipif(ESRI_PRJ is None, reason="실무문서 PRJ 표본이 없다")
def test_AUTHORITY_없는_ESRI_WKT도_판별된다():
"""Korean_1985_Modified_Korea_East_Belt — 파일명이 EPSG5176임을 근거로 삼는다."""
text = _read(ESRI_PRJ)
crs = CRS.from_user_input(text)
assert identify_epsg(crs, text) == 5176
assert crs_input_from_prj(text) == "EPSG:5176"
def test_불량_입력은_None을_돌려준다():
"""차단은 WKT 자체가 불량일 때만 — 라벨 실패는 차단 사유가 아니다."""
assert crs_input_from_prj("이건 WKT가 아니다") is None
assert crs_input_from_prj(" ") is None
assert crs_input_from_prj("") is None
def test_TOWGS84_보정이_박힌_WKT는_원문을_돌려준다():
"""EPSG로 갈아타면 파일의 지역 보정이 사라지므로 WKT 원문을 그대로 써야 한다."""
wkt = (
'PROJCS["Korea 2000 / East Belt 2010",'
'GEOGCS["Korea 2000",DATUM["Korea_2000",'
'SPHEROID["GRS 1980",6378137,298.257222101],'
"TOWGS84[-115.8,474.99,674.11,1.16,-2.31,-1.63,6.43]],"
'PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],'
'PROJECTION["Transverse_Mercator"],'
'PARAMETER["latitude_of_origin",38],PARAMETER["central_meridian",129],'
'PARAMETER["scale_factor",1],PARAMETER["false_easting",200000],'
'PARAMETER["false_northing",600000],UNIT["metre",1]]'
)
got = crs_input_from_prj(wkt)
assert got is not None
assert not got.startswith("EPSG:") # 라벨로 갈아타지 않는다
assert "TOWGS84" in got # 보정 모수가 살아 있다