---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 236
  claims_with_evidence: 228
  claims_without_evidence: 8
confidence_derived: 0.97
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：228 / 236、根拠なし：8
- 優先レビュー（高）
  1. **UT-MKD-079（remarkAllowHtmlEntities）**：Parserプロトタイプ操作のため外部依存が強い
  2. **UT-MKD-103〜104（Editor handleChange）**：Reactコンポーネントの内部状態管理で実装詳細に依存
  3. **UT-MKD-221（withHtml insertData）**：DOMParser依存でブラウザ環境必須

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

- E-01: `packages/decap-cms-widget-markdown/src/index.js` - エントリーポイント、Widget関数定義
- E-02: `packages/decap-cms-widget-markdown/src/serializers/index.js` - シリアライザのメイン定義（markdownToRemark, remarkToMarkdown, markdownToHtml, htmlToSlate, markdownToSlate, slateToMarkdown）
- E-03: `packages/decap-cms-widget-markdown/src/serializers/slateRemark.js` - Slate→MDAST変換（typeMap, markMap, slateToRemark, convertBlockNode, convertInlineNode等）
- E-04: `packages/decap-cms-widget-markdown/src/serializers/remarkSlate.js` - MDAST→Slate変換（remarkToSlate, mergeAdjacentTexts, convertNode, processMarkNode等）
- E-05: `packages/decap-cms-widget-markdown/src/serializers/remarkAssertParents.js` - 不正ネスト解除プラグイン
- E-06: `packages/decap-cms-widget-markdown/src/serializers/remarkWrapHtml.js` - HTMLノードラッピングプラグイン
- E-07: `packages/decap-cms-widget-markdown/src/serializers/remarkShortcodes.js` - ショートコードパーサー・ストリンジファイア
- E-08: `packages/decap-cms-widget-markdown/src/serializers/remarkEscapeMarkdownEntities.js` - マークダウンエンティティエスケープ
- E-09: `packages/decap-cms-widget-markdown/src/serializers/remarkSquashReferences.js` - 参照の展開
- E-10: `packages/decap-cms-widget-markdown/src/serializers/remarkImagesToText.js` - 画像のテキスト変換
- E-11: `packages/decap-cms-widget-markdown/src/serializers/remarkRehypeShortcodes.js` - ショートコードのRehype変換
- E-12: `packages/decap-cms-widget-markdown/src/serializers/remarkStripTrailingBreaks.js` - 末尾break除去
- E-13: `packages/decap-cms-widget-markdown/src/serializers/remarkPaddedLinks.js` - リンク内空白処理
- E-14: `packages/decap-cms-widget-markdown/src/serializers/remarkAllowHtmlEntities.js` - HTMLエンティティ許可
- E-15: `packages/decap-cms-widget-markdown/src/serializers/rehypePaperEmoji.js` - Dropbox Paper絵文字変換
- E-16: `packages/decap-cms-widget-markdown/src/regexHelper.js` - 正規表現ヘルパー関数
- E-17: `packages/decap-cms-widget-markdown/src/MarkdownPreview.js` - プレビューコンポーネント
- E-18: `packages/decap-cms-widget-markdown/src/MarkdownControl/index.js` - コントロールコンポーネント（MarkdownControl, getEditorControl, getEditorComponents）
- E-19: `packages/decap-cms-widget-markdown/src/MarkdownControl/VisualEditor.js` - ビジュアルエディタ（mergeMediaConfig, Editor）
- E-20: `packages/decap-cms-widget-markdown/src/MarkdownControl/RawEditor.js` - 生マークダウンエディタ
- E-21: `packages/decap-cms-widget-markdown/src/MarkdownControl/renderers.js` - レンダラー（Element, Leaf）
- E-22: `packages/decap-cms-widget-markdown/src/MarkdownControl/Toolbar.js` - ツールバーコンポーネント
- E-23: `packages/decap-cms-widget-markdown/src/MarkdownControl/ToolbarButton.js` - ツールバーボタンコンポーネント
- E-24: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/withBlocks.js` - ブロックプラグイン
- E-25: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/defaultEmptyBlock.js` - デフォルト空ブロック
- E-26: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/events/toggleBlock.js` - ブロックトグル
- E-27: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/events/keyDown.js` - ブロックキーイベント
- E-28: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/events/keyDownEnter.js` - ブロックEnterイベント
- E-29: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/events/keyDownBackspace.js` - ブロックBackspaceイベント
- E-30: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/isCursorInBlockType.js` - ブロックタイプ位置判定
- E-31: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/isCursorInNonDefaultBlock.js` - 非デフォルトブロック位置判定
- E-32: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/getListTypeAtCursor.js` - カーソルリストタイプ取得
- E-33: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/isCursorAtEndOfParagraph.js` - パラグラフ末尾判定
- E-34: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/isCursorAtStartOfNonEmptyHeading.js` - 非空見出し先頭判定
- E-35: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/isCursorCollapsedAfterSoftBreak.js` - softbreak直後判定
- E-36: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/isCursorAtStartOfBlockType.js` - ブロックタイプ先頭判定
- E-37: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/locations/areCurrentAndPreviousBlocksOfType.js` - 前後ブロックタイプ判定
- E-38: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/transforms/splitIntoParagraph.js` - パラグラフ分割
- E-39: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/transforms/unwrapIfCursorAtStart.js` - 先頭アンラップ
- E-40: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/blocks/transforms/wrapListItemsInBlock.js` - リストアイテムブロックラップ
- E-41: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/withInlines.js` - インラインプラグイン
- E-42: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/events/toggleMark.js` - マークトグル
- E-43: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/events/toggleLink.js` - リンクトグル
- E-44: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/events/keyDown.js` - インラインキーイベント
- E-45: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/events/keyDownShiftEnter.js` - Shift+Enterイベント
- E-46: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/locations/isMarkActive.js` - マークアクティブ判定
- E-47: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/selectors/getActiveLink.js` - アクティブリンク取得
- E-48: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/transforms/wrapLink.js` - リンクラップ
- E-49: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/inlines/transforms/unwrapLink.js` - リンクアンラップ
- E-50: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/withLists.js` - リストプラグイン
- E-51: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/events/toggleListType.js` - リストタイプトグル
- E-52: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/events/keyDownEnter.js` - リストEnterイベント
- E-53: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/events/keyDownBackspace.js` - リストBackspaceイベント
- E-54: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/events/keyDown.js` - リストキーイベント
- E-55: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/events/keyDownTab.js` - リストTabイベント
- E-56: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/events/keyDownShiftTab.js` - リストShift+Tabイベント
- E-57: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/locations/isCursorInListItem.js` - リストアイテム位置判定
- E-58: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/locations/isCursorAtListItemStart.js` - リストアイテム先頭判定
- E-59: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/locations/isSelectionWithinNoninitialListItem.js` - 非初期リストアイテム判定
- E-60: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/locations/isCursorAtNoninitialParagraphStart.js` - 非初期パラグラフ先頭判定
- E-61: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/locations/isCursorInItemContainingNestedList.js` - ネストリスト含むアイテム判定
- E-62: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/selectors/getListContainedInListItem.js` - リストアイテム内リスト取得
- E-63: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/selectors/getLowestAncestorList.js` - 最近接祖先リスト取得
- E-64: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/selectors/getLowestAncestorQuote.js` - 最近接祖先quote取得
- E-65: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/lists/transforms/*.js` - 各リスト変換関数（wrapSelectionInList, unwrapSelectionFromList, changeListType, splitListItem, liftListItem, mergeWithPreviousListItem, moveListToListItem, convertParagraphToListItem, splitToNestedList, liftFirstMatchedParent, unwrapFirstMatchedParent, wrapFirstMatchedParent）
- E-66: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/shortcodes/withShortcodes.js` - ショートコードプラグイン
- E-67: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/shortcodes/insertShortcode.js` - ショートコード挿入
- E-68: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/shortcodes/locations/isCursorInEmptyParagraph.js` - 空パラグラフ判定
- E-69: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/matchers/matchLink.js` - リンクマッチャー
- E-70: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/matchers/lowestMatchedAncestor.js` - 最近接祖先マッチャー
- E-71: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/matchers/matchedAncestors.js` - 祖先マッチャー
- E-72: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/html/withHtml.js` - HTML貼り付けプラグイン
- E-73: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/util.js` - ユーティリティ（assertType）
- E-74: `packages/decap-cms-widget-markdown/src/types.js` - 型定数
- E-75: `packages/decap-cms-widget-markdown/src/schema.js` - ウィジェットスキーマ
- E-76: `packages/decap-cms-widget-markdown/src/MarkdownControl/plugins/CommandsAndQueries.js` - コマンド・クエリ定義

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | UT-MKD-001〜003: Widget関数のテスト | E-01 | ○ |
| C-02 | UT-MKD-004〜006: markdownToRemark変換のテスト | E-02 | ○ |
| C-03 | UT-MKD-007〜009: remarkToMarkdown変換のテスト | E-02 | ○ |
| C-04 | UT-MKD-010〜011: markdownToHtml変換のテスト | E-02 | ○ |
| C-05 | UT-MKD-012〜014: htmlToSlate変換のテスト | E-02 | ○ |
| C-06 | UT-MKD-015〜016: markdownToSlate変換のテスト | E-02 | ○ |
| C-07 | UT-MKD-017: slateToMarkdown変換のテスト | E-02 | ○ |
| C-08 | UT-MKD-018〜037: slateRemark変換のテスト（typeMap, convertBlockNode, convertInlineNode, mark処理等） | E-03 | ○ |
| C-09 | UT-MKD-038〜051: remarkSlate変換のテスト（remarkToSlate, convertNode, processMarkNode, mergeAdjacentTexts等） | E-04 | ○ |
| C-10 | UT-MKD-052〜055: remarkAssertParentsのテスト | E-05 | ○ |
| C-11 | UT-MKD-056〜057: remarkWrapHtmlのテスト | E-06 | ○ |
| C-12 | UT-MKD-058〜062: remarkShortcodesのテスト | E-07 | ○ |
| C-13 | UT-MKD-063〜065: remarkEscapeMarkdownEntitiesのテスト | E-08 | ○ |
| C-14 | UT-MKD-066〜069: remarkSquashReferencesのテスト | E-09 | ○ |
| C-15 | UT-MKD-070〜072: remarkImagesToTextのテスト | E-10 | ○ |
| C-16 | UT-MKD-073〜074: remarkRehypeShortcodesのテスト | E-11 | ○ |
| C-17 | UT-MKD-075〜076: remarkStripTrailingBreaksのテスト | E-12 | ○ |
| C-18 | UT-MKD-077〜078: remarkPaddedLinksのテスト | E-13 | ○ |
| C-19 | UT-MKD-079: remarkAllowHtmlEntitiesのテスト | E-14 | △ |
| C-20 | UT-MKD-080〜081: rehypePaperEmojiのテスト | E-15 | ○ |
| C-21 | UT-MKD-082〜086: regexHelperのテスト | E-16 | ○ |
| C-22 | UT-MKD-087〜089: MarkdownPreviewのテスト | E-17 | ○ |
| C-23 | UT-MKD-090〜099: MarkdownControlのテスト | E-18 | ○ |
| C-24 | UT-MKD-100〜104: VisualEditorのテスト（mergeMediaConfig, handleChange） | E-19 | ○ |
| C-25 | UT-MKD-105〜112: renderersのテスト（Element, Leaf） | E-21 | ○ |
| C-26 | UT-MKD-113〜117: Toolbarのテスト | E-22 | ○ |
| C-27 | UT-MKD-118〜120: ToolbarButtonのテスト | E-23 | ○ |
| C-28 | UT-MKD-121〜122: defaultEmptyBlockのテスト | E-25 | ○ |
| C-29 | UT-MKD-123: withBlocksのテスト | E-24 | ○ |
| C-30 | UT-MKD-124〜127: toggleBlockのテスト | E-26 | ○ |
| C-31 | UT-MKD-128〜129: blocks keyDownのテスト | E-27 | ○ |
| C-32 | UT-MKD-130〜131: keyDownEnterのテスト | E-28 | ○ |
| C-33 | UT-MKD-132〜133: keyDownBackspaceのテスト | E-29 | ○ |
| C-34 | UT-MKD-134〜136: isCursorInBlockTypeのテスト | E-30 | ○ |
| C-35 | UT-MKD-137〜138: isCursorInNonDefaultBlockのテスト | E-31 | ○ |
| C-36 | UT-MKD-139〜140: getListTypeAtCursorのテスト | E-32 | ○ |
| C-37 | UT-MKD-141: isCursorAtEndOfParagraphのテスト | E-33 | ○ |
| C-38 | UT-MKD-142: isCursorAtStartOfNonEmptyHeadingのテスト | E-34 | ○ |
| C-39 | UT-MKD-143〜144: isCursorCollapsedAfterSoftBreakのテスト | E-35 | ○ |
| C-40 | UT-MKD-145: splitIntoParagraphのテスト | E-38 | ○ |
| C-41 | UT-MKD-146〜148: unwrapIfCursorAtStartのテスト | E-39 | ○ |
| C-42 | UT-MKD-149: wrapListItemsInBlockのテスト | E-40 | ○ |
| C-43 | UT-MKD-150〜152: withInlinesのテスト | E-41 | ○ |
| C-44 | UT-MKD-153〜154: toggleMarkのテスト | E-42 | ○ |
| C-45 | UT-MKD-155〜157: toggleLinkのテスト | E-43 | ○ |
| C-46 | UT-MKD-158〜161: inlines keyDownのテスト | E-44 | ○ |
| C-47 | UT-MKD-162: keyDownShiftEnterのテスト | E-45 | ○ |
| C-48 | UT-MKD-163〜165: isMarkActiveのテスト | E-46 | ○ |
| C-49 | UT-MKD-166〜167: getActiveLinkのテスト | E-47 | ○ |
| C-50 | UT-MKD-168〜170: wrapLinkのテスト | E-48 | ○ |
| C-51 | UT-MKD-171: unwrapLinkのテスト | E-49 | ○ |
| C-52 | UT-MKD-172〜174: withListsのテスト | E-50 | ○ |
| C-53 | UT-MKD-175〜177: toggleListTypeのテスト | E-51 | ○ |
| C-54 | UT-MKD-178〜180: lists keyDownEnterのテスト | E-52 | ○ |
| C-55 | UT-MKD-181〜183: lists keyDownBackspaceのテスト | E-53 | ○ |
| C-56 | UT-MKD-184〜185: keyDownTabのテスト | E-55 | ○ |
| C-57 | UT-MKD-186〜187: keyDownShiftTabのテスト | E-56 | ○ |
| C-58 | UT-MKD-188〜189: isCursorInListItemのテスト | E-57 | ○ |
| C-59 | UT-MKD-190: isCursorAtListItemStartのテスト | E-58 | ○ |
| C-60 | UT-MKD-191: isSelectionWithinNoninitialListItemのテスト | E-59 | ○ |
| C-61 | UT-MKD-192: isCursorAtNoninitialParagraphStartのテスト | E-60 | ○ |
| C-62 | UT-MKD-193: isCursorInItemContainingNestedListのテスト | E-61 | ○ |
| C-63 | UT-MKD-194: getListContainedInListItemのテスト | E-62 | ○ |
| C-64 | UT-MKD-195: getLowestAncestorListのテスト | E-63 | ○ |
| C-65 | UT-MKD-196: getLowestAncestorQuoteのテスト | E-64 | ○ |
| C-66 | UT-MKD-197〜208: リスト変換関数群のテスト | E-65 | ○ |
| C-67 | UT-MKD-209〜210: withShortcodesのテスト | E-66 | ○ |
| C-68 | UT-MKD-211〜212: insertShortcodeのテスト | E-67 | ○ |
| C-69 | UT-MKD-213〜214: isCursorInEmptyParagraphのテスト | E-68 | ○ |
| C-70 | UT-MKD-215: matchLinkのテスト | E-69 | ○ |
| C-71 | UT-MKD-216: lowestMatchedAncestorのテスト | E-70 | ○ |
| C-72 | UT-MKD-217〜219: matchedAncestorsのテスト | E-71 | ○ |
| C-73 | UT-MKD-220〜228: withHtml, deserializeのテスト | E-72 | ○ |
| C-74 | UT-MKD-229〜231: assertTypeのテスト | E-73 | ○ |
| C-75 | UT-MKD-232〜233: types.js定数のテスト | E-74 | ○ |
| C-76 | UT-MKD-234〜236: schema.jsのテスト | E-75 | ○ |
| C-77 | CommandsAndQueries関連のテストケースが不足 | **根拠なし** | △ |
| C-78 | RawEditorのhandleChange内部ロジックの詳細テストが不足 | **根拠なし** | △ |
| C-79 | Shortcodeコンポーネントの状態管理テストが不足 | **根拠なし** | △ |
| C-80 | VoidBlockコンポーネントの挿入ロジックテストが不足 | **根拠なし** | △ |
| C-81 | remarkAllowHtmlEntitiesのパーサー操作に関する詳細テストが不足 | E-14 | △ |
| C-82 | markdownToRemarkRemoveTokenizers内部関数のテストが不足 | E-02 | △ |
| C-83 | stylesエクスポート（EditorControlBar等）のテストが不足 | **根拠なし** | △ |
| C-84 | テスト環境でのSlateエディタ初期化に関する前提条件の具体性が不足 | **根拠なし** | △ |

