"""표 둘째 층 묶음 더하기 · 층 이름 고치기 — `ui_template_sheet_ops.ts` 를 Node 로 바로 돌려 봄. `addGroup` = 고른 열과 같은 맨 위 묶음(종류) 끝에 `[종류, 새 분류, …, 새 열]` · 다른 종류 열은 안 건드림. `setLayerName` = 층 이름(줄 머리 글) · 모자란 층은 빈 글로 채움. """ from __future__ import annotations import json import shutil import subprocess from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[2] OPS = ROOT / "ui_template" / "sheet" / "ui_template_sheet_ops.ts" pytestmark = pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음") SCRIPT = """ const { addGroup, setLayerName } = await import(process.argv[1]); const base = JSON.parse(process.argv[2]); const out = {}; let doc = structuredClone(base); out.id = addGroup(doc, "a1", 3, "새 분류", "새 열"); out.after_a1 = doc.열.map((c) => [c.id, c.머리]); doc = structuredClone(base); addGroup(doc, "b1", 4, "G", "L"); out.deep = doc.열.at(-1).머리; doc = structuredClone(base); addGroup(doc, null, 3, "G", "L"); out.none = doc.열.at(-1).머리; doc = structuredClone(base); setLayerName(doc, 1, " 분류1 "); out.layers = doc.층; doc = structuredClone(base); delete doc.층; setLayerName(doc, 2, "분류2"); out.padded = doc.층; console.log(JSON.stringify(out)); """ DOC = { "양식": "시험", "종류": "표", "판": 1, "층": ["종류", "공법", "규격"], "열": [ {"id": "a1", "머리": ["가", "x", "1"], "단위": "m"}, {"id": "a2", "머리": ["가", "x", "2"]}, {"id": "a3", "머리": ["가", "y", None]}, {"id": "b1", "머리": ["나", None, None]}, ], "줄": [], } def _run() -> dict: result = subprocess.run( ["node", "--experimental-strip-types", "--no-warnings", "--input-type=module", "-e", SCRIPT, OPS.as_uri(), json.dumps(DOC, ensure_ascii=False)], capture_output=True, text=True, encoding="utf-8", timeout=60, ) # fmt: skip assert result.returncode == 0, result.stderr return json.loads(result.stdout) def test_group_goes_to_end_of_same_top(): got = _run() assert got["id"] == "c1" assert got["after_a1"] == [ ["a1", ["가", "x", "1"]], ["a2", ["가", "x", "2"]], ["a3", ["가", "y", None]], ["c1", ["가", "새 분류", "새 열"]], ["b1", ["나", None, None]], ] def test_group_depth_and_no_selection(): got = _run() assert got["deep"] == ["나", "G", None, "L"] assert got["none"] == ["G", "G", "L"] def test_layer_name(): got = _run() assert got["layers"] == ["종류", "분류1", "규격"] assert got["padded"] == ["", "", "분류2"]