Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt
45 lines
1.8 KiB
Python
45 lines
1.8 KiB
Python
"""38-2 왼쪽 패널 「유가 · 전력」 컨테이너 — 재료 다음 따로 · 재료 컨테이너에서는 뺌 · 서버 재료 그룹 그대로."""
|
|
|
|
import json
|
|
import re
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
SIDE = (ROOT / "M01_MasterData/M01_MasterData_UI_Side.ts").read_text(encoding="utf-8")
|
|
|
|
|
|
def _array(name: str) -> list[str]:
|
|
body = re.search(rf"const {name}(?:: \w+\[\])? = \[(.*?)\]", SIDE, re.S).group(1)
|
|
return [x.strip().strip('"') for x in body.split(",") if x.strip()]
|
|
|
|
|
|
def test_fuel_container_right_after_material():
|
|
groups = _array("GROUPS")
|
|
assert groups[groups.index("재료") + 1] == "FUEL_GROUP"
|
|
assert 'const FUEL_GROUP = "유가 · 전력";' in SIDE
|
|
|
|
|
|
def test_material_container_has_no_fuel():
|
|
assert _array("MATERIAL_ORDER") == ["자재품목", "품셈재료"]
|
|
assert "list.filter((f) => !isFuel(f))" in SIDE
|
|
|
|
|
|
def test_fuel_container_reads_server_material_group():
|
|
# 서버로는 재료 그룹을 받아 유가전력 파일만 · 첫 받기에서 따로 부르지 않음
|
|
assert 'if (group === FUEL_GROUP) return (await refresh("재료")).filter(isFuel);' in SIDE
|
|
assert "GROUPS.filter((g) => g !== FUEL_GROUP).map(refresh)" in SIDE
|
|
# 거름 저장 열쇠 그대로 — 전에 고른 구분이 이어짐
|
|
assert "store: `m01.filter.재료.${FUEL}`" in SIDE
|
|
|
|
|
|
def test_fuel_file_still_in_material_group():
|
|
data = json.loads(
|
|
(ROOT / "resources/master_data/재료_유가전력.json").read_text(encoding="utf-8")
|
|
)
|
|
assert data
|
|
# 흐름도 넣을 값 판 · 단가산출 로직 요소 고르기는 서버 재료 그룹을 그대로 씀
|
|
panel = (ROOT / "M02_MasterTemplete/DataFlow/M02_DF_InputPanel_Build.ts").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
assert '유가전력: { group: "재료", part: "유가전력" }' in panel
|