무슨 일이 있었나 랩탑 줄의 병합 `20ba886c`(Merge origin/main_desktop_1·main_laptop_1·sub_desktop_1 into sub_laptop_1)가 우리 파일 22개를 떨구고 35개 파일의 내용을 옛것으로 되돌림. 손으로 지운 커밋은 없고 **병합 자체가 떨군 것**임. 그것이 `origin/dev`·`main_laptop_1`·`sub_laptop_1`· `CODEX` 까지 퍼졌고(데스크탑 둘만 무사), 이 창의 병합 `d92c1f2b` 로 들어옴. 잃었던 것 - 공용 — `common_util_provenance.py` · `ui_template_provenance.ts` - B08 — 근거 사전 · 좌측 패널 상자 모듈 · 토량환산계수 칸 - B09 — 근거 사전 셋 - B05 — 계획노선 편집 모듈 아홉 · 지형 라우터 · B04 지도 모듈 - 시험 셋과, 35개 파일 안의 최근 작업(환산계수 고르기 · 근거 호버 배선 등) 어떻게 되살렸나 `611a2b40`(병합 직전, 전부 온전)에서 `git show <커밋>:<경로>` 로 내용만 꺼내 되돌림. 이력은 안 건드림. ⚠ HEAD 에만 있던 「추가 816줄」은 랩탑의 새 작업이 아니라 **되살아난 옛 코드**였음(B05 편집은 모듈로 쪼개기 전 덩어리 · B08 라우터는 환산계수 고르기 전 옛 상수판). 되돌릴 시점 이후의 **진짜 새 커밋은 둘뿐**이라 그 둘만 패치로 다시 얹음 — `9f827bf6`(리로드 빌드 고리 끊기, 데스크탑 보조) · `b9bca6b3`(B06 조정창 1px, 랩탑). 위키 여덟은 코덱스 몫이라 손대지 않음. 자체검증 — 양쪽 작업이 다 살아 있음을 짚어 확인: `main.py` 의 「개발 서버는 살려 둔다」 · `B05_Profile_Engine_Grade.py` 의 `plan_curve_length_limit_m` · `B08_..._EarthworkGrid.ts` 의 `attachProvenance`. `tsc --noEmit` 통과 · `pytest -q` **1317 passed, 28 skipped** (되살리기 전에는 시험 둘이 수집 단계에서 깨져 있었음). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RANEBHns1S4tkmsYwewtk
111 lines
4.5 KiB
Python
111 lines
4.5 KiB
Python
"""토량환산계수를 「고를 수 있는 값」으로 연 자리 검사 (오솔길 대조 06절 3번).
|
|
|
|
못 박는 것 셋
|
|
① **기본값이 안 바뀐다** — 안 고른 프로젝트는 정본 그대로 선다.
|
|
② 고른 값은 **토적표·운반표가 같이** 읽는다(계수 정의처는 여전히 한 곳).
|
|
③ 품셈 범위 **밖도 막지 않는다** — 사유와 함께 선다.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from B08_Quantity.B08_Quantity_Engine_EarthworkTable import ( # noqa: E402
|
|
StationArea,
|
|
build_rows,
|
|
)
|
|
from B08_Quantity.B08_Quantity_Engine_HaulSummary import natural_m3 # noqa: E402
|
|
from common_util.common_util_project_settings import ( # noqa: E402
|
|
default_settings,
|
|
earthwork_conversion_choices,
|
|
earthwork_conversion_factors,
|
|
)
|
|
from config.config_system_design import ( # noqa: E402
|
|
EARTHWORK_CONVERSION_C_RANGES,
|
|
EARTHWORK_CONVERSION_FACTORS,
|
|
)
|
|
|
|
|
|
def test_안_고르면_기본값이_그대로() -> None:
|
|
"""빈 설정·기본 설정 둘 다 정본과 한 글자도 달라지지 않아야 한다."""
|
|
assert earthwork_conversion_factors({}) == EARTHWORK_CONVERSION_FACTORS
|
|
assert earthwork_conversion_factors(default_settings()["quantity"]) == (
|
|
EARTHWORK_CONVERSION_FACTORS
|
|
)
|
|
|
|
|
|
def test_고른_갈래만_갈아_끼움() -> None:
|
|
settings = {"conversion_factors_override": {"ripping_rock": {"compacted": 1.0}}}
|
|
resolved = earthwork_conversion_factors(settings)
|
|
assert resolved["ripping_rock"]["compacted"] == pytest.approx(1.0)
|
|
# 나머지 갈래는 정본 그대로다.
|
|
assert resolved["soil"] == EARTHWORK_CONVERSION_FACTORS["soil"]
|
|
assert resolved["blasting_rock"] == EARTHWORK_CONVERSION_FACTORS["blasting_rock"]
|
|
# ⚠ 정본 dict 를 건드리지 않았는가 — 얕은 복사였다면 여기서 걸린다.
|
|
assert EARTHWORK_CONVERSION_FACTORS["ripping_rock"]["compacted"] == pytest.approx(1.15)
|
|
|
|
|
|
def test_모르는_갈래와_말이_안_되는_값은_버림() -> None:
|
|
settings = {
|
|
"conversion_factors_override": {
|
|
"unknown_rock": {"compacted": 2.0},
|
|
"soil": {"compacted": 0},
|
|
"blasting_rock": {"compacted": "많이"},
|
|
}
|
|
}
|
|
assert earthwork_conversion_factors(settings) == EARTHWORK_CONVERSION_FACTORS
|
|
|
|
|
|
def test_토적표가_고른_계수로_섬() -> None:
|
|
"""오솔길처럼 암 계수 1.0 을 고르면 보정량이 그 값으로 선다."""
|
|
stations = [
|
|
StationArea(chainage_m=0.0),
|
|
StationArea(chainage_m=10.0, cut_rock_area_m2=2.0, cut_rock_kind="ripping_rock"),
|
|
]
|
|
factors = earthwork_conversion_factors(
|
|
{"conversion_factors_override": {"ripping_rock": {"compacted": 1.0}}}
|
|
)
|
|
row = build_rows(stations, factors)[1]
|
|
assert row.cut_rock_volume_m3 == pytest.approx(10.0)
|
|
assert row.cut_rock_adjusted_m3 == pytest.approx(10.0) # 기본값 1.15 였다면 11.5
|
|
# 안 주면 기본값 — 같은 측점이 11.5 로 선다.
|
|
assert build_rows(stations)[1].cut_rock_adjusted_m3 == pytest.approx(11.5)
|
|
|
|
|
|
def test_운반표도_같은_계수를_씀() -> None:
|
|
"""다짐 → 자연 되돌리기(÷C)도 고른 값으로 돌아야 표끼리 안 갈린다."""
|
|
factors = earthwork_conversion_factors(
|
|
{"conversion_factors_override": {"ripping_rock": {"compacted": 1.0}}}
|
|
)
|
|
assert natural_m3(11.5, "리핑암", factors) == pytest.approx(11.5)
|
|
assert natural_m3(11.5, "리핑암") == pytest.approx(11.5 / 1.15)
|
|
|
|
|
|
def test_범위_밖도_막지_않고_사유와_함께_섬() -> None:
|
|
low, _high = EARTHWORK_CONVERSION_C_RANGES["blasting_rock"]
|
|
settings = {
|
|
"conversion_factors_override": {
|
|
"blasting_rock": {"compacted": low - 0.5, "reason": "토질시험 값"}
|
|
}
|
|
}
|
|
resolved = earthwork_conversion_factors(settings)
|
|
assert resolved["blasting_rock"]["compacted"] == pytest.approx(low - 0.5)
|
|
choice = earthwork_conversion_choices(settings)["blasting_rock"]
|
|
assert choice["chosen"] is True
|
|
assert choice["in_range"] is False # 밖이라고 말은 하되 값은 그대로 선다.
|
|
assert choice["reason"] == "토질시험 값"
|
|
|
|
|
|
def test_선택_상태는_기본값과_범위를_함께_냄() -> None:
|
|
choice = earthwork_conversion_choices({})["ripping_rock"]
|
|
assert choice["chosen"] is False
|
|
assert choice["in_range"] is True
|
|
assert choice["default"] == pytest.approx(1.15)
|
|
assert choice["range"] == [1.00, 1.30]
|