---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 65
  claims_with_evidence: 63
  claims_without_evidence: 2
confidence_derived: 0.97
---

# 根拠レポート：decap-cms-widget-datetime 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：63 / 65、根拠なし：2
- 優先レビュー（高）
  1. **C-15 (UT-DTM-015)**：escapeZにundefinedを渡した場合の挙動 - ソースコードに明示的なnullチェックがなく、実行時の挙動は推測
  2. **C-60 (UT-DTM-060)**：date_formatとtime_formatの両方がfalseの場合 - 複合条件の結果がコードの実行順序に依存し、明確な仕様が不明

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

- E-01: `packages/decap-cms-widget-datetime/src/DateTimeControl.js` - メインコントロールコンポーネント（207行）
- E-02: `packages/decap-cms-widget-datetime/src/DateTimePreview.js` - プレビューコンポーネント（13行）
- E-03: `packages/decap-cms-widget-datetime/src/index.js` - エントリポイント、Widget関数定義（16行）
- E-04: `packages/decap-cms-widget-datetime/src/schema.js` - フィールドスキーマ定義（8行）
- E-05: `packages/decap-cms-widget-datetime/src/__tests__/DateTimeControl.spec.js` - 既存テストコード（90行）
- E-06: `packages/decap-cms-widget-datetime/package.json` - パッケージ定義、依存関係情報

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | input・Nowボタン・Clearボタンがレンダリングされる | E-01 (L164-203), E-05 (L50-55) | ○ |
| C-02 | forIDがinput要素のid属性に設定される | E-01 (L179) | ○ |
| C-03 | classNameWrapperがルート要素に適用される | E-01 (L171) | ○ |
| C-04 | isUtcがtrueの場合UTCラベルが表示される | E-01 (L188-196) | ○ |
| C-05 | isUtcがfalseの場合UTCラベルが非表示 | E-01 (L188) | ○ |
| C-06 | isDisabledがtrueの場合ボタンが非表示 | E-01 (L198-200) | ○ |
| C-07 | isDisabledがtrueの場合inputがdisabled | E-01 (L186) | ○ |
| C-08 | valueが空文字の場合input値が空 | E-01 (L182) | ○ |
| C-09 | valueがfalsyの場合input値が空 | E-01 (L182: `value ? this.formatInputValue(value) : ''`) | ○ |
| C-10 | valueが'{{now}}'の場合に現在日時が設定される | E-01 (L69-72) | ○ |
| C-11 | 通常の日時文字列では初期化処理が行われない | E-01 (L70: `if (value === '{{now}}')`) | ○ |
| C-12 | escapeZでZが[Z]にエスケープされる | E-01 (L77-82) | ○ |
| C-13 | 既に[Z]エスケープ済みの場合は変更なし | E-01 (L78: 正規表現 `/Z(?![\]])/.test(str)`) | ○ |
| C-14 | Zを含まない文字列はそのまま返却 | E-01 (L78-81) | ○ |
| C-15 | undefinedが渡された場合の挙動 | **根拠なし** | △ |
| C-16 | デフォルトでdatetime-localフォーマットが返却 | E-01 (L86-88) | ○ |
| C-17 | UTCモードでformat末尾が[Z] | E-01 (L88: `this.isUtc ? '[Z]' : 'Z'`) | ○ |
| C-18 | date_formatとtime_formatの両方が文字列の場合に結合 | E-01 (L101-102) | ○ |
| C-19 | time_formatのみ文字列の場合にtimeタイプ | E-01 (L103-105) | ○ |
| C-20 | date_formatのみ文字列の場合にdateタイプ | E-01 (L106-108) | ○ |
| C-21 | formatが文字列指定の場合に優先される | E-01 (L111-114) | ○ |
| C-22 | date_formatがtrueの場合にデフォルト日付フォーマット使用 | E-01 (L92) | ○ |
| C-23 | time_formatがtrueの場合にデフォルト時刻フォーマット使用 | E-01 (L93) | ○ |
| C-24 | date_formatがfalseの場合にinputTypeがtime | E-01 (L116) | ○ |
| C-25 | time_formatがfalseの場合にinputTypeがdate | E-01 (L117) | ○ |
| C-26 | dateタイプのinputFormatがYYYY-MM-DD | E-01 (L119) | ○ |
| C-27 | timeタイプのinputFormatがHH:mm | E-01 (L120) | ○ |
| C-28 | UTCモードでZがエスケープされる | E-01 (L95-99) | ○ |
| C-29 | 有効な日時文字列でisValidDateがtrue | E-01 (L125) | ○ |
| C-30 | 空文字列でisValidDateがtrue | E-01 (L125: `|| dt === ''`) | ○ |
| C-31 | 無効な日時文字列でisValidDateがfalse | E-01 (L125) | ○ |
| C-32 | フォーマット不一致の日時文字列でfalse | E-01 (L125) | ○ |
| C-33 | ローカルタイムゾーンで現在日時取得 | E-01 (L128-129) | ○ |
| C-34 | UTCモードで現在日時取得 | E-01 (L129) | ○ |
| C-35 | formatInputValueで空文字列がパススルー | E-01 (L133) | ○ |
| C-36 | ローカルで有効値がフォーマットされる | E-01 (L136-138) | ○ |
| C-37 | UTCで有効値がフォーマットされる | E-01 (L136-137) | ○ |
| C-38 | フォーマット不一致時のフォールバック処理 | E-01 (L140-143) | ○ |
| C-39 | handleChangeで有効日時がonChangeを呼び出す | E-01 (L146-157), E-05 (L69-78) | ○ |
| C-40 | handleChangeで空文字列がonChangeを呼び出す | E-01 (L150-151), E-05 (L63-67) | ○ |
| C-41 | handleChangeで無効日時がonChangeを呼び出さない | E-01 (L147) | ○ |
| C-42 | カスタムフォーマットで正しく変換 | E-01 (L153-155), E-05 (L57-61) | ○ |
| C-43 | onInputChangeからhandleChangeが呼び出される | E-01 (L159-162) | ○ |
| C-44 | NowボタンでhandleChange(getNow())が呼び出される | E-01 (L29), E-05 (L57-61) | ○ |
| C-45 | ClearボタンでhandleChange('')が呼び出される | E-01 (L39), E-05 (L63-67) | ○ |
| C-46 | ボタンテキストがt関数で翻訳される | E-01 (L32, L42) | ○ |
| C-47 | inputのtypeがgetFormat()のinputTypeに従う | E-01 (L167, L181) | ○ |
| C-48 | onFocusでsetActiveStyleが呼び出される | E-01 (L184) | ○ |
| C-49 | onBlurでsetInactiveStyleが呼び出される | E-01 (L185) | ○ |
| C-50 | DatePreviewでvalueがtoString()で表示される | E-02 (L6) | ○ |
| C-51 | DatePreviewでオブジェクトvalue.toString()が表示される | E-02 (L6: `value.toString()`) | ○ |
| C-52 | DatePreviewでundefined時にnullレンダリング | E-02 (L6: `value ? value.toString() : null`) | ○ |
| C-53 | DatePreviewでnull時にnullレンダリング | E-02 (L6) | ○ |
| C-54 | DatePreviewで空文字列の場合の表示 | E-02 (L6: falsyなので`null`が返る) | ○ |
| C-55 | Widget関数がデフォルトウィジェットオブジェクトを返却 | E-03 (L5-12) | ○ |
| C-56 | Widget関数でカスタムオプションが上書き | E-03 (L11: `...opts`) | ○ |
| C-57 | DecapCmsWidgetDatetimeの名前付きエクスポート構造 | E-03 (L15) | ○ |
| C-58 | スキーマにformat・date_format・time_format・picker_utcが定義 | E-04 (L2-7) | ○ |
| C-59 | date_formatとtime_formatの両方がtrueの場合のフォーマット | E-01 (L92-93, L101-102) | ○ |
| C-60 | date_formatとtime_formatの両方がfalseの場合 | **根拠なし** | △ |
| C-61 | 閏年日付が正しくフォーマットされる | E-01 (L146-157: dayjsライブラリに依存) | ○ |
| C-62 | 年末日時が正しくフォーマットされる | E-01 (L146-157: dayjsライブラリに依存) | ○ |
| C-63 | UTCモードでフォーマット不一致時のフォールバック | E-01 (L136-143) | ○ |
| C-64 | 空文字列ではcomponentDidMountでhandleChange非呼び出し | E-01 (L70: `value === '{{now}}'`条件分岐) | ○ |
| C-65 | formatとdate_format/time_formatの両方設定時にformatが優先 | E-01 (L111-114: format判定がdate_format/time_format判定の後に実行される) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-15**: `escapeZ`メソッドにundefinedを渡した場合の挙動について、ソースコードに明示的なnull/undefinedチェックが存在しない。JavaScriptの正規表現テストがundefinedに対してTypeErrorをスローする可能性があるが、実際にはgetFormat()内でのみ呼び出されるため、field.get()がundefinedを返す場合のescapeZ呼び出しはisUtcがtrueかつuserFormat/dateFormat/timeFormatがundefinedの場合に発生し得る。ただしescapeZの引数チェックは`/Z(?![\]])/.test(str)`であり、undefinedに対するRegExp.test()はfalseを返すため実際にはエラーにはならない可能性がある。
  - 候補：実際のJavaScriptランタイムでの挙動テスト / TypeErrorの有無確認
