gensym 続き
- gensym をテストの間だけ結果が予めわかるようなものに挿げ替えて、テストケースをそれに合わせて書いた(前回のお話)
- テストされるコードの実装が変わって、 gensym の呼び出しの順番が変わった場合に、テストを書き換えねばならないことが発覚した
- テスト用 gensym が返す値として「最初に equal? した任意のオブジェクトを記憶し、そのオブジェクトとの equal? だけ #t を返す」プレースホルダを定義した
- テストケースのシンボルをいちいち書き換えなくても良くなる
- ……と思ったら、object-equal? はそもそも同じ型のときしか呼ばれない
- テスト用 gensym が返す値として「最初に equal? した(同じクラスの)オブジェクトを記憶し、その相手との equal? だけ #t を返す」プレースホルダを定義した。テストには gensym の出力が入るはずのところにそのオブジェクトを入れておくことにした。
- テストとしてはOK
- 同じシンボルを期待するところには同じオブジェクトを置く必要があり、expect のところに置く式が (let ( (A (make-placeholder)) (B (make-placeholder))) ...) のような形式になってしまい不恰好。
- 被テストコード側で gensym の呼び出しの値としてシンボルを期待しているところに変なオブジェクトが渡ることでエラーに
- test* ではなく test の第四引数に自前の比較関数 ph-equal? を渡す。プレースホルダとして、最初に ph-equal? した(他のどのプレースホルダもまだ保持していない)オブジェクトを記憶し、その相手との ph-equal? だけ #t を返すようなオブジェクトを定義した。このオブジェクトの同値性は make に与えられるキーを基にするので、同じシンボルを期待するところに必ずしも同一のオブジェクトを置く必要はない。
- テストコードが単純に。
- gensym は本物の gensym で良い。
- 同じシンボルが入るところに同じのが入っていることが検証できる
- 違うシンボルが入るところに違うのが入っていることが検証できる
でやっと gensym の結果を出力に含むコードのテストがきもちよくできるようになりました。