"""125-1 연암 · 경암 비율 → 암 환산계수 C 가중(연암 = 리핑암 · 경암 = 발파암 고정). C = 연암 % × 리핑암 C + 경암 % × 발파암 C · 비율 = 122 `rock_ratios_pct`(기본 90 : 10) · B08 토적표 보정량 · B06 유토곡선이 같은 `mixed_conversion_factors` 를 씀. """ from __future__ import annotations import asyncio import json from pathlib import Path import pytest from B06_Section import B06_Section_Server_Calc_Prebuild as prebuild from B08_Quantity.B08_Quantity_Engine_Earthwork import StationArea, build_table from common_util.common_util_project_settings import ( mixed_conversion_factors, quantity_settings, settings_path, ) RIP, BLAST = 1.15, 1.30 # 품셈 토량환산계수 기본(config) — 표 그대로 def _c(settings: dict) -> float: factors = mixed_conversion_factors(settings) assert factors["ripping_rock"]["compacted"] == factors["blasting_rock"]["compacted"] return factors["ripping_rock"]["compacted"] def test_기본_90_10_이면_가중_C() -> None: assert _c({}) == pytest.approx(0.9 * RIP + 0.1 * BLAST) # 1.165 assert _c({"rock_ratios_pct": {"연암": 90.0, "경암": 10.0}}) == pytest.approx(1.165) def test_50_50_이면_C_가_바뀜() -> None: assert _c({"rock_ratios_pct": {"연암": 50.0, "경암": 50.0}}) == pytest.approx(1.225) assert _c({"rock_ratios_pct": {"연암": 100.0}}) == pytest.approx(RIP) assert _c({"rock_ratios_pct": {"연암": 0.0}}) == pytest.approx(BLAST) def test_시공법_칸은_안_읽음() -> None: ratios = {"rock_ratios_pct": {"연암": 50.0}} assert _c({**ratios, "rock_methods": {"연암": "blasting", "경암": "ripping"}}) == _c(ratios) def test_토사_C_는_그대로() -> None: assert mixed_conversion_factors({"rock_ratios_pct": {"연암": 50.0}})["soil"]["compacted"] == 0.9 def test_B08_토적표_보정량이_가중_C_로() -> None: stations = [ StationArea(chainage_m=0.0, cut_rock_area_m2=2.0), StationArea(chainage_m=20.0, cut_rock_area_m2=4.0, cut_rock_kind="blasting_rock"), ] for pct, c in ((90.0, 1.165), (50.0, 1.225)): settings = {"rock_ratios_pct": {"연암": pct}} table = build_table(stations, mixed_conversion_factors(settings)) assert table["totals"]["cut_rock_volume_m3"] == pytest.approx(60.0) assert table["totals"]["cut_rock_adjusted_m3"] == pytest.approx(60.0 * c) def test_B06_유토곡선이_같은_C(tmp_path: Path, monkeypatch) -> None: settings_path(tmp_path).write_text( json.dumps({"quantity": {"rock_ratios_pct": {"연암": 50.0, "경암": 50.0}}}), "utf-8" ) async def fake_run(_fn, _project_id): return "x" monkeypatch.setattr(prebuild, "run_with_connection", fake_run) monkeypatch.setattr(prebuild, "resolve_stored_project_path", lambda _p: tmp_path) factors = asyncio.run(prebuild.conversion_factors_for("p")) assert factors["ripping_rock"]["compacted"] == pytest.approx(1.225) assert factors == mixed_conversion_factors(quantity_settings(tmp_path)) context = prebuild._mass_haul_context(None, factors) assert context["earthwork_conversion"]["ripping_rock"]["compacted"] == pytest.approx(1.225)