Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UoSr2sqvYtBf1dtQdus88s
66 lines
2.9 KiB
TypeScript
66 lines
2.9 KiB
TypeScript
/* 행 · 열 · 전체 고른 복사 = 쓴 최외곽까지(99-4) 시험 진입 — vite --ssr 로 번들해 Node 로 돌림.
|
|
* 결과 = JSON {pass, fail, failures} 한 줄(`test_spreadsheet_clip_used.py` 가 읽음) */
|
|
import { blockToClipboard } from "../../../A00_Common/spreadsheet/spreadsheet_clipboard";
|
|
import {
|
|
clipWholeToUsed,
|
|
usedExtent,
|
|
} from "../../../A00_Common/spreadsheet/spreadsheet_grid_cells";
|
|
import { MAX_COLS, MAX_ROWS } from "../../../A00_Common/spreadsheet/spreadsheet_types";
|
|
import type { CellRange, Workbook } from "../../../A00_Common/spreadsheet/spreadsheet_types";
|
|
|
|
let pass = 0;
|
|
const failures: string[] = [];
|
|
const eq = (name: string, got: unknown, want: unknown): void => {
|
|
if (JSON.stringify(got) === JSON.stringify(want)) pass += 1;
|
|
else failures.push(`${name}: ${JSON.stringify(got)} ≠ ${JSON.stringify(want)}`);
|
|
};
|
|
|
|
const book = (칸: Record<string, { 값: number }>): Workbook =>
|
|
({
|
|
종류: "통합문서",
|
|
판: 1,
|
|
열: "t",
|
|
서식: [{}],
|
|
시트: [{ id: "s1", 이름: "면적산출", 칸 }],
|
|
활성: "s1",
|
|
}) as unknown as Workbook;
|
|
|
|
const used = book({ A1: { 값: 1 }, C7: { 값: 2 }, B12: { 값: 3 } }); // 12 줄 · 3 칸
|
|
const empty = book({});
|
|
const sheet = used.시트[0];
|
|
const R = (r0: number, c0: number, r1: number, c1: number): CellRange => ({ r0, c0, r1, c1 });
|
|
const lines = (b: Workbook, rg: CellRange): { rows: number; cols: number } => {
|
|
const t = blockToClipboard(b, "s1", rg, () => null).text.split("\r\n");
|
|
return { rows: t.length, cols: t[0].split("\t").length };
|
|
};
|
|
|
|
eq("usedExtent", usedExtent(sheet), { rows: 12, cols: 3 });
|
|
eq("usedExtent 빈 시트", usedExtent(empty.시트[0]), { rows: 0, cols: 0 });
|
|
eq("열 머리 A:C", clipWholeToUsed(sheet, R(0, 0, MAX_ROWS - 1, 2)), R(0, 0, 11, 2));
|
|
eq("열 머리 줄 수", lines(used, clipWholeToUsed(sheet, R(0, 0, MAX_ROWS - 1, 0))), {
|
|
rows: 12,
|
|
cols: 1,
|
|
});
|
|
eq("행 머리 3행", clipWholeToUsed(sheet, R(2, 0, 2, MAX_COLS - 1)), R(2, 0, 2, 2));
|
|
eq("행 머리 칸 수", lines(used, clipWholeToUsed(sheet, R(2, 0, 2, MAX_COLS - 1))), {
|
|
rows: 1,
|
|
cols: 3,
|
|
});
|
|
eq("전체", clipWholeToUsed(sheet, R(0, 0, MAX_ROWS - 1, MAX_COLS - 1)), R(0, 0, 11, 2));
|
|
eq("전체 줄 · 칸", lines(used, clipWholeToUsed(sheet, R(0, 0, MAX_ROWS - 1, MAX_COLS - 1))), {
|
|
rows: 12,
|
|
cols: 3,
|
|
});
|
|
eq("쓴 곳 밖 열 머리 Z", clipWholeToUsed(sheet, R(0, 25, MAX_ROWS - 1, 25)), R(0, 25, 11, 25));
|
|
eq("쓴 곳 밖 행 머리 500", clipWholeToUsed(sheet, R(499, 0, 499, MAX_COLS - 1)), R(499, 0, 499, 2));
|
|
eq(
|
|
"빈 시트 전체",
|
|
clipWholeToUsed(empty.시트[0], R(0, 0, MAX_ROWS - 1, MAX_COLS - 1)),
|
|
R(0, 0, 0, 0),
|
|
);
|
|
eq("빈 시트 복사 글", blockToClipboard(empty, "s1", R(0, 0, 0, 0), () => null).text.trim(), "");
|
|
eq("보통 범위는 그대로", clipWholeToUsed(sheet, R(0, 0, 999, 5)), R(0, 0, 999, 5));
|
|
eq("단일 칸", clipWholeToUsed(sheet, R(4, 4, 4, 4)), R(4, 4, 4, 4));
|
|
|
|
console.log(JSON.stringify({ pass, fail: failures.length, failures }));
|