## 4) 不足情報（Unknown / Missing）
- **CommandsAndQueries（E-76）**：このファイルはレガシーAPIのSlate 0.x系向けのコマンド・クエリ定義であり、現在のSlate 0.7x系（使用中のバージョン）では直接呼び出されない可能性がある。テストケース一覧に含めるかどうかの判断が必要。
  - 候補：既存テストの確認 / 実行時に使用されるか確認 / レガシーコードとして除外
- **RawEditorのhandleChange**：React関数コンポーネント内部の状態管理であり、統合テストに適している。単体テストとしてはvalue.map処理のロジックが対象。
  - 候補：handleChange関数を抽出して個別テスト / 統合テストで対応
- **Shortcode/VoidBlockコンポーネント**：Slateエディタのコンテキストに強く依存するReactコンポーネントであり、useSlateフック等のモック化が必要。
  - 候補：React Testing Library + Slateモックでのテスト / 統合テストに委任
- **Slateエディタのテスト前提条件**：多くのプラグイン関数はSlate Editorインスタンスとselection状態に依存する。テスト環境でのエディタ初期化方法の標準化が必要。
  - 候補：テストヘルパー（test-helpers/h.js）の活用 / slate-hyperscriptでのエディタ状態構築

## 5) リスクフラグ（レビュー観点）
- **リスク1（中）**：CommandsAndQueries.jsはSlate 0.x系のAPI（editor.value, startBlock等）を使用しており、現在のSlateバージョンとの互換性に問題がある可能性がある。テスト対象とするか要確認。
- **リスク1（中）**：remarkAllowHtmlEntitiesは`this.Parser.prototype`を直接操作するため、remark-parseのバージョン変更時に破損する可能性がある。
- **リスク0（低）**：serializers配下の多くのプラグインは純粋関数であり、Unifiedパイプラインの統合テストも存在する（__tests__ディレクトリ内のspec.jsファイル群）。単体テストとの重複範囲を確認すること。
- **リスク1（中）**：Slateプラグインの多くはEditor.withoutNormalizingでバッチ操作を行うため、個別のTransforms呼び出しをモックするだけでは不十分な場合がある。

## 6) レビュアーチェックリスト（最小）
- [ ] シリアライザ（serializers/）の正常系テストケースが全変換パス（Markdown <-> MDAST <-> Slate <-> HTML）をカバーしているか
- [ ] Slateプラグインのlocation関数がselection=null時のガード処理をテストしているか
- [ ] remarkプラグインの異常系（不正なMDAST構造、空入力等）が十分にカバーされているか
- [ ] MarkdownPreviewのsanitize_previewオプションのXSS防止テストが適切か
- [ ] CommandsAndQueries.jsがテスト対象とすべきか（レガシーAPI使用の確認）
- [ ] withHtmlのHTMLデシリアライズが主要なHTML要素（p, h1-h6, ul, ol, li, a, img, strong, em, code等）をカバーしているか
- [ ] toggleListTypeの3分岐（新規作成/タイプ変更/解除）が全てテストされているか
