---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 105
  claims_with_evidence: 101
  claims_without_evidence: 4
confidence_derived: 0.96
---

# 根拠レポート：renderer-wddmcon 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：101 / 105、根拠なし：4
- 優先レビュー（高）
  1. **C-058/C-059 WDDMConCreate初期値検証**：DisplaySizeの計算ロジックが複雑で、D2D/DWriteのモック環境での再現が必要
  2. **C-090 ReadSettings レジストリ読み取り**：実環境のレジストリに依存するため、テスト環境での再現性に懸念
  3. **C-102/C-103 CreateDeviceResources**：DirectX/D2Dデバイス作成はハードウェア依存のため、モック戦略の検討が必要

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `src/renderer/wddmcon/WddmConRenderer.hpp` - WddmConEngineクラス宣言（publicメソッド、protected/privateメンバ）
- E-02: `src/renderer/wddmcon/WddmConRenderer.cpp` - WddmConEngineクラス実装（コンストラクタ、各メソッドの実装コード）
- E-03: `src/renderer/wddmcon/main.h` - WDDM API関数の宣言（WDDMConCreate, WDDMConDestroy等）
- E-04: `src/renderer/wddmcon/main.cxx` - WDDM API関数の実装（WDDMCONSOLECONTEXTの定義、各関数実装）
- E-05: `src/renderer/wddmcon/precomp.h` - プリコンパイルヘッダ（依存ライブラリ情報）
- E-06: `src/renderer/wddmcon/oss_shim.h` - OSSシム（IDXGISwapChainDWM, IDXGIFactoryDWMの定義）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | コンストラクタでメンバ変数が初期値に設定される | E-02 (L23-31): メンバ初期化リストで各値を明示的に設定 | ○ |
| C-002 | Initialize正常系：WDDMコンテキストが正常に初期化される | E-02 (L70-146): WDDMConCreate, WDDMConGetDisplaySize, calloc処理 | ○ |
| C-003 | Initialize正常系：ディスプレイサイズに基づくメモリ確保 | E-02 (L91-121): DisplaySize.bottomベースのループでOld/New確保 | ○ |
| C-004 | Initialize異常系：既に初期化済みの場合E_HANDLE | E-02 (L76, L141-143): _hWddmConCtx != INVALID_HANDLE_VALUEでE_HANDLE | ○ |
| C-005 | Initialize異常系：WDDMConCreate失敗時エラー返却 | E-02 (L78-80): SUCCEEDED(hr)チェック | ○ |
| C-006 | Initialize異常系：WDDMConGetDisplaySize失敗時コンテキスト破棄 | E-02 (L82-84, L134-137): 失敗時WDDMConDestroy呼び出し | ○ |
| C-007 | Initialize異常系：displayStateのcalloc失敗でE_OUTOFMEMORY | E-02 (L91-93, L127-132): nullptr時E_OUTOFMEMORY、WDDMConDestroy | ○ |
| C-008 | Initialize異常系：行データのOld/Newのcalloc失敗 | E-02 (L106-114, L122-125): nullptr時E_OUTOFMEMORY、FreeResources | ○ |
| C-009 | IsInitialized：未初期化でfalse | E-02 (L148-151): _hWddmConCtx != INVALID_HANDLE_VALUEの比較 | ○ |
| C-010 | IsInitialized：初期化済みでtrue | E-02 (L148-151): 同上 | ○ |
| C-011 | Enable正常系：ディスプレイアクセス有効化 | E-02 (L153-159): WDDMConEnableDisplayAccess(TRUE)呼び出し | ○ |
| C-012 | Enable異常系：未初期化状態エラー | E-02 (L156): RETURN_LAST_ERROR_IF | ○ |
| C-013 | Disable正常系：ディスプレイアクセス無効化 | E-02 (L161-167): WDDMConEnableDisplayAccess(FALSE)呼び出し | ○ |
| C-014 | Disable異常系：未初期化状態エラー | E-02 (L164): RETURN_LAST_ERROR_IF | ○ |
| C-015 | Invalidate：S_OK返却 | E-02 (L169-172): return S_OK | ○ |
| C-016 | InvalidateCursor：S_OK返却 | E-02 (L174-177): return S_OK | ○ |
| C-017 | InvalidateSystem：S_OK返却 | E-02 (L179-182): return S_OK | ○ |
| C-018 | InvalidateScroll：S_OK返却 | E-02 (L184-187): return S_OK | ○ |
| C-019 | InvalidateAll：S_OK返却 | E-02 (L189-192): return S_OK | ○ |
| C-020 | StartPaint正常系：バッチ更新開始 | E-02 (L194-200): WDDMConBeginUpdateDisplayBatch呼び出し | ○ |
| C-021 | StartPaint異常系：未初期化エラー | E-02 (L197): RETURN_LAST_ERROR_IF | ○ |
| C-022 | EndPaint正常系：バッチ更新終了 | E-02 (L202-208): WDDMConEndUpdateDisplayBatch呼び出し | ○ |
| C-023 | EndPaint異常系：未初期化エラー | E-02 (L205): RETURN_LAST_ERROR_IF | ○ |
| C-024 | Present：S_FALSE返却 | E-02 (L218-221): return S_FALSE | ○ |
| C-025 | ScrollFrame：S_OK返却 | E-02 (L223-226): return S_OK | ○ |
| C-026 | PaintBackground正常系：OldにNew値コピー、Newクリア | E-02 (L228-248): 二重ループでOld<-New、New<-' '/0x0 | ○ |
| C-027 | PaintBackground異常系：未初期化エラー | E-02 (L230): RETURN_LAST_ERROR_IF | ○ |
| C-028 | PaintBackground境界値：displayHeight=0でループ無実行 | E-02 (L232): rowIndex < _displayHeightの条件 | ○ |
| C-029 | PaintBufferLine正常系：クラスタデータ書き込み | E-02 (L250-274): ループでNew設定、WDDMConUpdateDisplay呼び出し | ○ |
| C-030 | PaintBufferLine異常系：未初期化エラー | E-02 (L257): RETURN_LAST_ERROR_IF | ○ |
| C-031 | PaintBufferLine境界値：クラスタ数がdisplayWidth超過 | E-02 (L259): i < _displayWidthの条件 | ○ |
| C-032 | PaintBufferLine境界値：空クラスタ | E-02 (L259): clusters.size()=0でループ未実行 | ○ |
| C-033 | PaintBufferLine正常系：Old/New遷移 | E-02 (L261-268): Old<-New、New<-新値 | ○ |
| C-034 | PaintBufferGridLines：S_OK返却 | E-02 (L276-283): return S_OK | ○ |
| C-035 | PaintSelection：S_OK返却 | E-02 (L285-288): return S_OK | ○ |
| C-036 | PaintCursor：S_OK返却 | E-02 (L290-293): return S_OK | ○ |
| C-037 | UpdateDrawingBrushes正常系：レガシー属性設定 | E-02 (L295-304): GetLegacyAttributes()で取得し設定 | ○ |
| C-038 | UpdateDrawingBrushes境界値：属性0x00 | E-02 (L301): 特別なバリデーションなし、直接代入 | ○ |
| C-039 | UpdateDrawingBrushes境界値：属性0xFF | E-02 (L301): 同上 | ○ |
| C-040 | UpdateFont正常系：GetProposedFontへ委譲 | E-02 (L306-309): GetProposedFont呼び出し | ○ |
| C-041 | UpdateDpi：S_OK返却 | E-02 (L311-314): return S_OK | ○ |
| C-042 | UpdateViewport：S_OK返却 | E-02 (L323-326): return S_OK | ○ |
| C-043 | GetProposedFont正常系：デフォルトフォントサイズ設定 | E-02 (L328-344): GetFontSize呼び出し、SetFromEngine呼び出し | ○ |
| C-044 | GetProposedFont正常系：プロパティ保持 | E-02 (L336-341): GetFaceName等から値を取得しSetFromEngineに渡す | ○ |
| C-045 | GetDirtyArea正常系：全体ダーティ領域 | E-02 (L346-355): _dirtyAreaを設定しspanで返却 | ○ |
| C-046 | GetDirtyArea境界値：ゼロサイズ | E-02 (L348-349): std::max<LONG>(0, 0)=0 | ○ |
| C-047 | GetDirtyArea正常系：負値クランプ | E-02 (L348-349): std::max<LONG>(0, _displayHeight) | ○ |
| C-048 | GetFontSize正常系：デフォルト値返却 | E-02 (L368-383): DEFAULT_FONT_WIDTH(8), DEFAULT_FONT_HEIGHT(12) | ○ |
| C-049 | IsGlyphWideByFont：常にfalse | E-02 (L385-389): *pResult = false | ○ |
| C-050 | GetDisplaySize正常系 | E-02 (L357-366): _displayHeight, _displayWidthからrect構築 | ○ |
| C-051 | GetDisplaySize境界値：ゼロサイズ | E-02 (L357-366): 初期値0で構築 | ○ |
| C-052 | FreeResources正常系：全メモリ解放 | E-02 (L33-62): ループでfree(Old), free(New), free(行), free(_displayState), WDDMConDestroy | ○ |
| C-053 | FreeResources異常系：displayStateがnullptr | E-02 (L35): if (_displayState)チェック | ○ |
| C-054 | FreeResources異常系：hWddmConCtxがINVALID_HANDLE_VALUE | E-02 (L57): if (_hWddmConCtx != INVALID_HANDLE_VALUE)チェック | ○ |
| C-055 | FreeResources異常系：OldがnullptrでもOKか | E-02 (L41): if (_displayState[i]->Old)チェック | ○ |
| C-056 | デストラクタ：FreeResources呼び出し | E-02 (L64-68): FreeResources(_displayHeight) | ○ |
| C-057 | _DoUpdateTitle：S_OK返却 | E-02 (L398-401): return S_OK | ○ |
| C-058 | WDDMConCreate正常系：コンテキスト作成 | E-04 (L373-474): malloc、ReadSettings、D2D/DWrite初期化フロー | ○ |
| C-059 | WDDMConCreate正常系：初期値設定 | E-04 (L384-388): fOutputEnabled=FALSE, FontSize=FONT_SIZE | ○ |
| C-060 | WDDMConCreate異常系：malloc失敗 | E-04 (L382-383): nullptr時E_OUTOFMEMORY | ○ |
| C-061 | WDDMConCreate異常系：D2D1CreateFactory失敗 | E-04 (L397): D2D1CreateFactory呼び出し、失敗時L469-471でDestroy | ○ |
| C-062 | WDDMConCreate異常系：pwszGlyphRunAccel malloc失敗 | E-04 (L458-462): nullptr時E_OUTOFMEMORY | ○ |
| C-063 | WDDMConDestroy正常系：全リソース解放 | E-04 (L87-103): ReleaseDeviceResources、COMリリース、free | ○ |
| C-064 | WDDMConDestroy異常系：nullハンドル | E-04 (L93): if (hDisplay != nullptr)チェック | ○ |
| C-065 | WDDMConBeginUpdateDisplayBatch正常系：バッチ開始 | E-04 (L493-524): BeginDraw、fInD2DBatch=TRUE | ○ |
| C-066 | WDDMConBeginUpdateDisplayBatch異常系：nullハンドル | E-04 (L502-503): nullptr時E_INVALIDARG | ○ |
| C-067 | WDDMConBeginUpdateDisplayBatch異常系：二重バッチ | E-04 (L508-510): fInD2DBatch時E_INVALIDARG | ○ |
| C-068 | WDDMConBeginUpdateDisplayBatch：出力無効時スキップ | E-04 (L512): fOutputEnabledチェック | ○ |
| C-069 | WDDMConBeginUpdateDisplayBatch：デバイスリソース遅延作成 | E-04 (L513-515): !fHaveDeviceResources時CreateDeviceResources | ○ |
| C-070 | WDDMConEndUpdateDisplayBatch正常系：バッチ終了 | E-04 (L526-560): EndDraw、PresentSwapChain | ○ |
| C-071 | WDDMConEndUpdateDisplayBatch異常系：nullハンドル | E-04 (L535-536): nullptr時E_INVALIDARG | ○ |
| C-072 | WDDMConEndUpdateDisplayBatch異常系：バッチ未開始 | E-04 (L541-543): !fInD2DBatch時E_INVALIDARG | ○ |
| C-073 | WDDMConEndUpdateDisplayBatch異常系：EndDraw失敗時クリーンアップ | E-04 (L548-556): FAILED(hr)時ReleaseDeviceResources | ○ |
| C-074 | WDDMConUpdateDisplay正常系：差分描画 | E-04 (L562-708): memcmp比較、CreateTextLayout、FillRectangle、DrawTextLayout | ○ |
| C-075 | WDDMConUpdateDisplay正常系：強制再描画 | E-04 (L603-606): fInvalidateチェック | ○ |
| C-076 | WDDMConUpdateDisplay異常系：nullハンドル | E-04 (L573-574): nullptr時E_INVALIDARG | ○ |
| C-077 | WDDMConUpdateDisplay異常系：null行情報 | E-04 (L573): pRowInformation == nullptr時E_INVALIDARG | ○ |
| C-078 | WDDMConUpdateDisplay：出力無効時スキップ | E-04 (L588): fOutputEnabledチェック | ○ |
| C-079 | WDDMConUpdateDisplay異常系：再試行制限 | E-04 (L583, L694-703): MAX_RENDER_ATTEMPTS(3)、goto ReRender | ○ |
| C-080 | WDDMConUpdateDisplay正常系：グリフランアクセラレーション | E-04 (L610-631): 同一Attribute連続でまとめ描画 | ○ |
| C-081 | WDDMConUpdateDisplay：バッチ中EndDraw/Presentスキップ | E-04 (L685-691): !fInD2DBatchチェック | ○ |
| C-082 | WDDMConUpdateDisplay：背景色は上位4ビット | E-04 (L664-665): (pCharacter->Attribute >> 4) & 0xF | ○ |
| C-083 | WDDMConUpdateDisplay：前景色は下位4ビット | E-04 (L669): pCharacter->Attribute & 0xF | ○ |
| C-084 | WDDMConGetDisplaySize正常系 | E-04 (L711-732): pCtx->DisplaySizeコピー | ○ |
| C-085 | WDDMConGetDisplaySize異常系：nullハンドル | E-04 (L721-722): nullptr時E_INVALIDARG | ○ |
| C-086 | WDDMConEnableDisplayAccess：FALSE->TRUE | E-04 (L736-763): fOutputEnabled設定 | ○ |
| C-087 | WDDMConEnableDisplayAccess：TRUE->FALSEでリソース解放 | E-04 (L757-759): !fOutputEnabled時ReleaseDeviceResources | ○ |
| C-088 | WDDMConEnableDisplayAccess異常系：nullハンドル | E-04 (L744-745): nullptr時E_INVALIDARG | ○ |
| C-089 | WDDMConEnableDisplayAccess異常系：同一状態変更 | E-04 (L750-753): fOutputEnabled == pCtx->fOutputEnabled時E_NOT_VALID_STATE | ○ |
| C-090 | ReadSettings正常系：レジストリ読み取り | E-04 (L105-171): RegOpenKeyEx、RegQueryValueEx | ○ |
| C-091 | ReadSettings異常系：pCtxがnullptr | E-04 (L117-119): nullptr時E_INVALIDARG | ○ |
| C-092 | ReadSettings異常系：レジストリキー不存在 | E-04 (L128-130): RegOpenKeyEx失敗時HRESULT_FROM_WIN32 | ○ |
| C-093 | ReadSettings境界値：FontSize=0の無視 | E-04 (L161): ValueData > 0の条件 | ○ |
| C-094 | CreateTextLayout正常系 | E-04 (L173-197): pDWriteFactory->CreateTextLayout | ○ |
| C-095 | CreateTextLayout異常系：pCtx nullptr | E-04 (L183-185): nullptr時E_INVALIDARG | ○ |
| C-096 | CreateTextLayout：LineHeight=0のフォールバック | E-04 (L192): 三項演算子でDisplayMode.Heightを使用 | ○ |
| C-097 | ReleaseDeviceResources正常系 | E-04 (L54-85): fHaveDeviceResources=FALSE設定、SafeRelease連鎖 | ○ |
| C-098 | ReleaseDeviceResources：バッチ中EndDraw | E-04 (L62-65): fInD2DBatchチェック、EndDraw | ○ |
| C-099 | CopyFrontToBack正常系 | E-04 (L199-224): GetBuffer(0)、GetBuffer(1)、CopyResource | ○ |
| C-100 | PresentSwapChain正常系 | E-04 (L226-241): Present(1,0)、CopyFrontToBack | ○ |
| C-101 | PresentSwapChain異常系：Present失敗 | E-04 (L235-236): SUCCEEDED(hr)チェック | ○ |
| C-102 | CreateDeviceResources正常系：フルリソース作成 | E-04 (L243-369): DXGI/D3D/D2Dリソース作成チェーン | △ |
| C-103 | CreateDeviceResources正常系：スワップチェーンなし | E-04 (L298): fCreateSwapChainチェック | △ |
| C-104 | CreateDeviceResources：既存リソース解放 | E-04 (L249-251): fHaveDeviceResources時ReleaseDeviceResources | ○ |
| C-105 | CreateDeviceResources異常系：失敗時クリーンアップ | E-04 (L364-366): FAILED時ReleaseDeviceResources | △ |

