---
generated_at: 2026-01-28 10:30:00
metrics:
  claims_total: 111
  claims_with_evidence: 111
  claims_without_evidence: 0
confidence_derived: 1.00
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：111 / 111、根拠なし：0
- 優先レビュー（高）
  1. **UT-COORD-004 (ArticleCoordinator.start)**: 記事表示フローの核心部分
  2. **UT-COORD-009 (ArticleTabCoordinating.trackArticleTab)**: タブ管理の中心ロジック
  3. **UT-COORD-021 (ProfileCoordinator.handleProfileAction - showDonate)**: 寄付機能への遷移

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

- E-01: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/Coordinator.swift` - Coordinatorプロトコル定義
- E-02: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/ArticleCoordinator.swift` - ArticleCoordinator実装、ArticleTabCoordinatingプロトコル拡張
- E-03: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/ProfileCoordinator.swift` - ProfileCoordinator実装
- E-04: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/LoginCoordinator.swift` - LoginCoordinator実装
- E-05: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/SettingsCoordinator.swift` - SettingsCoordinator実装
- E-06: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/NotificationsCoordinator.swift` - NotificationsCoordinator実装
- E-07: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/WatchlistCoordinator.swift` - WatchlistCoordinator実装
- E-08: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/DonateCoordinator.swift` - DonateCoordinator実装
- E-09: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/LinkCoordinator.swift` - LinkCoordinator実装
- E-10: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/UserPageCoordinator.swift` - UserPageCoordinator実装
- E-11: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/TalkPageCoordinator.swift` - UserTalkCoordinator実装
- E-12: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/RandomArticleCoordinator.swift` - RandomArticleCoordinator実装
- E-13: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/TabsOverviewCoordinator.swift` - TabsOverviewCoordinator実装、TabsCoordinatorManager実装
- E-14: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/YearInReviewCoordinator.swift` - YearInReviewCoordinator実装、YiRShareActivityContentProvider実装
- E-15: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/TempAccountSheetCoordinator.swift` - TempAccountSheetCoordinator実装
- E-16: `/Users/tomoka.baba/Work/wikipedia-ios-main/Wikipedia/Code/LogoutCoordinatorDelegate.swift` - LogoutCoordinatorDelegateプロトコル定義

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

### Coordinator プロトコル (E-01)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 (UT-COORD-001) | startメソッドがBoolを返すこと | E-01: 行14 `func start() -> Bool` | ○ |
| C-02 (UT-COORD-002) | navigationControllerプロパティが取得できること | E-01: 行11 `var navigationController: UINavigationController { get }` | ○ |

### ArticleCoordinator (E-02)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-03 (UT-COORD-003) | 初期化が正しく行われること | E-02: 行163-175 `init(navigationController:...)` | ○ |
| C-04 (UT-COORD-004) | ArticleViewControllerがpushされること | E-02: 行177-228 `start()` メソッド内でpush | ○ |
| C-05 (UT-COORD-005) | articleURLがnilの場合falseを返すこと | E-02: 行180-182 `guard let articleURL else { return false }` | ○ |
| C-06 (UT-COORD-006) | 言語バリアントコード自動設定 | E-02: 行185-187 `if articleURL.wmf_languageVariantCode == nil` | ○ |
| C-07 (UT-COORD-007) | adjacentArticleInTab時のVC置換 | E-02: 行200-207 `case .adjacentArticleInTab:` | ○ |
| C-08 (UT-COORD-008) | Main Page削除ロジック | E-02: 行208-218 `case .appendArticleAndAssignCurrentTabAndRemovePrecedingMainPage:` | ○ |

### ArticleTabCoordinating (E-02)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 (UT-COORD-009) | タブがトラッキングされること | E-02: 行31-115 `trackArticleTab` | ○ |
| C-10 (UT-COORD-010) | タブ数500制限 | E-02: 行50-63 `if tabsCount >= tabsMax` | ○ |
| C-11 (UT-COORD-011) | currentTabIdentifierがnilの場合の処理 | E-02: 行67-77 `if currentTabIdentifier == nil` | ○ |
| C-12 (UT-COORD-012) | syncTabsOnArticleAppearance | E-02: 行118-130 `syncTabsOnArticleAppearance()` | ○ |
| C-13 (UT-COORD-013) | tabIdentifierがnilの場合の早期リターン | E-02: 行121-124 `guard let tabIdentifier, let tabItemIdentifier` | ○ |
| C-14 (UT-COORD-014) | prepareToShowTabsOverview | E-02: 行132-143 `prepareToShowTabsOverview` | ○ |

### ProfileCoordinator (E-03)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-15 (UT-COORD-015) | 初期化 | E-03: 行46-54 `init(navigationController:...)` | ○ |
| C-16 (UT-COORD-016) | プロフィール画面表示 | E-03: 行58-123 `start()` | ○ |
| C-17 (UT-COORD-017) | ログイン済みユーザー名表示 | E-03: 行65-73 `var finalPageTitle` | ○ |
| C-18 (UT-COORD-018) | 一時アカウント表示 | E-03: 行68-70 `else if isTemporaryAccount` | ○ |
| C-19 (UT-COORD-019) | showNotifications | E-03: 行129-132 `case .showNotifications:` | ○ |
| C-20 (UT-COORD-020) | showSettings | E-03: 行133-136 `case .showSettings:` | ○ |
| C-21 (UT-COORD-021) | showDonate | E-03: 行137-140 `case .showDonate:` | ○ |
| C-22 (UT-COORD-022) | login | E-03: 行152-155 `case .login:` | ○ |
| C-23 (UT-COORD-023) | logout | E-03: 行156-159 `case .logout:` | ○ |
| C-24 (UT-COORD-024) | showUserPage | E-03: 行140-143 `case .showUserPage:` | ○ |
| C-25 (UT-COORD-025) | showUserTalkPage | E-03: 行144-147 `case .showUserTalkPage:` | ○ |
| C-26 (UT-COORD-026) | showWatchlist | E-03: 行148-151 `case .showWatchlist:` | ○ |
| C-27 (UT-COORD-027) | showYearInReview | E-03: 行162-165 `case .showYearInReview:` | ○ |
| C-28 (UT-COORD-028) | logDonateTap explore | E-03: 行281-318 `logDonateTap()` | ○ |
| C-29 (UT-COORD-029) | logDonateTap article | E-03: 行292-305 `case .article:` | ○ |

### LoginCoordinator (E-04)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 (UT-COORD-030) | 初期化 | E-04: 行20-24 `init(navigationController:...)` | ○ |
| C-31 (UT-COORD-031) | ログイン画面表示 | E-04: 行26-48 `start()` | ○ |
| C-32 (UT-COORD-032) | 初期化失敗時false | E-04: 行28-30 `guard let loginVC` | ○ |
| C-33 (UT-COORD-033) | loggingCategory設定 | E-04: 行32-34 `if let loggingCategory` | ○ |
| C-34 (UT-COORD-034) | presentedViewController上への表示 | E-04: 行41-45 `if let presentedVC` | ○ |

### SettingsCoordinator (E-05)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-35 (UT-COORD-035) | 初期化 | E-05: 行18-22 `init(navigationController:...)` | ○ |
| C-36 (UT-COORD-036) | 設定画面表示 | E-05: 行26-39 `start()` | ○ |
| C-37 (UT-COORD-037) | 重複表示防止 | E-05: 行30-33 `if navigationController.viewControllers.count == 1` | ○ |

### NotificationsCoordinator (E-06)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 (UT-COORD-038) | 初期化 | E-06: 行16-20 `init(navigationController:...)` | ○ |
| C-39 (UT-COORD-039) | 通知画面表示 | E-06: 行24-30 `start()` | ○ |

### WatchlistCoordinator (E-07)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-40 (UT-COORD-040) | 初期化 | E-07: 行15-18 `init(navigationController:...)` | ○ |
| C-41 (UT-COORD-041) | ウォッチリスト遷移 | E-07: 行20-29 `start()` | ○ |
| C-42 (UT-COORD-042) | primarySiteURLがnil時false | E-07: 行22-25 `guard let linkURL` | ○ |

### DonateCoordinator (E-08)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-43 (UT-COORD-043) | 初期化 | E-08: 行108-117 `init(navigationController:...)` | ○ |
| C-44 (UT-COORD-044) | 寄付設定フェッチ | E-08: 行154 `WMFDonateDataController.shared.fetchConfigsForCountryCode` | ○ |
| C-45 (UT-COORD-045) | countryCodeがnil時false | E-08: 行149-151 `guard let countryCode` | ○ |
| C-46 (UT-COORD-046) | metricsID articleCampaignModal | E-08: 行121-122 `case .articleCampaignModal` | ○ |
| C-47 (UT-COORD-047) | metricsID profile | E-08: 行123-129 `case .articleProfile, .exploreProfile...` | ○ |
| C-48 (UT-COORD-048) | metricsID yearInReview | E-08: 行137-143 `case .yearInReview` | ○ |
| C-49 (UT-COORD-049) | アクションシート表示 | E-08: 行180-317 `presentActionSheet` | ○ |
| C-50 (UT-COORD-050) | navigateToNativeDonateForm push | E-08: 行420-421 `case .push:` | ○ |
| C-51 (UT-COORD-051) | navigateToNativeDonateForm dismissThenPush | E-08: 行422-425 `case .dismissThenPush:` | ○ |
| C-52 (UT-COORD-052) | navigateToOtherPaymentMethod | E-08: 行439-470 `navigateToOtherPaymentMethod` | ○ |
| C-53 (UT-COORD-053) | 成功トースト表示 | E-08: 行546-574 `popAndShowSuccessToastFromNativeForm` | ○ |
| C-54 (UT-COORD-054) | webViewFormThankYouDidTapReturn | E-08: 行576-591 `popFromWebFormThankYouPage` | ○ |

### LinkCoordinator (E-09)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 (UT-COORD-055) | 初期化 | E-09: 行19-27 `init(navigationController:...)` | ○ |
| C-56 (UT-COORD-056) | article遷移 | E-09: 行35-47 `case .article:` | ○ |
| C-57 (UT-COORD-057) | unknown時false | E-09: 行47-49 `case .unknown:` | ○ |
| C-58 (UT-COORD-058) | destination article | E-09: 行73-91 `case .main:` | ○ |
| C-59 (UT-COORD-059) | thankyou除外 | E-09: 行80-83 `host != "thankyou.wikipedia.org"` | ○ |
| C-60 (UT-COORD-060) | Main Page除外 | E-09: 行85-89 `isMainPageTitle` | ○ |

### UserPageCoordinator (E-10)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-61 (UT-COORD-061) | 初期化 | E-10: 行17-22 `init(navigationController:...)` | ○ |
| C-62 (UT-COORD-062) | ユーザーページ表示 | E-10: 行24-34 `start()` | ○ |
| C-63 (UT-COORD-063) | URL生成失敗時false | E-10: 行26-28 `guard let url` | ○ |

### UserTalkCoordinator (E-11)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-64 (UT-COORD-064) | 初期化 | E-11: 行18-24 `init(navigationController:...)` | ○ |
| C-65 (UT-COORD-065) | トークページ表示 | E-11: 行26-41 `start()` | ○ |
| C-66 (UT-COORD-066) | siteURLがnil時false | E-11: 行28-30 `guard let siteURL` | ○ |
| C-67 (UT-COORD-067) | ViewModel初期化失敗時false | E-11: 行34-36 `guard let viewModel` | ○ |

### RandomArticleCoordinator (E-12)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-68 (UT-COORD-068) | 初期化 | E-12: 行20-30 `init(navigationController:...)` | ○ |
| C-69 (UT-COORD-069) | articleURLありの場合 | E-12: 行36-61 `if var articleURL` | ○ |
| C-70 (UT-COORD-070) | siteURLのみの場合 | E-12: 行63-72 `else if var siteURL` | ○ |
| C-71 (UT-COORD-071) | VC置換 | E-12: 行52-55 `if replaceLastViewControllerInNavStack` | ○ |
| C-72 (UT-COORD-072) | 言語バリアント自動設定 | E-12: 行38-40 `if articleURL.wmf_languageVariantCode == nil` | ○ |

### TabsOverviewCoordinator (E-13)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-73 (UT-COORD-073) | 初期化 | E-13: 行21-28 `init(navigationController:...)` | ○ |
| C-74 (UT-COORD-074) | タブ概要表示 | E-13: 行15-18 `start()` | ○ |
| C-75 (UT-COORD-075) | tappedTab | E-13: 行262-286 `tappedTab` | ○ |
| C-76 (UT-COORD-076) | 同一タブdismissのみ | E-13: 行264-269 `if displayedTabIdentifier == tab.identifier` | ○ |
| C-77 (UT-COORD-077) | tappedAddTab | E-13: 行288-307 `tappedAddTab` | ○ |
| C-78 (UT-COORD-078) | tappedDone | E-13: 行309-311 `tappedDone` | ○ |
| C-79 (UT-COORD-079) | tappedShareTab | E-13: 行313-318 `tappedShareTab` | ○ |
| C-80 (UT-COORD-080) | サジェスト設定トースト | E-13: 行66-76 `showAlertForArticleSuggestionsDisplayChangeConfirmation` | ○ |
| C-81 (UT-COORD-081) | TabsCoordinatorManager | E-13: 行383-394 `TabsCoordinatorManager` | ○ |

### YearInReviewCoordinator (E-14)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-82 (UT-COORD-082) | 初期化 | E-14: 行184-189 `init(navigationController:...)` | ○ |
| C-83 (UT-COORD-083) | YiR画面表示 | E-14: 行777-819 `start()` | ○ |
| C-84 (UT-COORD-084) | formatNumber | E-14: 行191-196 `formatNumber` | ○ |
| C-85 (UT-COORD-085) | percentileRange | E-14: 行501-547 `percentileRange` | ○ |
| C-86 (UT-COORD-086) | percentileRange境界 | E-14: 行562-563 `if readCount < 336` | ○ |
| C-87 (UT-COORD-087) | getLocalizedMonth | E-14: 行583-585 `getLocalizedMonth` | ○ |
| C-88 (UT-COORD-088) | getLocalizedTime | E-14: 行587-604 `getLocalizedTime` | ○ |
| C-89 (UT-COORD-089) | getLocalizedTime深夜 | E-14: 行600-601 `default: localizedTime = "Late night"` | ○ |
| C-90 (UT-COORD-090) | getLocalizedDay | E-14: 行606-656 `getLocalizedDay` | ○ |
| C-91 (UT-COORD-091) | handleYearInReviewAction donate | E-14: 行973-989 `case .donate` | ○ |
| C-92 (UT-COORD-092) | handleYearInReviewAction share | E-14: 行990-1008 `case .share` | ○ |
| C-93 (UT-COORD-093) | handleYearInReviewAction dismiss | E-14: 行1009-1018 `case .dismiss` | ○ |
| C-94 (UT-COORD-094) | handleYearInReviewAction introLearnMore | E-14: 行1020-1033 `case .introLearnMore` | ○ |
| C-95 (UT-COORD-095) | setupForFeatureAnnouncement | E-14: 行821-824 `setupForFeatureAnnouncement` | ○ |
| C-96 (UT-COORD-096) | resetFromFeatureAnnouncement | E-14: 行826-829 `resetFromFeatureAnnouncement` | ○ |
| C-97 (UT-COORD-097) | presentationControllerWillDismiss | E-14: 行950-953 `presentationControllerWillDismiss` | ○ |
| C-98 (UT-COORD-098) | presentationControllerDidDismiss | E-14: 行955-960 `presentationControllerDidDismiss` | ○ |

### TempAccountSheetCoordinator (E-15)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-99 (UT-COORD-099) | 初期化 | E-15: 行24-31 `init(navigationController:...)` | ○ |
| C-100 (UT-COORD-100) | 一時アカウントシート | E-15: 行15-17 `if isTempAccount { presentTempEditorSheet() }` | ○ |
| C-101 (UT-COORD-101) | IPシート | E-15: 行18-19 `else { presentIPEditorSheet() }` | ○ |
| C-102 (UT-COORD-102) | tempEditorSubtitleString | E-15: 行122-128 `tempEditorSubtitleString` | ○ |
| C-103 (UT-COORD-103) | ipEditorSubtitleString | E-15: 行189-199 `ipEditorSubtitleString` | ○ |

### LogoutCoordinatorDelegate (E-16)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-104 (UT-COORD-104) | didTapLogout | E-16: 行5 `func didTapLogout()` | ○ |

### YiRShareActivityContentProvider (E-14)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-105 (UT-COORD-105) | 初期化 | E-14: 行1192-1196 `init(text:appStoreURL:hashtag:)` | ○ |
| C-106 (UT-COORD-106) | item | E-14: 行1199-1201 `var item: Any` | ○ |
| C-107 (UT-COORD-107) | FB除外 | E-14: 行1205-1206 `case .postToFacebook: return nil` | ○ |
| C-108 (UT-COORD-108) | IG除外 | E-14: 行1208-1211 `if activityType...contains("instagram")` | ○ |
| C-109 (UT-COORD-109) | messageRepresentation | E-14: 行1221-1223 `messageRepresentation` | ○ |

### URL Extension (E-08)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-110 (UT-COORD-110) | appendingAppVersionAndAppInstallID | E-08: 行869-887 `appendingAppVersionAndAppInstallID` | ○ |
| C-111 (UT-COORD-111) | appVersionがnil時 | E-08: 行871-875 `guard let appVersion, let appInstallID` | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし：全てのテストケースに対応するソースコードが確認できました。

## 5) リスクフラグ（レビュー観点）
- **リスク 0 (低リスク)**: 全テストケースがソースコードと対応しており、論理的整合性が確認されています。
- 本モジュールはiOSアプリのナビゲーション・画面遷移を担当するCoordinatorパターンの実装であり、UIテストとの組み合わせによる統合テストも推奨されます。

## 6) レビュアーチェックリスト（最小）
- [ ] 高優先度テストケース（UT-COORD-004, UT-COORD-009, UT-COORD-021）の網羅性確認
- [ ] 寄付機能（DonateCoordinator）関連テストの決済フロー確認
- [ ] タブ管理（ArticleTabCoordinating）のタブ上限500制限テストの妥当性確認
- [ ] Year in Review機能のログイン状態による分岐テストの確認
- [ ] 一時アカウント/IPユーザーシート表示の分岐テストの確認
- [ ] 各Coordinatorのstart()メソッドにおけるガード条件（異常系）テストの網羅性確認
