minsung 03fb504eea BREAKING: 3-tier split step 2 + engine-bridge v3 EgBim lambdas wired
Completes the Generic / HmEG-aware / App-specific separation started in
f6b6e74. The legacy EgPlugin / EngineBridge / EngineBridge.Client /
EngineBridge.Probe modules are moved into their proper tiers, namespaces
and csproj/sln entries are renamed, and the HmegDirectStateProvider
lambdas are finally populated with real handles from the EgBim plugin
host. A new Recordingtest.Architecture.Tests project enforces the tier
rule at build time.

Moves (git mv + csproj/RootNamespace/AssemblyName rename + sln):

  src/Recordingtest.EgPlugin
    -> src/Sut/EgBim/Recordingtest.Sut.EgBim.PluginHost
  src/Recordingtest.EngineBridge
    -> src/Hmeg/Recordingtest.Hmeg.Catalog
  src/Recordingtest.EngineBridge.Client
    -> src/Hmeg/Recordingtest.Hmeg.Bridge.Client
  src/Recordingtest.EngineBridge.Probe
    -> src/Hmeg/Recordingtest.Hmeg.Catalog.Probe

  tests/Recordingtest.EgPlugin.Tests
    -> tests/Sut/EgBim/Recordingtest.Sut.EgBim.PluginHost.Tests
  tests/Recordingtest.EngineBridge.Tests
    -> tests/Hmeg/Recordingtest.Hmeg.Catalog.Tests
  tests/Recordingtest.EngineBridge.IntegrationTests
    -> tests/Hmeg/Recordingtest.Hmeg.Catalog.IntegrationTests

Namespace rename applied across all .cs files and csproj RootNamespace:

  Recordingtest.EgPlugin           -> Recordingtest.Sut.EgBim.PluginHost
  Recordingtest.EngineBridge       -> Recordingtest.Hmeg.Catalog
  Recordingtest.EngineBridge.Client -> Recordingtest.Hmeg.Bridge.Client
  Recordingtest.EngineBridge.Probe -> Recordingtest.Hmeg.Catalog.Probe

New: tests/Recordingtest.Architecture.Tests/

  DependencyGraphTests walks Assembly.GetReferencedAssemblies() for each
  tier and fails if a forbidden reference leaks in:
    - Generic modules must not reference HmEG or any app-specific DLL
    - HmEG-aware modules must not reference app-specific DLLs
    - Recordingtest.Hmeg.Bridge must reference HmEG (positive check)
  11 tests, all passing. Prevents future drift from CLAUDE.md §8.1.

Engine-bridge v3 wire-up (HmEgBridgePlugin.BuildProvider):

  Previously the HmegDirectStateProvider lambdas returned null and the
  chain fell through to reflection. They now call directly into the
  EditorPlugin base class that HmEgBridgePlugin inherits:

    spaceProvider    = () => RootSpace
                           // AppManager.ViewportManager.RootSpace
    viewportProvider = () => View
                           // EGViewport : Control, HmEGViewport
    documentPathProvider = () => AppManager?.FileManager?.CurrentFile

  Every lambda is wrapped in try/catch so plugin construction still
  cannot throw back into the SUT. Editor02.HmEGAppManager.dll added as
  a reference on Recordingtest.Sut.EgBim.PluginHost.csproj — app-
  specific tier, which is allowed by the architecture tests.

Entry points were confirmed from read-only review of the SUT sources at
  D:\GiteaAll\EG-BIM_Modeler\EditorPluginInterface\EditorPlugin.cs
  D:\GiteaAll\EG-BIM_Modeler\HmEGApplicationManagementLibrary\HmEGAppManager.cs
  D:\GiteaAll\EG-BIM_Modeler\HmEGApplicationManagementLibrary\SubManager\FileManager.cs

closing out Q1/Q2/Q6/Q7 from docs/hmeg-api-survey.md.

Tests: 115 -> 126 (+11 Architecture), 0 failures.

Next step: live verification of /scene /camera /selection with a real
SUT session; any discrepancy in HmegDirectStateProvider reflection will
be tightened after observing real HmEG camera field names.

Ref: #10 follow-up, #14 follow-up, docs/contracts/generic-sut-split.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:39:13 +09:00
2026-04-07 20:35:45 +09:00
2026-04-07 20:35:45 +09:00

recordingtest

사내 WPF 3D 편집 응용(자체 엔진 HmEG, MEF plugin 아키텍처)에 대한 사용자 입력 회귀 테스트 자동화 도구. 도구 자체이지 SUT가 아니다. 자세한 운영 지침은 CLAUDE.md, 현재 진행 상태는 PROGRESS.md, 다음 할 일은 PLAN.md를 참고.

핵심 전략 — Golden-file 회귀

수동 테스트 입력을 레코딩 → 리플레이 → 결과 저장 파일을 정규화 후 baseline과 diff. ApprovalTests 패턴과 동형이며 SUT 코드 변경 협조를 최소화하기 위한 의도적 선택이다.

[수동 테스트] → 입력 레코드 + 결과 파일 A (approved baseline)
[회귀 시점]   → 입력 리플레이 → 결과 파일 B → normalize → diff(A, B)

모듈 구성

모듈 책임 상태
Recordingtest.SutProber SUT 정적 probe (plugin/Json/assembly 카탈로그) PoC pass
Recordingtest.Recorder 입력 캡처 (UIA element path + offset + 키/마우스/포커스) PoC pass
Recordingtest.Player 시나리오 재생, 비동기 동기화 PoC pass
Recordingtest.Normalizer 결과 파일 정규화 (timestamp/GUID/path/float/order) PoC pass
Recordingtest.DiffReporter approved vs received diff 리포트 PoC pass
Recordingtest.EngineBridge.Client + Recordingtest.EgPlugin HmEG 내부 상태 sidecar (MEF plugin masquerade + HttpListener) v2 pass
Recordingtest.Runner 5-모듈 E2E 파이프라인 + 실패 triage PoC pass

작업 사이클 — Planner / Generator / Evaluator

Anthropic harness design 원칙을 채택. 같은 에이전트가 생성과 평가를 겸하지 않는다.

  1. /contract <name> — Sprint Contract 작성 (docs/contracts/<name>.md, 검증 가능한 DoD)
  2. Generator — 계약 기준으로 구현
  3. /evaluate <name> — 독립 evaluator가 채점, pass 시에만 PROGRESS.md 갱신

기술 스택

  • 언어: C# / .NET (SUT와 동일 생태계)
  • UI 자동화: FlaUI 1순위, Win32 low-level hook hybrid
  • 시나리오 포맷: YAML/JSON (git diff 친화적)
  • 베이스라인: *.approved.{ext} / *.received.{ext}

디렉터리

recordingtest/
├── src/                # 모듈별 C# 프로젝트
├── scenarios/          # 시나리오 YAML
├── docs/
│   ├── contracts/      # Sprint Contracts + evaluations
│   ├── history/        # 작업 히스토리
│   ├── sut-catalog/    # sut-prober 산출물
│   └── guides/         # smoke test, deploy 가이드
├── CLAUDE.md           # 에이전트 운영 지침
├── PROGRESS.md         # 완료 상태
└── PLAN.md             # 우선순위 큐

저장소

Description
WPF Application User Input Regression Test
Readme 1 MiB
Languages
C# 93.2%
Python 4.6%
Shell 1.4%
Batchfile 0.8%