---
generated_at: 2026-01-28 18:30:00
metrics:
  claims_total: 115
  claims_with_evidence: 112
  claims_without_evidence: 3
confidence_derived: 0.97
---

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

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：112 / 115、根拠なし：3
- 優先レビュー（高）
  1. **UT-TLK-114, UT-TLK-115**：String.signed extensionはprivate extensionのため、テスト方法の検討が必要
  2. **TalkPagesFunnel イベントログ系**：イベント送信の検証方法についてモック設計が必要

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `Wikipedia/Code/TalkPageViewController.swift` - TalkPageViewControllerクラス定義
- E-02: `Wikipedia/Code/TalkPageViewModel.swift` - TalkPageViewModelクラス定義
- E-03: `Wikipedia/Code/TalkPageDataController.swift` - TalkPageDataControllerクラス定義
- E-04: `Wikipedia/Code/TalkPageFetcher.swift` - TalkPageFetcherクラス、TalkPageItem構造体定義
- E-05: `Wikipedia/Code/TalkPageCellViewModel.swift` - TalkPageCellViewModelクラス定義
- E-06: `Wikipedia/Code/TalkPageCellCommentViewModel.swift` - TalkPageCellCommentViewModelクラス定義
- E-07: `Wikipedia/Code/TalkPageType.swift` - TalkPageType enum定義
- E-08: `Wikipedia/Code/TalkPageReplyComposeController.swift` - TalkPageReplyComposeControllerクラス定義
- E-09: `Wikipedia/Code/TalkPageFindInPageState.swift` - TalkPageFindInPageStateクラス定義
- E-10: `Wikipedia/Code/TalkPageFindInPageSearchController.swift` - TalkPageFindInPageSearchControllerクラス定義
- E-11: `Wikipedia/Code/TalkPageCache.swift` - TalkPageCache構造体定義
- E-12: `Wikipedia/Code/TalkPageArchivesFetcher.swift` - TalkPageArchivesFetcherクラス定義
- E-13: `Wikipedia/Code/TalkPageArchivesViewController.swift` - TalkPageArchivesViewModel構造体定義
- E-14: `Wikipedia/Code/TalkPageArchivesItem.swift` - TalkPageArchivesItem構造体定義
- E-15: `Wikipedia/Code/TalkPageCoffeeRollViewModel.swift` - TalkPageCoffeeRollViewModelクラス定義
- E-16: `Wikipedia/Code/TalkPagesFunnel.swift` - TalkPagesFunnelクラス定義
- E-17: `Wikipedia/Code/TalkPageTopicComposeViewController.swift` - TalkPageTopicComposeViewControllerクラス定義
- E-18: `Wikipedia/Code/TalkPageCoordinator.swift` - UserTalkCoordinatorクラス定義
- E-19: `WikipediaUnitTests/Code/TalkPageControllerTests.swift` - 既存テストファイル

## 3) Claims と根拠の対応（レビューの主戦場）

### TalkPageViewModel（UT-TLK-001 〜 UT-TLK-015）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | TalkPageViewModel.initの正常系テスト | E-02 (lines 48-76) | ○ |
| C-02 | TalkPageViewModel.initの異常系テスト（無効URL） | E-02 (lines 57-59 guard文) | ○ |
| C-03 | convenience initの正常系テスト | E-02 (lines 84-90) | ○ |
| C-04 | convenience initの異常系テスト | E-02 (lines 85-86 guard文) | ○ |
| C-05 | fetchTalkPageの正常系テスト | E-02 (lines 107-130) | ○ |
| C-06 | fetchTalkPageの異常系テスト | E-02 (lines 124-127) | ○ |
| C-07 | postTopicの正常系テスト | E-02 (lines 132-134) | ○ |
| C-08 | postReplyの正常系テスト | E-02 (lines 136-138) | ○ |
| C-09 | subscribe購読の正常系テスト | E-02 (lines 141-150) | ○ |
| C-10 | subscribe購読解除の正常系テスト | E-02 (lines 141-150) | ○ |
| C-11 | updateSubscriptionForTopicテスト | E-02 (lines 152-160) | ○ |
| C-12 | getTalkPageURL(encoded:true)テスト | E-02 (lines 163-173) | ○ |
| C-13 | getTalkPageURL(encoded:false)テスト | E-02 (lines 163-173) | ○ |
| C-14 | resetToNewSiteURLテスト | E-02 (lines 94-101) | ○ |
| C-15 | isUserPermanentプロパティテスト | E-02 (lines 103-105) | ○ |

