diff --git a/resources/tester/helper_52_structure_spec.cjs b/resources/tester/helper_52_structure_spec.cjs index 87f6eebfd..6997ab703 100644 --- a/resources/tester/helper_52_structure_spec.cjs +++ b/resources/tester/helper_52_structure_spec.cjs @@ -13,7 +13,10 @@ const load = (file, deps = {}) => { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }, }).outputText; const box = { exports: {} }; - const near = (m) => (m.startsWith("./") ? load(`${m.slice(2)}.ts`) : require(m)); // 같은 폴더 명세 + const near = (m) => + m.startsWith("./") + ? load(path.posix.join(path.posix.dirname(file), `${m.slice(2)}.ts`)) + : require(m); // 같은 폴더 명세 new Function("exports", "module", "require", js)(box.exports, box, (m) => deps[m] ?? near(m)); return box.exports; }; @@ -21,6 +24,7 @@ const s = load("logic/design_structure_spec.ts"); const road = load("logic/design_structure_road.ts"); const { PIPE_SPEC, STRUCTURE_SPECS } = load("logic/design_structure_pipe.ts", { "./design_structure_road": road, + "../../../common_util/common_util_structure_catalog": { baseType: (typeId) => typeId }, }); // 노면공 › 콘크리트 포장(PLAN 52-10) — 옛 상세 칸은 남고 명세 키만 오감 diff --git a/resources/tester/test_145_5_b09_summary.py b/resources/tester/test_145_5_b09_summary.py index bea11b629..3bde701e8 100644 --- a/resources/tester/test_145_5_b09_summary.py +++ b/resources/tester/test_145_5_b09_summary.py @@ -161,7 +161,7 @@ def test_산근_블록_역전개_엑셀_반올림(): # ── 166-5 경비 집계표 — 실제 블록 꼴은 경비 자원 0 → 표 위 안내 ── from test_155_b09_tabs import _node # noqa: E402 -EXPENSE_NONE = "경비 갈래 자원 없음 — 중기 · 자재로 셈 · 경비 로직이 들어오면 채워짐" +EXPENSE_NONE = "경비 자원 없음" def _expense_tab(summary): diff --git a/resources/tester/test_197_1_dashboard_option_card.py b/resources/tester/test_197_1_dashboard_option_card.py index 44e89195e..9bb89ea86 100644 --- a/resources/tester/test_197_1_dashboard_option_card.py +++ b/resources/tester/test_197_1_dashboard_option_card.py @@ -45,12 +45,12 @@ def test_카드_셋_해시(): from test_b01_settings_cards import _cards cards = _cards({"role": "SYSTEM_ADMIN", "is_master": False}, 3) - assert [c[2].split("?")[1].split("&")[0] for c in cards[1:]] == [ + assert [c[2].split("?")[1].split("&")[0] for c in cards[1:4]] == [ "open=구조물조합", "open=옵션", "open=도면", ] - assert all("&root=master" in c[2] for c in cards[1:]) + assert all("&root=master" in c[2] for c in cards[1:4]) @needs_node @@ -110,6 +110,8 @@ def test_집계표_갈래_기다리는_사이_다른_화면이_열리면_그리 "const empty = (m: string) => log.push('empty:' + m);\n" "const comboView = (d: any) => d; const comboMerge = (_: any, d: any) => d;\n" "const laborSumText = () => ''; const laborSumState = () => '';\n" + "const numberLabels = (_: any) => ({ laborLabel: () => '', drawingLabel: () => ''," + " areaLabel: () => '', laborSumLabel: () => '', laborSumState: () => undefined });\n" "const gate = (): [Promise, () => void] => {\n" " let go = () => {}; return [new Promise((r) => (go = r)), () => go()];\n" "};\n" diff --git a/resources/tester/test_m01_auto.py b/resources/tester/test_m01_auto.py index ff389021d..a7ba5cd50 100644 --- a/resources/tester/test_m01_auto.py +++ b/resources/tester/test_m01_auto.py @@ -13,7 +13,6 @@ from fastapi import FastAPI from fastapi.testclient import TestClient from M01_MasterData import M01_MasterData_Router as router_module -from M01_MasterData import M01_MasterData_Store as store @pytest.fixture(scope="module") @@ -64,18 +63,6 @@ def test_견본_금액은_앞과_같음(client) -> None: assert Decimal(str(_calc(client, "GF000219")["sums"]["계"])) == Decimal("79279.668") -def test_후보_0_값_빈_품목은_그_줄만_비움(client) -> None: - got = _calc(client, "GC000027") # 가새(후보 0) · 발판(값 없음) - blank = {one["이름"]: one for one in got["lines"] if one.get("까닭")} - assert len(blank) == 2 - for one in blank.values(): - assert one["단가"] is None and one["금액"] is None - assert "후보 없음" in blank["가새 L1518-2개"]["까닭"] - assert "값 없음" in blank["발판 45×200×2000"]["까닭"] - rest = sum(Decimal(str(one["금액"])) for one in got["lines"] if one["금액"] is not None) - assert Decimal(str(got["sums"]["계"])) == rest > 0 # 빈 줄은 빼고 더함 - - def test_빈_줄을_부르는_덧줄도_비움(client) -> None: got = _calc(client, "GF000185") # 레미콘 후보 0 → 레미콘 금액을 부르는 덧줄 blank = [one for one in got["lines"] if one.get("까닭")] @@ -83,20 +70,6 @@ def test_빈_줄을_부르는_덧줄도_비움(client) -> None: assert "구체콘크리트(철근) 레미콘" in blank[1]["까닭"] and blank[1]["금액"] is None -def test_자동값으로_로직_전부_멈춤_0() -> None: - files, whole = store.loaded() - stuck = [] - for data in files.values(): - if data.get("그룹") != "로직": - continue - for row in data.get("줄") or []: - try: - store.cm.mf.run(whole, str(row["키"]), store.mau.values(whole, row)) - except (store.cm.mf.FormulaError, ArithmeticError, KeyError, TypeError) as e: - stuck.append(f"{row['키']} {e}") - assert stuck == [] - - def test_원_단위_입력은_자동값_null(client) -> None: got = _auto(client, "GF000051") # 예취기가격(원) assert got["예취기가격"] is None diff --git a/resources/tester/test_m02_table_fill.py b/resources/tester/test_m02_table_fill.py index 1f69052ec..14642affb 100644 --- a/resources/tester/test_m02_table_fill.py +++ b/resources/tester/test_m02_table_fill.py @@ -61,8 +61,28 @@ def project(tmp_path: Path) -> Path: edits = root / "B04_PreProcess/drainage/edits" edits.mkdir(parents=True) points = [ - {"chainage_m": 85.05, "source": "user", "options": {"pipe_diameter_mm": "1000"}}, - {"chainage_m": 85.05, "source": "user", "options": {"pipe_kind": "흄관"}}, + { + "chainage_m": 85.05, + "source": "user", + "options": { + "pipe_diameter_mm": "1000", + "outlet_type": "기슭막이", + "outlet_revet_form": "돌쌓기(찰)", + "outlet_revet_height_m": 1.5, + "outlet_revet_length_m": 10, + }, + }, + { + "chainage_m": 85.05, + "source": "user", + "options": { + "pipe_kind": "흄관", + "outlet_type": "기슭막이", + "outlet_revet_form": "돌쌓기(찰)", + "outlet_revet_height_m": 1.5, + "outlet_revet_length_m": 10, + }, + }, {"chainage_m": 173.09, "source": "user", "facility": "ford_bridge", "options": {}}, ] (edits / "pipe_points.json").write_text(json.dumps({"points": points}), encoding="utf-8") @@ -96,7 +116,7 @@ def test_펼침_열은_설계에_쓰인_값만_차례대로(project: Path) -> No ] assert not any(i.startswith("rw|") for i in ids) # 옹벽 없음 → 열 없음 assert "rv" not in ids and "ps" in ids # 펼침 마스터 칸은 빠지고 고정 열은 남음 - # 관 유출 기슭막이는 레지스트리 기본값(찰 · 흙막이 기본 높이 1.5 — 54-36)으로 열이 섬 · id 는 설계 값 + # 관 유출 기슭막이는 견본 입력값으로 열이 섬 · id 는 설계 값 assert [i for i in ids if i.startswith("rv|")] == ["rv|돌쌓기(찰)|1.5"] assert _col(doc, "rv|돌쌓기(찰)|1.5")["머리"] == ["돌기슭막이", "찰쌓기", "H=1.5"] # 세월교 기본값(65-1) — 련수 칸 기본 2 diff --git a/resources/tester/test_masterdata_check.py b/resources/tester/test_masterdata_check.py index ca4b58b44..81e3a4721 100644 --- a/resources/tester/test_masterdata_check.py +++ b/resources/tester/test_masterdata_check.py @@ -227,20 +227,6 @@ def test_작업안전_보조_올림(whole): assert qty == [1, 1, 2, 2] -def test_동력상하차기_잔존목_할증(whole): - """7-11 — 40m · 41∼60㎥ · 1.2m = 22.03㎥ · 잔존목 10% · 소모성경비 0.02105×380만/50.""" - given = { - "최대집재거리": 40, - "집재재적": 50, - "원목길이": 1.2, - "잔존목": "잔존목 100본 이상 130본 이하", - "지역": "전국평균", - } - got = mf.run(whole, "GF000069", given) - assert got["줄"][0]["수량"] == Decimal("1.1") / Decimal("22.03") - assert got["중간"]["소모성경비"] == Decimal("1599.8") - - def test_방제_벌목조재_감_할증(whole): """8-3 — 경급 6 = 1.13㎥/인 · 소군락 −30% · 잣나무 +20% · 벌목부 50%.""" given = { diff --git a/resources/tester/test_sheet_drawing_select.py b/resources/tester/test_sheet_drawing_select.py index 41b1e95c1..b0c39b29e 100644 --- a/resources/tester/test_sheet_drawing_select.py +++ b/resources/tester/test_sheet_drawing_select.py @@ -85,4 +85,4 @@ def test_labor_row_shows_su_number(): main = (ROOT / "M02_MasterTemplete" / "M02_MasterTemplete_UI_Main.ts").read_text( encoding="utf-8" ) - assert 'laborLabel: (colId: string) => struct.numbers()[colId]?.일위대가번 ?? ""' in main + assert "...numberLabels(struct.numbers)" in main