Files
Aislo/resources/tester/test_248_1_b09_group_jump_unpick.py
T

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