### TalkPageCellViewModel（UT-TLK-016 〜 UT-TLK-027）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-16 | TalkPageCellViewModel.init正常系 | E-05 (lines 43-64) | ○ |
| C-17 | timestampDisplay正常系 | E-05 (lines 47-50) | ○ |
| C-18 | timestampDisplay境界値（nil） | E-05 (lines 47-50) | ○ |
| C-19 | repliesCount計算 | E-05 (lines 27-30) | ○ |
| C-20 | allCommentViewModels正常系 | E-05 (lines 32-37) | ○ |
| C-21 | allCommentViewModels境界値 | E-05 (lines 32-37) | ○ |
| C-22 | topicTitleAttributedString | E-05 (lines 66-69) | ○ |
| C-23 | leadCommentAttributedString正常系 | E-05 (lines 71-81) | ○ |
| C-24 | leadCommentAttributedString境界値 | E-05 (lines 71-81) | ○ |
| C-25 | otherContentAttributedString | E-05 (lines 83-91) | ○ |
| C-26 | Hashable準拠 | E-05 (lines 94-102) | ○ |
| C-27 | accessibilityDate | E-05 (lines 104-114) | ○ |

### TalkPageCellCommentViewModel（UT-TLK-028 〜 UT-TLK-033）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | init正常系 | E-06 (lines 15-30) | ○ |
| C-29 | init異常系（html=nil） | E-06 (lines 17-21 guard文) | ○ |
| C-30 | init異常系（author=nil） | E-06 (lines 17-21 guard文) | ○ |
| C-31 | init異常系（replyDepth=nil） | E-06 (lines 17-21 guard文) | ○ |
| C-32 | commentAttributedString | E-06 (lines 32-36) | ○ |
| C-33 | Hashable準拠 | E-06 (lines 41-49) | ○ |

### TalkPageDataController（UT-TLK-034 〜 UT-TLK-042）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | init正常系 | E-03 (lines 16-21) | ○ |
| C-35 | resetToNewSiteURL | E-03 (lines 23-26) | ○ |
| C-36 | fetchTalkPage正常系 | E-03 (lines 36-77) | ○ |
| C-37 | fetchTalkPage記事サマリー取得 | E-03 (lines 169-205) | ○ |
| C-38 | fetchTalkPage購読情報取得 | E-03 (lines 108-127) | ○ |
| C-39 | postReply正常系 | E-03 (lines 79-86) | ○ |
| C-40 | postTopic正常系 | E-03 (lines 88-95) | ○ |
| C-41 | subscribeToTopic | E-03 (lines 97-104) | ○ |
| C-42 | fetchLatestRevisionID | E-03 (lines 207-239) | ○ |

### TalkPageFetcher（UT-TLK-043 〜 UT-TLK-053）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-43 | fetchTalkPageContent正常系 | E-04 (lines 84-105) | ○ |
| C-44 | fetchTalkPageContent異常系 | E-04 (lines 85-88 guard文) | ○ |
| C-45 | subscribeToTopic購読成功 | E-04 (lines 109-146) | ○ |
| C-46 | subscribeToTopic購読解除成功 | E-04 (lines 109-146) | ○ |
| C-47 | subscribeToTopicエラー | E-04 (lines 133-136) | ○ |
| C-48 | getSubscribedTopics正常系 | E-04 (lines 153-187) | ○ |
| C-49 | getSubscribedTopics空配列 | E-04 (lines 175-183) | ○ |
| C-50 | postReply正常系 | E-04 (lines 189-209) | ○ |
| C-51 | postReplyエラー | E-04 (lines 232-251) | ○ |
| C-52 | postTopic正常系 | E-04 (lines 211-230) | ○ |
| C-53 | postTopicエラー | E-04 (lines 232-251) | ○ |

