48 lines
3.1 KiB
Markdown
48 lines
3.1 KiB
Markdown
|
|
# Phase 233: loop_update_summary テスト刷新
|
|||
|
|
|
|||
|
|
目的: deprecated な `analyze_loop_updates()` 依存の期待値を捨てて、Phase 219 で本番化した `analyze_loop_updates_from_ast()` に合わせてユニットテストを組み直すよ。ロジック本体は既に AST ベースで動いているので、テスト側の追随だけを行うフェーズだよ。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 旧 API (`analyze_loop_updates`) の前提
|
|||
|
|
|
|||
|
|
- 入力: carrier 名リストだけ(RHS や AST 構造を見ない)。
|
|||
|
|
- ヒューリスティック: すべて AccumulationLike 扱い(名前ベースの Counter 推定は撤廃済み)。
|
|||
|
|
- テストで見ていたもの:
|
|||
|
|
- `test_analyze_single_counter` / `test_analyze_mixed`: 名前だけで Counter/Accumulation を判断する期待。
|
|||
|
|
- `test_is_simple_if_sum_pattern_*`: deprecated wrapper で組んだ summary をそのまま `is_simple_if_sum_pattern` に渡していた。
|
|||
|
|
- 問題: 本番 if-sum ラインは AST ベースに移行済みのため、これらのテストは現実の入力と乖離して FAIL していた。
|
|||
|
|
|
|||
|
|
## 2. 新 API (`analyze_loop_updates_from_ast`) の前提
|
|||
|
|
|
|||
|
|
- 入力: carrier 名リスト + ループ body の AST。
|
|||
|
|
- 処理:
|
|||
|
|
- `extract_assigned_variables` で実際に LHS に現れた変数だけを対象にする。
|
|||
|
|
- `find_assignment_rhs` で RHS を拾い、`classify_update_kind_from_rhs` で CounterLike / AccumulationLike を決定。
|
|||
|
|
- ループインデックスっぽい名前(i/j/k/idx/index/pos/n)だけは Counter 扱いに固定。
|
|||
|
|
- 実運用:
|
|||
|
|
- PatternPipelineContext から if-sum 判定に使われる唯一の経路。
|
|||
|
|
- Phantom carrier 解消(Phase 219)の一環として既に配線済み。
|
|||
|
|
|
|||
|
|
## 3. テストケースの扱い(棚卸し結果)
|
|||
|
|
|
|||
|
|
- `test_analyze_single_counter` → **AST ベースに組み直す**
|
|||
|
|
- ループ body に `i = i + 1` を置き、`has_single_counter()` が真になることだけを確認。
|
|||
|
|
- `test_analyze_accumulation` → **AST ベースに置き換え**
|
|||
|
|
- `sum = sum + i` のような RHS を与え、非 index 名が AccumulationLike になることを確認。
|
|||
|
|
- `test_analyze_mixed` → **Counter + Accumulation の AST で再構成**
|
|||
|
|
- `i = i + 1` と `sum = sum + i` の 2 本で、counter=1 / accumulation=1 を確認。
|
|||
|
|
- `test_is_simple_if_sum_pattern_basic` → **if-body に accumulator 更新を置いた AST で検証**
|
|||
|
|
- `if (cond) { sum = sum + i }` + `i = i + 1` の組み合わせで true を確認。
|
|||
|
|
- `test_is_simple_if_sum_pattern_with_count` → **accumulator 2 本の AST で検証**
|
|||
|
|
- `sum` / `count` 両方が AccumulationLike になり、2 本まで許容する条件を確認。
|
|||
|
|
- 旧 wrapper への期待は残さず、どうしても残す場合は `#[ignore]` で歴史テストにする方針。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 期待する着地
|
|||
|
|
|
|||
|
|
- ユニットテストは `analyze_loop_updates_from_ast()` を直接呼ぶ形に揃える。
|
|||
|
|
- `is_simple_if_sum_pattern` は AST 由来の summary を入力として検証するだけにする(パターン検出ロジック本体の契約をテスト)。
|
|||
|
|
- Phase 232 時点の FAIL(4 件)は、テスト刷新で 0 件にする。***
|