/** * 시트 키 — 한글 자판에서도 Ctrl 단축키(PLAN 214-2). * 실행: cd B07_DesignDetail/openwebcad && npx vitest run --config ../../resources/tester/cad/vitest.ui.config.ts */ import { describe, expect, it } from "vitest"; import { attachKeys } from "../../../A00_Common/spreadsheet/spreadsheet_keys"; describe("시트 키 — 한글 자판 Ctrl 단축키", () => { const setup = () => { const log: string[] = []; const handlers: ((e: KeyboardEvent) => void)[] = []; const ed = { ta: { addEventListener: (_: string, fn: (e: KeyboardEvent) => void) => handlers.push(fn), removeEventListener: () => {}, }, formula: { addEventListener: () => {}, removeEventListener: () => {} }, editing: () => false, }; const ctx = { undo: () => log.push("undo"), redo: () => log.push("redo"), readOnly: false, sheet: () => ({}), selection: {}, }; attachKeys(ctx as never, ed as never, { find: (replace: boolean) => log.push(replace ? "replace" : "find"), }); const press = (extra: object) => handlers[0]({ key: "", code: "", keyCode: 0, isComposing: false, ctrlKey: true, metaKey: false, shiftKey: false, altKey: false, target: null, preventDefault: () => {}, stopPropagation: () => {}, ...extra, } as unknown as KeyboardEvent); return { log, press }; }; it("「ㅋ」 = 되돌리기 · 「ㅛ」 = 다시 하기 · Shift+「ㅋ」 = 다시 하기", () => { const { log, press } = setup(); press({ key: "ㅋ", code: "KeyZ" }); press({ key: "ㅛ", code: "KeyY" }); press({ key: "ㅋ", code: "KeyZ", shiftKey: true }); expect(log).toEqual(["undo", "redo", "redo"]); }); it("「ㄹ」(KeyF) = 찾기 · 「ㅗ」(KeyH) = 바꾸기 · 조합 중에도", () => { const { log, press } = setup(); press({ key: "ㄹ", code: "KeyF" }); press({ key: "Process", code: "KeyH", keyCode: 229, isComposing: true }); expect(log).toEqual(["find", "replace"]); }); });