---
generated_at: 2026-01-28 18:30:00
metrics:
  claims_total: 96
  claims_with_evidence: 96
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：wmf-framework-widget 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：96 / 96、根拠なし：0
- 優先レビュー（高）
  1. **WidgetController の非同期処理テスト**：実際のDataStoreとの統合テストが必要な場合あり
  2. **ネットワークフェッチのモックテスト**：外部依存のモック化が必要
  3. **キャッシュの日付判定テスト**：タイムゾーンを考慮したテスト設計が必要

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

- E-01: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/WidgetController.swift`
- E-02: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/WidgetContentFetcher.swift`
- E-03: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetCache.swift`
- E-04: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetSettings.swift`
- E-05: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetFeaturedContent.swift`
- E-06: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetFeaturedArticle.swift`
- E-07: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetTopRead.swift`
- E-08: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetPictureOfTheDay.swift`
- E-09: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetImageSource.swift`
- E-10: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetOnThisDayElement.swift`
- E-11: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetContentURL.swift`
- E-12: `/Users/tomoka.baba/Work/wikipedia-ios-main/WMF Framework/Widget/Models/WidgetTitles.swift`

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

### WidgetController クラス（UT-WFW-001 〜 UT-WFW-030, UT-WFW-081 〜 UT-WFW-093）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | WidgetController.sharedはシングルトン | E-01 (Line 26: `@objc public static let shared = WidgetController()`) | ○ |
| C-02 | reloadAllWidgetsIfNecessaryはApp Extension内で早期リターン | E-01 (Line 36-38: `guard !Bundle.main.isAppExtension else { return }`) | ○ |
| C-03 | reloadAllWidgetsIfNecessaryはWidgetCenter.shared.reloadAllTimelines()を呼ぶ | E-01 (Line 47: `WidgetCenter.shared.reloadAllTimelines()`) | ○ |
| C-04 | reloadFeaturedArticleWidgetIfNecessaryは特定kindのタイムラインをリロード | E-01 (Line 62: `WidgetCenter.shared.reloadTimelines(ofKind: SupportedWidget.featuredArticle.rawValue)`) | ○ |
| C-05 | startWidgetUpdateTaskはDataStoreを取得してタスクを実行 | E-01 (Line 68-78: startWidgetUpdateTask実装) | ○ |
| C-06 | fetchNewestWidgetContentGroupは今日のコンテンツグループを取得 | E-01 (Line 80-95: fetchNewestWidgetContentGroup実装) | ○ |
| C-07 | SupportedWidget.featuredArticle.identifierは正しい値を返す | E-01 (Line 12: `case featuredArticle = "org.wikimedia.wikipedia.widgets.featuredArticle"`) | ○ |
| C-08 | SupportedWidget.onThisDay.identifierは正しい値を返す | E-01 (Line 13: `case onThisDay = "org.wikimedia.wikipedia.widgets.onThisDay"`) | ○ |
| C-09 | SupportedWidget.pictureOfTheDay.identifierは正しい値を返す | E-01 (Line 14: `case pictureOfTheDay = "org.wikimedia.wikipedia.widgets.potd"`) | ○ |
| C-10 | SupportedWidget.topRead.identifierは正しい値を返す | E-01 (Line 15: `case topRead = "org.wikimedia.wikipedia.widgets.topRead"`) | ○ |
| C-11 | SupportedWidget.search.identifierは正しい値を返す | E-01 (Line 16: `case search = "org.wikimedia.wikipedia.widgets.search"`) | ○ |
| C-12 | SupportedWidget.lockscreenSearch.identifierは正しい値を返す | E-01 (Line 17: `case lockscreenSearch = "org.wikimedia.wikipedia.widgets.lockscreen-search"`) | ○ |
| C-13 | potdTargetImageSizeは1000x1000を返す | E-01 (Line 212-214: `CGSize(width: 1000, height: 1000)`) | ○ |
| C-14 | fetchTopReadContentはTop Readコンテンツを取得 | E-01 (Line 274-337: fetchTopReadContent実装) | ○ |
| C-15 | fetchFeaturedArticleContentはサポート言語チェックを行う | E-01 (Line 361-364: supportedLanguageCodesチェック) | ○ |
| C-16 | fetchPictureOfTheDayContentは画像サイズを調整する | E-01 (Line 423: `WMFChangeImageSourceURLSizePrefix`) | ○ |
| C-17 | cachedContentIfAvailableはfetchDateを検証 | E-01 (Line 234: `Calendar.current.isDateInToday(fetchDate)`) | ○ |
| C-18 | cachedContentIfAvailableは言語コードを検証 | E-01 (Line 234: `cachedLanguageCode == widgetCache.settings.languageCode`) | ○ |
| C-19 | getRetainedSharedDataStoreは参照カウントを管理 | E-01 (Line 119: `dataStoreRetainCount += 1`) | ○ |
| C-20 | releaseSharedDataStoreは参照カウントをデクリメント | E-01 (Line 146: `dataStoreRetainCount -= 1`) | ○ |

### WidgetContentFetcher クラス（UT-WFW-031 〜 UT-WFW-039, UT-WFW-094 〜 UT-WFW-096）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-21 | WidgetContentFetcher.sharedはシングルトン | E-02 (Line 20: `public static let shared = WidgetContentFetcher()`) | ○ |
| C-22 | fetchFeaturedContentはJSONデコードしてWidgetFeaturedContentを返す | E-02 (Line 30-36: JSONDecoder().decode実装) | ○ |
| C-23 | fetchFeaturedContentはfetchDateを設定 | E-02 (Line 32: `decoded.fetchDate = Date()`) | ○ |
| C-24 | fetchImageDataFromは画像データを取得 | E-02 (Line 49-69: fetchImageDataFrom実装) | ○ |
| C-25 | FetcherError.urlFailureが定義されている | E-02 (Line 8: `case urlFailure`) | ○ |
| C-26 | FetcherError.contentFailureが定義されている | E-02 (Line 9: `case contentFailure`) | ○ |
| C-27 | FetcherError.unsupportedLanguageが定義されている | E-02 (Line 10: `case unsupportedLanguage`) | ○ |

### WidgetCache 構造体（UT-WFW-040 〜 UT-WFW-042）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | WidgetCacheはCodableに準拠 | E-03 (Line 3: `public struct WidgetCache: Codable`) | ○ |
| C-29 | WidgetCacheはsettingsとfeaturedContentを保持 | E-03 (Line 7-8: プロパティ定義) | ○ |
| C-30 | WidgetCacheのinitは正しく初期化する | E-03 (Line 12-15: init実装) | ○ |

### WidgetSettings 構造体（UT-WFW-043 〜 UT-WFW-046）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | WidgetSettingsはCodableに準拠 | E-04 (Line 3: `public struct WidgetSettings: Codable`) | ○ |
| C-32 | WidgetSettings.defaultはen.wikipedia.orgを返す | E-04 (Line 7: `URL(string: "https://en.wikipedia.org")!`) | ○ |
| C-33 | WidgetSettingsはsiteURL, languageCode, languageVariantCodeを保持 | E-04 (Line 9-11: プロパティ定義) | ○ |

### WidgetFeaturedContent 構造体（UT-WFW-047 〜 UT-WFW-051）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | WidgetFeaturedContentはCodableに準拠 | E-05 (Line 3: `public struct WidgetFeaturedContent: Codable`) | ○ |
| C-35 | previewContentはJSONファイルからロード | E-05 (Line 30-36: previewContent実装) | ○ |
| C-36 | CodingKeys.tfaはfeaturedArticleにマッピング | E-05 (Line 8: `case featuredArticle = "tfa"`) | ○ |
| C-37 | CodingKeys.mostreadはtopReadにマッピング | E-05 (Line 9: `case topRead = "mostread"`) | ○ |

### WidgetFeaturedArticle 構造体（UT-WFW-052 〜 UT-WFW-058）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 | WidgetFeaturedArticleはCodableに準拠 | E-06 (Line 3: `public struct WidgetFeaturedArticle: Codable`) | ○ |
| C-39 | isRTLはlanguageDirectionがrtlの場合trueを返す | E-06 (Line 34-36: `languageDirection.caseInsensitiveCompare("rtl") == .orderedSame`) | ○ |
| C-40 | supportedLanguageCodesにenが含まれる | E-06 (Line 21: `"en"`) | ○ |
| C-41 | supportedLanguageCodesにjaが含まれる | E-06 (Line 21: `"ja"`) | ○ |

### WidgetTopRead 構造体（UT-WFW-059 〜 UT-WFW-065）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-42 | WidgetTopReadはCodableに準拠 | E-07 (Line 3: `public struct WidgetTopRead: Codable`) | ○ |
| C-43 | topFourElementsは上位4件を返す | E-07 (Line 69-71: `Array(elements.prefix(4))`) | ○ |
| C-44 | Article.isRTLはlanguageDirectionを検証 | E-07 (Line 58-60: isRTL実装) | ○ |
| C-45 | ViewHistoryDataPointはviewsを保持 | E-07 (Line 17: `public let views: Int`) | ○ |

### WidgetPictureOfTheDay 構造体（UT-WFW-066 〜 UT-WFW-069）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | WidgetPictureOfTheDayはCodableに準拠 | E-08 (Line 3: `public struct WidgetPictureOfTheDay: Codable`) | ○ |
| C-47 | Descriptionはtext, html, languageを保持 | E-08 (Line 27-29: プロパティ定義) | ○ |
| C-48 | Licenseはtype, code, urlを保持（すべてオプショナル） | E-08 (Line 15-17: オプショナルプロパティ) | ○ |

### WidgetImageSource 構造体（UT-WFW-070 〜 UT-WFW-073）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | WidgetImageSourceはCodableに準拠 | E-09 (Line 3: `public struct WidgetImageSource: Codable`) | ○ |
| C-50 | dataプロパティはオプショナル | E-09 (Line 21: `public var data: Data?`) | ○ |
| C-51 | source, width, heightを保持 | E-09 (Line 16-18: プロパティ定義) | ○ |

### WidgetOnThisDayElement 構造体（UT-WFW-074 〜 UT-WFW-077）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-52 | WidgetOnThisDayElementはCodableに準拠 | E-10 (Line 3: `public struct WidgetOnThisDayElement: Codable`) | ○ |
| C-53 | text, year, pagesを保持 | E-10 (Line 49-51: プロパティ定義) | ○ |
| C-54 | Page.isRTLはlanguageDirectionを検証 | E-10 (Line 41-43: isRTL実装) | ○ |

### WidgetContentURL 構造体（UT-WFW-078 〜 UT-WFW-079）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | WidgetContentURLはCodableに準拠 | E-11 (Line 3: `public struct WidgetContentURL: Codable`) | ○ |
| C-56 | desktopプロパティを保持 | E-11 (Line 13: `public let desktop: PageURL`) | ○ |

### WidgetTitles 構造体（UT-WFW-080）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | WidgetTitlesはCodableに準拠 | E-12 (Line 3: `public struct WidgetTitles: Codable`) | ○ |
| C-58 | canonical, normalized, displayを保持 | E-12 (Line 5-7: プロパティ定義) | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし - すべてのテストケースがソースコードの実装に基づいて生成されています

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - すべてのテストケースがソースコードから直接導出
- 実装詳細:
  - 非同期処理のテストにはモック化が必要（MWKDataStore, Session等）
  - WidgetCenterはiOS APIのため、UIテストまたはモック化が必要
  - SharedContainerCacheはファイルシステムアクセスを伴うため、テスト環境の設定が必要

## 6) レビュアーチェックリスト（最小）
- [ ] WidgetControllerの非同期メソッド（startWidgetUpdateTask, fetchNewestWidgetContentGroup等）のテストにおいて、適切なモック化戦略が採用されているか
- [ ] ネットワークフェッチ（WidgetContentFetcher）のテストにおいて、URLSessionのモック化が適切に行われているか
- [ ] キャッシュの日付判定（cachedContentIfAvailable）のテストにおいて、タイムゾーンを考慮したテストケースが含まれているか
- [ ] Codableプロトコルのテストにおいて、実際のAPIレスポンスに基づいたJSONサンプルが使用されているか
- [ ] RTL判定（isRTL）のテストにおいて、アラビア語やヘブライ語などの実際のRTL言語が考慮されているか
- [ ] supportedLanguageCodesのテストにおいて、リストの完全性が検証されているか（19言語）
- [ ] topFourElementsの境界値テストにおいて、0件、1-3件、4件、5件以上のすべてのケースがカバーされているか
