Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01STqEqztUthVFBmEP18wBSz
77 lines
3.4 KiB
Python
77 lines
3.4 KiB
Python
"""181-2 박스보기 — 이름 · 접기 없음 · 목록표에서 고른 호표 = 박스 붉은 외곽선 · 표 보기 = 줄 구간 전체.
|
|
|
|
- 단추 글 「박스보기」 ↔ 「표로 보기」 · 요약(접기) 보기 지움
|
|
- 표 보기 = 고른 호표 줄 구간(키 `|` 앞머리 같은 줄) 모두 `is-pick` · 첫 줄 `is-pick-top` · 끝 줄 `is-pick-end`
|
|
- 붉은 색 = `--color-danger`(B06 횡단 카드 고름 꼴)
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
if str(ROOT) not in sys.path:
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from resources.tester.helper_b09_group_cards import COMMON, GROUPS, TABS, run # noqa: E402
|
|
|
|
ROWS = [ # 호표 A(3줄) · 호표 B(4줄) · 호표 C(1줄)
|
|
{"key": "A"}, {"key": "A|1"}, {"key": "A|합계"},
|
|
{"key": "B"}, {"key": "B|1"}, {"key": "B|2"}, {"key": "B|총계"},
|
|
{"key": "C"},
|
|
] # fmt: skip
|
|
|
|
|
|
def test_구간_첫_끝_줄():
|
|
out = run(
|
|
[COMMON, TABS, GROUPS],
|
|
f"\nconst rows = {json.dumps(ROWS)};"
|
|
"\nconst show = (focus) => { const r = pickRange(rows, focus);"
|
|
" return [r, rows.map((_, i) => pickClass(r, i))]; };"
|
|
"\nconsole.log(JSON.stringify({ a: show('A|1'), b: show('B'), c: show('C'),"
|
|
" none: show(undefined), unknown: show('Z|1') }));",
|
|
)
|
|
assert out["a"][0] == [0, 2]
|
|
assert out["a"][1] == [
|
|
"is-pick is-pick-top", "is-pick", "is-pick is-pick-end", None, None, None, None, None,
|
|
] # fmt: skip
|
|
assert out["b"][0] == [3, 6]
|
|
assert out["b"][1][3:7] == [
|
|
"is-pick is-pick-top", "is-pick", "is-pick", "is-pick is-pick-end",
|
|
] # fmt: skip
|
|
assert out["b"][1][:3] == [None] * 3 # 다른 호표 없음
|
|
assert out["c"][0] == [7, 7] and out["c"][1][7] == "is-pick is-pick-top is-pick-end"
|
|
assert out["none"] == [None, [None] * 8] and out["unknown"] == [None, [None] * 8]
|
|
|
|
|
|
def test_표_보기_줄_class_넘김():
|
|
out = run(
|
|
[COMMON, TABS, GROUPS],
|
|
f"\nconst spec = {{ columns: [{{ key: 'key' }}], rows: {json.dumps(ROWS)} }};"
|
|
"\nlet extra = null;"
|
|
"\nconst o = { tab: 'dg', spec, hint: null, focus: 'B|1', goto: () => {}, redraw: () => {},"
|
|
" makeTable: (e) => { extra = e; return { root: document.createElement('table'),"
|
|
" focusRow: () => {} }; } };"
|
|
"\nchosen.set('dg', 'table');"
|
|
"\nrenderGroupPanel(o);"
|
|
"\nconsole.log(JSON.stringify(spec.rows.map((_, i) => extra(i))));",
|
|
)
|
|
assert out == (
|
|
[None] * 3 + ["is-pick is-pick-top", "is-pick", "is-pick", "is-pick is-pick-end"] + [None]
|
|
)
|
|
|
|
|
|
def test_글_접기_없음_CSS_잇기():
|
|
groups = (ROOT / GROUPS).read_text("utf-8")
|
|
assert '"표로 보기" : "박스보기"' in groups and "호표별 보기" not in groups
|
|
common = (ROOT / COMMON).read_text("utf-8")
|
|
for gone in ("isSummary", "GROUP_SUMMARY_OVER", "is-closed", "모두 펼침", "모두 접기"):
|
|
assert gone not in common
|
|
assert 'box?.classList.add("is-pick")' in common
|
|
page = (ROOT / "B09_Estimation" / "B09_Estimation_UI_Page.css").read_text("utf-8")
|
|
for sel in ("tr.is-pick td", "tr.is-pick.is-pick-top td", "tr.is-pick.is-pick-end td"):
|
|
assert sel in page
|
|
assert page.count("var(--color-danger)") == 4 # 위 · 아래 · 왼 · 오른 2px
|
|
shell = (ROOT / "B09_Estimation" / "B09_Estimation_UI_Shell.ts").read_text("utf-8")
|
|
assert "extra?: (index: number) => string | null" in shell
|