## 4) 不足情報（Unknown / Missing）
- C-102, C-103: CreateDeviceResourcesのテストはDirectX/DXGI/D2Dデバイスの完全なモック環境が必要であり、全ステップの検証は実環境に強く依存する。テストケースの入力値・期待結果はコードから推定したが、実際のCOMインターフェースのモック方針が不明。
  - 候補：DirectXモックフレームワークの選定 / テスト用スタブの設計 / 統合テストとしての実施検討
- C-105: CreateDeviceResources内のどのステップで失敗するかにより挙動が異なるが、全パターンの列挙は省略した。
  - 候補：各COMオブジェクト生成ステップごとの失敗テスト / エラーパス網羅のための追加ケース

## 5) リスクフラグ（レビュー観点）
- 1: WDDMConUpdateDisplayの再試行ロジック（goto ReRender）は、無限ループリスクがMAX_RENDER_ATTEMPTSで制限されているが、テストでの再現性に中程度のリスクがある
- 1: CreateDeviceResourcesはハードウェア依存が強く、CI環境でのテスト実行に中程度のリスクがある
- 0: Invalidate系/PaintSelection/PaintCursor等のスタブメソッドは低リスク（単純なS_OK返却）
- 1: ReadSettingsはWindowsレジストリに直接依存するため、クロスプラットフォームテストに中程度のリスクがある
- 0: FreeResources/デストラクタのメモリ解放テストは、メモリリーク検出ツール併用で検証可能

## 6) レビュアーチェックリスト（最小）
- [ ] WddmConEngineのpublic/protectedメソッドがすべてテスト対象に含まれているか
- [ ] main.cxxのWINAPI関数がすべてテスト対象に含まれているか
- [ ] 各メソッドの正常系/異常系/境界値が適切にカバーされているか
- [ ] DirectX/D2D関連のモック戦略が実現可能か確認（特にCreateDeviceResources）
- [ ] レジストリアクセス（ReadSettings）のテスト方針が適切か確認
- [ ] WDDMConUpdateDisplayのgoto ReRenderによる再試行ロジックのテスト方針を確認
- [ ] メモリ管理（calloc/free）のテストで、メモリリーク検出ツールの使用が計画されているか確認
- [ ] FreeResourcesの部分的なnullptr処理（Old/New/行のいずれかがnull）の網羅性を確認
