Fix smoke 1차 follow-up gaps: player resolver, type target, filter, utf8 (#12)

This commit is contained in:
minsung
2026-04-07 20:30:59 +09:00
parent 3738a0df5c
commit 8784fec923
13 changed files with 802 additions and 30 deletions

View File

@@ -0,0 +1,60 @@
# 2026-04-07 이슈 #12 Smoke 2회차 fix — Generator
- **이슈**: #12
- **롤**: Generator (Planner/Generator/Evaluator 사이클)
- **소요 시간**: ~50분
- **Context 사용량**: ~75k tokens
## 작업 요약
Smoke 1회차에서 발견된 4개 구조적 gap을 unit test 가능한 형태로 수정.
| Gap | 위치 | 수정 |
|-----|------|------|
| A | Player full-path resolver | `UiaPathParser` + `IUiaTreeNode`/`UiaPathResolver` 신규. `UiaPlayerHost.ResolveElement`가 FlaUI tree adapter로 segment chain descend |
| B | Recorder type step target inheritance | `DragCollapser``lastFocusPath`/`lastMousePath` 추적, `FlushType()`이 typeRes 없을 때 fallback |
| C | SUT 외 창 필터 | `IWindowFilter` + `SutProcessWindowFilter` 도입, `LowLevelHook.Filter`가 mouse/key 모두 필터링. `Program.cs`에서 `WindowFromPoint`/`GetForegroundWindow` 와이어업 |
| D | UTF-8 BOM 없는 yaml 명시 | `ScenarioWriter.WriteToFile``new UTF8Encoding(false)`로 저장 |
## 새 테스트 (10건)
Player.Tests:
- `UiaPathParser_ParsesMultiSegment_WithClassAndId`
- `UiaPathParser_ParsesNameAttribute`
- `UiaPathResolver_Descend_FindsNestedElement`
- `UiaPathResolver_LastSegmentWithoutId_UsesClassName`
- `UiaPathResolver_NotFound_ReturnsNull`
- `SmokeRegression_BoxV4CleanLike_ParsesAndResolves`
Recorder.Tests:
- `DragCollapser_TypeAfterFocusChange_InheritsTarget`
- `DragCollapser_TypeAfterMouseDown_FallbackToMouseTarget`
- `WindowFilter_ExternalCoord_DropsEvent`
- `WindowFilter_SutCoord_KeepsEvent`
- `ScenarioWriter_RoundTrip_PreservesKorean`
## 빌드/테스트 결과
- `dotnet build recordingtest.sln` — 0 warning, 0 error (TreatWarningsAsErrors)
- `dotnet test` — 60 → 71 통과, 0 실패
## 변경 파일
- src/Recordingtest.Player/UiaPathParser.cs (new)
- src/Recordingtest.Player/IUiaPathResolver.cs (new — `IUiaTreeNode`+`UiaPathResolver`)
- src/Recordingtest.Player/UiaPlayerHost.cs
- src/Recordingtest.Recorder/DragCollapser.cs
- src/Recordingtest.Recorder/ScenarioWriter.cs
- src/Recordingtest.Recorder/WindowFilter.cs (new)
- src/Recordingtest.Recorder/NativeMethods.cs (WindowFromPoint/GetForegroundWindow/GetWindowThreadProcessId)
- src/Recordingtest.Recorder/LowLevelHook.cs (Filter property)
- src/Recordingtest.Recorder/Program.cs (filter wiring)
- tests/Recordingtest.Player.Tests/UiaPathResolverTests.cs (new)
- tests/Recordingtest.Recorder.Tests/RecorderTests.cs (5 새 fact)
- docs/guides/smoke-test.md (PowerShell UTF-8 팁)
## 다음 단계
- `/evaluate issue-12` (Evaluator)
- 통과 시 PROGRESS.md/PLAN.md orchestrator가 갱신
- 실제 SUT 위 smoke 2회차로 box-v4-clean.yaml 재생 검증