### TalkPageItem（UT-TLK-054 〜 UT-TLK-057）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-54 | init(from:)デコード正常系 | E-04 (lines 56-75) | ○ |
| C-55 | timestamp ISO8601パース | E-04 (lines 69-74) | ○ |
| C-56 | オプショナルフィールド処理 | E-04 (lines 60-67) | ○ |
| C-57 | updatingReplies | E-04 (lines 77-79) | ○ |

### TalkPageType（UT-TLK-058 〜 UT-TLK-062）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-58 | canonicalNamespacePrefix article | E-07 (lines 14-23) | ○ |
| C-59 | canonicalNamespacePrefix user | E-07 (lines 14-23) | ○ |
| C-60 | titleWithCanonicalNamespacePrefix | E-07 (lines 25-27) | ○ |
| C-61 | namespaceCodeStringForLogging article | E-07 (lines 7-12) | ○ |
| C-62 | namespaceCodeStringForLogging user | E-07 (lines 7-12) | ○ |

### TalkPageFindInPageState（UT-TLK-063 〜 UT-TLK-073）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-63 | next()正常系 | E-09 (lines 33-44) | ○ |
| C-64 | next()ループ | E-09 (lines 37-40) | ○ |
| C-65 | next()空配列ガード | E-09 (lines 34-36) | ○ |
| C-66 | previous()正常系 | E-09 (lines 47-58) | ○ |
| C-67 | previous()ループ | E-09 (lines 51-54) | ○ |
| C-68 | previous()空配列ガード | E-09 (lines 48-50) | ○ |
| C-69 | reset() | E-09 (lines 60-69) | ○ |
| C-70 | search()正常系 | E-09 (lines 71-78) | ○ |
| C-71 | search()マッチなし | E-09 (lines 74-77) | ○ |
| C-72 | selectedMatch正常系 | E-09 (lines 16-22) | ○ |
| C-73 | selectedMatch境界外 | E-09 (lines 17-19 guard文) | ○ |

### TalkPageFindInPageSearchController（UT-TLK-074 〜 UT-TLK-079）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-74 | タイトル検索 | E-10 (lines 46-56) | ○ |
| C-75 | リードコメント検索 | E-10 (lines 58-70) | ○ |
| C-76 | 返信検索 | E-10 (lines 87-98) | ○ |
| C-77 | otherContent検索 | E-10 (lines 72-85) | ○ |
| C-78 | 大文字小文字無視 | E-10 (line 49 localizedCaseInsensitiveContains) | ○ |
| C-79 | 複数マッチ | E-10 (lines 51-55 forループ) | ○ |

### TalkPageReplyComposeController（UT-TLK-080 〜 UT-TLK-089）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-80 | setupAndDisplay正常系 | E-08 (lines 54-72) | ○ |
| C-81 | setupAndDisplay重複防止 | E-08 (lines 56-59) | ○ |
| C-82 | calculateLayoutキーボード対応 | E-08 (lines 83-116) | ○ |
| C-83 | calculateLayoutアクセシビリティ | E-08 (lines 243-254) | ○ |
| C-84 | closeAndReset | E-08 (lines 118-146) | ○ |
| C-85 | isLoading | E-08 (lines 148-152) | ○ |
| C-86 | isShowing true | E-08 (lines 154-156) | ○ |
| C-87 | isShowing false | E-08 (lines 154-156) | ○ |
| C-88 | attemptClose テキストなし | E-08 (lines 386-398) | ○ |
| C-89 | attemptClose テキストあり | E-08 (lines 389-394) | ○ |

