プロパティベースドテストを行うライブラリであるScalaCheckには、任意の値を生成できるGenという仕組みがある。任意の日付時刻を生成するためのGenを定義したメモを残しておく。
Gen
Genとは値を生成するためのジェネレータである。例えばGen.long
は任意のLong
を生成する:
import org.scalacheck.Gen val longGen = Gen.long longGen.sample // => Some(12345L)
詳しくは別稿で説明したいが、Gen
はScalaTestと組み合わせて使える:
import org.scalacheck.Gen import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks.{ forAll => forAllSC, } import com.github.nscala_time.time.Imports._ import org.scalatest.funspec.AnyFunSpec import org.scalatest.matchers.should.Matchers class LongSpec extends AnyFunSpec with Matchers { describe("long") { it("should be same after double negate") { forAllSC(longGen) { l => -(-l) shouldBe l } } } }
どういう雰囲気で使えるかわかると思う。
Gen
for DateTime
適当な(任意の範囲の)DateTime
を生成してもらうには、適当なLongを経由してから生成するのが一番やりやすい:
val now = DateTime.now() val pastYear = now.minusYears(5) val dateTimeGen = Gen .choose(pastYear.getMillis(), now.getMillis()) .map(new DateTime(_)) // => 5年前から現在までの任意のDateTimeを出力してくれる
Gen.choose
は指示した範囲の値を出力するやつで、今回はgetMillis
の結果(Long
)を渡すことでLong
を暗に指示し、指示した範囲のLong
吐き出し君になっている。
ScalaCheckのGen全部見るやつやりたい。