Files
Aislo/resources/tester/cad/ctrl-shortcut-sheet.test.ts
T
eomsangdonandClaude Sonnet 5.5 f8fff70d56 fix(단축키): 전역 Ctrl 단축키 한글 자판 대응 · 공용 판정 함수(214-2)
- A00_Common/key_shortcut.ts 새로 — 영문이면 글자 · 아니면 자판 자리(code) · CAD 와 페이지가 같이 씀
- CAD input-shortcut.ts 는 공용을 다시 내보냄 · tsconfig.app.json 에 공용 파일 포함
- B05 종단 Ctrl+Z · 노선 편집 Ctrl+Z · Y · M02 흐름도 Ctrl+Z · 카드 Ctrl+S · 나무 Ctrl+C · V · 시트 Ctrl+글자
- 시트 키는 한글 조합 중에도 Ctrl+글자 판정
- 새 시험 ctrl-shortcut-hangul · ctrl-shortcut-sheet

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01STqEqztUthVFBmEP18wBSz
2026-10-10 15:32:58 +09:00

61 lines
2.1 KiB
TypeScript

/**
* 시트 키 — 한글 자판에서도 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"]);
});
});