### その他クラス（UT-TLK-090 〜 UT-TLK-115）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-90 | TalkPageCache init | E-11 (lines 3-10) | ○ |
| C-91 | TalkPageCache Codable | E-11 (line 3 Codable準拠) | ○ |
| C-92 | TalkPageArchivesFetcher init | E-12 (lines 40-46) | ○ |
| C-93 | fetchFirstPage | E-12 (lines 52-59) | ○ |
| C-94 | fetchNextPage正常系 | E-12 (lines 61-70) | ○ |
| C-95 | fetchNextPage境界値 | E-12 (lines 63-65) | ○ |
| C-96 | TalkPageArchivesItem init正常系 | E-14 (lines 9-19) | ○ |
| C-97 | TalkPageArchivesItem init異常系 | E-14 (lines 10-14 guard文) | ○ |
| C-98 | TalkPageArchivesItem Equatable | E-14 (lines 31-33) | ○ |
| C-99 | TalkPageArchivesItem description | E-14 (lines 37-39) | ○ |
| C-100 | TalkPageCoffeeRollViewModel init | E-15 (lines 9-13) | ○ |
| C-101 | TalkPagesFunnel shared | E-16 (line 5) | ○ |
| C-102 | logExpandedTopic | E-16 (lines 66-68) | ○ |
| C-103 | logTappedNewTopic | E-16 (lines 70-72) | ○ |
| C-104 | logTappedInlineReply | E-16 (lines 74-76) | ○ |
| C-105 | logChangedLanguage | E-16 (lines 83-85) | ○ |
| C-106 | logTappedPublishNewTopicOrInlineReply | E-16 (lines 87-89) | ○ |
| C-107 | logTappedContributions | E-16 (lines 91-93) | ○ |
| C-108 | TalkPageTopicComposeViewController init | E-17 (lines 166-172) | ○ |
| C-109 | shouldBlockDismissal true | E-17 (lines 353-361) | ○ |
| C-110 | shouldBlockDismissal false | E-17 (lines 353-361) | ○ |
| C-111 | setupNavigationBar isPublishing=true | E-17 (lines 341-351) | ○ |
| C-112 | setupNavigationBar isPublishing=false | E-17 (lines 341-351) | ○ |
| C-113 | TalkPageArchivesViewModel init | E-13 (lines 17-25) | ○ |
| C-114 | String.signed autoSign=true | E-03 (lines 242-245) | △ |
| C-115 | String.signed autoSign=false | E-03 (lines 242-245) | △ |

## 4) 不足情報（Unknown / Missing）

### String.signed private extension（C-114, C-115）
- **理由**: `TalkPageDataController.swift` 内の private extension であり、直接テストするにはテスト用のアクセス手段が必要
- **候補対応策**:
  - `@testable import` でアクセスし、テスト専用メソッドを追加
  - signed ロジックを別の internal クラスに移動
  - 統合テストとして postReply/postTopic の署名付きテストで間接的に検証

### TalkPagesFunnel イベント送信検証
- **理由**: EventPlatformClient.shared.submit の呼び出しを検証するにはモック化が必要
- **候補対応策**:
  - EventPlatformClient をプロトコル化し、テスト用モックを注入可能にする
  - 既存の統合テストで検証する

## 5) リスクフラグ（レビュー観点）

| リスクレベル | 項目 | 理由 |
|---|---|---|
| 2 (高) | UT-TLK-007, UT-TLK-008 | 投稿機能は認証・ネットワーク・API全てが絡む重要機能 |
| 2 (高) | UT-TLK-050 〜 UT-TLK-053 | API呼び出しの成功/失敗はユーザー体験に直結 |
| 1 (中) | UT-TLK-080 〜 UT-TLK-089 | UI状態管理のテストはUIKitの制約を考慮する必要あり |
| 1 (中) | UT-TLK-063 〜 UT-TLK-079 | 検索機能は複雑なデータ構造を扱うため、エッジケースに注意 |
| 0 (低) | UT-TLK-101 〜 UT-TLK-107 | イベントログは機能に影響しないが、分析精度に関わる |

## 6) レビュアーチェックリスト（最小）

- [ ] TalkPageViewModelの初期化テスト（UT-TLK-001 〜 004）がWikimediaProjectの全パターンをカバーしているか確認
- [ ] API呼び出しテスト（UT-TLK-043 〜 053）でネットワークエラー、タイムアウト、401認証エラーのケースを検討
- [ ] 購読機能テスト（UT-TLK-009 〜 011）でログアウト状態のケースを追加検討
- [ ] TalkPageFindInPageSearchController（UT-TLK-074 〜 079）でローカライズされたテキストの検索を検討
- [ ] String.signed（UT-TLK-114, 115）のテスト方法について実装方針を確定
- [ ] 既存テストファイル（WikipediaUnitTests/Code/TalkPageControllerTests.swift）との重複・整合性を確認
