Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
91 lines
4.6 KiB
Python
91 lines
4.6 KiB
Python
"""248-1 B09 묶음 탭(일위대가표 · 중기사용료 · 단가산출근거) 다른 탭 이동 빨강 = 설계내역서(242-1) 규칙.
|
|
|
|
- 이동해 온 호표 = 빨강 하나 — 카드 = 박스 is-pick 만(줄 is-focus 안 붙음) · 표 = 구간 is-pick 만 ·
|
|
공용 focusRow(at, false) = 스크롤만
|
|
- 줄 · 카드 누름 · 방향키 · Esc = 빨강 풂 · 누른 줄만 고름(is-focus) · Esc = 고름도 풂 · 다시 그려도 그대로
|
|
- 글 칸 안 키 · 다른 키 = 그대로
|
|
"""
|
|
|
|
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, RAW, TABS, run # noqa: E402
|
|
from resources.tester.test_171_3_b09_group_tabs import DG # noqa: E402
|
|
from resources.tester.test_181_2_b09_box_pick import ROWS # noqa: E402
|
|
|
|
LABOR = "B09_Estimation/B09_Estimation_UI_Tabs_Labor.ts"
|
|
INPUT = "{ closest: (s) => (s.includes('input') ? {} : null) }" # 글 칸 안 키
|
|
|
|
|
|
def test_카드_빨강_하나_누름_키_풂():
|
|
out = run(
|
|
[COMMON, TABS, LABOR, GROUPS],
|
|
f"\nconst spec = buildDaegaBlocks({{ sheets: {{ daega_blocks: [{json.dumps(DG, ensure_ascii=False)}] }} }});"
|
|
"\nconst o = { tab: 'dg', spec, hint: null, focus: 'DG1|1', goto: () => {}, redraw: () => {},"
|
|
" setTools: () => {}, makeTable: () => null };"
|
|
"\nconst marks = (v) => [v.all('.is-pick').length, v.all('.is-focus').map((e) => e.dataset.at ?? 'box')];"
|
|
"\nconst out = {};"
|
|
"\nlet [v] = renderGroupPanel(o); out.came = marks(v);"
|
|
"\nv.querySelector('[data-at=\"2\"]').click(); out.line = marks(v);"
|
|
"\n[v] = renderGroupPanel(o); v.querySelector('.ui-group-card').click(); out.box = marks(v);"
|
|
"\n[v] = renderGroupPanel(o); key('a'); key('ArrowDown', "
|
|
+ INPUT
|
|
+ "); out.kept = marks(v);"
|
|
"\nkey('ArrowDown'); out.arrow = marks(v);"
|
|
"\n[v] = renderGroupPanel(o); v.querySelector('[data-at=\"2\"]').click(); key('Escape'); out.esc = marks(v);"
|
|
"\nconsole.log(JSON.stringify(out));",
|
|
RAW,
|
|
)
|
|
assert out["came"] == [1, []] # 박스 빨강만 · 줄 강조 없음
|
|
assert out["line"] == [0, ["2"]] # 누른 줄만 고름
|
|
assert out["box"] == [0, []] # 카드 빈 곳 누름 = 빨강만 풂
|
|
assert out["kept"] == [1, []] # 다른 키 · 글 칸 안 = 그대로
|
|
assert out["arrow"] == [0, []]
|
|
assert out["esc"] == [0, []] # Esc = 고름도 풂
|
|
|
|
|
|
def test_표_빨강_하나_누름_키_풂():
|
|
out = run(
|
|
[COMMON, TABS, GROUPS],
|
|
f"\nconst spec = {{ columns: [{{ key: 'key' }}], rows: {json.dumps(ROWS)} }};"
|
|
"\nlet extra = null; let root = null; const scrolled = [];"
|
|
"\nconst makeTable = (e) => { extra = e; root = document.createElement('table');"
|
|
" spec.rows.forEach((_, i) => { const tr = document.createElement('tr'); tr.dataset.i = String(i);"
|
|
" tr.className = e(i) ?? ''; tr.append(document.createElement('td')); root.append(tr); });"
|
|
" return { root, focusRow: (i, mark) => scrolled.push([i, mark]) }; };"
|
|
"\nconst o = { tab: 'dg', spec, hint: null, focus: 'B|1', goto: () => {}, redraw: () => {},"
|
|
" setTools: () => {}, makeTable };"
|
|
"\nchooseGroupView('table');"
|
|
"\nconst marks = () => [root.children.map((tr) => tr.className || null),"
|
|
" spec.rows.map((_, i) => extra(i))];"
|
|
"\nconst out = {};"
|
|
"\nrenderGroupPanel(o); out.came = marks(); out.scrolled = [...scrolled];"
|
|
"\nroot.children[1].children[0].click(); out.click = marks();"
|
|
"\nrenderGroupPanel(o); key('Enter'); key('ArrowUp', " + INPUT + "); out.kept = marks()[0];"
|
|
"\nkey('ArrowUp'); out.arrow = marks();"
|
|
"\nrenderGroupPanel(o); root.children[5].click(); key('Escape'); out.esc = marks();"
|
|
"\nconsole.log(JSON.stringify(out));",
|
|
)
|
|
red = [None] * 3 + ["is-pick is-pick-top", "is-pick", "is-pick", "is-pick is-pick-end", None]
|
|
none = [None] * 8
|
|
assert out["came"] == [red, red] # 구간 빨강만
|
|
assert out["scrolled"] == [[4, False]] # 스크롤만(공용 강조 안 붙임)
|
|
focus1 = [None, "is-focus"] + [None] * 6
|
|
assert out["click"] == [focus1, focus1] # 누른 줄만 · 다시 그려도
|
|
assert out["kept"] == red
|
|
assert out["arrow"] == [none, none]
|
|
assert out["esc"] == [none, none]
|
|
|
|
|
|
def test_배선():
|
|
groups = (ROOT / GROUPS).read_text("utf-8")
|
|
assert "table.focusRow(at, false)" in groups
|
|
common = (ROOT / COMMON).read_text("utf-8")
|
|
assert 'el?.classList.add("is-focus")' not in common
|
|
assert "unpickCards(grid, true);" in common
|