---
generated_at: 2026-02-22 12:00:00
metrics:
  claims_total: 153
  claims_with_evidence: 148
  claims_without_evidence: 5
confidence_derived: 0.97
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：148 / 153、根拠なし：5
- 優先レビュー（高）
  1. **C-119, C-120, C-121（uv_fatal_error関連）**：abort()で終了するため実際のテスト実行が困難。テスト手法の検討が必要
  2. **C-150〜C-153（uv__poll関連）**：IOCPとの実際の相互作用を伴うため、Windows環境でのみ検証可能
  3. **C-137〜C-142（detect-wakeup関連）**：電源管理APIへの依存があり、モック化の方針が必要

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

- E-01: `src/win/core.c` - Windows版イベントループ・コア関数の実装
- E-02: `src/win/loop-watcher.c` - prepare/check/idleウォッチャーの実装（マクロ展開）
- E-03: `src/win/async.c` - 非同期通知ハンドルの実装
- E-04: `src/win/handle.c` - ハンドル管理（guess_handle, close, is_active等）の実装
- E-05: `src/win/handle-inl.h` - ハンドル操作のインライン関数・マクロ
- E-06: `src/win/internal.h` - Windows内部ヘッダ（関数宣言・型定義）
- E-07: `src/win/req-inl.h` - リクエスト操作のマクロ定義
- E-08: `src/win/error.c` - エラー変換関数の実装
- E-09: `src/win/detect-wakeup.c` - システムウェイクアップ検出の実装

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | uv_loop_initがIOCP作成・内部フィールド初期化・タイマーヒープ確保等を行う | E-01 (L227-322) | ○ |
| C-002 | IOCP作成失敗時にuv_translate_sys_errorの結果を返す | E-01 (L237-238) | ○ |
| C-003 | uv__calloc失敗時にUV_ENOMEMを返す | E-01 (L240-242) | ○ |
| C-004 | timer_heap確保失敗時にUV_ENOMEMを返し、lfieldsを解放する | E-01 (L267-271, L312-318) | ○ |
| C-005 | wq_mutex初期化失敗時にtimer_heapを解放する | E-01 (L288-310) | ○ |
| C-006 | 初期化後のフィールドがtime=0, active_reqs.count=0等の初期値を持つ | E-01 (L255-286) | ○ |
| C-007 | uv_update_timeがuv__hrtime(1000)の結果をloop->timeに設定する | E-01 (L325-329) | ○ |
| C-008 | uv_update_timeの結果が単調増加（assert(new_time >= loop->time)） | E-01 (L327) | ○ |
| C-009 | uv__once_initがuv_onceを使ってuv__initを1回だけ呼ぶ | E-01 (L332-334) | ○ |
| C-010 | 複数回のuv__once_init呼び出しでuv__initが1回のみ実行される | E-01 (L332-334, L40) | ○ |
| C-011 | uv__loop_closeがtimer_heap解放、lfields解放、IOCP閉鎖を行う | E-01 (L337-375) | ○ |
| C-012 | poll_peer_socketsのINVALID_SOCKETと0以外がclosesocketで閉じられる | E-01 (L354-358) | ○ |
| C-013 | UV_METRICS_IDLE_TIMEオプションでlfields->flagsが設定される | E-01 (L378-388) | ○ |
| C-014 | 未サポートオプションでUV_ENOSYSが返る | E-01 (L387) | ○ |
| C-015 | uv_backend_fdが常に-1を返す | E-01 (L391-393) | ○ |
| C-016 | uv_loop_forkがUV_ENOSYSを返す | E-01 (L396-398) | ○ |
| C-017 | uv_loop_aliveがactive_handles、active_reqs、pending_reqs_tail、endgame_handlesを確認 | E-01 (L401-411) | ○ |
| C-018 | active_reqs存在時にuv_loop_aliveがtrueを返す | E-01 (L402-403) | ○ |
| C-019 | pending_reqs_tail != NULLでtrueを返す | E-01 (L404) | ○ |
| C-020 | endgame_handles != NULLでtrueを返す | E-01 (L405) | ○ |
| C-021 | 全フィールドがNULL/0でfalseを返す | E-01 (L401-406) | ○ |
| C-022 | stop_flag設定時にuv_backend_timeoutが0を返す | E-01 (L415) | ○ |
| C-023 | idle_handles存在時にuv_backend_timeoutが0を返す | E-01 (L419) | ○ |
| C-024 | pending_reqs_tail存在時にuv_backend_timeoutが0を返す | E-01 (L418) | ○ |
| C-025 | アクティブハンドルのみの場合にuv__next_timeoutを返す | E-01 (L414-422) | ○ |
| C-026 | UV_RUN_DEFAULTモードでwhile(r != 0 && !stop_flag)ループが実行される | E-01 (L701-764) | ○ |
| C-027 | UV_RUN_ONCEで1回のイテレーション後にbreakする | E-01 (L753) | ○ |
| C-028 | UV_RUN_NOWAITでtimeout=0の後breakする | E-01 (L727, L753) | ○ |
| C-029 | 非生存ループでuv_update_timeのみ呼んで戻る | E-01 (L706-708) | ○ |
| C-030 | stop_flag設定でループ停止、stop_flagが0にリセット | E-01 (L719, L760-761) | ○ |
| C-031 | UV_TCPハンドルからsocketを取得する | E-01 (L771-772) | ○ |
| C-032 | UV_NAMED_PIPEからhandleを取得する | E-01 (L775-776) | ○ |
| C-033 | UV_TTYからhandleを取得する | E-01 (L778-779) | ○ |
| C-034 | UV_UDPからsocketを取得する | E-01 (L781-782) | ○ |
| C-035 | UV_POLLからsocketを取得する | E-01 (L784-785) | ○ |
| C-036 | 未サポートタイプでUV_EINVALを返す | E-01 (L791-792) | ○ |
| C-037 | クロージング中のハンドルでUV_EBADFを返す | E-01 (L795-796) | ○ |
| C-038 | INVALID_HANDLE_VALUEでUV_EBADFを返す | E-01 (L795-796) | ○ |
| C-039 | *value==0でgetsockoptが呼ばれる | E-01 (L820-821) | ○ |
| C-040 | *value!=0でsetsockoptが呼ばれる | E-01 (L822-823) | ○ |
| C-041 | handle==NULLでUV_EINVALを返す | E-01 (L808-809) | ○ |
| C-042 | value==NULLでUV_EINVALを返す | E-01 (L808-809) | ○ |
| C-043 | TCP/UDP以外でUV_ENOTSUPを返す | E-01 (L811-816) | ○ |
| C-044 | SOCKET_ERRORでuv_translate_sys_errorを返す | E-01 (L825-826) | ○ |
| C-045 | uv_cpumask_sizeがsizeof(DWORD_PTR)*8を返す | E-01 (L831-833) | ○ |
| C-046 | uv__getsockpeernameがuv_filenoでFD取得後にfuncを呼ぶ | E-01 (L835-856) | ○ |
| C-047 | uv_fileno失敗時にそのエラーを返す | E-01 (L844-846) | ○ |
| C-048 | delayed_error非ゼロ時にuv_translate_sys_errorを返す | E-01 (L848-849) | ○ |
| C-049 | func失敗時にWSAGetLastErrorをuv_translate_sys_errorで変換 | E-01 (L851-853) | ○ |
| C-050 | 空キューにreqを追加すると自己参照循環リストになる | E-01 (L875-877) | ○ |
| C-051 | 既存キュー末尾にreqを追加し循環リスト維持 | E-01 (L872-874) | ○ |
| C-052 | uv__loops_addがloopをuv__loopsに追加する | E-01 (L93-118) | ○ |
| C-053 | 容量不足時にuv__reallocでリスト拡張 | E-01 (L99-108) | ○ |
| C-054 | realloc失敗時にUV_ENOMEMを返す | E-01 (L102-103, L115-117) | ○ |
| C-055 | uv__loops_removeがloopをリストから削除する | E-01 (L121-163) | ○ |
| C-056 | 最後のループ削除時にuv__loops=NULL, capacity=0 | E-01 (L140-145) | ○ |
| C-057 | 存在しないループの削除は無視される | E-01 (L132-134) | ○ |
| C-058 | 容量が十分大きくsizeが半分以下の場合にリスト縮小 | E-01 (L148-159) | ○ |
| C-059 | uv__wake_all_loopsが全ループにPostQueuedCompletionStatusを送信 | E-01 (L165-177) | ○ |
| C-060 | ループ0個の場合はforループが実行されない | E-01 (L170) | ○ |
| C-061 | iocp!=INVALID_HANDLE_VALUEの場合のみPostQueuedCompletionStatus呼出 | E-01 (L173-174) | ○ |
| C-062 | UV_HANDLE_CLOSING時にUV_HANDLE_CLOSEDを設定しuv__handle_closeを呼ぶ | E-02 (L29-35) | ○ |
| C-063 | UV_HANDLE_CLOSING未設定時は何もしない | E-02 (L30) | ○ |
| C-064 | uv_prepare_initがuv__handle_initでUV_PREPAREタイプを設定する | E-02 (L38-43, L120) | ○ |
| C-065 | uv_check_initがUV_CHECKタイプを設定する | E-02 (L38-43, L121) | ○ |
| C-066 | uv_idle_initがUV_IDLEタイプを設定する | E-02 (L38-43, L122) | ○ |
| C-067 | uv_prepare_startがハンドルをアクティブにする | E-02 (L46-73) | ○ |
| C-068 | 既にアクティブな場合は0を返して何もしない | E-02 (L52-53) | ○ |
| C-069 | cb==NULLでUV_EINVALを返す | E-02 (L55-56) | ○ |
| C-070 | uv_check_startがハンドルをアクティブにする | E-02 (L46-73, L121) | ○ |
| C-071 | check_startでcb==NULLの場合UV_EINVALを返す | E-02 (L55-56) | ○ |
| C-072 | uv_idle_startがハンドルをアクティブにする | E-02 (L46-73, L122) | ○ |
| C-073 | idle_startでcb==NULLの場合UV_EINVALを返す | E-02 (L55-56) | ○ |
| C-074 | uv_prepare_stopがハンドルを非アクティブにしリストから除去 | E-02 (L76-104) | ○ |
| C-075 | 非アクティブ時のstopは0を返す | E-02 (L81-82) | ○ |
| C-076 | リスト先頭のハンドル停止でloop->headが更新される | E-02 (L85-87) | ○ |
| C-077 | uv_check_stopがハンドルを非アクティブにする | E-02 (L76-104, L121) | ○ |
| C-078 | uv_idle_stopがハンドルを非アクティブにする | E-02 (L76-104, L122) | ○ |
| C-079 | uv__prepare_invokeが全prepareハンドルのコールバックを呼ぶ | E-02 (L107-118, L120) | ○ |
| C-080 | prepare_handles==NULLの場合whileに入らない | E-02 (L112) | ○ |
| C-081 | uv__check_invokeが全checkハンドルのコールバックを呼ぶ | E-02 (L107-118, L121) | ○ |
| C-082 | uv__idle_invokeが全idleハンドルのコールバックを呼ぶ | E-02 (L107-118, L122) | ○ |
| C-083 | uv_async_initがasync_sent=0, async_cb設定, reqをUV_WAKEUPで初期化 | E-03 (L58-72) | ○ |
| C-084 | async_cb=NULLでも初期化が成功する | E-03 (L63) | ○ |
| C-085 | 初回送信(async_sent=0)でPOST_COMPLETION_FOR_REQが呼ばれる | E-03 (L96-98) | ○ |
| C-086 | async_sent=1の場合は重複ポストされない | E-03 (L96) | ○ |
| C-087 | handle->type!=UV_ASYNCで-1を返す | E-03 (L87-90) | ○ |
| C-088 | async_sent=0のclose時にuv__want_endgameが呼ばれる | E-03 (L76-78) | ○ |
| C-089 | async_sent=1のclose時はuv__want_endgameが呼ばれない | E-03 (L76) | ○ |
| C-090 | CLOSING+async_sent=0でuv__handle_closeが呼ばれる | E-03 (L49-54) | ○ |
| C-091 | async_sent=1ではendgameでcloseされない | E-03 (L50-51) | ○ |
| C-092 | wakeup処理でasync_sent=0にリセットし、cbを呼ぶ | E-03 (L104-116) | ○ |
| C-093 | CLOSING中のwakeupでuv__want_endgameが呼ばれる | E-03 (L111-112) | ○ |
| C-094 | async_cb==NULLの場合コールバックが呼ばれない | E-03 (L113) | ○ |
| C-095 | FILE_TYPE_CHAR+GetConsoleMode成功でUV_TTYを返す | E-04 (L42-44) | ○ |
| C-096 | FILE_TYPE_PIPEでUV_NAMED_PIPEを返す | E-04 (L49-50) | ○ |
| C-097 | FILE_TYPE_DISKでUV_FILEを返す | E-04 (L52-53) | ○ |
| C-098 | FILE_TYPE_CHARでGetConsoleMode失敗時にUV_FILEを返す | E-04 (L45-47) | ○ |
| C-099 | file<0でUV_UNKNOWN_HANDLEを返す | E-04 (L35-37) | ○ |
| C-100 | file=0で適切なハンドルタイプを返す | E-04 (L35) | ○ |
| C-101 | UV_HANDLE_ACTIVE設定・CLOSING未設定でtrueを返す | E-04 (L61-64) | ○ |
| C-102 | UV_HANDLE_ACTIVE未設定でfalseを返す | E-04 (L62) | ○ |
| C-103 | ACTIVE+CLOSINGでfalseを返す | E-04 (L63) | ○ |
| C-104 | UV_TCPのcloseでuv__tcp_closeが呼ばれる | E-04 (L79-81) | ○ |
| C-105 | UV_TIMERのcloseでuv_timer_stop+endgame追加 | E-04 (L99-103) | ○ |
| C-106 | UV_PREPAREのcloseでuv_prepare_stop+endgame追加 | E-04 (L105-109) | ○ |
| C-107 | UV_ASYNCのcloseでuv__async_closeが呼ばれる | E-04 (L123-125) | ○ |
| C-108 | close時にhandle->close_cb=cbが設定される | E-04 (L75) | ○ |
| C-109 | UV_HANDLE_CLOSING設定時にuv_is_closingがtrue | E-04 (L151-153) | ○ |
| C-110 | UV_HANDLE_CLOSED設定時にuv_is_closingがtrue | E-04 (L152) | ○ |
| C-111 | どちらのフラグもない場合にfalse | E-04 (L152) | ○ |
| C-112 | uv_get_osfhandleがuv__get_osfhandleを呼ぶ | E-04 (L156-158) | ○ |
| C-113 | 無効FDでINVALID_HANDLE_VALUEを返す | E-04 (L157), E-05 (L98-110) | ○ |
| C-114 | uv_open_osfhandleが_open_osfhandleを呼ぶ | E-04 (L160-162) | ○ |
| C-115 | 無効HANDLEで-1を返す | E-04 (L161) | △ |
| C-116 | UV_HANDLE_ENDGAME_QUEUED未設定時にフラグ設定しリスト先頭に追加 | E-05 (L88-95) | ○ |
| C-117 | UV_HANDLE_ENDGAME_QUEUED設定済みでは何もしない | E-05 (L89) | ○ |
| C-118 | CRTアサート無効化付きで_get_osfhandleを呼ぶ | E-05 (L98-110) | ○ |
| C-119 | uv_fatal_errorがFormatMessageA+stderrへの出力後abort()を呼ぶ | E-08 (L35-63) | ○ |
| C-120 | syscall==NULLの場合にsyscall名なしでメッセージ出力 | E-08 (L51-55) | ○ |
| C-121 | FormatMessageA失敗時に"Unknown error"を使用 | E-08 (L43-47) | ○ |
| C-122 | WSAEACCES -> UV_EACCESの変換 | E-08 (L72) | ○ |
| C-123 | WSAEADDRINUSE -> UV_EADDRINUSEの変換 | E-08 (L76) | ○ |
| C-124 | WSAECONNREFUSED -> UV_ECONNREFUSEDの変換 | E-08 (L93) | ○ |
| C-125 | WSAETIMEDOUT -> UV_ETIMEDOUTの変換 | E-08 (L166) | ○ |
| C-126 | ERROR_FILE_NOT_FOUND -> UV_ENOENTの変換 | E-08 (L137) | ○ |
| C-127 | ERROR_ACCESS_DENIED -> UV_EPERMの変換 | E-08 (L158) | ○ |
| C-128 | ERROR_NOT_ENOUGH_MEMORY -> UV_ENOMEMの変換 | E-08 (L145) | ○ |
| C-129 | sys_errno=0で0を返す | E-08 (L67-68) | ○ |
| C-130 | 負のsys_errnoでそのまま返す | E-08 (L67-68) | ○ |
| C-131 | 未知エラーでUV_UNKNOWNを返す | E-08 (L172) | ○ |
| C-132 | ERROR_BROKEN_PIPE -> UV_EOF（通常変換） | E-08 (L157) | ○ |
| C-133 | ERROR_DISK_FULL -> UV_ENOSPCの変換 | E-08 (L148) | ○ |
| C-134 | 書き込み時ERROR_BROKEN_PIPE -> UV_EPIPEの変換 | E-08 (L176-183) | ○ |
| C-135 | 書き込み時ERROR_NO_DATA -> UV_EPIPEの変換 | E-08 (L179) | ○ |
| C-136 | その他のエラーはuv_translate_sys_errorに委譲 | E-08 (L181) | ○ |
| C-137 | uv__init_detect_system_wakeupがuv__register_system_resume_callbackを呼ぶ | E-09 (L28-33) | ○ |
| C-138 | PBT_APMRESUMESUSPENDでuv__wake_all_loopsを呼ぶ | E-09 (L38-39) | ○ |
| C-139 | PBT_APMRESUMEAUTOMATICでuv__wake_all_loopsを呼ぶ | E-09 (L38-39) | ○ |
| C-140 | その他のTypeではuv__wake_all_loopsを呼ばない | E-09 (L38) | ○ |
| C-141 | pPowerRegisterSuspendResumeNotification!=NULLの場合にコールバック登録 | E-09 (L44-56) | ○ |
| C-142 | pPowerRegisterSuspendResumeNotification==NULLの場合は何もしない | E-09 (L48-49) | ○ |
| C-143 | pending_reqs_tail==NULLで即座にreturn | E-01 (L562-563) | ○ |
| C-144 | UV_READのDELEGATE_STREAM_REQ呼び出し | E-01 (L574-576) | ○ |
| C-145 | UV_WRITEのDELEGATE_STREAM_REQ呼び出し | E-01 (L578-579) | ○ |
| C-146 | UV_WAKEUPでuv__process_async_wakeup_reqを呼ぶ | E-01 (L604-605) | ○ |
| C-147 | 複数リクエストがnext_reqチェーンで順次処理される | E-01 (L569-627) | ○ |
| C-148 | endgame_handlesチェーンの各ハンドルタイプに応じたendgame関数呼び出し | E-01 (L632-698) | ○ |
| C-149 | endgame_handles==NULLの場合whileに入らない | E-01 (L635) | ○ |
| C-150 | timeout=0でGetQueuedCompletionStatusExが即座に返る | E-01 (L426-527) | △ |
| C-151 | IOCPパケット受信時にcontainer_of+uv__insert_pending_req呼び出し | E-01 (L490-497) | ○ |
| C-152 | UV_METRICS_IDLE_TIME時に初回timeout=0で後にuser_timeout復元 | E-01 (L443-476) | ○ |
| C-153 | overlapped==NULLのパケットが無視される | E-01 (L490) | △ |

