Repository navigation
test: 実装の書き方ではなく画面とステップ列の仕様を確かめる - #68
Merged
Merged
Conversation
リファクタやライブラリの更新だけで落ちるテストと、仕様違反を見逃すテストがあったため、公開された入口から観測できる結果を、仕様と手計算から導いた期待値で確かめる形に書き換えた。本体のコードは変えていない。 | 対象 | 実装に依存していた点 | 確かめる仕様 | | --- | --- | --- | | バブル・選択ソート | 比較・交換の i と j の順序 | 2本の組(順序は問わない)、各パスの最小値をパスの先頭へ移す交換 | | マージソート | 添字の計算の再現、UIが使わない write.id | 範囲の左右を昇順で示す、小さい方(同じ値なら左)を取る、全部取ってから書き戻す | | クイックソート | 「直後」「3ステップ以内」などステップの並び方 | 右端のピボット、候補の大小、境界の左はピボット以下、ピボットの最終位置 | | スライダー・チップ | 画面上の何番目か、Mantine の DOM | 名前で取る | | シャッフル | Math.random の呼び出し回数 | 並びが変わり、本数を保ち、全パネルで同じ | | オーバーレイ | インラインの style.display | 表示されているか | | マージの説明・高さ・比較枠 | 再生の何ステップ目か、Fisher–Yates に固定値を与えたときの並び | 表示の順序、高さの基準、完了時の比較枠。必要な並びはシャッフルを繰り返して作る | UIテストの Math.random は固定の擬似乱数に置き換え、どの実行でも同じ並びで再現できるようにした。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
既存のテストのうち、実装の書き方に依存していたものと、仕様違反を見逃していたものを書き換えました。公開された入口(ステップを作る関数と画面)から観測できる結果を、仕様と手計算から導いた期待値で確かめます。本体のコードは変えていません。
仕様・設計の変更なし。
書き換えたテスト
src/__tests__/visualizer.spec.tsiとjの順序(画面では2本を区別しない)jが最小値候補であること。交換はn-1回以下とだけ確認[5, 3, 4, 1, 2]で[0,3] [1,4] [2,4] [3,4])。最小値がすでに先頭にあるパスでは交換しない([1, 3, 2]で[1,2]だけ)。各パスで、未ソートの残りの棒すべてを候補と比べるwrite.idで安定性を確かめていたrangeの直後はpivot」「swapの後3ステップ以内にboundary」など、ステップの並び方を固定していた[2, 3, 1, 2, 2]を加えたsrc/__tests__/ui.spec.tsxgetAllByRole('slider')の何番目か(操作の並び)本数:・アニメ速度:)で取るnextElementSibling)バブルソートのチェックボックスステップ: 0と凡例の各項目を表示するMath.randomの呼び出し回数style.displayの値[1]・右[2]・結果[]→ 「左の1を結果に入れました。」 → 結果[1, 2]で書き戻し、の順に表示するMath.random() = 0で Fisher–Yates が作る並び[2, 3, 4, 5, 1]Math.random() = 0.999で昇順になること、9000ms で完了すること具体的な並びが必要な3件(マージの説明・高さの基準・比較枠)は、
Math.randomに固定値を与える代わりに、条件を満たすまでシャッフルボタンを押して並びを作ります。シャッフルの実装を変えても(例: Fisher–Yates を左から進める)落ちません。UIテストの
Math.randomは、beforeEachで固定の擬似乱数(Park–Miller の線形合同法)に置き換えました。これまで多くのテストは実行のたびに違う並びで動いており、並びによってだけ起きる失敗を再現できませんでした。消した確認
テストケースは消していません。テストの中の次の確認を、別の確認に置き換えました。
Math.randomが呼ばれたことwrite.idと、idから求めた並びidを使わない。安定性は、同じ値のとき左を取ることで確かめるn-1回以下n(n-1)/2回検証
すべて Docker のコンテナで実行しました。
yarn typecheck && yarn lint && yarn format && yarn test: 成功(44件)。git diffで本体に差分がないことを確かめました。iとjを入れ替えるiとjを入れ替えるwrite.idを0にする「完了したパネルに比較枠を残す」は、書き換え前は完了まで再生するテストでも落ちることがありましたが、乱数で決まる並びで、バブルソートの最後の操作が比較になったときだけでした。書き換え後は比較枠のテストが決まった並びで検出します。
気付いた点(変更していない)
1回の再生で、
sort_finishがアルゴリズムによって複数回送られます。src/App.tsxの送信処理は、どれかのパネルが完了するたびに、完了済みのパネルすべての分を送り直すためです。一時的なテストでReactGA.eventの呼び出しを数えると、20本で1回再生したとき(並びは乱数を固定していない)、quick_sort3回、bubble_sort2回、selection_sort2回、merge_sort1回でした。AGENTS.md にはalgorithm_typeの値の約束だけがあり、回数の記載はないため、不具合かどうかは判断していません。🤖 Generated with Claude Code