- 지움(git rm) 15 파일 3,318 줄: Hopyo_Check · CheckRows · Choose · WizardSk · SkApi · SkLines · logic/SkPick · logic/Draft · Left · Lost · Pick · SheetMake · Kids · ToItem · Compare(모두 옛 확인 창 · 마법사 단가산출 · 안 이은 줄 길 몫 · 부르는 곳 0) - 단추 판단: 엑셀 보기 [저장](체크 호표) · [모두 고정으로 들여오기] 화면 단추 걷음 → 만들기 = [옮기기] 하나 · 모두 고정 서버 길(Builder · build_all)은 B09 · 붙여넣기가 써서 남김 · 목록 체크 칸 · 모달 껍데기(openHopyoSheet · raise · lower) 걷음 - Import: 「안 이은 줄」 띠 · [안 이은 줄 고르기] · 남은 줄 셈 걷음 · [끝내기] = 물음(확인하고 안 옮긴 수 = 판정 고름 캐시 moveBody) - Api: 옛 맞춤 타입 · 길(readHopyoOne · guessHopyo · buildHopyo · buildHopyoAll · leftHopyo · listHopyoPicks · hopyoSiblings · buildHopyoItem …) 걷음 · POLL_MS · HOPYO_BUILT 옮겨 옴 · 목록 꼴 = 1차 판정 줄상태(Judge.view) - Labor_Pick: withHopyo(실무 호표 덧줄) → withSangeun(찾아 넣기 창 표시만) · Detail · Table 부름 바꿈 - Ledger: unitField 옮겨 옴 · SheetNav: 옛 확인 캐시 칠 걷음 · UI_Page: [구조물 조합으로] 듣기 걷음 - CSS: 옛 확인 창 · 고르기 창 규칙 34 걷음(481 → 287 줄) · 390 폭 = 줄 판 열리면 위 칸 넓힘 · 줄 판 높이 바닥 16rem 시험 정리(까닭 = 지운 화면 파일만 읽음): - 지움: test_729_3_hopyo_left_screen · test_746_2_hopyo_compare_screen · test_778_5_sk_pick_screen · helper_729_3 · helper_m02_hopyo_check · pick · seam - test_m02_hopyo_screen = 좌측 판 · 끝내기 둘만 · 627 · helper_778_5 = SheetSk 판 바꿈만 · 785_4 · 721 · 717_4 · 720 · 739_1 = 지금 꼴로 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
100 lines
4.4 KiB
Python
100 lines
4.4 KiB
Python
"""780-2 지킴 — 엑셀 보기 단가산출표 · 상세 탭 = 오른쪽 단가산출 목록(요구 627).
|
|
|
|
서버 없이 잡음: 탭(역할) 따라 판 바꿈(일위대가표 = 호표 목록 · 단가산출 탭 = 단가산출 목록 · 칸은 처음 한 번만 지음) ·
|
|
시트 행 → 목록 강조 · 목록 줄 → 지금 탭의 블록 자리 · 만들 층 ≠ 파일 층 = 보기만 · 거르기(전체 · 안 · 밖 · 고를 줄 있음) ·
|
|
[끝내기] = 막지 않고 물음창 글만 ·
|
|
화면 = 부품 상자만 · 700 줄.
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import re
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
HERE = os.path.dirname(__file__)
|
|
M02 = Path(__file__).resolve().parents[2] / "M02_MasterTemplete"
|
|
|
|
|
|
def _node(payload: dict) -> dict:
|
|
proc = subprocess.run(
|
|
["node", os.path.join(HERE, "helper_778_5_sk_pick.cjs")],
|
|
input=json.dumps(payload, ensure_ascii=False),
|
|
capture_output=True,
|
|
text=True,
|
|
encoding="utf-8",
|
|
check=False,
|
|
)
|
|
assert proc.returncode == 0, proc.stderr
|
|
return json.loads(proc.stdout)
|
|
|
|
|
|
PICKS = [["s1", "B5"], ["s2", "B12"], ["s1", "C3"], ["s3", "A85"], ["s3", "A2"]]
|
|
|
|
|
|
def test_판_바꿈_목록_지음_강조_뛰기():
|
|
got = _node({"sheetSk": {"same": True, "canWrite": True, "picks": PICKS}})
|
|
# 785-6 — 단가산출 목록 = 새 블록 판정(hopyo-judge 목록) · 처음 단가산출 탭에 올 때 한 번 읽음
|
|
hide = [(s["호표판숨김"], s["단가판숨김"], s["읽음"]) for s in got["seen"]]
|
|
assert hide == [
|
|
(False, True, 0),
|
|
(True, False, 1),
|
|
(False, True, 1),
|
|
(True, False, 1),
|
|
(True, False, 1),
|
|
]
|
|
assert [on for _, on in got["toggled"]] == [False, True, False, True, True]
|
|
assert got["reads"] == [{"key": "HP-000001", "to": {"layer": "personal", "owner": None}}]
|
|
# 목록 행 12 → 단산8 강조 · 상세 2 행 → 블록 0(없음) — 목록 줄 누름 뒤 단산8
|
|
assert [s["강조"] for s in got["seen"]] == [
|
|
None,
|
|
"단산8 거푸집",
|
|
"단산8 거푸집",
|
|
"단산8 거푸집",
|
|
None,
|
|
]
|
|
# 목록 줄 누름 = 지금 탭의 자리(단가산출표 = 목록 행 · 상세 = 블록 범위) + 시트 아래 블록 판
|
|
assert got["jumps"] == [["s2", [8, 9]], ["s3", [8, 9]], ["s3", [8, 9]]]
|
|
assert got["blocks"] == [{"no": 8, "readOnly": False, "onSheet": True}] * 3
|
|
rows = {r["label"]: r for r in got["rows"]}
|
|
assert rows["단산8 거푸집"]["sub"] == "㎡ · 고를 것 2 · M02_JudgeCalls 1"
|
|
assert rows["단산8 거푸집"]["tail"] == "accent:M02_JudgeConfirmed" # 캐시 확인
|
|
assert rows["단산9 잡석"]["sub"] == "㎥ · 줄 조합 · 준용 · M02_JudgeOutside"
|
|
assert rows["단산10 운반"]["tail"] == "success:M02_JudgeMade SK-000001"
|
|
assert got["count"] == {"블록": 2, "밖": 1, "줄": 2} # 만든 SK 뺌
|
|
|
|
|
|
def test_다른_층_권한_없음_보기만():
|
|
for same, can in ((False, True), (True, False)):
|
|
got = _node({"sheetSk": {"same": same, "canWrite": can, "picks": [["s2", "B5"]]}})
|
|
assert got["blocks"][0]["readOnly"] is True
|
|
|
|
|
|
def _src(name: str) -> str:
|
|
return (M02 / f"M02_MasterTemplete_Hopyo_{name}.ts").read_text(encoding="utf-8")
|
|
|
|
|
|
def test_캐시_공유_알림_칠_다시():
|
|
sheet = _src("Sheet")
|
|
assert "createSheetSk(" in sheet and "sk?.at(s);" in sheet
|
|
side = _src("SheetSk")
|
|
assert "readJudge(opt.scope, opt.key, opt.target)" in side # 785-6 새 블록 판정 목록
|
|
nav = _src("SheetNav")
|
|
assert "blockAt(sheet: string, row: number)" in nav and "spotOf(no: number, role: Role)" in nav
|
|
wizard = _src("Import")
|
|
assert 'L("M02_SkUnmoved")' in wizard and "leftCount" not in wizard # 밖 = 안 막음 · 옛 남은 줄 막음 걷음
|
|
tone = (M02 / "logic" / "M02_MasterTemplete_Hopyo_SheetMap.ts").read_text(encoding="utf-8")
|
|
assert '글: "일위대가 밖"' in tone
|
|
|
|
|
|
def test_부품_상자만_700줄():
|
|
for name in ("SheetSk", "Sheet", "SheetNav", "Import", "Side"):
|
|
src = _src(name)
|
|
assert len(src.splitlines()) <= 700, name
|
|
assert not re.search(r"#[0-9a-fA-F]{3,6}\b|rgb\(", src), name
|
|
for name in ("SheetSk", "Import"):
|
|
assert not re.search(r'el\("(button|input|select)"|<button|<input', _src(name)), name
|
|
css = (M02 / "M02_MasterTemplete_Hopyo.css").read_text(encoding="utf-8")
|
|
block = css.split(".m02-hopyo-sheet.is-sk", 1)[1].split("/*", 1)[0]
|
|
assert not re.search(r"#[0-9a-fA-F]{3,6}\b|rgb\(", block)
|