## 4) 不足情報（Unknown / Missing）
- C-115: `uv_open_osfhandle`に無効なHANDLEを渡した場合の挙動は`_open_osfhandle`のCRT実装に依存する。libuvソースコード上では明示的なエラーチェックがない
  - 候補：MSVC CRTドキュメント / Windows SDKドキュメント / テスト実行による検証
- C-150, C-153: IOCPの実際の動作はWindowsカーネル側の挙動に依存するため、ソースコードだけでは完全に検証できない
  - 候補：Windows APIドキュメント / IOCP統合テスト / Windows環境でのテスト実行
- uv_fatal_error（C-119〜C-121）はabort()を呼ぶため、通常のユニットテストでは実行困難
  - 候補：プロセス分離テスト / シグナルハンドラでの検証 / モック化

## 5) リスクフラグ（レビュー観点）
- 1: uv_fatal_errorのテストケースはabort()を伴うため、テスト実行方法に工夫が必要（プロセスフォーク等）
- 1: uv__poll関連のテストケースはWindows IOCP APIとの実際の相互作用を前提としている
- 0: エラーコード変換テスト（uv_translate_sys_error）は定数マッピングのため高い信頼性
- 0: loop-watcher、async、handleの各テストケースはソースコードから直接導出可能
- 1: detect-wakeup関連のテストはWindows電源管理API（PowerRegisterSuspendResumeNotification）の利用可否に依存

## 6) レビュアーチェックリスト（最小）
- [ ] uv_fatal_errorのテストケースが実際に実行可能なテスト手法（プロセス分離等）を前提としているか確認
- [ ] uv_translate_sys_errorのエラーコードマッピングが網羅的かどうか確認（全73ケース中代表的な11ケースのみ抽出）
- [ ] uv__pollのテストケースがIOCPの実際の動作を正しく反映しているか確認
- [ ] マクロ展開（UV_LOOP_WATCHER_DEFINE）によるprepare/check/idleの3タイプが同一テストパターンで十分かどうか確認
- [ ] uv_closeの全ハンドルタイプ（13タイプ）のうち代表的な4タイプのみテスト対象としているが、他タイプのテストが必要かどうか確認
- [ ] handle-inl.hのインラインマクロ（DECREASE_ACTIVE_COUNT等）を直接テストするか、呼び出し元関数経由でテストするかの方針確認