- **C-60**: `date_format=false`と`time_format=false`の両方が設定された場合、L116で`inputType='time'`、L117で`inputType='date'`と順に上書きされるため最終的に`inputType='date'`となるが、この組み合わせが意図された挙動かどうかは仕様書がないため不明。
  - 候補：プロダクトの仕様確認 / 開発者への確認

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - 全体的にソースコードとの整合性が高く、テストケースは直接コードの各行・分岐に紐づけられている
- **1: 中リスク** - `getFormat()`の複合条件分岐（date_format/time_format/formatの組み合わせ）は条件の優先順位が複雑であり、テストケースの期待結果が正しいかレビューが必要
- **0: 低リスク** - dayjsライブラリに依存する日付フォーマット処理は、ライブラリの挙動に準拠しているため信頼性が高い

## 6) レビュアーチェックリスト（最小）
- [ ] getFormat()の条件分岐が全パターン網羅されているか（date_format/time_format/formatの全組み合わせ）
- [ ] escapeZにundefined/nullが渡された場合の実際の挙動が確認されているか
- [ ] UTCモードとローカルモードの両方でformatInputValueの変換が正しいか
- [ ] handleChangeの無効日時拒否ロジック（isValidDateとの連携）が正しく検証されているか
- [ ] DatePreviewのfalsy値（undefined/null/空文字列/0）に対する挙動が全て確認されているか
- [ ] date_format=falseとtime_format=falseの両方設定時の想定挙動が明確になっているか
