포인터 제스처를 순서대로 구동하는 테스트 seam (1.3 1단계) - #49
Merged
Merged
Conversation
1.2.0에서 표 그리기가 "모든 드래그가 아무것도 넣지 않는" 상태로 잠깐 나갔었다. `ReleasePointerCapture`가 `PointerCaptureLost`를 **동기로** 일으키는데 놓기 처리가 해제를 먼저 불렀기 때문이고, 좌표 단위 테스트는 전부 초록이었다(캡처가 테스트 밖이라 — `PointerRoutedEventArgs`는 생성할 수 없다). 사람이 실기에서 잡았다. **seam**: 처리기가 이벤트에서 실제로 읽는 것은 위치·오른쪽 버튼·모디파이어·캡처 넷뿐이므로 이것을 `PointerStep`으로 묶고, 캡처를 `IPointerCapture`로 추상화했다(`RichEditor.PointerPipeline.cs`). `OnCanvasPointer*`는 어댑터만 남고 본문은 `PointerPressedCore`/`MovedCore`/`ReleasedCore`/`CaptureLostCore`로 간다. 하위 처리기 9개(표 그리기·열/행 끌기·그림 손잡이·개체/텍스트 끌기)도 같은 타입을 받는다. 포인터 경로의 `Ctrl`/`Shift` 정적 키보드 읽기도 step으로 옮겼다 — 이제 테스트가 모디파이어를 정할 수 있다 (휠 처리기 하나만 남겨 뒀다: 3단계). 공개 표면 변화 없음, 동작 불변(기존 815 그대로 통과). **테스트** `ControlPointerSequenceTests` 6 — 누르기→캡처→이동→놓기→캡처상실을 실제 순서로 구동한다. `FakeCapture`가 WinUI처럼 해제 시 캡처 상실을 **동기로** 되쏜다. 반증 5종: - 놓기 순서 뒤집기 → 표 그리기 제스처 2건 빨강 (이 릴리스의 회귀가 재현된다) - 캡처 상실의 `CancelTableDraw` 제거 → 캡처 상실 테스트 + 기존 좌표 테스트 빨강 - 캡처 상실의 `FinishColumnResize` 제거 → 열 끌기 캡처 상실 테스트 + 기존 테스트 빨강 - ⚠ **열 끌기 놓기 순서 뒤집기 → 아무것도 빨개지지 않는다.** 캡처 상실이 열 끌기는 *취소*가 아니라 *완료*하고 `FinishColumnResize`가 멱등이라 실제로 무해하다(상류와 같다). 테스트 주석에 적어 뒀다. - ⚠ **가짜가 캡처 상실을 동기로 안 쏘면 뒤집힌 순서도 통과**(측정). 보증이 가짜의 충실도에 얹혀 있다는 뜻이라, 호출 순서 `capture → release → lost`를 테스트가 직접 단정하게 했다 — 가짜를 약화시키면 그 테스트가 빨개진다(확인). 여전히 자동 검증 밖: 프레임워크의 라우팅·히트테스트·포커스, WinUI의 진짜 캡처 의미. 그쪽 게이트는 `tools/fault-sweep.ps1`과 실기 확인이다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
centwon
added a commit
that referenced
this pull request
Sep 23, 2026
행/열 편집은 우클릭 메뉴로만, 단축키는 편집기 안에서만 읽혔다. 자체 툴바를 만드는 호스트는 TableBlock을 직접 고치거나(되돌리기·부모 배선·무효화 누락) "Ctrl+B"를 다시 적어야 했다. - 표·인덱스 지정 4종(InsertTableRow 등) + 캐럿 기준 6종(InsertRowAbove 등). 호출 하나 = 되돌리기 한 단계, bool 반환. 읽기 전용·범위 밖·다른 문서의 표·마지막 행/열은 false이고 체크포인트도 없다. "아래/오른쪽"은 메뉴와 같은 RowBelowIndex/ColumnRightIndex(병합 뒤). 문서 소속 판정은 AllParagraphs + FindCell — 부모 사슬은 떼어 낸 표도 "안"으로 본다(테스트로 고정). - RichEditorShortcuts·RichEditorShortcutId·RichEditorShortcut 공개. All은 읽기 전용 뷰, TryMatch는 내부. enum 순서는 포트 것 유지, Gesture(id)는 Avalonia 전용이라 뺐다. 테스트 887 → 910(TableStructureApiTests 17, PublicShortcutTableTests 6), 전부 통과. 반증 6종 전부 의도한 테스트만 빨강: 다른 문서 검사·범위 검사·읽기 전용 검사 제거, 아래=r+1, 키 핸들러 Bold 분기 제거, All이 배열 그대로. ControlFeatureFlagTests의 HTML 붙여넣기 테스트가 전체 실행 2/3에서 실패 — 실제 OS 클립보드에 HTML 형식이 안 실려 평문으로 떨어짐. main에서도 1/3 재현(기존 불안정, 이번 변경과 무관), 단독 3회 통과. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1.3의 최우선 항목 1단계. 공개 표면 변화 없음, 동작 불변(기존 815 그대로 통과 → 821).
왜
1.2.0에서 표 그리기가 잠깐 "모든 드래그가 아무것도 넣지 않는" 상태로 나갔다.
ReleasePointerCapture가PointerCaptureLost를 동기로 일으키는데 놓기 처리가 해제를 먼저 불렀기 때문이고, 좌표 단위 테스트는 전부 초록이었다 — 캡처가 테스트 밖이라(PointerRoutedEventArgs는 생성 불가). 사람이 실기에서 잡았다.무엇을
처리기가 이벤트에서 실제로 읽는 것은 위치 · 오른쪽 버튼 · 모디파이어 · 캡처 넷뿐이다. 이것을
PointerStep으로 묶고 캡처를IPointerCapture로 추상화했다(RichEditor.PointerPipeline.cs).OnCanvasPointer*는 어댑터만 남고, 본문은PointerPressedCore/MovedCore/ReleasedCore/CaptureLostCore로 간다.Ctrl/Shift정적 키보드 읽기를 step으로 옮겼다 — 테스트가 모디파이어를 정할 수 있다(휠 처리기 하나만 3단계로 남김).TableDrawPressAt등)는 그대로 둔다 — 현재 테스트 자산이고, 새 테스트는 그 위층을 덮는다.테스트
ControlPointerSequenceTests6개 — 누르기 → 캡처 → 이동 → 놓기 → 캡처상실을 실제 순서로 구동한다.FakeCapture가 WinUI처럼 해제 시 캡처 상실을 동기로 되쏜다.반증 5종
CancelTableDraw제거FinishColumnResize제거FinishColumnResize가 멱등이라 실제로 무해하다(상류와 같다). 테스트 주석에 적었다capture → release → lost를 테스트가 직접 단정하게 했고, 가짜를 약화시키면 그 테스트가 빨개진다(확인)남는 한계
프레임워크의 라우팅 · 히트테스트 · 포커스, 그리고 WinUI의 진짜 캡처 의미는 여전히 자동 검증 밖이다. 그쪽 게이트는
tools/fault-sweep.ps1과 실기 확인이며, 이 PR은 그것을 대체하지 않는다.다음: 2단계(그림 손잡이 · 개체 끌기 · 텍스트 끌기), 3단계(모디파이어 의존 동작 — Ctrl 복사 끌기, Ctrl+클릭 링크).
🤖 Generated with Claude Code