"""산출근거 스프레드시트 — B(함수 · 숫자 형식 · 채우기) 자기 시험. 엔진 A(파서 · eval 몸)가 아직 없어 `build:spreadsheet`(F)로 전체를 못 돌린다. B 파일은 DOM 을 모르고 A00_Common/spreadsheet 안에서 서로만 참조하므로(단 `spreadsheet_fill.ts` 가 A 의 `spreadsheet_refshift.moveFormula` 를 참조 — 채우기 시험은 식 채우기를 안 씀), `resources/tester/spreadsheet/spreadsheet_b_test_entry.ts` 를 vite `--ssr` 로 바로 번들해 Node 로 실행한다(엔진 전체가 아니라 B 파일만 문다). """ from __future__ import annotations import json import shutil import subprocess import tempfile from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[2] ENTRY = ROOT / "resources" / "tester" / "spreadsheet" / "spreadsheet_b_test_entry.ts" VITE = ROOT / "config" / "node_modules" / "vite" / "bin" / "vite.js" pytestmark = pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음") def _run_entry() -> dict: with tempfile.TemporaryDirectory(prefix="spreadsheet_b_test_") as outdir: entry_rel = "../" + str(ENTRY.relative_to(ROOT)).replace("\\", "/") build = subprocess.run( ["node", str(VITE), "build", "--configLoader", "runner", "--ssr", entry_rel, "--outDir", outdir], cwd=str(ROOT), capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=120, ) assert build.returncode == 0, f"vite ssr 번들 실패:\n{build.stdout}\n{build.stderr}" bundle = Path(outdir) / "spreadsheet_b_test_entry.js" run = subprocess.run( ["node", str(bundle)], capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=60, ) assert run.stdout.strip(), f"시험 진입이 아무 결과도 안 냄:\n{run.stderr}" return json.loads(run.stdout) def test_b_functions_numfmt_fill(): result = _run_entry() assert result["fail"] == 0, result["failures"] assert result["pass"] > 60