Files
Aislo/resources/tester/test_125_rock_c.py
T

79 lines
3.2 KiB
Python

"""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)