Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ScalaCheckで任意の範囲のDateTimeを生成するGen

プロパティベースドテストを行うライブラリである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全部見るやつやりたい。

github.com

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?