使用 scalacheck 生成任意 A => 日期

Generating arbitrary A => Date with scalacheck

我 运行 遇到了 scalacheck 1.13.3 的一个奇怪问题:A => java.util.Date 的任意实例根据它们被调用的时间生成不同的值。

这是一个具体的、可重现的例子:

import org.scalatest.FunSuite
import org.scalatest.prop.GeneratorDrivenPropertyChecks
import java.util.Date
import org.scalacheck._

class Repr extends FunSuite with GeneratorDrivenPropertyChecks {
  implicit val cogenDate: Cogen[Date] = Cogen(_.getTime)

  test("reproduce") {
    forAll { (s: String, g: String => Date) =>
      val d1 = g(s)
      Thread.sleep(100)
      val d2 = g(s)

      assert(d1 === d2)
    }
  }
}

这失败了。打印 d1d2 的实际值表明日期确实不同,差异在 100 和 103 毫秒之间。

我猜问题出在我的 Cogen 实例上,但我必须承认我不明白为什么。

事实证明这是 scalacheck 1.13.3 中的回归,正如项目 gitter channel. An issue 中所讨论的那样 已打开。