https://github.com/scalaprops/scalaprops-shapeless
scalacheck-shapelessというのがあるので、それを移植しました。
scalapropsは、自作のproperty based testingライブラリです(これ http://xuwei-k.github.io/slides/scalaprops/#1 などを読んで下さい)
shapelessはHaskellのGHC.Genericsみたいなやつとか、HListとか、型レベルプログラミングとか色々できるやつです。
ライブラリ自体は、ひとことでいうと、完全に全自動でscalapropsの Gen、Cogen、Shrink などの型クラスのインスタンスが手に入るものです。
基本的にはロジック変えずに移植しただけなのですが、思ったよりは細かい違いや罠があって面倒でした。以下それらの罠や違いや、移植した感想
- scalapropsにはArbitraryない
- scalacheckがGenがfailする可能性がある(failという状態がある、と言えばいいのか)が、scalapropsは原理的にそれがない。これはむしろコード削ればいいだけだったから、難しくはなかったが
- scalapropsに足りないメソッド見つけたので追加 https://github.com/scalaprops/scalaprops/commit/e46fb84a447ec57c06d7ccfc3805017f4474e77a
- scalapropsで微妙なバグ見つけたので修正(chooseが偏っていた) https://github.com/scalaprops/scalaprops/commit/fce8e4092bdc675eb789be6db73fe
- ついでに数ヶ月ぶりに細かい変更したので、scalaprops 本体も 0.3.5 をリリースした
- なぜか元コードではstack overflowしないのに移植したらstack overflowする(ほぼ直したが、一箇所だけ未解決 https://github.com/scalaprops/scalaprops-shapeless/blob/v0.1.0/test/shared/src/test/scala/scalaprops/PropertyTests.scala#L28-L34 )
- shapelessのWitnessというかSingletonが、書き方によってはマクロがクラッシュする(コンパイラがクラッシュするように見えるのでエラーわかりにくい)
- utestというテストライブラリでテスト書かれていたが、scalapropsで書き直した
shapelessの元コードをあまり理解できていないけれど、今後メンテ出来るのか謎・・・。
とはいっても、それほど手を加えずに最低限のメンテしつつ、fork元の scalacheck-shapeless に機能加わったら、それを随時移植するくらいのこと(だけを?)するつもり