f :: A -> B のテストは ・B (or A) の == を使う場合 ・一般の場合 ・h :: A -> B を用意して f x == h x をテスト ・逆関数 g :: B -> A がある場合 ・x == g (f x) をテスト ・y == f (g y) をテスト ・使わない場合 ・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト (テストはランダムな x :: A, y :: B に対して) 大概こんな感じ。
元実装とほとんど同じテストってのは、 g やうまい r が無くて、f x == h x というテストしか無いんだけど、 f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、 == を明示的には使わないで実質的に f x == f x と同じことをやる、 みたいな感じじゃないかな。