From b43c4f106039ad456e76cf9ef0e77a08e38d0978 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 19 Oct 2026 09:46:03 +0900 Subject: [PATCH] =?UTF-8?q?test(=EC=8B=9C=ED=97=98=20=EC=A0=95=EB=A6=AC=20?= =?UTF-8?q?=EB=91=98):=20=EA=B5=AC=EC=A1=B0=EB=AC=BC=20=EC=A0=95=EC=B1=85?= =?UTF-8?q?=20=EC=8B=9C=ED=97=98=20=3D=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=EB=AC=BC=EC=A0=95=EC=9D=98=20=ED=8C=90=2023?= =?UTF-8?q?=20=EC=9D=84=20=EC=9D=BD=EC=96=B4=20=ED=8C=90=EC=A0=95=20=C2=B7?= =?UTF-8?q?=20=EC=B7=A8=ED=96=A5=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=EC=8B=9C?= =?UTF-8?q?=ED=97=98=20=3D=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=EA=B3=A0?= =?UTF-8?q?=EB=A5=B4=EB=8A=94=20=EC=9E=90=EB=A6=AC=EB=A7=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - test_b05_structures_registry_policy: 우클릭 목록 수 28 · 끈 종류 목록 · 바닥막이 켬 단언 → 마스터 파일(켬 · 끔 · managed_by)과 같은지로(수 · 이름 안 박음) · 맹암거 암거 높이 3 m · 경사 3 % = 사용자 지시(요구 223 · 4baf49ba4) 근거로 허용 목록 - test_prefs_persist_across_tabs: 388-3 세션 넘침 때 결과 칸 비우는 글(setOrMakeRoom)을 저장소 가름으로 오판 → storageFor 안만 판정 Co-Authored-By: Claude Opus 5.5 --- .../test_b05_structures_registry_policy.py | 52 +++++++++++-------- .../tester/test_prefs_persist_across_tabs.py | 10 +++- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/resources/tester/test_b05_structures_registry_policy.py b/resources/tester/test_b05_structures_registry_policy.py index 3048c6f79..ec9c37f97 100644 --- a/resources/tester/test_b05_structures_registry_policy.py +++ b/resources/tester/test_b05_structures_registry_policy.py @@ -6,7 +6,9 @@ 미사용으로 완전 삭제. 배관·BOX암거는 부속 옵션 정의를 갖는다. """ -from B05_Profile.B05_Profile_Structures_Schema import load_structure_types +import json + +from B05_Profile.B05_Profile_Structures_Schema import DEFINITION_PATH, load_structure_types # 기본값을 남겨 둘 수 있는 항목 — 법정 단일값·사용자 확정값·표시용 문자열뿐이다. ALLOWED_DEFAULT_KEYS = { @@ -156,20 +158,17 @@ ALLOWED_DEFAULT_KEYS = { ("box_culvert", "wing_out_height_m"), ("box_culvert", "wing_out_length_m"), ("box_culvert", "wing_out_angle_deg"), + # A군 맹암거 암거 높이 3 m · 암거 경사 3 % — 사용자 지시(요구 223 · 4baf49ba4 · M02 판 21). + ("cross_underdrain", "culvert_height_m"), + ("cross_underdrain", "culvert_slope_pct"), } -# B06 이관 보류 — 정의 보존을 위해 삭제하지 않고 enabled=False로 숨긴다. -DISABLED_TYPE_IDS = { - "ditch_side", - "ditch_ridge", - "ditch_berm", - "chute", - "slope_drain", - "underdrain", - "wildlife_path", - "revegetation", - "gravel_surfacing", -} + +def _master_types() -> list[dict]: + """사용자 M02 구조물정의(정본 파일) 그대로 — 켬 · 끔 · 수는 이 표가 정함(시험이 박지 않음).""" + with open(DEFINITION_PATH, encoding="utf-8") as handle: + return json.load(handle)["types"] + # 임도 미사용 확정 — 레지스트리에서 완전 삭제. 바닥막이(bed_sill)는 2026-08-19 # 사용자 지시로 부활해 D군(계류 사방)에 되살렸다. @@ -189,7 +188,7 @@ def test_quick_add_types_exclude_pipe_family(): def test_all_enabled_non_managed_types_are_quick_addable(): - """잔존 B05 선택지 = A군 3(노출형·개거·맹암거) + C군 5 + D군 3 + E군 14 + G군 1(콘크리트 포장) + 기타 1. + """잔존 B05 선택지 = 표에서 켠 정본 관리 밖 종류 전부(수는 표가 정함 · 아래는 옛 수 이력). 콘크리트 포장은 2026-08-28 사용자 지시로 되살렸다 — 포장 구간을 기준측점+길이+전/후로 받는 정본이 됐다(종단경사 자동 포장 적용을 대체). @@ -203,8 +202,17 @@ def test_all_enabled_non_managed_types_are_quick_addable(): 아니라 여기 수에 안 잡힌다.) E군이 10에서 14로 늘었다 — 표 07(PLAN 52-7) 대피로 · 경계석 · 위험표시 · 취수정. + + 판 23(2026-10-19 · 사용자 M02 저장)부터 켬 · 끔을 구조물마다 표에 적음 — 수는 표가 정함. + 판정 = 우클릭 목록 = 표에서 켜고 정본 관리(managed_by) 아닌 종류 전부(빠짐 · 더함 없음). """ - assert len(_quick_add_types()) == 28 + expected = { + row["type_id"] + for row in _master_types() + if not row.get("managed_by") and row.get("enabled", True) + } + assert {item.type_id for item in _quick_add_types()} == expected + assert expected, "우클릭으로 넣을 종류가 하나도 없음" def test_removed_types_are_absent(): @@ -215,14 +223,12 @@ def test_removed_types_are_absent(): def test_b06_deferred_types_are_disabled_but_preserved(): - """B·F·G군은 B05 선택지에서 빠지되 정의는 남는다(B06 횡단도 옵션 재사용).""" + """끈 종류도 정의는 남는다(B06 횡단도 옵션 재사용) — 켬 · 끔은 사용자 표(판 23) 그대로.""" by_id = {item.type_id: item for item in load_structure_types()} - for type_id in DISABLED_TYPE_IDS: - assert type_id in by_id, f"{type_id} 정의가 삭제됨 — 보존 대상" - assert by_id[type_id].enabled is False, f"{type_id} enabled=False여야 함" - for type_id, item in by_id.items(): - if type_id not in DISABLED_TYPE_IDS: - assert item.enabled is True, f"{type_id}는 활성이어야 함" + rows = _master_types() + assert set(by_id) == {row["type_id"] for row in rows}, "끈 종류를 읽기에서 버림" + for row in rows: + assert by_id[row["type_id"]].enabled is row.get("enabled", True), row["type_id"] def test_b05_phase_options_are_never_required(): @@ -521,7 +527,7 @@ def test_bed_sill_revived_as_point_type(): 옵션 = 형태(돌붙임 찰/메)·면적·높이, 기본 돌붙임(메)·10㎡·0.3m.""" by_id = {item.type_id: item for item in load_structure_types()} item = by_id["bed_sill"] - assert item.group == "D" and item.placement == "point" and item.enabled + assert item.group == "D" and item.placement == "point" # 켬 · 끔 = 사용자 표(판 23) options = {option.key: option for option in item.options} assert options["form"].choices == ["돌붙임(찰)", "돌붙임(메)"] assert options["form"].default == "돌붙임(메)" and options["form"].phase == "b05" diff --git a/resources/tester/test_prefs_persist_across_tabs.py b/resources/tester/test_prefs_persist_across_tabs.py index 4cd0f4d13..205adb4b0 100644 --- a/resources/tester/test_prefs_persist_across_tabs.py +++ b/resources/tester/test_prefs_persist_across_tabs.py @@ -31,10 +31,16 @@ def test_취향만_브라우저_저장소로_간다(): def test_설계값은_세션_그대로다(): - """초안·결과가 브라우저 저장소로 새면 프로젝트를 옮겨도 남는다 — 그 경계를 지킨다.""" + """초안·결과가 브라우저 저장소로 새면 프로젝트를 옮겨도 남는다 — 그 경계를 지킨다. + + 판정 = 저장소를 고르는 자리(`storageFor`)만 — 세션 한도 넘침 때 결과 칸을 비우는 자리(388-3 + `setOrMakeRoom`)는 세션 안에서 지울 열쇠를 고를 뿐 저장소를 가르지 않음. + """ source = _STATE.read_text(encoding="utf-8") + chooser = re.search(r"function storageFor\(key: string\): Storage \{(.*?)\}", source, re.S) + assert chooser, "저장소를 고르는 자리가 없음" for bucket in ("aislo:draft:", "aislo:result:"): - assert f'startsWith("{bucket}")' not in source, f"{bucket} 까지 저장소를 갈랐음" + assert bucket not in chooser.group(1), f"{bucket} 까지 저장소를 갈랐음" def test_화면_공용_부품도_같은_판단을_쓴다():