# -*- coding: utf-8 -*- """52-6 횡단배수 › 맹암거(표 06 · 새 종류) — 정의 · 컨테이너 · 서버 저장 왕복. 새 키 `cross_underdrain`(횡단배수 · 점형) — 종단배수 맹암거(`underdrain`)와 따로. 컨테이너 = 정의 그룹 「맹암거」(필수 · 늘 한 벌) — 암거 높이(m) · 암거 경사(%) 손 입력(비워 둘 수 있음) · 그룹 잇기(`group_items`)로 구조물 조합 항목. 저장은 임시 storage 에서만. """ import pytest from B05_Profile.B05_Profile_Structures_Schema import ( StructureInstance, is_station_planting_type, load_definition, structure_type_map, ) KEY = "cross_underdrain" GROUP = "gcrossud" def test_새_종류는_횡단배수_점형_종단배수_맹암거와_따로(): types = structure_type_map() new, old = types[KEY], types["underdrain"] assert (new.group, new.placement, new.name, new.enabled) == ("A", "point", "맹암거", True) assert (old.group, old.placement) == ("B", "interval") assert new.style["abbr"] != old.style["abbr"] and new.style["color"] != old.style["color"] assert is_station_planting_type(new) # 횡단배수 = 그 측점에 횡단도 def test_컨테이너_맹암거_높이_경사_손_입력(): opts = {o.key: o for o in structure_type_map()[KEY].options} assert list(opts) == ["culvert_height_m", "culvert_slope_pct"] for key, label, unit in ( ("culvert_height_m", "암거 높이", "m"), ("culvert_slope_pct", "암거 경사", "%"), ): o = opts[key] assert (o.label, o.input, o.unit, o.default, o.required) == ( label, "number", unit, None, False, ) assert o.empty_means # 손 입력 · 기본값 근거 없음 — 비워 둘 수 있음(B05 단계 필수 금지) groups = load_definition()["그룹"][KEY] assert groups == [ {"id": GROUP, "이름": "맹암거", "옵션": list(opts), "형상": {}}, ] def test_정의_검사_통과(): from M02_MasterTemplete.StructOptions import M02_SO_Definition as definition assert definition.check(load_definition()) == [] def _item(**options): return StructureInstance( type_id=KEY, placement="point", chainage_m=63.5, options=options, group_items={ GROUP: {"layer": "system", "owner": None, "key": "SS000001", "name": "맹암거"} }, ) def test_저장_다시_읽기_그대로(tmp_path): from B05_Profile.B05_Profile_Structures_Repository import load_structures, save_structures item = _item(culvert_height_m=0.6, culvert_slope_pct=2.5) save_structures(str(tmp_path), [item], base_revision=0) _, loaded = load_structures(str(tmp_path)) assert [(s.type_id, s.chainage_m, s.options) for s in loaded] == [ (KEY, 63.5, {"culvert_height_m": 0.6, "culvert_slope_pct": 2.5}) ] assert loaded[0].group_items == item.group_items @pytest.mark.parametrize( "options", [{"culvert_height_m": -1}, {"culvert_slope_pct": -0.5}], ) def test_음수는_서버가_막음(tmp_path, options): from B05_Profile.B05_Profile_Structures_Repository import save_structures with pytest.raises(ValueError): save_structures(str(tmp_path), [_item(**options)], base_revision=0)