Files
Aislo/resources/tester/spreadsheet/harness_analysis.ts
T
eomsangdonandClaude Opus 5.5 6acc8d0c52 feat(spreadsheet): 수식 분석 — 선행 · 종속 추적 화살표 · 수식 계산 단계 보기 · 오류 검사 ⚠ 풍선
- 추적 화살표(spreadsheet_trace.ts): 누를 때마다 한 단계 · 범위는 상자 · 오류 칸 화살 빨강 · 다른 시트 점선 · 지우기
- 수식 계산 창(spreadsheet_eval_steps.ts): 왼쪽부터 한 마디씩 값으로 · 밑줄 · IF 류 첫 인자만 먼저 · 값은 엔진 풀이
- 오류 검사(spreadsheet_errcheck.ts): 순환 · 식 오류 · 숫자처럼 보이는 글 까닭 · ⚠ 메뉴(숫자로 변환 · 계산 단계 · 선행 추적 · 오류 무시)
- 격자 초록 세모는 C(sub6) · 잇기는 sub7 — 머리 주석에 잇는 법
- 엔진: evalSafe 내보냄 · formulaToText 에 갈음 · 밑줄 자리 · 계약 파일 목록 줄만 더함
- 시험: test_spreadsheet_analysis.py(3 묶음) · harness_analysis(ORCA) · 시험 틀은 inspect 로 문맥 꺼냄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TULoa94ZFL26KU6ZqVpjkF
2026-09-27 21:14:40 +09:00

73 lines
2.4 KiB
TypeScript

/* 수식 분석 화면 시험 틀 — 진짜 부품(createSpreadsheet)에 추적 화살 · 수식 계산 창 · 오류 ⚠ 를 붙임.
* sub7 잇기 전이라 `inspect` 로 문맥(ctx)을 꺼내고, grid.render 뒤 refresh 를 부름.
* 번들: node harness_analysis_bundle.cjs → tmp/spreadsheet_analysis/harness.js (git 밖) */
import { createSpreadsheet } from "../../../A00_Common/spreadsheet/spreadsheet";
import { attachTrace } from "../../../A00_Common/spreadsheet/spreadsheet_trace";
import { openEvalSteps } from "../../../A00_Common/spreadsheet/spreadsheet_eval_steps";
import { attachErrorTip } from "../../../A00_Common/spreadsheet/spreadsheet_errcheck";
import type { SpreadsheetContext } from "../../../A00_Common/spreadsheet/spreadsheet_view_types";
import type { Workbook } from "../../../A00_Common/spreadsheet/spreadsheet_types";
const w = window as unknown as Record<string, unknown>;
const book: Workbook = {
종류: "통합문서",
판: 1,
이름: "harness",
서식: [{}],
시트: [
{
id: "s1",
이름: "분석",
칸: {
A1: { 값: "단가" },
B1: { 값: "수량" },
C1: { 값: "금액" },
A2: { 값: 1200 },
B2: { 값: 3 },
C2: { 식: "A2*B2" },
A3: { 값: 800 },
B3: { 값: "5" },
C3: { 식: "A3*B3" },
A4: { 값: 50 },
B4: { 값: 0 },
C4: { 식: "A4/B4" },
C6: { 식: "SUM(C2:C3)+IF(B2>2,C2*10%,0)" },
D6: { 식: "C6*2" },
E2: { 식: "E3+1" },
E3: { 식: "E2+1" },
},
},
{ id: "s2", 이름: "요약", 칸: { A1: { 식: "분석!D6" } } },
],
활성: "s1",
};
const host = document.getElementById("host")!;
w.ss = createSpreadsheet(host, book, { inspect: true });
const c = w.__aisloSheet as SpreadsheetContext;
const trace = attachTrace(c);
const tip = attachErrorTip(c, trace);
const render = c.grid.render.bind(c.grid);
c.grid.render = () => {
render();
trace.refresh();
tip.refresh();
};
const renderSel = c.grid.renderSelection.bind(c.grid);
c.grid.renderSelection = () => {
renderSel();
tip.refresh();
};
w.ssCtx = c;
w.ssTrace = trace;
w.ssTip = tip;
w.ssSteps = () => openEvalSteps(c);
for (const [id, run] of [
["btn-prec", () => trace.precedents()],
["btn-dep", () => trace.dependents()],
["btn-clear", () => trace.clear()],
["btn-steps", () => openEvalSteps(c)],
] as const)
document.getElementById(id)!.addEventListener("click", run);